gcc检测“subindex out of bound”错误

时间:2013-08-31 20:46:28

标签: c++ c gcc

令人惊讶的是,我发现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]);
}

我认为上述现象更多的是功能而非错误。我希望有人帮我弄清楚发生了什么,和/或编译器设计的原因。非常感谢!

2 个答案:

答案 0 :(得分:4)

访问数组末尾的内存会产生undefined behaviour

gcc非常好,可以用来检测并警告你一些错误。但是,它没有义务这样做,当然也不能指望所有这样的错误。

答案 1 :(得分:4)

编译器不需要为此类错误提供诊断,但gcc通常能够提供帮助;请注意,这些警告通常部分地作为为优化目的而进行的静态分析过程的副产品而出现,这意味着,正如您所注意到的,此类警告通常取决于指定的优化级别。