简体   繁体   English

为什么地址清理程序没有检测到这个简单的 memory 泄漏?

[英]Why is address sanitizer not detecting this simple memory leak?

Does anybody have any idea why address sanitizer is not flagging this very obvious memory leak有谁知道为什么地址清理程序没有标记这个非常明显的 memory 泄漏

class A {
public:
    A() = default;
};

TEST_F(LibrdfSerializerTests, Test) {
    A* a = new A;
}

built with the following added to cmake:在 cmake 中添加以下内容:

    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
    set(CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")

You can try using the ASAN_OPTIONS=detect_leaks=1 while executing the binary to detect leaks.您可以在执行二进制文件时尝试使用ASAN_OPTIONS=detect_leaks=1来检测泄漏。 Using the example from the documentation使用文档中的示例

❯ cat leak.c
#include <stdlib.h>
void *p;
int main() {
  p = malloc(7);
  p = 0; // The memory is leaked here.
  return 0;
}

Compile the program编译程序

clang -fsanitize=address -g leak.c

and then execute it as follows:然后执行如下:

ASAN_OPTIONS=detect_leaks=1 ./a.out

Output: Output:

=================================================================
==63987==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 7 byte(s) in 1 object(s) allocated from:
    #0 0x1034c109d in wrap_malloc+0x9d (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x4609d)
    #1 0x103477ef8 in main leak.c:4
    #2 0x7fff6b30fcc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8)

SUMMARY: AddressSanitizer: 7 byte(s) leaked in 1 allocation(s).

Same for CPP CPP 也一样

❯ cat memory-leak.cpp
#include <cstdlib>
#include <cstdio>
class A {
public:
    A() = default;
};

int main() {
    char const* asanOpt = std::getenv("ASAN_OPTIONS");
    std::printf("%s\n", asanOpt);
    A* a = new A;
    return 0;
}

Compile it编译它

clang++ -g memory-leak.cpp -fsanitize=address

While executing the binary, use the option to enable leak detections在执行二进制文件时,使用该选项启用泄漏检测

ASAN_OPTIONS=detect_leaks=1 ./a.out

Output: Output:

detect_leaks=1

=================================================================
==69309==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 1 byte(s) in 1 object(s) allocated from:
    #0 0x109ea556d in wrap__Znwm+0x7d (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x5256d)
    #1 0x109e4bf48 in main memory-leak.cpp:7
    #2 0x7fff6b30fcc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8)

SUMMARY: AddressSanitizer: 1 byte(s) leaked in 1 allocation(s).

Tested on:测试:

MacOS 10.15

With clang与 clang

clang version 10.0.1 
Target: x86_64-apple-darwin19.6.0
Thread model: posix

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM