驚いたことにgcc
、コンパイル時にこのエラーを見つけることができることがわかりましたC
。まだ警告をトリガーするコードを単純化しました。使用するテクニックの詳細を明確にするために質問を投稿します。以下はファイルの私のコードですa.c
int main(){
int a[1]={0};
return(a[1]);
}
私のgccバージョンはgcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
. を使用する場合gcc a.c -Wall
、警告はありません。を使用gcc -O1 a.c -Wall
すると、次の警告が表示されます。
warning: ‘a[1]’ is used uninitialized in this function [-Wuninitialized]
gcc -O2 a.c -Wall
(または)を使用すると、-O3
別の警告が表示されます。
warning: array subscript is above array bounds [-Warray-bounds]
最も驚くべきことはa[1]
、値を指定すると、上記のコンパイル オプションのいずれも警告を出さないことです。インデックスを膨大な数に変更しても警告はありません (もちろん、コンパイルされたファイルはオペレーティング システムに問題を引き起こし、追い出されます)。
int main(){
int a[1]={0};
a[2147483648]=0;
return(a[2147483648]);
}
上記の現象はバグというより機能だと思います。何が起こるか、および/またはコンパイラがそのように設計されている理由を理解するのを誰かが助けてくれることを願っています。どうもありがとう!