如何检测如果建筑物与地址消毒时,建设与gcc4.8?

jgovgodb  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(720)

我正在写一个用C写的程序,我偶尔会用地址消毒器来构建,基本上是为了捕捉bug。程序启动时会在日志中打印一条横幅,其中包含以下信息:谁构建了它,它构建的分支,编译器等。我在想,如果二进制文件是使用地址消毒器构建的,那么也可以拼写出来。我知道有__has_feature(address_sanitizer),但这只适用于clang。我尝试了以下简单的程序:

#include <stdio.h>

int main()
{
#if defined(__has_feature)
# if __has_feature(address_sanitizer)
    printf ("We has ASAN!\n");
# else
    printf ("We have has_feature, no ASAN!\n");
# endif
#else
    printf ("We got nothing!\n");
#endif

    return 0;
}

当使用gcc -Wall -g -fsanitize=address -o asan asan.c构建时,会产生:

We got nothing!

clang -Wall -g -fsanitize=address -o asan asan.c

We has ASAN!

是否有与__has_feature等价的gcc?
我知道有一些方法可以检查,比如用地址消毒器构建的程序的巨大VSZ值,只是想知道是否有编译时定义或其他东西。

iyr7buue

iyr7buue1#

From the GCC 4.8.0 manual

__SANITIZE_ADDRESS__

-fsanitize=address正在使用时,此宏被定义为值1。

u7up0aaq

u7up0aaq2#

您也可以使用:

#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)

您可能需要#include <sanitizer/asan_interface.h>

相关问题