如何将来自clang静态代码分析的警告视为Xcode 3中的错误?

时间:2011-02-17 19:10:16

标签: xcode warnings clang static-code-analysis

问题

RUN_CLANG_STATIC_ANALYZER(“运行静态分析器”)项目设置在我们的项目中发现了重要问题。我们已经解决了这些问题,我们希望防止未来的问题蔓延开来。

我们正试图让clang分析警告 被视为break our build的错误。到目前为止,尽管已启用-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分析器结果”。我们正在寻找的解决方案将使上面的示例生成“构建失败”。


解决方案

我接受了Jim的建议并创建了一个构建脚本。

为了避免误报,我遇到了确保忽略外来分析残留的麻烦。从Xcode IDE构建时以及使用xcodebuild构建项目时,此解决方案应该有效。

将Xcode 3分析警告转换为构建错误:

  • 双击有问题的项目或目标。
  • 在构建标签下,选中设置>下的框。链接>写链接地图文件

该设置也称为LD_GENERATE_MAP_FILE

  • 在“群组和文件”下> “目标”,点击您要添加此功能的目标的显示三角形。
  • 右键单击“Link Binary With Libraries”阶段。
  • 选择添加>新建阶段>新运行脚本构建阶段
  • 可选:重命名刚刚添加到“将Clang警告视为错误”的“运行脚本”阶段。
  • 双击新脚本阶段(如果尚未打开)。

复制下面的内容并将其粘贴到“脚本”部分。

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 Vossellerupgraded version of this script for Xcode 5

2 个答案:

答案 0 :(得分:2)

我们一直在计划单独的构建步骤来运行分析器并检查结果。我们将以这种方式在构建服务器上构建失败。但是,这对当地人没有帮助。

答案 1 :(得分:-3)

Xcode有一个“将警告视为错误”复选框。如果您找不到它,已经为某些iPhone项目说过,只需在您的目标的构建设置中为您的WARNING_CFLAGS添加“-Werror”。