程序在bash中运行良好但不与valgrind一起运行

时间:2011-04-06 16:25:13

标签: valgrind

我有一个用c编写的程序,它在bash中运行良好,但在valgrind下给出了奇怪的结果,而valgrind报告内存泄漏。

在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   

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

它不仅报告内存泄漏,还报告错误,程序的输出完全错误。

为什么?

1 个答案:

答案 0 :(得分:1)

因为你有一个错误(实际上有几个错误)。

特别是,在get_fibo_index中你realloc有一些内存,然后在main中读取超出分配缓冲区的末尾(产生完全未定义的结果)。

使用-g重建您的程序,在Valgrind下重新运行它,并修复它找到的所有“无效”错误。

(使用-g重建将为您提供文件和行信息,以便更轻松地修复错误。)