Valgrind: неверное чтение размера 1

У меня проблема с valgrind: Это моя программа (ну основная часть, где появляются ошибки):

int main()
{
char comanda[N];
....
char *p;
while( fgets(comanda,100,stdin)!=NULL)
    {
    p=strtok(comanda," \n");
    if (strcmp(comanda,"INIT")==0)
        {
        p=strtok(NULL," ");
        Init(n);        
        }
395 >>if (strcmp(p,"DUMP")==0)
        {
        Dump(n);}
    if (strcmp(p,"ALLOC")==0)
        {
        Alloc(j,n);
        }
    ....return 0;}

И когда я запускаю valgrind, он говорит:

Invalid read of size 1
at 0x401569: main (:395)
Address 0x0 is not stack'd malloc'd or (recently) free'd

Я не могу понять, в чем дело с этой программой.

Ответ 1

Как это прочитать:

Неверное чтение размера 1

Ваша программа пытается прочитать один байт откуда-то, что Valgrind не нравится.

на 0x401569: main (: 395)

Где в коде это происходит (явно strcmp был встроен)

Адрес 0x0 не находится в стеке malloc'd или (недавно) free'd

Какой адрес он читал - 0x0 - "NULL". Остальная часть утверждения просто говорит, почему он недействителен (это не из стека, это не то, что вы получили от malloc, и не было освобождено в последнее время). "Недавно" упоминается, потому что valgrind отслеживает освобожденную память для ограниченного количества frees, поэтому он не может точно сказать, что он не освободил миллион лишних денег - в этом случае это не так, но если вы см. такое сообщение, МОЖЕТ быть, что оно стало недействительным, потому что оно было освобождено веками назад. Адрес не будет равен нулю (или около нуля).

Ответ 2

Возможно, что strtok возвращает NULL, когда осталось больше лексем.

Когда вы передаете NULL на strcmp, это поведение undefined, поскольку вы удаляете NULL там.