web-dev-qa-db-ja.com

gcc-4.9未定義の動作サニタイザー

gcc-4.9の変更点 には次のように書かれています:

UndefinedBehaviorSanitizer(ubsan)、未定義の高速動作検出器が追加され、-fsanitize = undefinedで有効にできます。実行時に未定義の動作を検出するために、さまざまな計算が組み込まれます。 UndefinedBehaviorSanitizerは現在、CおよびC++言語で使用できます。

私はこの質問( 未定義の動作を検出するC++実装? )を見ましたが、かなり古いようです。

このリンク( http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html )にはいくつかの情報がありますが、数か月前のものです。

これは、未定義の動作サニタイザーをGCCに追加する試みです。これは非常にアルファ版であることに注意してください。これまでのところそれほど多くは行われていませんが、現時点ではゼロケースによる除算、INT_MIN/-1、およびさまざまなシフトケース(負の値によるシフト、第2オペランドがTYPE_PRECISION(first_operand)よりも大きい場合のシフト)、および(整数型については、これまでのところ。)

私が読んだことから、それはgccからLLVMに移植されています。

私は(5 / 0)で試してみましたが、唯一の違いはこの出力のようです:

main.cpp:5:19: runtime error: division by zero

誰かそれについてそれ以上の情報やそれが持っている機能はありますか?

34
user1508519

これは、このようなチェックを追加するためのフレームワークであり、未定義の動作のすべての形式を検出する試みではありません(「問題を停止する」という意味ではほぼ確実に不可能です)。

GCCドキュメント は、これらを現在サポートされているチェックとしてリストします。

-fsanitize=undefined UndefinedBehaviorSanitizerを有効にします。これは、未定義の高速動作検出器です。実行時に未定義の動作を検出するために、さまざまな計算が組み込まれます。現在のサブオプションは次のとおりです。

-fsanitize=shiftこのオプションを使用すると、シフト演算の結果が未定義でないことを確認できます。未定義と正確に見なされるものは、CとC++の間、およびISO C90とC99の間などで若干異なることに注意してください。

-fsanitize=integer-divide-by-zero INT_MIN/-1除算だけでなく、ゼロによる整数除算も検出します。

-fsanitize=unreachableこのオプションを使用すると、コンパイラは__builtin_unreachable呼び出しを代わりに診断メッセージ呼び出しに変換します。 __builtin_unreachable呼び出しに到達したときの動作は未定義です。

-fsanitize=vla-boundこのオプションは、可変長配列のサイズが正であることを確認するようコンパイラーに指示します。標準では代わりに例外をスローする必要があるため、このオプションは-std = c ++ 1yモードでは効果がありません。

-fsanitize=nullこのオプションは、ポインタチェックを有効にします。特に、このオプションをオンにして構築されたアプリケーションは、NULLポインターを逆参照しようとした場合、または参照(おそらく右辺値参照)がNULLポインターにバインドされている場合にエラーメッセージを発行します。

-fsanitize=returnこのオプションは、returnステートメントのチェックを有効にします。このオプションをオンにしてビルドされたプログラムは、実際に値を返さずに非void関数の終わりに達したときにエラーメッセージを発行します。このオプションはC++でのみ機能します。

-fsanitize=signed-integer-overflowこのオプションは、符号付き整数オーバーフローチェックを有効にします。 +、*、および単項と二項の両方の結果が、符号付き算術演算でオーバーフローしないことを確認します。整数の昇格規則を考慮する必要があることに注意してください。つまり、以下はオーバーフローではありません。

signed char a = SCHAR_MAX;
a++;

-ftrapvは、符号付きオーバーフローのトラップを発生させます-fsanitize=undefinedは診断メッセージを表示します。これは現在、C言語ファミリの言語でのみ機能します。

41
Nemo

UndefinedBehaviorSanitizer にリストされているオプションの完全なリスト

GCC 5リリースシリーズから抽出された最新のGCC 5.0追加:変更、新機能、および修正 以下にリストされています。

UndefinedBehaviorSanitizerは、いくつかの新しいサニタイズオプションを取得しました。

-fsanitize=float-divide-by-zero: detect floating-point division by zero;
-fsanitize=float-cast-overflow: check that the result of floating-point type to integer conversions do not overflow;
-fsanitize=bounds: enable instrumentation of array bounds and detect out-of-bounds accesses;
-fsanitize=alignment: enable alignment checking, detect various misaligned objects;
-fsanitize=object-size: enable object size checking, detect various out-of-bounds accesses.
-fsanitize=vptr: enable checking of C++ member function calls, member accesses and some conversions between pointers to base and derived classes, detect if the referenced object does not have the correct dynamic type.
1
Gayan Pathirage