4

これを試した

int main(void){

int a [10]; a [20] = 5;

}

gcc -Wall -O2 main.c

警告は出ません...

これはWindows(mingw)内のgccであり、この種の境界制限のバグを検出できません。

コンパイラにチェックするように指示する方法は?mingwはそれを行うことができますか?

ありがとう

4

3 に答える 3

2

配列の境界チェックを処理する試みがあります。デフォルトでは、santdard C99 は、配列境界の強制について何も述べていません。主にオーバーヘッドが大きいためだと思います。

そうは言っても、人々がそれに対処しようとした次のようなサイトを見ることができます。

http://williambader.com/bounds/example.html

于 2010-06-10T13:41:48.247 に答える
1

静的解析を使用して配列境界違反などのエラーを検出できる、コンパイラ以外のツールが他にもあります。以前のSO の質問では、それらのいくつかについて説明しています。選択を制限する可能性のあるmingw環境で実行する必要がある場合は、注意してください。

于 2010-06-10T15:06:15.883 に答える
1

質問はかなり古いですが、ここで得た別の答えだと思います。gcc でフル ビルドを実行する予定がある場合でも、clang コンパイラを試すことができます (たとえば、大規模プロジェクトでのナイトリー ビルドの場合)。それはかなりうまくいきました。

例は、配列サイズが 4 として宣言されているインデックス 4 にアクセスしようとしたときの出力です。

    ex9.c:17:2: warning: array index 4 is past the end of the array (which contains
          4 elements) [-Warray-bounds]
            numbers[4] = 4;
            ^       ~
    ex9.c:4:2: note: array 'numbers' declared here
            int numbers[4] = {0};
            ^

ありがとうカジャル

于 2013-07-14T09:54:09.557 に答える