Valgrind rapporte des valeurs non initialisées sur un programme C vide

J’ai ce programme C compilé avec gcc test.c ou clang test.c :

 int main (void) { return 0; } 

valgrind ./a.out me donne ceci:

 ==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_ssortingng_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_ssortingng_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 version 4.7.1 et Clang version 3.1. Qu’est-ce qui se passe avec ça? Y a-t-il quelque chose qui cloche dans ma mémoire? Il y a quelques temps que j’ai utilisé Valgrind pour la dernière fois, mais je pense que ce n’est pas un comportement normal. Japper?


Solution : d’après ce que j’ai appris de @Shawn, il est possible de supprimer ces erreurs de l’éditeur de liens à l’aide d’un fichier .grpp de .supp . Ce que j’ai fait, c’était exécuter valgrind sur mon programme en utilisant l’ --gen-suppressions=all :

 valgrind --gen-suppressions=all ./a.out 

Ensuite, j’extrais les nouveaux morceaux entre crochets et les my.supp directement dans un fichier my.supp :

 {  Memcheck:Cond fun:index fun:expand_dynamic_ssortingng_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 } 

Maintenant, je peux exécuter valgrind avec l’option --suppressions pour pointer vers mon nouveau fichier et les messages seront supprimés:

 valgrind --suppressions=/home/foo/my.supp ./a.out 

Il s’agit d’un problème connu avec valgrind, qui est généralement traité à l’aide de suppressions valgrind . En supposant que le problème ait été signalé pour votre dissortingbution, la liste de suppression devrait être mise à jour prochainement et disparaîtra dans la prochaine mise à jour.

Pour l’instant, il est prudent d’ignorer le message.

Si cela vous dérange, vous pouvez conserver votre propre fichier de suppression et l’utiliser jusqu’à ce que votre dissortingbution mette à jour le fichier par défaut (généralement /var/lib/valgrind/default.supp ).

Ceci est un “problème” dans l’éditeur de liens dynamic et il est commun. Il apparaît avant que main() soit appelé. Vous pouvez ignorer le message.