如何在 GCC 中使用地址消毒器?

我正在尝试建立我的项目

g++ -O0 -g -fsanitize=address -fno-omit-frame-pointer

但是会出现很多错误,比如:

/home/user/libs/opencv/include/opencv2/core/mat.hpp:715: undefined reference to `__asan_report_load8'

如何使用 AddressSanitize 支持编译项目?

我的 gcc 版本是4.8。

113952 次浏览

您需要将交换机 -lasan -fsanitize=address添加到您的 都有,您的编译 还有链接命令行来链接正确的库。

注意: 原来的答案-拉桑是过时的,不应该使用,根据评论

您需要将 -fsanitize=address添加到编译器标志(CFLAGSCXXFLAGS)和链接器标志(LDFLAGS)。您可能只将它添加到编译器标志中。

请注意,ASan 开发人员(例如 给你)普遍不鼓励使用显式的 -lasan选项,因为它忽略了一些其他重要的链接器标志。唯一推荐的链接方式是使用 -fsanitize=address

作为一个附带说明,更积极的验证标志检查 Asan 常见问题(寻找“更积极的诊断”)。

确保你已经安装了 libasan,例如,在 Fedora 中:

安装 libasan libasan-static