gpt4 book ai didi

c - 我如何知道 Leak Sanitizer 是否在编译时启用?

转载 作者:行者123 更新时间:2023-12-02 03:08:27 35 4
gpt4 key购买 nike

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

这样的内存可以使用 Leak Sanitizer interface 进行注释。 :

#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

Clang 中没有 __has_feature(leak_sanitizer) 来检测 LSan 的存在,GCC 中也不存在 __SANITIZE_LEAKS__ 。我怎样才能检测 ASAN 的可用性?请注意,LSan 可以独立于 AddressSanitizer 和 ThreadSanitizer 启用。

最佳答案

由于编译器不会为自己设置预处理器定义,因此必须自己执行此操作。

使用 LeakSanitizer 或不使用 LeakSanitizer 时使用 -fsanitize=leak -DMYLEAKSAN=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
}

关于c - 我如何知道 Leak Sanitizer 是否在编译时启用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31273016/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com