2012-07-16 10 views
13

ho questo programma C compilato sia con gcc test.c o clang test.c:Valgrind riporta valori non inizializzati sul programma C vuoto

int main (void) { 
    return 0; 
} 

valgrind ./a.out mi dà questo: versione

==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 e la versione Clang 3.1. Cosa succede con questo? C'è qualcosa di sbagliato nella mia memoria? C'è un po 'di tempo dall'ultimo utilizzo di valgrind, ma penso che non sia un comportamento normale. Guaire?


Soluzione: E 'possibile da quello che ho imparato da @Shawn per sopprimere questi errori del linker utilizzando un file di .supp valgrind. Quello che ho fatto è stato in esecuzione valgrind sul mio programma utilizzando l'opzione --gen-suppressions=all:

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

Poi estrarre il nuovo pezzi racchiusi tra parentesi e metterli direttamente in un file 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 
} 

Ora posso correre Valgrind con l'opzione --suppressions per puntare al mio nuovo file ei messaggi saranno soppressi:

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

Come alluso @ypnos, un programma c "vuoto" compilato da gcc è tutt'altro che vuoto. Prova 'ldd a.out' per un buon tempo. – msw

+0

@msw - imparare qualcosa ogni giorno :) –

risposta

9

Questo è un knowissue con valgrind che è in genere addressed using valgrind suppressions. Supponendo che il problema sia stato segnalato per la tua distribuzione, l'elenco delle soppressioni dovrebbe essere aggiornato a breve e scomparirà nel prossimo aggiornamento.

Per ora, è possibile ignorare il messaggio.

Se vi dà fastidio, è possibile mantenere your own suppressions file e utilizzarlo fino a quando la distro aggiorna il file predefinito (in genere /var/lib/valgrind/default.supp).

+0

Wow è un vecchio bug (2007). Grazie del promemoria –

5

si tratta di una "p roblem "nel linker dinamico ed è comune. Appare prima che venga chiamato main(). Puoi ignorare il messaggio.

+1

Ah, capisco. Tendo ad essere paranoico ogni volta che valgrind mi dice che qualcosa non va; non si può discutere con valgrind .. –

Problemi correlati