2017-06-02 87 views
10

Dodałem AddressSanitizer flagę następująco:Jaki jest właściwy sposób, aby umożliwić AddressSanitizer w CMake, który działa w Xcode

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

Wszystko buduje i działa dobrze podczas korzystania Unix Makefiles.

Problem pojawia się podczas generowania projektu Xcode, po prostu nie chce się połączyć, ponieważ nie może znaleźć biblioteki ASAN.

ja już znaleźć dwa rozwiązania, ale nie zdecydował się ich używać, ponieważ nie można zautomatyzować przy użyciu tylko CMake:

  1. Dodawanie -Wl,-undefined,dynamic_lookup do połączonego flagami, więc pomija łączenie bibliotek dynamicznych.
  2. Bezpośrednie połączenie z libclang_rt.asan_osx_dynamic.dylib.

Jaki jest problem z tymi dwoma rozwiązaniami?

  • Przy zastosowaniu rozwiązania nr 1, muszę ręcznie otworzyć schemat docelowej w Xcode i dodać DYLD_INSERT_LIBRARIES zmienną środowiskową wskazując na libclang_rt.asan_osx_dynamic.dylib.
  • Podczas korzystania z rozwiązania nr 2 ścieżka do biblioteki ASan różni się w zależności od komputera.

Dodatkowo jako inne rozwiązanie próbowałem włączyć flagę odseparowania adresata ze schematu docelowego Xcode, ale co ciekawe, nie wykryłem problemów, które dodałem, więc nie wymieniłem tego jako rozwiązania, ponieważ mój test się nie powiódł.

Każda pomoc będzie doceniana.

+2

może to sprawdzić: https://github.com/arsenm/sanitizers-cmake – xaxxon

+0

Jeśli znasz otoczeniu projektu Xcode, które zamienia na to, co chcesz, możesz ustaw go z CMake, wypełniając zmienne 'CMAKE_XCODE_ATTRIBUTE _...' lub używając właściwości celu docelowego 'XCODE_ATTRIBUTE _...'. –

Odpowiedz

1

Musisz podać flagę (y) także do linkera. Robię to tak:

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

Druga linia wygląda na niepoprawną. Osiem powinno być CMAKE_STATIC_LINKER_FLAGS_DEBUG po obu stronach lub CMAKE_LINKER_FLAGS_DEBUG. – proski

+0

zestaw (CMAKE_CXX_FLAGS "$ {CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize = adres") pracował dla mnie na kompilacjach CMOS dla iOS. Powinieneś upewnić się, że używasz poprawnej konfiguracji biblioteki, którą tworzysz (Debuguj/Release) –