所以我从valgrind得到了一些神秘的未初始化的值消息,关于坏值是从哪里来的,这是相当神秘的。
似乎valgrind显示了使用单一化值的位置,但没有显示未初始化值的来源。
==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)
可以看出,它变得非常神秘..尤其是因为当它使用Class::MethodX时,它有时会直接指向ostream等,也许这是由于优化?
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
简单得不得了。我是不是漏掉了什么?捕获不好的值而不必求助于超长的printf侦测工作的最佳方法是什么?
更新:
我发现了问题所在,但奇怪的是,valgrind在第一次使用坏值时没有报告它。它被用在乘法函数中:
movespeed = stat.speedfactor * speedfac * currentbendfactor.val;
其中speedfac是一个单一化的浮动。但是,当时没有报告,直到要打印该值时,我才得到错误。是否有针对valgrind的设置来更改此行为?
https://stackoverflow.com/questions/2612447
复制相似问题