在 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,通常使用
CFLAGS
和 CXXFLAGS
;这并不总是有效,因为许多软件包忽略了它们(我认为这就是 Hanno Boeck 在 Gentoo 中所做的)
- 将
/usr/bin/gcc
、/usr/bin/g++
和 /usr/bin/cc
(可能 x86_64-linux-gnu-gcc
、x86_64-linux-gnu-g++
)替换为包装器,这将添加 Asan 标志并将调用重定向到原始可执行文件(这是我们最终在 Tizen 中采用的方法,并且发现它非常成功)
作为旁注,我建议添加以下选项
CFLAGS += -fsanitize-recover=address,undefined
否则启动会在过早的阶段失败。还要查看上面链接中的建议设置 ASAN_OPTIONS
,人们花了很长时间才弄明白。
为了能够对整个 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,通常使用
CFLAGS
和CXXFLAGS
;这并不总是有效,因为许多软件包忽略了它们(我认为这就是 Hanno Boeck 在 Gentoo 中所做的) - 将
/usr/bin/gcc
、/usr/bin/g++
和/usr/bin/cc
(可能x86_64-linux-gnu-gcc
、x86_64-linux-gnu-g++
)替换为包装器,这将添加 Asan 标志并将调用重定向到原始可执行文件(这是我们最终在 Tizen 中采用的方法,并且发现它非常成功)
作为旁注,我建议添加以下选项
CFLAGS += -fsanitize-recover=address,undefined
否则启动会在过早的阶段失败。还要查看上面链接中的建议设置 ASAN_OPTIONS
,人们花了很长时间才弄明白。