Xcode Address Sanitizer с ccache
Я пытаюсь использовать Address Sanitizer в Xcode, но я также использую 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
Таким образом, желаемый эффект достигается (ccache используется, если установлен в системе разработчика). Это работает хорошо.
Теперь проблема возникает, когда мы включаем адрес Sanitizer для данной схемы. Сборка завершается успешно, но затем мы наконец видим эту ошибку, когда пытаемся запустить:
Error: Check dependencies
Could not determine version of clang to find its Address Sanitizer library: ~/projects/support/cmake/ccache-clang
Возможно, это связано с какой-то хакерской реализацией в Xcode, где он пытается разобрать путь компилятора, чтобы определить версию?
Хотите знать, как я могу изменить свой скрипт, чтобы разрешить работу Address Sanitizer. Текущее решение состоит в том, чтобы удалить переопределенный CC
флаг, когда нам нужно сделать дезинфицирующую работу.
Используя Xcode 8.3.1
0 ответов
Свяжите библиотеку Asan напрямую вместо того, чтобы отмечать галочку на схеме.
Флаги компоновщика и компилятора должны содержать следующее.
-fsanitize=address -fno-omit-frame-pointer
Если он не может найти библиотеку, найдите путь к динамической библиотеке asan, которая обычно находится в
${CMAKE_LINKER}/../../lib/clang/version/lib/darwin/libclang_rt.asan_osx_dynamic.dylib
и добавьте его во флаги компоновщика.