Valgrind报告空C程序的未初始化值

13 c memory linker gcc valgrind

我有这个C程序编译使用gcc test.cclang test.c:

int main (void) {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

valgrind ./a.out 给我这个:

==9232== Memcheck, a memory error detector
==9232== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==9232== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==9232== Command: ./a.out
==9232== 
==9232== Conditional jump or move depends on uninitialised value(s)
==9232==    at 0x4017876: index (in /usr/lib/ld-2.16.so)
==9232==    by 0x4007902: expand_dynamic_string_token (in /usr/lib/ld-2.16.so)
==9232==    by 0x4008204: _dl_map_object (in /usr/lib/ld-2.16.so)
==9232==    by 0x400180D: map_doit (in /usr/lib/ld-2.16.so)
==9232==    by 0x400E785: _dl_catch_error (in /usr/lib/ld-2.16.so)
==9232==    by 0x40010DB: do_preload (in /usr/lib/ld-2.16.so)
==9232==    by 0x4004546: dl_main (in /usr/lib/ld-2.16.so)
==9232==    by 0x4014B5D: _dl_sysdep_start (in /usr/lib/ld-2.16.so)
==9232==    by 0x4004DFD: _dl_start (in /usr/lib/ld-2.16.so)
==9232==    by 0x4001627: ??? (in /usr/lib/ld-2.16.so)
==9232== 
==9232== Conditional jump or move depends on uninitialised value(s)
==9232==    at 0x401787B: index (in /usr/lib/ld-2.16.so)
==9232==    by 0x4007902: expand_dynamic_string_token (in /usr/lib/ld-2.16.so)
==9232==    by 0x4008204: _dl_map_object (in /usr/lib/ld-2.16.so)
==9232==    by 0x400180D: map_doit (in /usr/lib/ld-2.16.so)
==9232==    by 0x400E785: _dl_catch_error (in /usr/lib/ld-2.16.so)
==9232==    by 0x40010DB: do_preload (in /usr/lib/ld-2.16.so)
==9232==    by 0x4004546: dl_main (in /usr/lib/ld-2.16.so)
==9232==    by 0x4014B5D: _dl_sysdep_start (in /usr/lib/ld-2.16.so)
==9232==    by 0x4004DFD: _dl_start (in /usr/lib/ld-2.16.so)
==9232==    by 0x4001627: ??? (in /usr/lib/ld-2.16.so)
==9232== 
==9232== 
==9232== HEAP SUMMARY:
==9232==     in use at exit: 0 bytes in 0 blocks
==9232==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==9232== 
==9232== All heap blocks were freed -- no leaks are possible
==9232== 
==9232== For counts of detected and suppressed errors, rerun with: -v
==9232== Use --track-origins=yes to see where uninitialised values come from
==9232== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Run Code Online (Sandbox Code Playgroud)

GCC版本4.7.1和Clang版本3.1.这怎么了?我的记忆有问题吗?自从我上次使用valgrind以来有一段时间,但我认为这不是正常行为.喊叫?


解决方案:从我从@Shawn学到的东西可以使用valgrind .supp文件来抑制这些链接器错误.我做的是使用--gen-suppressions=all选项在我的程序上运行valgrind :

valgrind --gen-suppressions=all ./a.out 
Run Code Online (Sandbox Code Playgroud)

然后我提取括在括号中的新块并将它们直接放入文件中my.supp:

{  
   <linker>
   Memcheck:Cond
   fun:index
   fun:expand_dynamic_string_token
   fun:_dl_map_object
   fun:map_doit
   fun:_dl_catch_error
   fun:do_preload
   fun:dl_main
   fun:_dl_sysdep_start
   fun:_dl_start
   obj:/usr/lib/ld-2.16.so
}  
Run Code Online (Sandbox Code Playgroud)

现在我可以使用--suppressions指向我的新文件的选项运行valgrind,并且将禁止消息:

valgrind --suppressions=/home/foo/my.supp ./a.out
Run Code Online (Sandbox Code Playgroud)

Sha*_*hin 9

这是valgrind的一个已知 问题,通常使用valgrind抑制解决.假设已经为您的发行版报告了该问题,则抑制列表应该很快更新,并在下次更新时消失.

现在,忽略该消息是安全的.

如果它困扰您,您可以维护自己的抑制文件并使用它直到您的发行版更新默认文件(通常/var/lib/valgrind/default.supp).


ypn*_*nos 5

这是动态链接器中的"问题"并且很常见.它之前出现了main().您可以忽略该消息.