错误: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 标志。

生成的错误

示例 1 中显示 stack-buffer-underflow 错误的调试器的屏幕截图。

示例 - 线程上的堆栈下溢

// 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

生成的错误 - 线程上的堆栈下溢

示例 2 中显示 stack-buffer-underflow 错误的调试器的屏幕截图。

另请参阅

AddressSanitizer 概述
AddressSanitizer 已知问题
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例