2017-06-02 299 views
10

工作我已經添加AddressSanitizer標誌如下:什麼是正確的方式CMake的啓用AddressSanitizer在Xcode中

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

一切都建立並使用Unix Makefiles時運行正常。

生成Xcode項目時出現問題,它只是不想鏈接,因爲它找不到ASan庫。

我已經發現了兩個解決方案,但決定不使用他們,因爲他們不能只使用CMake的自動化:

  1. 添加-Wl,-undefined,dynamic_lookup到鏈接的標誌,所以它跳過鏈接到動態庫。
  2. 直接鏈接libclang_rt.asan_osx_dynamic.dylib

那麼這兩種解決方案有什麼問題?

  • 當使用溶液#1,我在Xcode手動打開目標方案,並添加DYLD_INSERT_LIBRARIES環境變量指向libclang_rt.asan_osx_dynamic.dylib
  • 使用解決方案#2時,ASan庫的路徑因計算機而異。

此外,作爲另一種解決方案,我試圖從Xcode目標方案啓用Address Sanitizer標誌,但有趣的是它沒有檢測到我添加的問題,所以我沒有列出這個解決方案,因爲它沒有通過我的測試。

任何幫助將不勝感激。

+2

或許檢查了這一點:https://github.com/arsenm/sanitizers-cmake – xaxxon

+0

如果你知道一個Xcode項目設置,你想要什麼變成,你可以通過填充'CMAKE_XCODE_ATTRIBUTE _...'變量或使用每個目標屬性'XCODE_ATTRIBUTE _...'來從CMake中設置它。 –

回答

1

您還需要爲鏈接器提供標誌。我做這樣的:

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

第二行對我來說看起來不對。八位應該是CMAKE_STATIC_LINKER_FLAGS_DEBUG,或CMAKE_LINKER_FLAGS_DEBUG。 – proski

+0

設置(CMAKE_CXX_FLAGS「$ {CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -sananize = address」) 在iOS上爲我工作CMake構建。你應該確保使用你構建的庫的正確配置(Debug/Release) –

相關問題