2009-04-28 11 views
16

Esistono noti falsi positivi con Valgrind? Ricevo un "Salto condizionato o spostamento dipendente da valori non inizializzati" con la funzione fmemopen, scrivendo in C e compilando con GCC. Posso essere sicuro che sia reale?Sono noti problemi di falsi positivi con Valgrind?

MODIFICA: sono noti problemi che non si trovano nei file di soppressione? Ci sono alcune cose che si possono fare in un programma, che non sono veramente errori ma Valgrind dirà che lo sono? Se ci sono problemi noti, una lista sarebbe carina.

risposta

13

Sì, ci sono falsi positivi con Valgrind, ecco perché ha i file di soppressione per particolari versioni di glibc e gcc, per esempio. I falsi positivi possono sorgere se si utilizza valgrind precedente con i nuovi gcc e glibc, vale a dire valgrind 3.3 con glibc 2.9.

Detto questo, si devono ancora esaminare questione e scoprire se è davvero un falso positivo (se questo risulta essere il caso, è possibile scrivere una soppressione per voi stessi) o è un vero e proprio bug nel tuo programma.

Non c'è un modo semplice e veloce per dire cosa sta succedendo qui, ma in questo caso sospetto che stiate passando il valore non inizializzato dal vostro codice al codice della libreria. Prova l'opzione Valgrind --track-origins=yes. Mostrerà da dove viene il valore non inizializzato. Se è il tuo codice, probabilmente dovresti inizializzarlo. Se è all'interno della libreria, potrebbe essere il falso positivo o, ancora, i cattivi valori degli argomenti della chiamata alla libreria potrebbero causarne la causa, quindi controllali.

+0

Come posso scoprire se si tratta di un falso positivo? –

+0

Ho aggiunto alcuni suggerimenti alla mia risposta, speriamo che aiuti. –

+0

Direi che supponiamo che tutti i problemi segnalati siano in realtà problemi finché non si è verificato senza dubbio che lo è. È facile liquidare qualcosa come un falso positivo o un bug in un'altra libreria o qualsiasi altra cosa quando il problema è, in effetti, un vero problema nel proprio codice. Ricorda: selezionare probabilmente non è rotto ;-) Certo, ci saranno casi in cui è davvero un falso positivo ... – Dan

2

Valgrind viene fornito con una soppressione degli errori predefinita, ma non coprono affatto tutte le librerie.

Gli strumenti di controllo degli errori rilevano numerosi problemi nelle librerie di base, come ad esempio la libreria GNU C, e le librerie client X11, che vengono pre-installato nel sistema GNU/Linux. Non è possibile sistemarli facilmente, ma non si vogliono vedere questi errori (e sì, ce ne sono molti!). Così Valgrind legge un elenco di errori da sopprimere all'avvio. Un file di soppressione predefinito viene creato dallo script ./configure al momento della creazione del sistema.

È possibile creare il proprio error suppressions che si sa sono irrilevanti per il codice.

1

La motivazione di Debian SSL non è stata motivata dalla correzione di alcuni falsi positivi con Valgrind?

+2

Dipende da cosa intendi con "falso positivo". Era un uso deliberato della memoria non inizializzata in OpenSSL, come una delle molte fonti di casualità. Valgrind era del tutto corretto nell'avvertirlo (anche se era innocuo). –

+4

@BaffeBoyois: Non era innocuo, come dimostrano gli infami bug di Debian.Se Debian memsetting il buffer su zero ha rotto la generazione di chiavi sicure, un compilatore cambia nel modo in cui è allocata la memoria dello stack (o una modifica della libreria in malloc, se proveniva dall'heap) potrebbe facilmente portare alla memoria tutto allo zero e rottura generazione sicura delle chiavi. L'uso di memoria non inizializzata per qualsiasi scopo, incluso ottenere l'entropia, è un bug grave. –

+2

@R: Il bug di Debian non era che avessero troppa poca entropia quando hanno smesso di usare la memoria non inizializzata come sorgente. Fu così che, quando cercarono di smettere di usare la memoria non inizializzata, aggiustarono la cosa sbagliata e accidentalmente smise anche di usare la maggior parte delle altre fonti di entropia. La semplice rimozione della memoria non inizializzata sarebbe andata bene. –