如何在 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
添加到编译器标志(CFLAGS
和 CXXFLAGS
)和 linker 标志(LDFLAGS
)。您可能只将它添加到编译器标志中。
请注意,ASan 开发人员(例如 here)广泛反对使用显式 -lasan
选项,因为它遗漏了一些其他重要的 linker 标志。 link 的唯一推荐方法是使用 -fsanitize=address
.
附带说明一下,要获得更积极的验证标志,请检查 Asan FAQ(寻找“更积极的诊断”)。
确保安装了 libasan。例如,在 Fedora 中:
dnf install libasan libasan-static
我正在尝试使用
构建我的项目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
添加到编译器标志(CFLAGS
和 CXXFLAGS
)和 linker 标志(LDFLAGS
)。您可能只将它添加到编译器标志中。
请注意,ASan 开发人员(例如 here)广泛反对使用显式 -lasan
选项,因为它遗漏了一些其他重要的 linker 标志。 link 的唯一推荐方法是使用 -fsanitize=address
.
附带说明一下,要获得更积极的验证标志,请检查 Asan FAQ(寻找“更积极的诊断”)。
确保安装了 libasan。例如,在 Fedora 中:
dnf install libasan libasan-static