Pergunta

Pergunta

O RUN_CLANG_STATIC_ANALYZER ("Executar o Analisador Estático") definição de projecto tem encontrado problemas importantes em nosso projeto.Temos dirigiu-se a eles e nós queremos evitar futuros problemas de rastejar.

Estamos tentando chegar a clang avisos de análise para ser tratados como erros quebrar a nossa construir.Até agora sem sucesso, apesar de ter -Werror ("Tratar Avisos de Erros") habilitado.

Exemplo do Problema

A análise seguinte chamada gerada dentro do Xcode:

/Desenvolvedor/usr/bin/clang -x objective-c [...] --analisar [...]/TroubledCode.m-o [...]/TroubledTarget.construir/StaticAnalyzer/normal/i386/TroubledCode.plist

produz-se uma análise estática de código de aviso:

[...]/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.

mas Xcode relatórios", a Compilação foi bem Sucedida ...1 analisador de resultado".A solução que está procurando faria o exemplo acima gerar uma "Falha na Compilação".


Solução

Eu levei Jim conselhos e criado um script de compilação.

Para evitar falsos alarmes, eu fui pela dificuldade de se certificar de que ele ignora estranhas análise de resíduos.Esta solução deve funcionar quando a construção do Xcode IDE e a construção de seu projeto usando xcodebuild.

Para ativar o Xcode 3 avisos de análise em erros de compilação:

  • Faça duplo clique no projecto ou destino em questão.
  • Sob a guia de Compilação, marque a caixa em Definições > Ligação > Escrever Link do Arquivo de Mapa

Essa configuração também é conhecida como LD_GENERATE_MAP_FILE.

  • Em "Grupos e Arquivos" > "Alvos", clique no triângulo de divulgação do destino você gostaria de adicionar esse recurso.
  • Clique com o botão direito clique em "Vincular Binários Com Bibliotecas" fase.
  • selecione Adicionar > Nova Fase de Compilação > Nova Executar o Script de construção Fase de
  • opcional:Mudar o nome de "Executar Script" fase você acabou de adicionar ao "Tratar Clang Avisos de Erros".
  • Faça duplo clique em novo script fase se ele já não estiver aberto.

Copie o conteúdo abaixo e cole-o no "Script" seção.

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

Atualização

Mike Vosseller tem um versão atualizada do script para o Xcode 5.

Foi útil?

Solução

Estivemos planejando ter um separado etapa de compilação para executar o analisador e verificar os resultados.Nós vamos falhar a construir em construir o servidor de que forma.Que não vai ajudá-lo localmente, embora.

Outras dicas

O Xcode tem um "Tratar avisos como erros de" caixa de seleção.Se você não pode encontrá-lo, o que tem sido dito por alguns de iPhone de projetos, basta adicionar "-Werror" para o seu WARNING_CFLAGS em Definições de Compilação para o seu alvo(s) em questão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top