g++排序函数警告

4

当我使用以下代码编译器(-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;
} 

为什么会发生这种情况?

7
@Mat: 0当然了。全局原语总是被初始化为零。 - orlp
1
它是0。它通过BSS进行初始化。 - Bartek Banachewicz
2
两者在使用g++ 4.7.0编译时都没有警告! - trojanfoe
2
哪个GCC版本会给你这个警告?除了-Wall之外,还有其他的编译器标识吗? - Rafał Rawicki
2
尝试使用g++ 4.4到g++ 4.7,这些版本都没有在使用“-Wall”时给出任何警告。 - Prasoon Saurav
显示剩余5条评论
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版本的编译器中进行的。

总之,如果这对您真的是一个问题(即它不仅仅是一个好奇心),那么您可能需要考虑以下解决方法:

  • 升级到GCC 4.5.1或更高版本
  • 通过代码更改解决问题。如前所述,小的更改可能会防止触发警告
  • 使用-Wno-array-bounds关闭警告

-1

无论哪个代码编译时没有警告,两个代码中都存在一个错误。在这两个代码中,您都使用了未初始化的n(也是数组a [10])。

因此,在使用sort函数之前,您可能需要将数组“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;
}

2
数组的值和 n 被初始化为 0 - a-z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接