相关文章推荐
强健的太阳  ·  linux sftp ...·  1 年前    · 
很酷的登山鞋  ·  html - Setting ...·  1 年前    · 

地址清理器错误:解除分配释放的内存

在 C 中,可能会错误地调用 free 。 在 C++ 中,可能会多次调用 delete 。 在这些示例中,我们显示了 delete free HeapCreate 错误。

示例 C++ - double operator delete

// example1.cpp
// double-free error
int main() {
    int *x = new int[42];
    delete [] x;
    // ... some complex body of code
    delete [] x;
    return 0;

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

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

生成的错误 - double operator delete

示例“C”- double free

// example2.cpp
// double-free error
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
    char* x = (char*)malloc(10 * sizeof(char));
    memset(x, 0, 10);
    int res = x[argc];
    free(x);
    // ... some complex body of code
    free(x + argc - 1);  // Boom!
    return res;

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

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

生成的错误 - double free

示例 - Windows HeapCreate double HeapFree

// example3.cpp
// double-free error
#include <Windows.h>
#include <stdio.h>
int main() {
    void* newHeap = HeapCreate(0, 0, 0);
    void* newAlloc = HeapAlloc(newHeap, 0, 100);
    HeapFree(newHeap, 0, newAlloc);
    HeapFree(newHeap, 0, newAlloc);
    printf("failure\n");
    return 1;

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

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

生成的错误 - Windows HeapCreate double HeapFree

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