Как обрабатывать предупреждения от статического анализа кода Clang как ошибки в Xcode 3? - PullRequest
11 голосов
/ 17 февраля 2011

Вопрос

Настройка проекта RUN_CLANG_STATIC_ANALYZER («Запустить статический анализатор») обнаружила важные проблемы в нашем проекте.Мы обратились к ним, и мы хотим предотвратить будущие проблемы.

Мы пытаемся сделать так, чтобы предупреждения анализа лягушек рассматривались как ошибки, чтобы сломать нашу сборку .Пока что безуспешно, несмотря на то, что -Werror («Обрабатывать предупреждения как ошибки»).

Пример проблемы

Следующий вызов анализа, сгенерированный в Xcode:

/ Developer / usr / bin / clang -x target-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 result of analyzer".Решение, которое мы ищем, заставит приведенный выше пример генерировать «Build Failed».

Решение

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

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

Чтобы превратить предупреждения анализа Xcode 3 в ошибки сборки:

  • Дважды щелкните проект илицелевой объект.
  • На вкладке «Построение» установите флажок в разделе «Настройки»> «Связывание»> «Создать файл карты ссылок»

Этот параметр также известен как LD_GENERATE_MAP_FILE.

*.1039 * В разделе «Группы и файлы»> «Цели» щелкните треугольник раскрытия цели, в которую вы хотите добавить эту функцию. Щелкните правой кнопкой мыши по фазе «Связать двоичные файлы с библиотеками».. выберите «Добавить»> «Новая фаза сборки»> «Создать сценарий запуска сценария» необязательно: переименуйте фазу «Выполнить сценарий», которую вы только что добавили, в «Обрабатывать предупреждения кланов как ошибки». Дважды щелкните новый этап сценария, если он еще не открыт.

Скопируйте приведенное ниже содержимое и вставьте его в раздел «Сценарий».

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 .

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Мы планировали отдельный этап сборки для запуска анализатора и проверки результатов.Таким образом, мы не сможем выполнить сборку на сервере сборки.Это не поможет вам на местном уровне.

0 голосов
/ 17 февраля 2011

Xcode имеет флажок «Обрабатывать предупреждения как ошибки».Если вы не можете найти его, как было сказано для некоторых проектов iPhone, просто добавьте «-Werror» в WARNING_CFLAGS в настройках сборки для ваших целей.

...