Каков правильный способ включения AddressSanitizer в CMake, который работает в Xcode

Я добавил флаг AddressSanitizer следующим образом:

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

Все работает и работает отлично при использовании Unix Makefiles.

Проблема возникает при создании проекта Xcode, он просто не хочет ссылаться, потому что он не может найти библиотеку ASan.

Я уже нашел два решения, но решил не использовать их, потому что они не могут быть автоматизированы с использованием только CMake:

  • Добавление -Wl,-undefined,dynamic_lookup к связанным флагам, поэтому он пропускает ссылку на динамические библиотеки.
  • Прямая ссылка на libclang_rt.asan_osx_dynamic.dylib.

Итак, какая проблема с этими двумя решениями?

  • При использовании решения # 1 мне нужно вручную открыть целевую схему в Xcode и добавить переменную среды DYLD_INSERT_LIBRARIES, указывающую на libclang_rt.asan_osx_dynamic.dylib.
  • При использовании решения №2 путь для библиотеки ASan изменяется между компьютерами.

Кроме того, в качестве другого решения я попытался включить флаг Address Sanitizer из целевой схемы Xcode, но интересно, что он не обнаружил проблем, которые я добавил, поэтому я не перечислил это как решение, потому что он не прошел мой тест.

Любая помощь будет очень оценена.

Ответ 1

Вы также должны предоставить флаг компоновщику. Я делаю это так:

set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")

Ответ 2

cmake 3.13
представить конфигурацию для схемы xcode

в CMake

cmake_minimum_required(VERSION 3.13)
set(CMAKE_XCODE_GENERATE_SCHEME ON)
set(CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER ON)
set(CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN ON)

Когда строить

xcodebuild -enableAddressSanitizer YES

Ответ 3

Самое простое решение, которое я сейчас нашел, это

cmake -DCMAKE_BUILD_TYPE=ASAN .

Я предпочитаю эту опцию, так как она выражает намерение (запуск дезинфицирующих средств), а не изменяет ряд флагов.

Я не знаю, когда эта опция была добавлена. Я также не могу найти какую-либо документацию к нему.