web-dev-qa-db-ja.com

Xcodeで動作するCMakeでAddressSanitizerを有効にする適切な方法は何ですか

次のようにAddressSanitizerフラグを追加しました。

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

Unix Makefilesを使用すると、すべてが正常にビルドおよび実行されます。

Xcodeプロジェクトを生成するときに問題が発生します。ASanライブラリが見つからないため、リンクしたくないだけです。

すでに2つのソリューションを見つけましたが、CMakeだけでは自動化できないため、使用しないことにしました。

  1. リンクされたフラグに-Wl,-undefined,dynamic_lookupを追加すると、動的ライブラリへのリンクがスキップされます。
  2. libclang_rt.asan_osx_dynamic.dylibと直接リンクします。

では、これら2つのソリューションの問題点は何ですか?

  • ソリューション#1を使用する場合、Xcodeでターゲットスキームを手動で開き、DYLD_INSERT_LIBRARIESを指すlibclang_rt.asan_osx_dynamic.dylib環境変数を追加する必要があります。
  • ソリューション#2を使用する場合、ASanライブラリーのパスはコンピューターによって異なります。

さらに、別のソリューションとして、XcodeターゲットスキームからAddress Sanitizerフラグを有効にしようとしましたが、興味深いことに、追加した問題を検出できませんでした。したがって、テストに失敗したため、これをソリューションとしてリストしませんでした。

どんな助けも大歓迎です。

19
ObjSal

リンカにもフラグを提供する必要があります。私はこれを次のようにしています:

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

cmake 3.13
xcode schema の設定を導入

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
5
zxshi

私が現在見つけた最も簡単な解決策は

cmake -DCMAKE_BUILD_TYPE=ASAN .

このオプションは、多くのフラグを変更するのではなく、意図(サニタイザーの実行)を表現するため、このオプションの方が好きです。

このオプションがいつ追加されたかはわかりません。また、ドキュメントも見つかりません。

3
Unapiedra