2011-12-08 7 views
9

La maggior parte delle domande qui riportate fornisce un codice e riceve risposta da qualcuno che indica l'errore effettivo. La mia domanda riguarda i salti condizionali su valori non inizializzati in generale. Posso capire che un pezzo di memoria non deve essere necessariamente pulito alla fine di un programma se si è sicuri che questa allocazione viene eseguita una sola volta e sarà probabilmente necessaria durante la vita di un programma. Per quanto mi ricordo il sistema GType lascia molta memoria non voluta quando il programma termina. Questi blocchi non concordati possono essere visti come "falsi positivi". Ma un "salto condizionato o passaggio a un valore non inizializzato" può essere un falso positivo? L'unica cosa che riesco a inventare è una persona che implementa una (cattiva) randomizzazione semplicemente leggendo un indirizzo casuale (in cui l'indirizzo casuale è la parte più difficile;). Un altro esempio potrebbe essere l'hardware mappato su una parte della memoria che viene poi letta, ma questo è per lo più fatto dai driver e non dalle normali applicazioni utente. C'è qualche altro esempio (preferibilmente C) che potrebbe causare un tale falso positivo?Esiste comunque un messaggio di valgrind "Il salto condizionato o lo spostamento dipende dal valore non inizializzato" può essere un cosiddetto "falso positivo"

+1

[Ecco] (https://bugzilla.redhat.com/show_bug.cgi?id=518247) un falso positivo. – nos

+0

[Dovrei preoccuparmi che "Il salto condizionato o lo spostamento dipende dai valori non inizializzati"?] (Http://stackoverflow.com/questions/765913/) dalla barra laterale "Correlata" mostra (dopo tutte le modifiche) molto codice semplice che genera questo errore e Jared il perché e il percome. – dmckee

+0

@dmckee Ho letto velocemente quel thread e ho potuto trovare solo una risposta del poster al suo problema. Non vedo un falso positivo lì. – LittleFunnyMan

risposta

6

Ciò che Valgrind sta segnalando è che vede un salto basato su una lettura da un luogo per il quale sa che è stato assegnato dal programma ma per il quale non è stato visto l'inizializzazione. Questo potrebbe accadere se l'oggetto è inizializzato da una magia che Valgrind non conosce. Le architetture si evolvono costantemente e forse hai un'istruzione o un tipo di registro di cui valgrind non ne sa abbastanza.

Un'altra fonte difficile di tali non inizializzazioni è union s. Due fonti:

  • Per impostazione predefinita, solo per questi il ​​primo membro viene inizializzato e così quando un altro campo, oltre a quelle primo membro che potrebbe essere parte inizializzato.
  • Se i membri del union sono struct Possono avere imbottitura byte in posti diversi, e così parte di un membro può essere inizializzato se è stato assegnato a un membro diverso.

In alcuni casi potrebbe essere legittima da leggere anche queste cose (attraverso un unsigned char[] per esempio), quindi se si considera cose come un bug (falso positivo) o non è una questione di prospettiva.

+1

Grazie - l'utilizzo di 'memcmp' su una struttura imbottita mi ha dato esattamente questo problema! – Alnitak

4

Assolutamente! Una volta ho avuto il codice C del modulo

// compute a and, possibly, b 
if (a && b) { 
    // do stuff 
} 

in cui b è stato garantito da inizializzare se a fosse vero. Pertanto, non c'era modo che un valore non inizializzato di b potesse causare un problema. Tuttavia, gcc, durante l'ottimizzazione sufficientemente aggressiva, ha deciso di verificare prima il valore di b. Questo era accettabile dal momento che nessuno dei due ha avuto effetti collaterali, ma ha comunque causato il reclamo di valgrind.

Problemi correlati