kcov icon indicating copy to clipboard operation
kcov copied to clipboard

fread() fails when reading file larger than 1024 bytes

Open vasilyrud opened this issue 6 years ago • 2 comments

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

vasilyrud avatar Aug 31 '18 20:08 vasilyrud

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.

SimonKagstrom avatar Sep 01 '18 07:09 SimonKagstrom

Thanks for letting me know. I'll keep looking into what's happening in my system then.

vasilyrud avatar Sep 01 '18 19:09 vasilyrud