Vì vậy, tôi đã nhận được một số thông điệp giá trị chưa được xác định bí ẩn từ valgrind và nó khá bí ẩn về việc giá trị xấu bắt nguồn từ đâu.
Có vẻ như valgrind cho thấy nơi mà giá trị đơn vị cuối cùng được sử dụng, nhưng không phải là nguồn gốc của giá trị chưa được khởi tạo.
==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)
Có thể thấy, nó trở nên khá khó hiểu .. đặc biệt bởi vì khi nó được nói bởi Class :: MethodX, đôi khi nó chỉ thẳng vào việc phát sóng, v.v. Có lẽ điều này là do tối ưu hóa?
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
Chỉ cần như vậy. Có thiếu điều gì không? Cách tốt nhất để bắt các giá trị xấu mà không cần phải dùng đến công việc thám tử printf siêu dài là gì?
Cập nhật:
Tôi đã tìm ra những gì sai, nhưng điều kỳ lạ là, valgrind đã không báo cáo khi giá trị xấu được sử dụng lần đầu tiên. Nó được sử dụng trong hàm nhân:
movespeed = stat.speedfactor * speedfac * currentbendfactor.val;
Trong đó speedfac là một float đơn vị. Tuy nhiên, tại thời điểm đó nó không được báo cáo và cho đến khi giá trị được in mà tôi gặp lỗi .. Có cài đặt nào cho valgrind để thay đổi hành vi này không?