简体   繁体   中英

Valgrind: Invalid read of size 1

I'm having an issue with valgrind: This is my program (well the main part where the errors appear):

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

And when i run valgrind it says:

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

I can't figure out what's the matter with this program.

How to read this:

Invalid read of size 1

Your program is trying to read one byte from somewhere that Valgrind doesn't like.

at 0x401569: main (:395)

Where in the code this happens (clearly strcmp has been inlined)

Address 0x0 is not stack'd malloc'd or (recently) free'd

What the address it was reading - 0x0 is "NULL". The rest of the statement just says why it's invalid (it's not from the stack, it's not something you've got from malloc, and not been freed recently). The "recently" is mentioned because valgrind keeps track of freed memory for a limited number of frees, so it can't say for sure that it wasn't freed a million frees back - in this case it wasn't, but if you see a message like that, it MAY be that it has become invalid because it was freed ages ago. The address would not be zero tho' (or near zero).

It is possible for strtok to return NULL when there are no more tokens left.

When you pass NULL to strcmp it is an undefined behavior as you de-reference NULL there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM