【问题标题】:How to detect if building with address sanitizer when building with gcc 4.8?使用 gcc 4.8 构建时如何检测是否使用地址清理器构建?
【发布时间】:2016-04-21 04:26:49
【问题描述】:

我正在编写一个用 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 值,只是想知道是否有编译时定义或其他东西。

【问题讨论】:

标签: c gcc clang address-sanitizer


【解决方案1】:

From the GCC 4.8.0 manual:

__SANITIZE_ADDRESS__

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

【讨论】:

猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2011-12-02
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多