Компиляторы GCC и Clang поддерживают 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)
для обнаружения только существования Lsan в Clang, и __SANITIZE_LEAKS__
не существует для GCC. Как я могу определить доступность ASAN в любом случае? Обратите внимание, что Lsan можно включить независимо от AddressSanitizer и ThreadSanitizer.