kcov
kcov copied to clipboard
fread() fails when reading file larger than 1024 bytes
When running kcov on a program that calls fread()
on a file larger than 1024 bytes, fread()
only reads the first 9 bytes into the buffer. When executing the same program normally, fread()
reads the whole file.
Example output:
$ kcov tmp ./test_fread
file_1.txt: dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz2uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF4jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQsEqX78fhelxu5hsoeu5so9fHmDqZiFFH984B4Q92fkn7ueeIEQVACrmjnSaihYwxuKs7hrcDs01Pw1jFc2H9WE44r8TtIWe6tB6wp8tyQAFlTDm09ytUuDQuuCjc134b8l8BmF0ObmNLQ5z1oFM3YxLBAoGAM072dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz9uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF9jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQs1
file_2.txt: dP4BY2F7J??
$ ./test_fread
file_1.txt: dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz2uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF4jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQsEqX78fhelxu5hsoeu5so9fHmDqZiFFH984B4Q92fkn7ueeIEQVACrmjnSaihYwxuKs7hrcDs01Pw1jFc2H9WE44r8TtIWe6tB6wp8tyQAFlTDm09ytUuDQuuCjc134b8l8BmF0ObmNLQ5z1oFM3YxLBAoGAM072dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz9uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF9jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQs1
file_2.txt: dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz2uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF4jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQsEqX78fhelxu5hsoeu5so9fHmDqZiFFH984B4Q92fkn7ueeIEQVACrmjnSaihYwxuKs7hrcDs01Pw1jFc2H9WE44r8TtIWe6tB6wp8tyQAFlTDm09ytUuDQuuCjc134b8l8BmF0ObmNLQ5z1oFM3YxLBAoGAM072dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz9uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF9jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQs12
Example code:
test_fread.c
// Compiled with: gcc test_fread.c -g -o test_fread
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define FILESIZE_1 1024
#define FILESIZE_2 1025
void run_fread(char *filename, size_t filesize) {
FILE *fp = fopen(filename, "rb");
char *buf = malloc(filesize);
size_t fread_ret = fread(buf, 1, filesize, fp);
assert(fread_ret == filesize);
printf("%s: %s\n", filename, buf);
fclose(fp);
memset(buf, '\0', filesize);
free(buf);
}
int main () {
run_fread("file_1.txt", FILESIZE_1);
run_fread("file_2.txt", FILESIZE_2);
return 0;
}
file_1.txt
(1024 bytes)
dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz2uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF4jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQsEqX78fhelxu5hsoeu5so9fHmDqZiFFH984B4Q92fkn7ueeIEQVACrmjnSaihYwxuKs7hrcDs01Pw1jFc2H9WE44r8TtIWe6tB6wp8tyQAFlTDm09ytUuDQuuCjc134b8l8BmF0ObmNLQ5z1oFM3YxLBAoGAM072dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz9uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF9jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQs1
file_2.txt
(1025 bytes)
dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz2uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF4jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQsEqX78fhelxu5hsoeu5so9fHmDqZiFFH984B4Q92fkn7ueeIEQVACrmjnSaihYwxuKs7hrcDs01Pw1jFc2H9WE44r8TtIWe6tB6wp8tyQAFlTDm09ytUuDQuuCjc134b8l8BmF0ObmNLQ5z1oFM3YxLBAoGAM072dP4BY2F7JhFkucq1KSDVpDZgzFXMEPOoddnL9jz9uQKBgQD7DlETSWMF2wUSKUtVjfYhKo4lXz1BqhpxIg6xZbSXCqFlcXr6FAJUq0uloxcu0B5br8Foko8tsRyEcLWsbPiGaBxu84WA8sNF9jUPAYGePxAuUlLUkJjvfxy2OD01NaYRF1yKJmCkPG5k9K0q6E4EZmAubenjAJkY2MKUYuDqnQKBgQDll4MKYzW6ihA36D2XShU8M3qQwsQG7VesA9iToJPAsBA8DrHVVb1YdVvcXrAQHMAAaUD0hGHKasxTpanyKYExwlvlbOM6efOw54VDPVWn5QMMz8scyEh9oHMmUtbHwymRHFwdgCIxukXn7ORt56NYoF9xdzad1dZdNwC9JMEUewKBgFoJuGoCV9Exy4sH34ysbRZXsMLKdV2ncsQs12
System details:
kcov v36-1-g495c
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Ubuntu 16.04.5 LTS
Linux 4.4.0-134-generic
x86_64
Unfortunately, I can't reproduce this. I get the same output in both runs. I run Fedora with a newer compiler though.
Anyway, the actual fread call shouldn't be instrumented on kcov anyway, so something fishy is going on here.
Thanks for letting me know. I'll keep looking into what's happening in my system then.