Lek*_*eyn 5 c memory-leaks sanitizer address-sanitizer leak-sanitizer
GCC 和 Clang 编译器都支持LeakSanitizer,这有助于查找 C 程序中的内存泄漏。有时内存泄漏是不可避免的(例如,因为它正在测试套件中进行测试)。
可以使用Leak Sanitizer 接口对此类内存进行注释:
#include <sanitizer/lsan_interface.h>
void *p = create_new_object();
__lsan_ignore_object(p);
Run Code Online (Sandbox Code Playgroud)
然而,这会在不支持 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
Run Code Online (Sandbox Code Playgroud)
仅在 Clang 中检测不到__has_feature(leak_sanitizer)
LSan 的存在,__SANITIZE_LEAKS__
在 GCC 中也检测不到 LSan 的存在。我怎样才能检测 ASAN 的可用性?请注意,LSan 可以独立于 AddressSanitizer 和 ThreadSanitizer 启用。
由于编译器没有为自己设置预处理器定义,因此必须自己执行此操作。
一种是-fsanitize=leak -DMYLEAKSAN=1
使用 LeakSanitizer 进行编译,另一种是不使用 LeakSanitizer 进行编译-DMYLEAKSAN=0
。如果忘记定义,MYLEAKSAN
编译器就会停止。
#ifndef MYLEAKSAN
# error: MYLEAKSAN must be either 0 or 1
#endif
#include <stdio.h>
#include <stdlib.h>
#if MYLEAKSAN
# include <sanitizer/lsan_interface.h>
#endif
int main(void)
{
void *p = malloc(5);
#if MYLEAKSAN
__lsan_ignore_object(p);
#endif
}
Run Code Online (Sandbox Code Playgroud)