如何在使用gcc 4.8编译时检测是否使用地址扫描器构建?

30

我正在处理一份用C语言编写的程序,有时会使用地址检测器进行构建以捕获错误。当程序启动时,它会在日志中打印一个横幅,其中包含构建者、所用分支、编译器等信息。我思考了一下,如果能够明确指出二进制文件是否使用了地址检测器也是不错的。我知道有 __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值,只是想知道是否有编译时定义或其他方式。


1
看起来这里有个错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60512 - dragosht
2个回答

30

谢谢!还有一个问题,这里RTFM会有所帮助 :)。 - fencekicker
有关最新版本的g++,请参见https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html -- 请注意我们现在也有__SANITIZE_THREAD__ - Alexis Wilke
请参考此答案,它展示了如何自行确定这些问题,让你不再为此困扰。 - jwd

2

你也可以选择:

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

你可能需要包含 #include <sanitizer/asan_interface.h>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接