6

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

私はエラーを期待していました。ans が初期化されていないという事実を Memory Sanitizer はキャッチしませんか?

ご協力いただきありがとうございます。

4

3 に答える 3

1

このエラーをキャッチするために Sanitizer は必要ありません。コンパイラは、コンパイル時にこのエラーを検出できます (サニタイザーと valgrind は実行時に機能します)。実際、警告をオンにすると、GCC Clang と ICC のすべてがこのコードに対して警告を発します。この特定の警告は-Wuninitializedフラグで制御されます。一般に、常に高い警告レベルを使用することをお勧めします。特に言語を学習している間は、次の警告フラグの組み合わせをお勧めします。

-Wall -Wextra -pedantic

誤検知が発生した場合は、それらが本当に間違っていることを厳密に確認した後にのみ、特定の警告を無効にすることができます。警告フラグを使用しない理由はありません。一部のプロジェクトでは-Werror、フラグを使用して、すべての警告をエラーに変えています。

于 2015-12-08T01:14:31.317 に答える