2015-12-07 70 views
5

我在Ubuntu 14.04上使用Clang 3.7.0的Memory Sanitizer進行遊戲。下面的代碼不會很好地工作:內存消毒劑

#include <cstdio> 

int main() { 
    double ans; 
    printf("Hello World: %f\n", ans); 

    return 0; 
} 

clang++ -g -O1 -fsanitize=memory -fsanitize-memory-track-origins=2 -fomit-frame-pointer sanitize.cpp -o sanitize 

我期待一個錯誤編譯。 Memory Sanitizer是否記住了ans未初始化的事實?

感謝您的幫助。

+0

嘗試將ans改爲char *! – Matt

+0

@Matt:WTF? –

+0

由於明顯缺乏任何研究而降低。 –

回答

5

從clang santitizer文檔中可以清楚地看出,它只處理來自動態分配內存的單元化內存讀取。自動記憶不是清潔劑檢查的一部分。

+0

謝謝。我現在明白我的問題很愚蠢,因爲這種檢查可以靜態進行。 – InsideLoop

0

Valgrind memcheck可以用來檢測未初始化的堆棧值。

Valgrind的文檔:

對於從堆塊始發未初始化值,MEMCHECK示出了塊被分配。對於源自堆棧分配的未初始化值,Memcheck可以告訴你哪個函數分配了該值,但不超過該值 - 通常它會顯示該函數的開始大括號的源位置。所以你應該仔細檢查所有函數的局部變量是否被正確初始化。

參考: http://valgrind.org/docs/manual/mc-manual.html

1

你不需要任何消毒趕上這個錯誤。編譯器可以在編譯時計算出這個錯誤(運行時的清理器和valgrind工作)。事實上,如果您打開警告,所有的GCC Clang和ICC都會對此代碼發出警告。該特定警告由-Wuninitialized標誌控制。一般來說,始終使用高警告級別是一種很好的做法。我會建議警告標誌的下列組合,尤其是在學習的語言:

-Wall -Wextra -pedantic 

如果你得到一些誤報,只有經過嚴格檢查,他們是真的假的,你可以禁用特定的警告。沒有理由不使用警告標誌。有些項目甚至使用-Werror標誌,將所有警告轉爲錯誤。