即使释放了所有堆块,Valgrind也会出错

14 c valgrind

我最近养成了运行所有程序valgrind来检查内存泄漏的习惯,但是大部分结果对我来说都有点神秘.

对于我的最新运行,valgrind -v给了我:

All heap blocks were freed -- no leaks are possible
Run Code Online (Sandbox Code Playgroud)

这意味着我的程序被内存泄漏所覆盖,对吗?

那么这个错误意味着什么?我的程序没有正确读取某些内存块吗?

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 9)

1 errors in context 1 of 1:
Invalid read of size 4
   at 0x804885B: findPos (in /home/a.out)
   by 0xADD918: start_thread (pthread_create.c:301)
   by 0xA26CCD: clone (clone.S:133)
 Address 0x4a27108 is 0 bytes after a block of size 40 alloc'd
   at 0x4005BDC: malloc (vg_replace_malloc.c:195)
   by 0x804892F: readInput (in /home/a.out)
   by 0xADD918: start_thread (pthread_create.c:301)
   by 0xA26CCD: clone (clone.S:133)

used_suppression:     14 dl-hack3-cond-1
Run Code Online (Sandbox Code Playgroud)

此外,这里所谓的"抑制"错误是什么?

Mar*_*ins 22

这看起来很明显......但值得指出的是,这条"no leaks are possible"消息并不意味着你的程序无法泄漏; 它只是意味着它在测试的配置中没有泄漏.

如果我使用没有命令行参数的valgrind运行以下命令,它会通知我没有泄漏是可能的.但是如果我提供命令行参数,它确实会泄漏.

int main( int argc, char* argv[] )
{
   if ( argc > 1 )
      malloc( 5 );
   printf( "Enter any command line arg to cause a leak\n" );
}
Run Code Online (Sandbox Code Playgroud)


Jen*_*edt 12

  1. 是的,你被大大覆盖,不要以为valgrind很容易错过用户代码泄漏
  2. 您的错误意味着索引数组变量时可能会出现+1错误.valgrind告诉你的那些行应该准确,所以你应该很容易找到,只要你编译所有的代码-g
  3. 抑制错误通常来自系统库,系统库有时会出现小漏洞或线程状态变量等不可检测的错误.您的手册页应列出默认使用的抑制文件