2011-12-08 90 views
9

我在這裏找到的大多數問題提供了一段代碼,並得到有人指出實際錯誤的答案。我的問題是關於未初始化值的條件跳轉。我可以理解,如果確信這個分配只執行一次,並且在程序生命週期中可能需要,那麼在程序結束時不應該清除一段內存。據我所知,當程序終止時,GType系統會留下很多不確定的內存。這些未實現的區塊可被視爲「誤報」。但是,「有條件跳轉還是繼續執行未初始化的值」是一種誤報?我唯一能想到的就是有人通過讀取隨機地址(隨機地址本身就是棘手的部分)來實現(壞)隨機函數。另一個例子可能是硬件映射到內存的一部分,然後讀取,但這主要由驅動程序完成,而不是由普通用戶應用程序完成。還有其他的例子(最好是C)會導致這種誤報嗎?有沒有反正valgrind消息「條件跳轉或移動取決於未初始化的值」可以是所謂的'假正面'

+1

[Here's](https://bugzilla.redhat.com/show_bug.cgi?id=518247)誤報。 – nos

+0

[我應該擔心「有條件的跳轉或移動取決於未初始化的值」?](http://stackoverflow.com/questions/765913/)從「相關」邊欄顯示(經過所有編輯)一個非常產生這個錯誤的簡單代碼和Jared的原因和因此。 – dmckee

+0

@dmckee我很快就讀到了這個帖子,只能找到他的問題的答案。我沒有看到那裏的假陽性。 – LittleFunnyMan

回答

6

什麼Valgrind是報告的是,它認爲基於從它知道,它是由程序分配一個位置讀取跳躍,但對於其沒有看到初始化。如果對象被valgrind不知道的一些魔法初始化,可能會發生這種情況。體系結構不斷髮展,也許你有一個valgrind不太瞭解的指令或註冊類型。

這種非初始化的另一個困難來源是union s。兩個來源:

  • 每默認情況下,這些只有第一成員初始化等 當另一場超越了部分可能是 未初始化的是第一個成員。
  • 如果union的成員struct他們可能有填充 字節在不同的地方,所以成員的一部分,可能是 初始化,如果你分配到不同的成員。

在某些情況下,它可能是合法的,即使(通過unsigned char[]例如)讀這些東西,如果你認爲這樣的事情作爲一個bug(假陽性)或不是角度的問題。

+1

謝謝 - 在填充結構上使用'memcmp'正是給了我這個問題! – Alnitak

4

絕對!我曾經在這b是保證被初始化,如果a是真實的形式

// compute a and, possibly, b 
if (a && b) { 
    // do stuff 
} 

的C代碼。因此,未初始化的值b可能會導致問題。但是,在進行充分積極優化時,決定首先檢查b的值。這是可以接受的,因爲這些檢查都沒有任何副作用,但它仍然導致valgrind抱怨。

相關問題