11

質問

RUN_CLANG_STATIC_ANALYZER (「Run Static Analyzer」) プロジェクト設定により、プロジェクトで重要な問題が検出されました。私たちはそれらに対処しており、将来の問題が忍び寄るのを防ぎたいと考えています.

私たちは、clang 分析の警告をエラーとして扱い、ビルドを中断させようとしています。-Werror (「警告をエラーとして扱う」) が有効になっているにもかかわらず、これまでのところ成功していません。

問題の例

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

/Developer/usr/bin/clang -x Objective-c [...] --analyze [...]/TroubledCode.m -o [...]/TroubledTarget.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つのアナライザー結果」を報告します。私たちが探している解決策は、上記の例で「Build Failed」を生成することです。


解決

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

誤報を避けるために、無関係な分析残留物を無視するように苦労しました。このソリューションは、Xcode IDE からビルドする場合、および を使用してプロジェクトをビルドする場合に機能するはずxcodebuildです。

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

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

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

  • [グループとファイル] > [ターゲット] の下で、この機能を追加するターゲットの開閉用三角ボタンをクリックします。
  • 「Link Binary With Libraries」フェーズを右クリックします。
  • [追加] > [新しいビルド フェーズ] > [新しい実行スクリプト ビルド フェーズ] を選択します。
  • オプション: 追加したばかりの「Run Script」フェーズの名前を「Treat Clang Warnings as Errors」に変更します。
  • まだ開いていない場合は、新しいスクリプト フェーズをダブルクリックします。

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

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 用のこのスクリプトのアップグレード版を持っています。

4

2 に答える 2

2

アナライザーを実行して結果を確認するための別のビルドステップを計画しています。その方法でビルドサーバーでのビルドに失敗します。ただし、それはローカルでは役に立ちません。

于 2011-02-18T16:34:48.947 に答える