Каков правильный способ включения 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 .
Я предпочитаю эту опцию, так как она выражает намерение (запуск дезинфицирующих средств), а не изменяет ряд флагов.
Я не знаю, когда эта опция была добавлена. Я также не могу найти какую-либо документацию к нему.