Компиляторы GCC и Clang имеют поддержку LeakSanitizer, что помогает находить утечки памяти в программах на C. Иногда утечка памяти неизбежна (потому что она тестируется, например, в тестовом наборе).Как узнать, включена ли защита от утечек во время компиляции?
Такая память может быть аннотированный с помощью Leak Sanitizer interface:
#include <sanitizer/lsan_interface.h>
void *p = create_new_object();
__lsan_ignore_object(p);
Это, однако перерыв на компиляторы, которые не поддерживают LSAn. В Адресной Sanitizer, эта конструкция может быть использована для определения доступности области Асана:
/* __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.
Или аналогичным образом определите my_leaksan_ignore_object (arg), чтобы развернуть до нуля или реального вызова. Это менее уродливо, когда разбросаны по кодовой базе. – mabraham