如何在 GCC 中使用 AddressSanitizer?

How to use AddressSanitizer with 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.4。

您需要将开关 -lasan -fsanitize=address 添加到您的 both 您的编译 and link 命令行 link 正确的库。

注意:根据评论,原始答案 -lasan 已过时,不应使用

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

请注意,ASan 开发人员(例如 here)广泛反对使用显式 -lasan 选项,因为它遗漏了一些其他重要的 linker 标志。 link 的唯一推荐方法是使用 -fsanitize=address.

附带说明一下,要获得更积极的验证标志,请检查 Asan FAQ(寻找“更积极的诊断”)。

确保安装了 libasan。例如,在 Fedora 中:

dnf install libasan libasan-static