在 Xcode 中工作的 CMake 中启用 AddressSanitizer 的正确方法是什么

新手上路,请多包涵

我添加了 AddressSanitizer 标志如下:

 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")

使用 Unix Makefiles 时,一切都可以正常构建和运行。

问题出现在生成 Xcode 项目时,它只是不想链接,因为它找不到 ASan 库。

我已经找到了两个解决方案,但决定不使用它们,因为它们不能仅使用 CMake 实现自动化:

  1. -Wl,-undefined,dynamic_lookup 添加到链接标志中,因此它跳过链接到动态库。
  2. 直接链接 libclang_rt.asan_osx_dynamic.dylib

那么这两种解决方案有什么问题呢?

  • 使用解决方案 #1 时,我必须在 Xcode 中手动打开目标方案并添加 DYLD_INSERT_LIBRARIES 环境变量指向 libclang_rt.asan_osx_dynamic.dylib
  • 使用解决方案 #2 时,ASan 库的路径因计算机而异。

此外,作为另一种解决方案,我尝试从 Xcode 目标方案中启用 Address Sanitizer 标志,但有趣的是它没有检测到我添加的问题,因此我没有将其列为解决方案,因为它未能通过我的测试。

任何帮助都感激不尽。

原文由 ObjSal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 659
1 个回答

由于这些天投票最多的答案是错误的方法,而且我没有得到正确的 cmake 解决方案来阅读这个线程,我想我会在写这篇文章时提到正确的方法,以便下一位读者这样做不需要花太多时间。

此解决方案的想法是将 -fsanitize=address 传递给编译器和链接器标志。

如果您想同时为所有目标启用此功能,可以使用 add_compile_optionsadd_link_options 。如果您有多个,可能是大量的目标,这是有道理的。

 add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)

或者,您也可以使用 target_compile_optionstarget_link_options 为特定目标设置这些。如果您不希望这适用于所有目标,这可能更有意义。

 target_compile_options(asan-target PRIVATE -fsanitize=address)
target_link_options(asan-target PRIVATE -fsanitize=address)

原文由 László Papp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题