如何在编译时启用Leak Sanitizer?

GCC和Clang编译器都支持LeakSanitizer ,它有助于在C程序中查找内存泄漏。 有时内存泄漏是不可避免的(因为它正在测试套件中进行测试)。

可以使用Leak Sanitizer界面注释这样的内存:

#include  void *p = create_new_object(); __lsan_ignore_object(p); 

然而,这将在不支持LSan的编译器上中断。 在Address Sanitizer中,此构造可用于检测ASAN的可用性:

 /* __has_feature(address_sanitizer) is used later for Clang, this is for * compatibility with other compilers (such as GCC and MSVC) */ #ifndef __has_feature # define __has_feature(x) 0 #endif #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) /* ASAN-aware code here. */ #endif 

没有__has_feature(leak_sanitizer)来检测Clang中__SANITIZE_LEAKS__存在__SANITIZE_LEAKS__ ,GCC也不存在__SANITIZE_LEAKS__ 。 如何检测ASAN可用性? 请注意,可以独立于AddressSanitizer和ThreadSanitizer启用LSan。

由于编译器没有为自己设置预处理器定义,因此必须为自己执行此操作。

使用LeakSanitizer或不使用LeakSanitizer进行-fsanitize=leak -DMYLEAKSAN=1编译,使用-DMYLEAKSAN=0编译。 如果忘记定义MYLEAKSAN ,编译器将暂停。

 #ifndef MYLEAKSAN # error: MYLEAKSAN must be either 0 or 1 #endif #include  #include  #if MYLEAKSAN # include  #endif int main(void) { void *p = malloc(5); #if MYLEAKSAN __lsan_ignore_object(p); #endif }