我意外地发现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]);
}
我认为上述现象与其说是一个bug,不如说是一种功能。我希望有人能帮我弄清楚会发生什么,和/或为什么编译器是这样设计的。非常感谢!
最佳答案
访问数组末尾之后的内存会导致 undefined behaviour .
gcc
非常好,可以检测并警告您其中的一些错误。但是,它没有义务这样做,当然也不能期望捕获所有此类错误。
关于c++ - gcc 检测到 "subindex out of bound"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552668/