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

Вопрос

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

Мы пытаемся получить предупреждения анализа clang относиться к ошибкам отладить нашу сборку. До сих пор не удалось добиться успеха, несмотря на наличие -Werror ( "Обработать предупреждения как ошибки" ).

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

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

/Разработчик/usr/bin/clang -x objective-c [...] --анализ [...]/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 результат анализатора". Решение, которое мы ищем, приведет к тому, что приведенный выше пример генерирует "Сбой сборки".


Решение

Я взял совет Джима и создал сборку script.

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

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

  • Дважды щелкните проект или цель, о которой идет речь.
  • На вкладке "Сборка" установите флажок "Настройки" > "Связывание" > "Файл ссылки с ссылкой"

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

  • В разделе "Группы и файлы" > "Цели" щелкните треугольник раскрытия цели, к которой вы хотите добавить эту функцию.
  • Щелкните правой кнопкой мыши по фазе "Link Binary With Libraries".
  • выберите "Добавить" > "Новая фаза сборки" > "Новый запуск" Script "Фаза сборки"
  • optional: переименуйте фазу "Запуск Script", которую вы только что добавили в "Обработка предупреждений о кланге как ошибки".
  • Дважды щелкните по новой фазе Script, если она еще не открыта.

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

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

Update

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

Ответ 1

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

Ответ 2

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