2

驚いたことに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]);
}

上記の現象はバグというより機能だと思います。何が起こるか、および/またはコンパイラがそのように設計されている理由を理解するのを誰かが助けてくれることを願っています。どうもありがとう!

4

2 に答える 2

3

配列の末尾を超えてメモリにアクセスすると、未定義の動作が発生します。

gccこれらのエラーのいくつかを検出して警告するのに十分なほど優れています。ただし、そうする義務はなく、そのようなエラーをすべてキャッチすることは期待できません。

于 2013-08-31T20:50:41.400 に答える
3

コンパイラは、この種のエラーの診断を提供する必要はありませんが、gcc が役立つことがよくあります。これらの警告は、最適化のために行われた静的解析パスの副産物として部分的に発生することが多いことに注意してください。つまり、お気づきのように、このような警告は指定された最適化レベルに依存することがよくあります。

于 2013-08-31T21:00:12.383 に答える