错误:stack-buffer-underflow
地址擦除器错误:堆栈缓冲区下溢
这些错误消息指示对堆栈变量开始之前某个位置的内存访问。
示例 - 本地数组下溢
// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>
int main() {
int subscript = -1;
char buffer[42];
buffer[subscript] = 42; // Boom!
return 0;
}
若要生成并测试此示例,请在 Visual Studio 2019 版本 16.9 或更高版本的开发人员命令提示符中运行以下命令:
cl example1.cpp /fsanitize=address /Zi /Od
devenv /debugexe example1.exe
ASAN 是动态分析的一种形式,这意味着它只能检测实际执行的错误代码。 优化器将删除对 buffer[subscript]
的分配,因为 buffer[subscript]
从不读取。 因此,此示例需要 /Od
标志。
生成的错误
示例 - 线程上的堆栈下溢
// example2.cpp
// stack-buffer-underflow error
#include <windows.h>
DWORD WINAPI thread_proc(void *) {
int subscript = -1;
volatile char stack_buffer[42];
stack_buffer[subscript] = 42;
return 0;
}
int main() {
HANDLE thr = CreateThread(NULL, 0, thread_proc, NULL, 0, NULL);
if (thr == 0) return 0;
WaitForSingleObject(thr, INFINITE);
return 0;
}
若要生成并测试此示例,请在 Visual Studio 2019 版本 16.9 或更高版本的开发人员命令提示符中运行以下命令:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
生成的错误 - 线程上的堆栈下溢
另请参阅
AddressSanitizer 概述
AddressSanitizer 已知问题
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例