g ++排序功能警告

时间:2012-04-17 12:21:45

标签: c++ sorting stl g++

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

为什么会这样?

2 个答案:

答案 0 :(得分:1)

当在网上讨论与GCC中-Warray-bounds相关的问题时,似乎偶尔出现问题,但这些问题通常似乎与非常具体的代码方案有关。该功能似乎依赖于优化器 - 这就是为什么-O2选项是您查看问题所必需的原因。 (请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35903#c9,其中提及&#34;这需要-O2的原因是-Warray-bounds要求VRP警告&#34; - 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 :(得分:-1)

无论哪一个编译都没有警告,两个代码都有一个错误。在你使用的两个代码中都没有启动(也是数组a [10])。

因此,在sort函数中使用“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;
}