Подтвердить что ты не робот

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?


Решение: Возможно, из того, что я узнал от @Shawn, чтобы подавить эти ошибки компоновщика, используя файл 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
4b9b3361

Ответ 1

Это знать вопрос с valgrind, который обычно обращаются с использованием запретов valgrind. Предполагая, что проблема была обнаружена для вашего дистрибутива, список запретов должен быть обновлен в ближайшее время и исчезнет в следующем обновлении.

В настоящее время безопасно игнорировать сообщение.

Если это вас беспокоит, вы можете сохранить свой собственный файл запретов и использовать его, пока ваш дистрибутив не обновит файл по умолчанию (обычно /var/lib/valgrind/default.supp).

Ответ 2

Это "проблема" в динамическом компоновщике, и это распространено. Он появляется до вызова main(). Вы можете игнорировать сообщение.