c++ - gcc 检测到 "subindex out of bound"错误

标签 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]);
}

我认为上述现象与其说是一个bug,不如说是一种功能。我希望有人能帮我弄清楚会发生什么,和/或为什么编译器是这样设计的。非常感谢!

最佳答案

访问数组末尾之后的内存会导致 undefined behaviour .

gcc 非常好,可以检测并警告您其中的一些错误。但是,它没有义务这样做,当然也不能期望捕获所有此类错误。

关于c++ - gcc 检测到 "subindex out of bound"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552668/

相关文章:

c++ - 为全局模板化运算符指定模板参数的正确语法?

c++ - 存储数组的字符串

performance - 如何解释两个处理器之间巨大的执行速度差异?

c++ - 从内置 C 库获取月份名称的多种方法

c++ - C++ 中的一元运算符重载类型(新手)

c - 获取函数名称作为符号(而不是字符串)- C 预处理器

c++ - 为 c++20 编写输出迭代器

C++:将一个部分特化设置为等于另一个

c - 函数调用期间不兼容的指针类型

c - Unix 和 C 中的输出重定向