【问题标题】:C++ AddressSanitizer with CMakeLists.txt results in asan errors带有 CMakeLists.txt 的 C++ AddressSanitizer 导致 asan 错误
【发布时间】:2018-10-14 06:52:11
【问题描述】:

尝试在我的 C++ 项目中使用 AddressSanitizer 工具 (ASan),我得到了一个非常详细的输出,其中包含 undefined reference to '__asan_report_store8'undefined reference to '__asan_report_load8',以及其他类似 __asan_stack_malloc_2 的输出。我的项目是用 CMake 构建的,我在 CMakeLists.txt 中添加了以下行:

add_definitions(-fsanitize=address -g3 -fno-omit-frame-pointer)

遵循这些 ASan 示例:

运行上面的 makefile 示例,我得到了预期的漂亮输出(也可以在视频链接中看到)。但是对于我的项目,我得到了这些错误的混乱堆栈跟踪。

注意事项:

  • ubuntu 16.04
  • 我设置了环境变量 ASAN_OPTIONS=symbolize=1ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer 以便在 ASan 输出中打印行号

【问题讨论】:

    标签: c++ cmake address-sanitizer


    【解决方案1】:

    当编译代码以使用 LLVM Sanitizer 之一运行时,您必须将 -fsanitize=... 标志传递给编译器和链接器。使用 CMake,您可以通过调用 target_link_libraries 来做到这一点:

    target_link_libraries(MyTarget
      -fsanitize=address
    )
    

    或者,如果您不使用现代 CMake,您可以使用 link_libraries 命令执行相同操作

    【讨论】:

    • 是的!现在我可以看到我的内存泄漏了 :)
    • 关于在输出中打印行号有什么建议吗?我在上面指定的配置似乎不起作用。当我将ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer 设置为add_definitions 参数时,cmake 会给我一个错误,指出路径不存在(当确实存在时,使用which llvm-symbolizer 找到)。
    • @BoltzmannBrain 你在环境中设置了ASAN_OPTIONS=symbolize=1 吗?
    • @yugr 是的,请参阅上面的原始帖子。我从命令行将这些选项设置为export ASAN_OPTIONS=symbolize=1,然后运行 ​​CMake 步骤。
    • CMake 3.13+ 也提供target_link_options
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2021-08-17
    相关资源
    最近更新 更多