Also habe ich einige mysteriöse nicht initialisierte Werte von Valgrind bekommen und es war ziemlich das Mysterium, woher der schlechte Wert kam."konditionaler Sprung oder Bewegung hängt von nicht initialisierten Werten ab" valgrind message
Scheint, dass Valgrind den Ort zeigt, an dem der unitialisierte Wert verwendet wird, aber nicht den Ursprung des nicht initialisierten Wertes.
==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 man sehen kann, ist es durchaus kryptischen wird .. vor allem, weil, wenn es von der Klasse sagen ist :: MethodX, ist es manchmal gerade Punkte usw. bis oStream Vielleicht ist dies eine Optimierung durch?
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
Einfach so. Gibt es etwas, das mir fehlt? Was ist der beste Weg, um schlechte Werte zu erfassen, ohne auf super-printf Detektivarbeit zurückgreifen zu müssen?
Update:
ich herausgefunden habe, was falsch war, aber das Merkwürdige ist, valgrind hat es nicht berichten, wenn der schlechte Wert zum ersten Mal verwendet wurde. Es wurde in einer Multiplikationsfunktion verwendet:
movespeed = stat.speedfactor * speedfac * currentbendfactor.val;
Wo Speedfac eine unitialisierte Float war. Zu diesem Zeitpunkt wurde es jedoch nicht gemeldet, und erst wenn der Wert gedruckt wird, erhalte ich den Fehler. Gibt es eine Einstellung für Valgrind, um dieses Verhalten zu ändern?
Was ist die minimale valgrind Version, um diese Funktion zu benutzen? Ich benutze 3.3.0 und es scheint die Option nicht zu mögen. –
@Robert: --track-origins wurde in valgrind 3.4.0 hinzugefügt – mark4o