-内联函数 g++4.9.2 中的 Warray 边界虚假警告
-Warray-bounds bogus warning in inline function g++4.9.2
我收到了我遇到过的最奇怪的警告。我有一个内联函数,我正在做类似的事情
inline int f(int n)
{
int myarray[maxn];
myarray[n-1] = 1;
}
参数 maxn
在头文件中定义为 constexpr
。在我的代码中,传递给f
的参数n
总是小于或等于maxn
。但是,每当我编译时,我都会收到警告
warning: array subscript is above array bounds [-Warray-bounds]
在行myarray[n-1] = 1
.
它只发生在使用g++4.9
(clang++
不会发出任何警告,以及以前的g++
版本),并且仅当函数标记为inline
.如果我在函数中使用测试条件,例如
if(n > maxn) cerr << "ERROR!"<< endl;
甚至一个简单的显示语句
cout << n;
警告消失(if
当然被评估为false
,因此不会显示错误消息,因为我绝对确保n <= maxn;
)。
有谁知道这是否是一个g++
问题?你以前遇到过吗?
看起来数组边界检查的误报问题已经gcc
报告了好几次(这里和这里),例如这个错误报告 Picon[错误 c/59564]新增:误报数组 -Warray-bounds check with -O2 在使用 -02
和 gcc 4.8.2
时显示此代码,gcc 4.9.0
产生误报(实时查看):
int arr[1];
int n = 0;
int main() {
if (n <= 0) n = 0;
arr[n] = 0;
if (n <= 0) n = 0;
return 0;
}
所以这可能是回归或错误的不同形式,您应该提交错误报告。
相关文章:
- std::当在256字节边界上写入整数时,流的奇怪行为
- 使用不变量来确定二分搜索中的边界条件
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 在 64 位边界上对齐C++结构数组?
- std::数组边界检查如何工作?
- CGAL:如何创建填充边界曲线的曲面网格?
- 在 c++ 中是否允许创建具有运行时边界的数组?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++11:16 字节原子<>变量是否在 16 字节边界上自动对齐,从而允许CMPXCHG16B指令?
- 转换引用对象的边界框?
- 将迭代器作为 3 个元素的滑动窗口,可以超调边界(可能使用 Boost)
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 查找矩形的边界集
- 在sfml中获取可转换的边界框
- SystemC sc_signal数组内存边界
- 如何处理libstdc++跨执行边界抛出的异常
- BoostSpirit.Qi-针对原始数据类型进行边界检查
- 在运行时为随机分布类成员设置最小和最大边界?
- -内联函数 g++4.9.2 中的 Warray 边界虚假警告
- 警告:数组下标高于数组边界 [-Warray-bounds]