Valgrind: ongeldige lezing van maat 1

Ik heb een probleem met valgrind:
Dit is mijn programma (nou ja, het belangrijkste deel waar de fouten verschijnen):

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

En als ik valgrind start, staat er:

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

Ik begrijp niet wat er met dit programma aan de hand is.


Antwoord 1, autoriteit 100%

Hoe dit te lezen:

Ongeldige lezing van maat 1

Je programma probeert één byte te lezen van een plek die Valgrind niet leuk vindt.

op 0x401569: hoofd (:395)

Waar in de code dit gebeurt (duidelijk is strcmp inline gezet)

Adres 0x0 is niet gestapeld met malloc’d of (recentelijk) free’d

Wat het adres was dat het aan het lezen was – 0x0 is “NULL”. De rest van de verklaring zegt alleen waarom het ongeldig is (het is niet van de stapel, het is niet iets dat je van malloc hebt gekregen en het is niet recentelijk bevrijd). De “recent” wordt genoemd omdat valgrind het vrijgekomen geheugen bijhoudt voor een beperkt aantal vrijmakingen, dus het kan niet met zekerheid zeggen dat het niet een miljoen vrijgemaakt is terug – in dit geval was het dat niet, maar als je als je zo’n bericht ziet, KAN het zijn dat het ongeldig is geworden omdat het eeuwen geleden is vrijgelaten. Het adres zou niet nul zijn (of bijna nul).


Antwoord 2, autoriteit 23%

Het is mogelijk voor strtok om NULL terug te geven als er geen tokens meer over zijn.

Wanneer u NULL doorgeeft aan strcmp, is dit een ongedefinieerd gedrag omdat u daar de verwijzing naar NULL verwijdert.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes