gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:30:11 30 4
gpt4 key购买 nike



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 分析警告转换为构建错误:
  • 双击有问题的项目或目标。
  • 在 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

    更新

    Mike Vosseller有一个 upgraded version of this script for Xcode 5 .

    最佳答案

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

    关于xcode - 如何将来自 clang 静态代码分析的警告视为 Xcode 3 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5033417/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com