4

array subscript is above array bound...当我编译以下代码 ( -Wall -O2)时, g++ 会发出警告

#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

在网上寻找与-Warray-boundsGCC 相关的问题时,似乎偶尔会出现与它有关的问题,但这些问题通常似乎与非常具体的代码场景有关。该功能似乎依赖于优化器 - 这就是为什么-O2您需要该选项才能看到问题。(参见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35903#c9,其中提到“需要-O2的原因是-Warray-bounds需要VRP发出警告”-VRP是值范围传播)。源代码的微小差异很容易导致优化器中的不同行为。

无论如何,我认为这些问题更重要的-Warray-bounds是它们似乎也与非常特定的编译器版本相关联。例如,报告了针对 4.4.3 的此错误 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43949)(据我所知,此错误可能是导致您发出警告的原因)为 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 未启动(也是数组 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 回答