未定义的卫生化无法检测到简单的堆栈外误差
Undefined sanitization unable to detect a simple stack out-of-bound error
#include <iostream>
void fill(int *);
int main() {
int a[1];
int b[1];
a[0] = 1;
b[0] = 2;
fill(a);
std::cout << *a << " " << *b << std::endl;
}
void fill (int * x) {
x[1] = 3;
}
此代码会产生一个不合时宜的情况,其中堆栈值b[0]
被fill(a)
覆盖。
该代码已使用
编译g++ main.cpp -fsanitize=undefined -lstdc++ -lubsan
但是,消毒剂无法检测到错误。
我想念什么吗?
我错过了什么吗?
是。地址Santizer检测到堆栈溢出,而不是UB Santizer。用-fsanitize=address
编译片段给出
=17847==ERROR: AddressSanitizer: stack-buffer-overflow on address ... at pc ... #0 0x10f7f5d44 in fill(int*) (a.out:x86_64+0x100000d44) #1 0x10f7f5b81 in main (a.out:x86_64+0x100000b81) #2 0x7fff5f490014 in start (libdyld.dylib:x86_64+0x1014) ...
从技术上讲,堆栈上的范围访问确实会导致不确定的行为。但是,将所有导致UB进入UB消毒剂的一切都可能太少了。从叮当地址消毒剂文档:
addressanitizer是一个快速的内存错误检测器。它由编译器仪器模块和一个运行时库组成。该工具可以检测到以下类型的错误:
- 越野访问堆,堆栈和全球范围
- ...
虽然可以在此处找到UB消毒器工具的检查列表(再次是Clang Docs(。
相关文章:
- 在c++中用vector填充一个简单的动态数组
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 一种在C++中读取TXT配置文件的简单方法
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 关于简单C++函数(is_palindrome)的逻辑的问题
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 显示错误输出的简单数组排序程序
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 未定义的卫生化无法检测到简单的堆栈外误差
- 在C 中制作简单的堆栈
- 简单的递归跟踪理解堆栈
- 在 Mac 上的 Xcode 中使用 C++ 中的堆栈、队列和链表的最简单方法是什么?
- 简单的无锁堆栈c++11
- 堆栈周围的变量被破坏-添加简单类到std::vector
- 程序简单,没有调用堆栈,"inpossible"查找错误
- 我的简单线程安全堆栈有什么问题?