Как обрабатывать предупреждения от статического анализа кода clang как ошибки в Xcode 3?

Вопрос

Параметр проекта RUN_CLANG_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 сообщает "Build Succeeded ... 1 analyzer result". Решение, которое мы ищем, заставит приведенный выше пример сгенерировать сообщение «Build Failed».


Решение

Я последовал совету Джима и создал сценарий сборки.

Чтобы избежать ложных срабатываний, я столкнулся с проблемой: убедитесь, что он игнорирует посторонние остатки анализа.

  • Дважды щелкните новую фазу сценария, если она еще не открыта.
  • Скопируйте содержимое ниже и вставьте его в раздел «Сценарий».

    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
    

    Обновление

    Майк Восселлер имеет обновленная версия этого скрипта для Xcode 5 .

    11
    задан Community 23 May 2017 в 12:09
    поделиться