2015-12-07 11 views
5

私は、Ubuntu 14.04でClang 3.7.0のMemory Sanitizerを使って遊んでいます。次のコードは完璧に動作します:Memory Sanitizer

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

付きでコンパイルされたとき

#include <cstdio> 

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

    return 0; 
} 

私はエラーを期待していました。メモリサニタイザは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フラグも使用され、すべての警告がエラーになります。