web-dev-qa-db-fra.com

Valgrind: lecture invalide de taille 1

J'ai un problème avec valgrind: c'est mon programme (enfin la partie principale où les erreurs apparaissent):

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

Et quand je lance valgrind, ça dit:

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

Je ne peux pas comprendre quel est le problème avec ce programme.

17
user1934103

Comment lire ceci:

Lecture invalide de taille 1

Votre programme essaie de lire un octet d'un endroit que Valgrind n'aime pas.

à 0x401569: principal (: 395)

Où dans le code cela se produit (clairement strcmp a été inséré)

L'adresse 0x0 n'est pas empilée malloc'd ou (récemment) libérée

L'adresse qu'il lisait - 0x0 est "NULL". Le reste de la déclaration indique simplement pourquoi il n'est pas valide (ce n'est pas de la pile, ce n'est pas quelque chose que vous avez de malloc, et qui n'a pas été libéré récemment). Le "récemment" est mentionné parce que valgrind garde une trace de la mémoire libérée pour un nombre limité de libérations, donc il ne peut pas dire avec certitude qu'il n'a pas été libéré un million de libérations - dans ce cas, il ne l'était pas, mais si vous voir un message comme ça, il se peut qu'il soit devenu invalide parce qu'il a été libéré il y a longtemps. L'adresse ne serait pas égale à zéro (ou proche de zéro).

28
Mats Petersson

Il est possible pour strtok de retourner NULL lorsqu'il n'y a plus de jetons.

Lorsque vous passez NULL à strcmp, il s'agit d'un comportement indéfini lorsque vous dé-référencez NULL à cet endroit.

6
codaddict