41

gcc-4.9 の変更では、次のように書かれています。

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

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

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

これは、Undefined Behavior Sanitizer を GCC に追加する試みです。非常にアルファ版であることに注意してください。これまでのところ、それほど多くはありませんが、現時点では、ゼロのケースによる除算、INT_MIN / -1、およびさまざまなシフトのケース (負の値によるシフト、2 番目のオペランドが TYPE_PRECISION (first_operand) よりも >= の場合のシフト) を処理する必要があります。 (これまでのところ、整数型について)

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

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

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

誰かがそれについてもっと情報を持っていますか、またはそれが持つ機能は何ですか?

4

2 に答える 2

47

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

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このオプションは、符号付き整数のオーバーフロー チェックを有効にします。+、*、および単項と 2 進数の両方の結果が符号付き演算でオーバーフローしないことを確認します。整数昇格規則を考慮する必要があることに注意してください。つまり、次はオーバーフローではありません。

signed char a = SCHAR_MAX;
a++;

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

于 2013-12-23T07:13:23.127 に答える
1

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.
于 2016-03-28T07:07:58.317 に答える