Valgrind: Invalid read of size 1

user1934103 picture user1934103 · Dec 28, 2012 · Viewed 69.8k times · Source

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.

Answer

Mats Petersson picture Mats Petersson · Dec 28, 2012

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).