2011-09-21 20 views
6

Ho un driver di test collegato a una libreria che ho scritto. La libreria utilizza gli autotools in modo che produca sia un archivio (.a file) che una libreria dinamica (.so).Errori Valgrind se collegati con -static - Perché?

Quando collego il mio driver con 'g ++ -static', presumibilmente collegando a .a, valgrind si illumina ripetutamente 'Il salto condizionato o lo spostamento dipende dal/i valore/i non inizializzato'. Il primo errore si verifica prima di main in __pthread_initialize_minimal.

Quando collego senza -static, presumibilmente collegando con .so, non ricevo lamentele di valore.

Qualcuno sa perché? Valgrind non funziona con -static?

UPDATE: non posso postare persino una versione abita in fondo del mio autista perché si collega a una grande libreria che non è possibile riuscivo a snellire, ma ho notato che più semplice di tutti i programmi di

int main() 
{ 
    return 0; 
} 

dà un errore se direttamente connessa al -static ed eseguire da valgrind:

==15449== Use of uninitialised value of size 8 
==15449== at 0x40B0F3: exit (in /home/jdgordo/src/t) 

avrei compreso che sto correndo a 64 bit Redhat 5.5.

+0

prova a restringere il problema al minor numero possibile di linee e postare qui. – fazo

+4

Ci sono un sacco di errori e scorciatoie nelle varie librerie di sistema in modo che non sia insolito vederli venire in valgrind. Potresti provare a ignorarli sistematicamente, suppongo, o semplicemente fare i tuoi test con la versione condivisa. –

+0

Non vedo questo sul mio sistema. @KerrekSB - ha ragione, non è qualcosa di cui preoccuparsi e Valgrind spedisce con un file di grandi dimensioni che sopprime la maggior parte di questi. Probabilmente è un po 'errato per la tua versione di libc/compilatore sul tuo sistema in qualche modo. – Flexo

risposta

10

Valgrind non funziona con -static?

Lo fa. Il problema non è in Valgrind, è in glibc, che non è pulito con Valgrind. Gli sviluppatori di glibc si sono rifiutati di risolvere questi problemi (perché i problemi sono di natura "non mi interessa" e fissano i costi (alcuni) cicli).

Quando si collega dinamicamente, questi errori provengono da libc.so.6 e possono essere facilmente soppressi, che è quello che fa Valgrind per impostazione predefinita.

Ma quando si collega in modo statico, questi errori provengono dal file eseguibile (che ora include il codice da libc.a) e quindi le soppressioni di Valgrind predefinite non li sopprimono.

È possibile scrivere nuove soppressioni (vedere Valgrind --gen-suppressions=yesdocumentation).

Oppure è possibile installare e utilizzare glibc-audit.

+0

Valgrind intercetterà malloc e chiamate gratuite quando libc è collegato staticamente? –

1

Se la libreria causa problemi in valgrind, è possibile ignorare tali problemi solo tramite writing suppression files.

Uno dei problemi che ho incontrato è AIndividuare qualcosa sul mucchio, in questo modo:

// library 
int * some = new int; 

// main links the library 
int main() 
{ 
} 

Questo esempio potrebbe segnalare un errore su perdite.

MODIFICA: se si dispone del codice sorgente della libreria, è possibile correggere l'errore (uso della variabile non inizializzata) e ricompilarlo.

Problemi correlati