如何在gcc中使用AddressSanitizer?

mrg*_*oom 35 gcc address-sanitizer

我正在尝试用我的项目来构建

g++ -O0 -g -fsanitize=address -fno-omit-frame-pointer
Run Code Online (Sandbox Code Playgroud)

但是会遇到很多错误:

/home/user/libs/opencv/include/opencv2/core/mat.hpp:715: undefined reference to `__asan_report_load8'
Run Code Online (Sandbox Code Playgroud)

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

我的gcc版本是4.8.4.

yug*_*ugr 64

您需要添加-fsanitize=address编译器标志(CFLAGS,CXXFLAGS)和链接器标志(LDFLAGS).您可能只是将它添加到编译器标志中.

请注意,-lasanASan开发人员(例如此处)广泛不鼓励使用显式选项,因为它错过了一些其他重要的链接器标志.唯一推荐的链接方式是使用-fsanitize=address.

作为旁注,对于更积极的验证标志,请检查Asan FAQ(寻找"更积极的诊断").

  • @HeinrichStack 很难在没有重现的情况下发表评论。请注意,“-fsanitize=address”相当于“-lasan”+一些其他内容。 (2认同)
  • 当将 `-Wl,--no-undefined` 与 Clang 一起使用时,还必须将 `-shared-libasan` 添加到链接器标志中。它也是官方常见问题解答的一部分,但为了以防万一,在这里提供这些信息也很好。 (2认同)

Sme*_*eey 11

您需要将开关添加-lasan到编译/链接命令行以链接正确的库.

  • 这不应该是公认的答案。以下来自 @yugr 的回答是正确的。只需添加此评论,这样人们就不会在接受答案后停止阅读。 (19认同)
  • 你不应该自己添加`-lasan`。您应该使用编译器来驱动链接。当存在“-fsanitize=address”时,编译器将添加正确的库。 (4认同)
  • 根据我的经验,当需要这样做时,gcc 安装不正确 (2认同)

小智 6

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

dnf install libasan libasan-static