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:   }

Если кто-нибудь подскажет мне, в чем причина сообщения Вальгринда, я был бы очень благодарен. У меня нет идей. Заранее спасибо.

0 ответов

Другие вопросы по тегам