问题
RUN_CLANG_STATIC_ANALYZER(“运行静态分析器”)项目设置在我们的项目中发现了重要问题。我们已经解决了这些问题,我们希望防止未来的问题蔓延。
我们试图让 clang 分析警告被视为错误来破坏我们的构建。尽管启用了 -Werror(“将警告视为错误”),但到目前为止还没有成功。
问题示例
在 Xcode 中生成以下分析调用:
/Developer/usr/bin/clang -x objective-c [...] --analyze [...]/TroubledCode.m -o [...]/TroubledTarget.build/StaticAnalyzer/normal/i386/TroubledCode。列表
产生静态代码分析警告:
[...]/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 分析警告转换为构建错误:
- 双击有问题的项目或目标。
- 在 Build 选项卡下,选中 Settings > Linking > Write Link Map File 下的框
该设置也称为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