带有 cca​​che 的 Xcode Address Sanitizer

yan*_*ano 5 xcode ccache address-sanitizer xcode8

我正在尝试在 Xcode 中使用 Address Sanitizer,但我也使用 ccache 来加速我的构建。为此,我CC在 Xcode 项目级别设置了标志以指向我存储在的脚本~/projects/support/cmake/ccache-clang。脚本如下:

#!/bin/sh
if type -p /usr/local/bin/ccache >/dev/null 2>&1; then
  export CCACHE_CPP2=true
  exec /usr/local/bin/ccache "${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" "$@"
else
  exec "${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" "$@"
fi
Run Code Online (Sandbox Code Playgroud)

这样就达到了预期的效果(如果开发系统上安装了ccache,则使用ccache)。这运作良好。

现在,当我们为给定方案打开地址消毒器时,问题就出现了。构建成功完成,但是当我们尝试运行时,我们终于看到了这个错误:

Error: Check dependencies

Could not determine version of clang to find its Address Sanitizer library: ~/projects/support/cmake/ccache-clang
Run Code Online (Sandbox Code Playgroud)

也许这是由于 Xcode 中的一些 hacky 实现导致的,它试图解析编译器的路径以确定版本?

想知道如何修改我的脚本以允许 Address Sanitizer 工作。CC当前的解决方法是当我们需要进行消毒工作时删除覆盖的标志。

使用 Xcode 8.3.1

小智 2

直接链接 Asan 库,而不是在方案中选中复选框。

链接器编译器标志应包含以下内容。

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

如果找不到该库,则查找asan动态库的路径,通常位于

${CMAKE_LINKER}/../../lib/clang/version/lib/darwin/libclang_rt.asan_osx_dynamic.dylib
Run Code Online (Sandbox Code Playgroud)

并将其添加到链接器标志中。