如何将AddressSanitizer与GCC一起使用?

如何将AddressSanitizer与GCC一起使用?,gcc,address-sanitizer,Gcc,Address Sanitizer,我正试图用它来构建我的项目 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-fsanize=add

我正试图用它来构建我的项目

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
-fsanize=address添加到编译和链接命令行,以链接正确的库


注意:原始答案-lasan已过时,不应使用,根据注释,您需要将
-fsanize=address
添加到编译器标志(包括
CFLAGS
cxflags
)和链接器标志(
LDFLAGS
)。您可能只将其添加到编译器标志中

请注意,ASan开发人员(例如)广泛反对使用显式
-lasan
选项,因为它忽略了一些其他重要的链接器标志。唯一推荐的链接方式是使用
-fsanize=address


作为旁注,要获得更积极的验证标志,请检查(查看“更积极的诊断”)。

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

dnf安装libasan libasan static

这不是完整的编译行,因为您没有文件名。您是否在单独的步骤中编译/链接?你还忘了提到你正在使用的gcc版本…请设置正确的答案@yugr one,因为你标记的答案并不正确。如果我跳过
-lasan
,我会得到
未定义的引用到uuu asan…
@HeinrichStack,很难不加修改就评论。请注意,
-fsanize=address
相当于
-lasan
+一些其他东西。在使用
-Wl,--no-undefined
和Clang时,还必须将
-shared libasan
添加到链接器标志中。这也是官方常见问题解答的一部分,但为了以防万一,在这里有这些信息也很好。@DmitryKochkin选择静态/共享运行时库是一个充满蠕虫的罐子(LLVM和GCC之间的默认选择不同,
-静态libasan
在GCC中不起作用,共享/静态运行时根据主应用程序是否被净化而不同,等等).一般来说,我建议尽可能坚持编译器的默认选择,在边缘情况下(仅清理一个库和/或使用
-Wl,--无未定义的
)仅切换到
-shared libasan
)这里有一个链接,它提供了一些非常有趣的细节。@ YGRR是的,我说它只适用于<代码> -WL,没有未定义的< /代码>。C++中的链接是一个单独的蠕虫,无论如何,你注定要用这种语言选择。在你的另一个答案中,你也建议用CLAN。这可能会在应用Asan时产生类似的错误。单个共享库并使用
-static libasan
。否则
gcc
将发出不同的错误消息(
libasan_preinit.o:没有这样的文件或目录
找不到-lasan
)在Ubuntu上,默认情况下,
libasan
gcc
一起安装。这既不适用于WSL,也不适用于windows。安装了所有版本的libasan。根据我的经验,在必要时,gcc安装不正确,这不应该是可接受的答案。下面@yugr的答案是正确的。只需添加此注释,这样人们就不会在接受答案后停止阅读。您不应该自己添加
-lasan
。您应该使用编译器来驱动链接。当出现
-fsanize=address
时,编译器将添加正确的库。同时确认这不是启用地址消毒器的正确方法。