Poinpointing "Bedingter Sprung oder Bewegung hängt von nicht initialisierten Werten ab" Valgrind-Meldung

So habe ich eine mysteriöse Nachricht über nicht initialisierte Werte von valgrind erhalten und es war ziemlich rätselhaft, woher der schlechte Wert stammt.

Scheint, dass valgrind den Ort anzeigt, an dem der einheitliche Wert verwendet wird, aber nicht den Ursprung des nicht initialisierten Werts.

==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)

Wie zu sehen ist, wird es ziemlich kryptisch. Vor allem, weil es bei Class :: MethodX manchmal direkt auf ostream usw. verweist. Vielleicht liegt das an der Optimierung?

==11366==    by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)

Genau so. Fehlt mir etwas? Was ist der beste Weg, schlechte Werte zu fangen, ohne auf überlange Detektivarbeit zurückgreifen zu müssen?

Aktualisieren

Ich habe herausgefunden, was falsch ist, aber das Seltsame ist, dass valgrind es nicht gemeldet hat, als der schlechte Wert zum ersten Mal verwendet wurde. Es wurde in einer Multiplikationsfunktion verwendet:

movespeed = stat.speedfactor * speedfac * currentbendfactor.val;

Wo Speedfac war ein einheitlicher Schwimmer. Zu diesem Zeitpunkt wurde es jedoch nicht gemeldet und erst wenn der Wert gedruckt werden soll, erhalte ich den Fehler. Gibt es eine Einstellung für valgrind, um dieses Verhalten zu ändern?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage