3

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 とは別に有効にできることに注意してください。

4

1 に答える 1

3

コンパイラはそれ自体にプリプロセッサの定義を設定しないため、自分でそれを行う必要があります。

LeakSanitizer を使用してコンパイルする-fsanitize=leak -DMYLEAKSAN=1か、LeakSanitizer を使用せずに 1 つコンパイルし-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
}
于 2015-07-08T15:02:29.500 に答える