【问题标题】:Enable AddressSanitizer by default in gcc在 gcc 中默认启用 AddressSanitizer
【发布时间】:2017-02-16 09:18:56
【问题描述】:

为了能够调试和模糊整个 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。

我的问题是:

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

【问题讨论】:

    标签: gcc fuzzing sanitizer address-sanitizer


    【解决方案1】:

    首先,请务必查看Tizen(也称为here)和Gentoo 中现有的全发行版Asan 支持。

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

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

    【讨论】:

    • 嗨,你能指出一个 gcc 包装器的例子吗?我找到了例如github.com/gawen947/gcc-wrapper,我可以研究一下,但是如果你已经有了一些想法,那就更好了..
    • @VP。好吧,它实际上只是一个原始的 shell 包装器,它用-fanitize=address -fsanitize-recover=address -fno-common etc. 调用“真正的”gcc。 Gcc 包装器是一种常见做法(参见例如pbuilder instructions),但恐怕我没有特定于 Asan 的链接。
    • 好的,我做了类似 export MYFLAGS="..."; exec /usr/bin/gcc-6 $@ 但它没有以某种方式工作..感谢您的大力投入!
    • @VP。仅供参考,我刚刚检查了 Tizen 文章,它有示例包装器(图 5)。不客气。
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2011-03-09
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多