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

и добавьте его во флаги компоновщика.

Другие вопросы по тегам