web-dev-qa-db-fra.com

Quelle est la bonne façon d'activer AddressSanitizer dans CMake qui fonctionne dans Xcode

J'ai ajouté le drapeau AddressSanitizer comme suit:

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

Tout est construit et fonctionne bien avec Unix Makefiles.

Le problème survient lors de la génération du projet Xcode. Il ne veut tout simplement pas créer de lien car il ne trouve pas la bibliothèque ASan.

J'ai déjà trouvé deux solutions, mais j'ai décidé de ne pas les utiliser car elles ne peuvent pas être automatisées à l'aide de CMake uniquement:

  1. En ajoutant -Wl,-undefined,dynamic_lookup aux indicateurs liés, le lien avec les bibliothèques dynamiques est ignoré. 
  2. Lien avec libclang_rt.asan_osx_dynamic.dylib directement.

Alors, quel est le problème avec ces deux solutions?

  • Lorsque j'utilise la solution n ° 1, je dois ouvrir manuellement le schéma cible dans Xcode et ajouter la variable d'environnement DYLD_INSERT_LIBRARIES pointant vers libclang_rt.asan_osx_dynamic.dylib.
  • Lors de l'utilisation de la solution n ° 2, le chemin d'accès à la bibliothèque ASan varie d'un ordinateur à l'autre.

De plus, en tant que solution supplémentaire, j'ai essayé d'activer l'indicateur Address Sanitizer à partir du schéma de cible Xcode, mais il est intéressant de noter qu'il n'a pas détecté les problèmes que j'ai ajoutés. Je ne l'ai donc pas répertorié comme solution car il a échoué.

Toute aide sera très appréciée.

13
ObjSal

Vous devez également fournir le ou les indicateurs à l'éditeur de liens. Je le fais comme ça:

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")
6
MaartenVds

cmake 3.13
introduire la configuration pour xcode schema

dans 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)

Quand construire

xcodebuild -enableAddressSanitizer YES
1
zxshi