it-swarm.com.de

Was ist der richtige Weg, um AddressSanitizer in CMake für Xcode zu aktivieren?

Ich habe das AddressSanitizer-Flag wie folgt hinzugefügt:

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

Bei der Verwendung von Unix Makefiles wird alles problemlos erstellt und ausgeführt.

Das Problem tritt beim Generieren des Xcode-Projekts auf. Es möchte einfach keine Verknüpfung herstellen, da es die ASan-Bibliothek nicht finden kann.

Ich habe bereits zwei Lösungen gefunden, entschied mich jedoch, sie nicht zu verwenden, da sie nicht nur mit CMake automatisiert werden können:

  1. Hinzufügen von -Wl,-undefined,dynamic_lookup zu den verknüpften Flags, sodass die Verknüpfung mit dynamischen Bibliotheken übersprungen wird. 
  2. Direkt mit libclang_rt.asan_osx_dynamic.dylib verknüpfen.

Was ist das Problem mit diesen beiden Lösungen?

  • Wenn Sie Lösung 1 verwenden, muss ich das Zielschema manuell in Xcode öffnen und die Umgebungsvariable DYLD_INSERT_LIBRARIES hinzufügen, die auf libclang_rt.asan_osx_dynamic.dylib zeigt.
  • Wenn Sie Lösung 2 verwenden, variiert der Pfad für die ASan-Bibliothek zwischen den Computern.

Als weitere Lösung habe ich auch versucht, das Address Sanitizer-Flag aus dem Xcode-Zielschema zu aktivieren. Interessanterweise wurden die hinzugefügten Probleme nicht erkannt. Daher habe ich dies nicht als Lösung aufgeführt, da mein Test fehlgeschlagen ist.

Jede Hilfe wird sehr geschätzt.

13
ObjSal

Sie müssen die Flag (en) auch dem Linker zur Verfügung stellen. Ich mache es so:

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

Die einfachste Lösung, die ich derzeit gefunden habe, ist

cmake -DCMAKE_BUILD_TYPE=ASAN .

Ich bevorzuge diese Option, da sie die Absicht ausdrückt (Desinfektionsprogramme ausführen), anstatt eine Reihe von Flags zu ändern.

Ich weiß nicht, wann diese Option hinzugefügt wurde. Ich kann auch keine Dokumentation dazu finden.

3
Unapiedra

3,13
Konfiguration für xcode-Schema einführen

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

Wann bauen?

xcodebuild -enableAddressSanitizer YES
1
zxshi