Xcode 3のエラーとしてCLANG静的コード分析から警告を扱う方法は?
-
14-11-2019 - |
質問
質問
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
更新
解決
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.