質問

質問

run_clang_static_analyzer( "Run Static Analyzer")プロジェクト設定は、プロジェクトで重要な問題を見つけました。私たちはそれらを取り上げています、そして私たちは将来の問題を忍び寄るからの問題を防ぎたいです。

私たちはCLANG分析警告を取得しようとしています ビルドを破る。これまでのところ成功はありません(「警告として扱う」という警告を有効にしています。

問題の例

Xcode内で生成された次の分析呼び出し:

/ developer / usr / bin / clang -x objective-c [...] --analyze [...] / trorfutcode.m -o [...] / trorbledTarget.build/Staticanalyzer/Normal/i386 /troubledCode.plist

静的コード分析を生成する警告:

[...]/TroubledCode.m:38:34: warning: Potential leak of an object allocated on line 38 and stored into 'leakingManager'
    Manager *leakingManager = [[Manager alloc] init];
                              ^
1 warning generated.
.

しかしXcodeレポート「ビルド成功... 1アナライザ結果」。私たちが探している解決策は、上記の例に「ビルド失敗」を生成します。


溶液

私はJimのアドバイスをしてビルドスクリプトを作成しました。

誤警報を避けるために、私は無関係な分析残差を無視することを確実にするための問題を回避しました。このソリューションは、Xcode IDEからビルディングするとき、およびProjectをxcodebuildを使用してプロジェクトを構築するときに機能するはずです。

Xcode 3分析警告をビルドエラーに変えるには:

  • 問題のプロジェクトまたはターゲットをダブルクリックします。
  • [ビルド]タブの下にある[設定]> [リンク]> [リンクマップファイルの書き込み] を確認します。

    その設定はLD_GENERATE_MAP_FILEとも呼ばれます。

    • 「グループとファイル」>「ターゲット」の下にある、この機能を追加したいターゲットの開示の三角形をクリックします。
    • 「ライブラリとのリンクバイナリ」フェーズを右クリックします。
    • 追加の選択>新しいビルドフェーズ>新規実行スクリプトビルドフェーズ
    • オプション: "Run Script"フェーズの名前を "run script"フェーズを "run clang warningsとしてエラーとして";
    • まだ開いていない場合は、新しいスクリプトフェーズをダブルクリックします。

      下記の内容をコピーして「スクリプト」セクションに貼り付けます。

      error_count=0
      
      ##
      
      function verify_clang_analysis_at_path()
      {
        local analysis_path=$1
        local plist_tool=/usr/libexec/PlistBuddy
        local diagnostics=$($plist_tool -c "print diagnostics" $analysis_path)
      
        if [[ $diagnostics != $'Array {\n}' ]]
        then
          ((error_count++))
        fi
      }
      
      function verify_clang_analysis_for_object_file()
      {
        local object_file=$1
        local analysis_directory=$TARGET_TEMP_DIR/StaticAnalyzer/$CURRENT_VARIANT/$CURRENT_ARCH
        local analysis_path=$analysis_directory/${object_file%.*}.plist
      
        # if this object file corresponds to a source file that clang analyzed...
        if [ -e $analysis_path ]
        then
          verify_clang_analysis_at_path $analysis_path
        fi
      }
      
      ##
      
      object_directory=$OBJECT_FILE_DIR-$CURRENT_VARIANT/$CURRENT_ARCH
      object_path_pattern=${object_directory}'/\(.\)\+\.o$'
      
      index_pattern='\[[[:space:]0-9]*\][[:space:]]'
      
      object_paths=$( 
        grep $object_path_pattern $LD_MAP_FILE_PATH | sed s/$index_pattern//
      )
      
      ##
      
      for object_path in $object_paths 
      do
        object_file=${object_path##*/}
        verify_clang_analysis_for_object_file $object_file
      done
      
      if [ $error_count -gt 0 ]
      then
         echo "Clang static code analysis failed for" $error_count "source file(s)."
      fi
      
      exit $error_count
      
      .

      更新

      mike vosseller には XCODE 5のこのスクリプトのアップグレードバージョン5

役に立ちましたか?

解決

We've been planning on having a separate build step to run the analyzer and check the results. We'll fail the build on the build server that way. That won't help you locally, though.

他のヒント

Xcode has a "Treat warnings as errors" checkbox. If you can't find it, which has been said for some iPhone projects, just add "-Werror" to your WARNING_CFLAGS in the Build Settings for your target(s) in question.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top