默认情况下在gcc中启用AddressSanitizer

时间:2017-02-16 09:18:56

标签: gcc fuzzing sanitizer address-sanitizer

为了能够调试和模糊整个Linux发行版,我想将ASAN(AddressSanitizer,https://en.wikipedia.org/wiki/AddressSanitizer)设置为gcc的默认选项。通常,为了达到我想要的目的,我通常在编译linux包之前设置以下变量:

CFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g" 
CXXFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g" 
LDFLAGS="-fsanitize=address,undefined"

并尝试编译并运行我的代码。我想将它默认为gcc。

执行此操作的一个选项是使用规范文件:https://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html。但是我没有找到一种设置“捕获所有规则”的方法来编译和链接我的所有c / c ++代码和AddressSanitizer。

我的问题是:

  • 如何使用spec文件做任何示例?
  • 这是最好的方法吗?
  • 还有其他替代方法吗?

1 个答案:

答案 0 :(得分:2)

首先,请务必查看Tizen(还有here)和Gentoo中现有的整个发行版Asan enablings。

一般来说,有两种主要方法:

  • 默认情况下,自定义您的构建系统以启用Asan,通常使用CFLAGSCXXFLAGS;这并不总是有效,因为许多软件包忽略它们(我认为这是Hanno Boeck在Gentoo中所做的)
  • 使用包装器替换/usr/bin/gcc/usr/bin/g++/usr/bin/cc(以及可能x86_64-linux-gnu-gccx86_64-linux-gnu-g++),这些包装器会添加Asan标志并将调用重定向到原始可执行文件(这是我们最终在Tizen中采用的方法,并且发现它非常成功)

作为旁注,我建议添加以下选项

CFLAGS += -fsanitize-recover=address,undefined

否则启动会在过早的阶段失败。另外,在上面的链接中查看建议的设置ASAN_OPTIONS,花了很长时间才弄清楚它们。