错误:alloc-dealloc-mismatch

地址擦除系统错误:分配 API 与解除分配 API 之间不匹配

默认情况下,AddressSanitizer 中的 alloc/dealloc 不匹配功能在 Windows 中处于禁用状态。 若要启用它,请在运行程序之前先运行 set ASAN_OPTIONS=alloc_dealloc_mismatch=1。 此环境变量会在运行时进行检查,以报告 malloc/deletenew/freenew/delete[] 相关错误。

示例

// example1.cpp
// alloc-dealloc-mismatch error
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {

    if (argc != 2) return -1;

    switch (atoi(argv[1])) {

    case 1:
        delete[](new int[10]);
        break;
    case 2:
        delete (new int[10]);      // Boom!
        break;
    default:
        printf("arguments: 1: no error 2: runtime error\n");
        return -1;
    }

    return 0;
}

若要生成并测试此示例,请在 Visual Studio 2019 版本 16.9 或更高版本的开发人员命令提示符中运行以下命令:

cl example1.cpp /fsanitize=address /Zi
set ASAN_OPTIONS=alloc_dealloc_mismatch=1
devenv /debugexe example1.exe 2

生成的错误

示例 1 中显示 alloc-dealloc-mismatch 错误的调试程序的屏幕截图。

另请参阅

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