c++ - GCC8.2如何启用警告: array subscript is above array bounds [-Warray-bounds]

标签 c++ c arrays gcc8

我想在gcc8.2下启用数组边界检查,这样可以帮助在编译期间检查数组下标是否越界,它可能会给出如下警告: 数组下标高于数组边界 [-Warray-bounds]

我使用 coliru 做了一个演示:

#include <iostream>

struct A
{
    int a;
    char ch[1];
};

int main() 
{
    volatile A test;
    test.a = 1;
    test.ch[0] = 'a';
    test.ch[1] = 'b';
    test.ch[2] = 'c';
    test.ch[3] = 'd';
    test.ch[4] = '\0';
    std::cout << sizeof(test) << std::endl
              << test.ch[1] << std::endl;
}

编译运行命令:

g++ -std=c++11  -O2 -Wall main.cpp  && ./a.out

输出如下所示,没有任何警告或错误。

8
b

那么gcc8.2支持数组边界检查吗?如何启用它?

编辑:

更进一步,基于第一个answer ,如果去掉volatile A test;行的volatile,是否可以启用数组边界检查?

谢谢。

最佳答案

默认情况下,-Warray-bounds 不会对结构末尾的数组发出警告,大概是为了避免对预标准化灵活数组成员的误报。要启用该检查,请使用 -Warray-bounds=2Demo .

另请注意,-Warray-bounds 仅在 -ftree-vrp 标志处于事件状态时有效,默认情况下为 -O2 和更高。

关于c++ - GCC8.2如何启用警告: array subscript is above array bounds [-Warray-bounds],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57301108/

相关文章:

c++ - 编译器错误与链接器错误?

c++ - WinINet InternetGetProxyInfo : error 1003 ERROR_CAN_NOT_COMPLETE

c - 为什么我不能在C编程中将char写入二进制文件?

c++ - 什么时候整数到浮点转换无损?

java - 获取所有 Android 联系人和详细信息并放入单个多维数组中

Java - 像二维数组一样填充多维(二维)ArrayList

c++ - 具有 mkl 后端的特征库的系数数组操作的性能

c++ - 无法从其他类的函数访问对象的参数

c - c 中的 scanf 命令出现问题(在论坛中找不到其他地方)

javascript - JavaScript 数组是关联的吗?