J'ai reçu de mystérieux messages de valgrind concernant des valeurs non initialisées, et l'origine de cette mauvaise valeur est un véritable mystère.
Il semble que valgrind montre l'endroit où la valeur unitialisée finit par être utilisée, mais pas l'origine de la valeur non initialisée.
==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)
Comme on peut le voir, cela devient assez cryptique surtout parce que lorsqu'il est dit par Class::MethodX, il pointe parfois directement vers ostream, etc. Peut-être est-ce dû à l'optimisation ?
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
Juste comme ça. Il y a quelque chose qui m'échappe ? Quelle est la meilleure façon d'attraper les mauvaises valeurs sans avoir à recourir à un travail de détective printf super long ?
Mise à jour :
J'ai trouvé ce qui n'allait pas, mais ce qui est étrange, c'est que valgrind ne l'a pas signalé lorsque la mauvaise valeur a été utilisée pour la première fois. Elle était utilisée dans une fonction de multiplication :
movespeed = stat.speedfactor * speedfac * currentbendfactor.val;
Où speedfac était un flottant unitialisé. Cependant, à ce moment-là, il n'a pas été signalé et ce n'est que lorsque la valeur doit être imprimée que j'obtiens l'erreur . Existe-t-il un paramètre pour valgrind permettant de modifier ce comportement ?