Valgrind сообщает о неинициализированных значениях в пустой программе на C
У меня есть эта программа на C, скомпилированная либоgcc test.c
или жеclang test.c
:
int main (void) {
return 0;
}
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)
GCC версии 4.7.1 и Clang версии 3.1. Что с этим случилось? Что-то не так с моей памятью? С тех пор, как я последний раз использовал valgrind, прошло некоторое время, но я думаю, что это не нормальное поведение. Yelp?
Solution:
It is possible from what I learned from @Shawn to suppress these linker errors using a valgrind .supp
файл. Что я сделал, так это запустил valgrind в своей программе, используя--gen-suppressions=all
опция:
valgrind --gen-suppressions=all ./a.out
Затем я извлекаю новые чанки, заключенные в скобки, и помещаю их прямо в файл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
}
Теперь я могу запустить Valgrind с--suppressions
опция указывать на мой новый файл и сообщения будут подавлены:
valgrind --suppressions=/home/foo/my.supp ./a.out