I have a program written in c, which runs well in bash, but gives strange result under valgrind, and valgrind report memory leak.
Running in bash:
:~/sandbox/binofino$ ./a.out
24 = 3 + 21
24 = 3 + 21
24 = 3 + 8 + 13
24 = 1 + 2 + 8 + 13
24 = 1 + 2 + 3 + 5 + 13
24 = 1 + 2 + 21
Under valgrind:
>:~/sandbox/binofino$ valgrind ./a.out
==20116== Memcheck, a memory error detector
==20116== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==20116== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==20116== Command: ./a.out
==20116==
==20116== Invalid read of size 4
==20116== at 0x804857A: main (in /home/..../sandbox/binofino/a.out)
==20116== Address 0x41a402c is 0 bytes after a block of size 4 free'd
==20116== at 0x4025016: realloc (vg_replace_malloc.c:525)
==20116== by 0x804879F: get_fibo_index (in /home/..../sandbox/binofino/a.out)
==20116== by 0x804854F: main (in /home/..../sandbox/binofino/a.out)
==20116==
24 = 1 + 1
==20116== Invalid read of size 4
==20116== at 0x80485CE: main (in /home/..../sandbox/binofino/a.out)
==20116== Address 0x41a402c is 0 bytes after a block of size 4 free'd
==20116== at 0x4025016: realloc (vg_replace_malloc.c:525)
==20116== by 0x804879F: get_fibo_index (in /home/..../sandbox/binofino/a.out)
==20116== by 0x804854F: main (in /home/..../sandbox/binofino/a.out)
==20116==
24 = 1
==20116== Invalid free() / delete / delete[]
==20116== at 0x4024B3A: free (vg_replace_malloc.c:366)
==20116== by 0x804867E: main (in /home/..../sandbox/binofino/a.out)
==20116== Address 0x41a4028 is 0 bytes inside a block of size 4 free'd
==20116== at 0x4025016: realloc (vg_replace_malloc.c:525)
==20116== by 0x804879F: get_fibo_index (in /home/..../sandbox/binofino/a.out)
==20116== by 0x804854F: main (in /home/..../sandbox/binofino/a.out)
==20116==
==20116==
==20116== HEAP SUMMARY:
==20116== in use at exit: 8 bytes in 1 blocks
==20116== total heap usage: 4 allocs, 4 frees, 20 bytes allocated
==20116==
==20116== LEAK SUMMARY:
==20116== definitely lost: 8 bytes in 1 blocks
==20116== indirectly lost: 0 bytes in 0 blocks
==20116== possibly lost: 0 bytes in 0 blocks
==20116== still reachable: 0 bytes in 0 blocks
==20116== suppressed: 0 bytes in 0 blocks
==20116== Rerun with --leak-check=full to see details of leaked memory
==20116==
==20116== For counts of detected and suppressed errors, rerun with: -v
==20116== ERROR SUMMARY: 5 errors from 3 contexts (suppressed: 11 from 6)
Not only it reports memory leak, it also reports error and the开发者_JS百科 out put of the program is completely wrong.
Why?
Because you have a bug (actually several bugs).
In particular, in get_fibo_index
you realloc
some memory, then in main
read right past the end of the allocated buffer (which produces totally undefined result).
Rebuild your program with -g
, re-run it under Valgrind, and fix all "Invalid" errors it finds.
(Rebuilding with -g
will give you file and line info that will make fixing the errors easier.)
精彩评论