如何使用gcc 4.8构建时使用地址消毒剂进行检测?

时间:2016-01-15 14:36:22

标签: c gcc clang address-sanitizer

我正在开发一个用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 个答案:

答案 0 :(得分:7)

From the GCC 4.8.0 manual

__SANITIZE_ADDRESS__
     

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