GCC 和 Clang 编译器都支持LeakSanitizer,这有助于发现 C 程序中的内存泄漏。有时内存泄漏是不可避免的(例如,因为它正在测试套件中进行测试)。
这样的内存可以使用Leak Sanitizer 接口进行注释:
#include <sanitizer/lsan_interface.h>
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
在 Clang中没有__has_feature(leak_sanitizer)
检测到 LSan 的__SANITIZE_LEAKS__
存在,对于 GCC 也不存在。无论如何,我如何检测 ASAN 可用性?请注意,LSan 可以独立于 AddressSanitizer 和 ThreadSanitizer 启用。