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"
risposta
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
sonostruct
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.
Grazie - l'utilizzo di 'memcmp' su una struttura imbottita mi ha dato esattamente questo problema! – Alnitak
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
.
- 1. Valgrind "Salto condizionale o spostamento dipende dal/i valore/i non inizializzato/i" Errore
- 2. localizzare "il salto condizionale o lo spostamento dipende dal/i valore/i non inizializzato/i" valgrind messaggio
- 3. valgrind Il salto o lo spostamento condizionato dipende dai valori non inizializzati, ciò indica perdita di memoria?
- 4. Esiste un semplice esempio di rapporto "possibilmente perso" di valgrind falso positivo?
- 5. Potrebbe essere un rapporto di perdita di memoria positivo falso?
- 6. Questo comportamento non definito o un falso avviso positivo?
- 7. ZF2: il modulo non può essere inizializzato
- 8. Perché un membro di dati statici non può essere inizializzato?
- 9. Esiste un algoritmo per lo spostamento di intervalli?
- 10. Un riferimento non può essere NULL o può essere NULL?
- 11. C: Valgrind: utilizzo del valore non inizializzato della dimensione 4 E Utilizzo del valore non inizializzato della dimensione 4
- 12. C++: Può boost :: scopeed_ptr essere inizializzato all'interno di un costruttore?
- 13. Un checksum TCP può produrre un falso positivo? Se sì, come viene affrontato?
- 14. quello che sarà il valore di default di un valore booleano non inizializzato in C++
- 15. Errore: il valore non può essere nullo
- 16. Sonarqube 5 - Come contrassegno il falso positivo?
- 17. Restituisce sempre il valore positivo
- 18. Falso positivo: la precondizione è ridondante
- 19. valgrind Messaggio "Ucciso"
- 20. Provare a eliminare un valore predefinito, ma ottenere un messaggio che non esiste sul server
- 21. specificare un valore può essere una stringa o null con lo schema json
- 22. Sonarqube calamaro: S2095 falso positivo
- 23. Errori Valgrind se collegati con -static - Perché?
- 24. Un argomento predefinito C++ può essere inizializzato con un altro argomento?
- 25. (R.dimen.padding_medium) Non può essere risolto o non è un campo?
- 26. Esiste comunque lo schema JSON-LD non inlineato
- 27. Spostamento di una lambda: una volta spostato, acquisito un tipo di solo spostamento, come può essere utilizzato il lambda?
- 28. Sono noti problemi di falsi positivi con Valgrind?
- 29. WCF - MessageBodyMember - Stream - "Il valore non può essere nullo"
- 30. Perché XMLHttpRequest ProgressEvent.lengthComputable può essere falso?
[Ecco] (https://bugzilla.redhat.com/show_bug.cgi?id=518247) un falso positivo. – nos
[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
@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