[C++] 精確定位“有條件跳轉或移動取決於未初始化的值”(valgrind消息)


Answers

這意味著你正試圖打印輸出一個至少部分未初始化的值。 你能縮小它,以便你確切知道那是什麼價值嗎? 之後,通過您的代碼追踪它的初始化位置。 機會是,你會看到它沒有被完全初始化。

如果您需要更多幫助,發布源代碼的相關部分可能會允許某人提供更多指導。

編輯

我發現你發現了這個問題。 請注意,valgrind監視條件跳轉或基於單位變量移動 。 這意味著如果程序的執行由於未初始化的值而改變(例如程序在if語句中採用不同的分支),它將只會發出警告。 由於實際算術不涉及有條件的跳躍或移動,因此valgrind並未警告您。 相反,它會將“未初始化”狀態傳播到使用它的語句的結果。

它似乎並不直接警告你,但正如mark4o指出的那樣,它是這樣做的,因為未初始化的值始終在C中使用(例如:結構中的padding, realloc()調用等),所以這些警告由於誤報頻率而不會非常有用。

Question

所以我一直在從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改變這種行為的設置?