【发布时间】:2019-04-25 18:02:44
【问题描述】:
根据Wikipedia 和this,这段代码是未定义的行为:
#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;
}
消毒剂没有检测到任何东西,即使这是仍然未定义的行为。 Valgrind 也没有显示任何问题。有什么方法可以检测到这种未定义的行为?
由于我从不访问任何无效数据,因此这不是 Recommended way to track down array out-of-bound access/write in C program 的重复。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。