未检测到越界指针算法?

Out of bounds pointer arithmetic not detected?

本文关键字:算法 指针 越界 检测      更新时间:2023-10-16

根据维基百科和这个,这个代码是未定义的行为:

#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并生成代码,就好像你没有一样。如果你这样做了,那就是你,你可以保留破碎的碎片。

某些工具(如asanubsan以及将编译器警告级别转换为 11)将为您检测一些UB。但不是全部。

你的编译器实现者不会伤害你。他们确实会尽可能警告您UB。因此,至少您应该启用所有警告,并让他们尽其所能为您提供帮助。

检测UB的一种方法是深入了解C++标准并非常仔细地阅读代码。但是,您真的不能做得比这更好+让一些工具帮助您找到唾手可得的果实。你只需要知道(所有)规则并知道你在做什么。

C++没有训练轮或类似的东西。