これを試した
int main(void){
int a [10]; a [20] = 5;
}
gcc -Wall -O2 main.c
警告は出ません...
これはWindows(mingw)内のgccであり、この種の境界制限のバグを検出できません。
コンパイラにチェックするように指示する方法は?mingwはそれを行うことができますか?
ありがとう
これを試した
int main(void){
int a [10]; a [20] = 5;
}
gcc -Wall -O2 main.c
警告は出ません...
これはWindows(mingw)内のgccであり、この種の境界制限のバグを検出できません。
コンパイラにチェックするように指示する方法は?mingwはそれを行うことができますか?
ありがとう
配列の境界チェックを処理する試みがあります。デフォルトでは、santdard C99 は、配列境界の強制について何も述べていません。主にオーバーヘッドが大きいためだと思います。
そうは言っても、人々がそれに対処しようとした次のようなサイトを見ることができます。
静的解析を使用して配列境界違反などのエラーを検出できる、コンパイラ以外のツールが他にもあります。以前のSO の質問では、それらのいくつかについて説明しています。選択を制限する可能性のあるmingw環境で実行する必要がある場合は、注意してください。
質問はかなり古いですが、ここで得た別の答えだと思います。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};
^
ありがとうカジャル