我正在处理一份用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值,只是想知道是否有编译时定义或其他方式。