Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何知道是否在编译时启用了泄漏消毒剂?_C_Memory Leaks_Sanitizer_Address Sanitizer_Leak Sanitizer - Fatal编程技术网

C 如何知道是否在编译时启用了泄漏消毒剂?

C 如何知道是否在编译时启用了泄漏消毒剂?,c,memory-leaks,sanitizer,address-sanitizer,leak-sanitizer,C,Memory Leaks,Sanitizer,Address Sanitizer,Leak Sanitizer,GCC和Clang编译器都支持查找C程序中的内存泄漏。有时,内存泄漏是不可避免的(例如,因为它正在测试套件中测试) 可以使用以下方法对此类内存进行注释: 没有任何\uuuu功能(泄漏消毒剂)可以检测是否存在叮当声中的LSan,GCC也没有\uuuu消毒剂\uuuuu泄漏。我如何检测ASAN的可用性?请注意,可以独立于AddressSanitizer和ThreadSanitizer来启用LSan。因为编译器没有为自己设置预处理器定义,所以必须为自己设置预处理器 一个编译时使用-fsanize=le

GCC和Clang编译器都支持查找C程序中的内存泄漏。有时,内存泄漏是不可避免的(例如,因为它正在测试套件中测试)

可以使用以下方法对此类内存进行注释:


没有任何
\uuuu功能(泄漏消毒剂)
可以检测是否存在叮当声中的LSan,GCC也没有
\uuuu消毒剂\uuuuu泄漏。我如何检测ASAN的可用性?请注意,可以独立于AddressSanitizer和ThreadSanitizer来启用LSan。

因为编译器没有为自己设置预处理器定义,所以必须为自己设置预处理器

一个编译时使用
-fsanize=leak-DMYLEAKSAN=1
带Leaksanizer或不带Leaksanizer一个编译时使用
-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
}
\ifndef MYLEAKSAN
#错误:MYLEAKSAN必须为0或1
#恩迪夫
#包括
#包括
#如果我是迈利桑
#包括
#恩迪夫
内部主(空)
{
void*p=malloc(5);
#如果我是迈利桑
__lsan_忽略_对象(p);
#恩迪夫
}

或类似地定义my_leaksan_ignore_对象(arg)以扩展为nothing或实际调用。当分散在代码库中时,这就不那么难看了。
/* __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
#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
}