C 如何知道是否在编译时启用了泄漏消毒剂?
GCC和Clang编译器都支持查找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
没有任何
\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
}