그래서 나는 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가이 동작을 변경하기위한 설정이 있습니까?