Quindi ho ricevuto alcuni misteriosi messaggi di valori non inizializzati da valgrind ed è stato piuttosto il mistero da dove proveniva il valore errato.localizzare "il salto condizionale o lo spostamento dipende dal/i valore/i non inizializzato/i" valgrind messaggio
Sembra che valgrind mostri il luogo in cui viene utilizzato il valore unitializzato, ma non l'origine del valore non inizializzato.
==11366== Conditional jump or move depends on uninitialised value(s)
==11366== at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E31B4: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42EE56F: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
==11366== by 0x810B9F1: Snake::Snake::update() (snake.cpp:257)
==11366== by 0x81113C1: SnakeApp::updateState() (snakeapp.cpp:224)
==11366== by 0x8120351: RoenGL::updateState() (roengl.cpp:1180)
==11366== by 0x81E87D9: Roensachs::update() (rs.cpp:321)
Come si può vedere, si fa piuttosto criptico .. soprattutto perché quando si sta dicendo da Class :: MethodX, a volte punta dritto al ostream ecc Forse questo è dovuto all'ottimizzazione?
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
Proprio così. C'è qualcosa che mi manca? Qual è il modo migliore per ottenere cattivi valori senza dover ricorrere a un lavoro investigativo di lunghissima stampa?
Aggiornamento:
ho scoperto cosa era sbagliato, ma la cosa strana è, valgrind non segnalarlo quando il valore di cattivo è stato utilizzato prima. È stato utilizzato in una funzione di moltiplicazione:
movespeed = stat.speedfactor * speedfac * currentbendfactor.val;
Dove speedfac era un galleggiante unitializzato. Tuttavia, in quel momento non è stato segnalato e non fino a quando il valore deve essere stampato che ottengo l'errore .. Esiste un'impostazione per valgrind per modificare questo comportamento?
Qual è la versione di Valgrind minima per utilizzare questa funzione? Sto usando 3.3.0 e non sembra gradire l'opzione. –
@Robert: --track-origini è stato aggiunto in valgrind 3.4.0 – mark4o