4

clangのcatch-undefined-behaviorフラグについて質問があります。Cで書かれた大きなプロジェクトで試してみました。ある時点で、ユーザーから提供された整数値(i)が到着します。次に、次のコードを追加しました。

int arr[3]
arr[i] = 1234;

しかし、gdbを使用してコードを実行すると、変数iの値が4以上の場合にのみ停止します。したがって、値3をiに渡すと、停止せずに範囲外の配列にアクセスします。

これは-fcatch-undefined-behaviorの既知の制限ですか?または、アクセスがスタックフレームの外側にあるかどうかだけをチェックし、ローカルアレイの外側にはないかどうかをチェックしますか?

よろしくクリスチャン

PS:コンパイラ/リンカーとしてclang +llvm3.0を使用しています。ターゲットはx86です。プログラムは、WindowsXPボックスのxubuntu12.04仮想マシン内で実行されます。

4

1 に答える 1

1

ISO C 標準の付属書 J には、質問に関連する次の未定義の動作がリストされています。

  • 配列オブジェクトまたは整数型へのポインターの加算または減算は、同じ配列オブジェクト (6.5.6) を指していないか、またはその直後を指していない結果を生成します。
  • 配列オブジェクトおよび整数型への、またはそのすぐ後のポインターの加算または減算は、配列オブジェクトのすぐ先を指す結果を生成し、評価される単項 * 演算子のオペランドとして使用されます (6.5.6)。

あなたの投稿によると、Clang-fcatch-undefined-behaviorはこれら 2 つのうち最初のものしかキャッチしないようです。

于 2012-10-27T12:36:51.913 に答える