Valgrind, неверное чтение, fgetc
Добрый вечер всем.
Я написал функцию, которая проверяет значения, поступающие из потока, анализируя каждый символ. Если символ имеет значение определенного знака, код должен сделать что-то более глубокое в программе.
Все работает нормально, но Valgrind жалуется на используемую функцию fgetc. Я не понимаю почему.
==12681== Memcheck, a memory error detector
==12681== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==12681== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==12681== Command: /tmp/3RKi4ZeFa74f-a.out tests/15_defaultFitting output/ausgabe_15_defaultFitting
==12681==
==12681== Invalid read of size 4
==12681== at 0x4EA69E1: getc (getc.c:38)
==12681== by 0x400B58: checkUp (1441398601.c:36)
==12681== by 0x402453: main (1441398601.c:891)
==12681== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==12681==
==12681==
==12681== Process terminating with default action of signal 11 (SIGSEGV)
==12681== Access not within mapped region at address 0x0
==12681== at 0x4EA69E1: getc (getc.c:38)
==12681== by 0x400B58: checkUp (1441398601.c:36)
==12681== by 0x402453: main (1441398601.c:891)
==12681== If you believe this happened as a result of a stack
==12681== overflow in your program's main thread (unlikely but
==12681== possible), you can try to increase the size of the
==12681== main thread stack using the --main-stacksize= flag.
==12681== The main thread stack size used in this run was 8388608.
==12681==
==12681== HEAP SUMMARY:
==12681== in use at exit: 0 bytes in 0 blocks
==12681== total heap usage: 1 allocs, 1 frees, 568 bytes allocated
==12681==
==12681== All heap blocks were freed -- no leaks are possible
==12681==
==12681== For counts of detected and suppressed errors, rerun with: -v
==12681== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Ниже приведен мой код:
31: void checkUp(char *filename)
32: {
33: datei = fopen (filename, "r");
34: int h = 0;
35: int control = 0;
36: while((control = fgetc(datei)) != EOF)
37: {
38: if(control == '\n')
39: {
40: h++;
41: }
42: if(h>2)
43: {
44: fprintf(stderr,"Error: Die Eingabedatei darf nur zwei Zeilen haben.\n");
45: abbruch = TRUE;
46: break;
47: }
48: if(control == '-')
49: {
50: fprintf(stderr,"Error: Keine negativen Zahlen bitte.\n");
51: abbruch = TRUE;
52: break;
53: }
54: if(control != ' ' && control != '\n')
55: {
56: if((control != 97 && control != 98 && control != 102 && control != 110 && control != 119) && (control > 57 || control < 48))
57: {
58: fprintf(stderr,"Error: Formatierungsfehler oder falsche Eingabe. Bitte prüfen Sie Ihre Eingabe.\n");
59: abbruch = TRUE;
60: break;
61: }
62: }
63: }
64: fclose (datei);
65: }
Если кто-нибудь подскажет мне, в чем причина сообщения Вальгринда, я был бы очень благодарен. У меня нет идей. Заранее спасибо.