在 gcc 中默认启用 AddressSanitizer

Enable AddressSanitizer by default in gcc

为了能够对整个 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。但是,我没有找到一种方法来设置 "catch all rules" 进行编译,并且 link 我的所有 c/c++ 代码都带有 AddressSanitizer。

我的问题是:

首先,请务必查看 Tizen (also here) and Gentoo 中现有的 whole-distro 牙山赋能。

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

  • 自定义您的构建系统以默认启用 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,人们花了很长时间才弄明白。