4

array subscript is above array bound...次のコードをコンパイルすると、g++ で警告が表示されます ( -Wall -O2)

#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int n;
int main(){
    sort(a, a+n);

    return 0;
}

しかし、このコードは警告なしでコンパイルされます:

#include <iostream>
#include <algorithm>
using namespace std;
int a[100];
int n;
int main(){
    sort(a, a+n);

    return 0;
} 

なぜそれが起こるのですか?

4

2 に答える 2

1

GCC に関連する問題をネットで調べて-Warray-boundsいると、時々問題が発生するようですが、これらの問題は通常、非常に特定のコード シナリオに関連しているようです。この機能はオプティマイザーに依存しているようです。これが-O2、問題を確認するためにオプションが必要な理由です。( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35903#c9を参照してください。「これが -O2 を-Warray-bounds必要とする理由は、警告するために VRP が必要だからです」と言及されています。VRP は値の範囲の伝播です)。ソースのわずかな違いにより、オプティマイザで異なる動作が発生する可能性があります。

とにかく、これらの問題についてより重要なこと-Warray-boundsは、それらが非常に特定のコンパイラのバージョンにも関連付けられているように見えることだと思います。たとえば、このバグ (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43949) は 4.4.3 に対して報告されています (私が知る限り、このバグが警告の原因である可能性があります)。 4.2.4、4.5.1、および 4.6.0 では動作しますが、4.5.0 でも機能しません。それに対する修正は、コンパイラの 4.5.x バージョンに組み込まれたようです。

とにかく、結論: これが本当に問題である場合 (つまり、単なる好奇心ではない場合)、次の回避策/修正のいずれかを検討することをお勧めします。

  • 4.5.1 以上の GCC のバージョンに移行する
  • コードを変更して問題を回避してください。前述のように、小さな変更により、警告がトリガーされない場合があります
  • で警告をオフにします-Wno-array-bounds
于 2012-04-17T19:03:33.643 に答える
-1

どちらが警告なしでコンパイルされたかに関係なく、両方のコードにバグがあります。両方のコードで、n uninitiated (配列 a[10] も) を使用しています。

そのため、ソート関数で "n" を使用する前に、配列 "a" の長さを格納したい場合があります。

これがあなたのコードの適切なバージョンです -

#include <iostream>
#include <algorithm>
using namespace std;
const int n=10;
int a[n]={3,71,4,5,2,8,5,3,34,87};
int main(){
  sort(a,a+n);
  for(int i=0;i<n;i++)
    cout<<a[i]<<endl;
  return 0;
}
于 2012-04-17T17:28:29.377 に答える