未检测到越界指针算法?
Out of bounds pointer arithmetic not detected?
根据维基百科和这个,这个代码是未定义的行为:
#include <iostream>
int main(int, char**) {
int data[1] = {123};
int* p = data + 5; // undefined behavior
std::cout << *(p - 5) << std::endl;
}
用clang++-6.0 -fsanitize=undefined
编译并执行,检测到未定义的行为,这太棒了,我收到以下消息:
ub.cpp:5:19: runtime error: index 5 out of bounds for type 'int [1]'
但是当我不使用数组时,无法检测到未定义的行为:
#include <iostream>
int main(int, char**) {
int data = 123;
int* p = &data + 5; // undefined behavior
std::cout << *(p - 5) << std::endl;
}
消毒器未检测到任何内容,即使这仍然是未定义的行为。瓦尔格林德也没有表现出任何问题。有什么方法可以检测这种未定义的行为吗?
由于我从不访问任何无效数据,因此这不是在 C 程序中跟踪数组越界访问/写入的推荐方法的副本。
该标准非常明确地规定,大多数形式的未定义行为"不需要诊断"。这意味着您的编译器没有义务诊断 UB(这也是不合理的,因为在许多情况下很难这样做)。相反,编译器可以假设你"当然没有"编写任何UB并生成代码,就好像你没有一样。如果你这样做了,那就是你,你可以保留破碎的碎片。
某些工具(如asan
和ubsan
以及将编译器警告级别转换为 11)将为您检测一些UB。但不是全部。
你的编译器实现者不会伤害你。他们确实会尽可能警告您UB。因此,至少您应该启用所有警告,并让他们尽其所能为您提供帮助。
检测UB的一种方法是深入了解C++标准并非常仔细地阅读代码。但是,您真的不能做得比这更好+让一些工具帮助您找到唾手可得的果实。你只需要知道(所有)规则并知道你在做什么。
C++没有训练轮或类似的东西。
相关文章:
- 使用指针算法修改函数中的 2D 数组
- 通过指针算法计算数组长度
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- 由于指针算法错误,代码在 memcpy 中崩溃
- 在 c++ 中使用指针算法
- 通过指针算法访问结构数据成员
- 使用字符** argv 时如何避免指针算法
- 通过指针算法调用结构的结构属性
- R-->cpp 如何让C++指针与 sourceCpp (Bellman Ford 算法)
- 是什么让这种易失性打破了结构的指针算法?
- 使用指针算法调用结构内的结构数组
- USACO 牛障碍赛:迪尼克的算法/对指针未注册的更改
- 指针算法:*p++ 和 (*p)++ 等等
- 指针算法是否适用于迭代器?
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 使用指针算法搜索 2D 数组
- 未检测到越界指针算法?
- 指针似乎迷失在递归算法中
- 为什么这种递归子集和算法会导致指针分配错误
- 分类算法和对象指针的问题