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.

3

2 Answers

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.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy