GCC コンパイラと Clang コンパイラはどちらも、C プログラムのメモリ リークを検出するのに役立つLeakSanitizerをサポートしています。メモリ リークが避けられない場合があります (たとえば、テスト スイートでテストされているため)。
このようなメモリには、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
__has_feature(leak_sanitizer)
Clang の LSan の存在だけを検出することはできず、GCC にも存在しません__SANITIZE_LEAKS__
。とにかく、ASAN の可用性を検出するにはどうすればよいですか? LSan は、AddressSanitizer および ThreadSanitizer とは別に有効にできることに注意してください。