3

Компиляторы 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.

ответ

3

Поскольку компилятор не задает для себя препроцессор, нужно сделать это для себя.

Скомпилируйте с помощью -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 
} 
+1

Или аналогичным образом определите my_leaksan_ignore_object (arg), чтобы развернуть до нуля или реального вызова. Это менее уродливо, когда разбросаны по кодовой базе. – mabraham

 Смежные вопросы

  • Нет связанных вопросов^_^