Cómo tratar las advertencias de ruido de análisis de código estático como errores en Xcode 3?

StackOverflow https://stackoverflow.com/questions/5033417

Pregunta

Pregunta

El RUN_CLANG_STATIC_ANALYZER ("Ejecutar Analizador Estático") configuración de proyecto ha encontrado problemas importantes en nuestro proyecto.Nos hemos dirigido a ellos y queremos prevenir futuros problemas de reptiles en.

Estamos tratando de hacer sonar el análisis de las advertencias a ser tratados como errores a romper nuestra generación.Hasta ahora ningún éxito a pesar de tener -Werror ("Tratar a las Advertencias de Errores") habilitado.

Ejemplo de Problema

El siguiente análisis de la llamada generada dentro de Xcode:

/Desarrollador/usr/bin/clang -x objective-c [...] --analizar [...]/TroubledCode.m -s [...]/TroubledTarget.construir/StaticAnalyzer/normal/i386/TroubledCode.plist

produce un análisis estático del código de advertencia:

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

pero Xcode informes de "Construir Logrado ...1 analizador de resultado".La solución que estamos buscando hacer el ejemplo anterior generar un "Build Failed".


Solución

Me tomó de Jim asesoramiento y creado un script de compilación.

Para evitar falsas alarmas, me fui a través de la molestia de asegurarse de que se ignora extraños análisis de residuos.Esta solución debe funcionar cuando la construcción de la Xcode IDE y cuando la construcción de su proyecto utilizando xcodebuild.

A su vez Xcode 3 análisis de las advertencias en errores de compilación:

  • Haga doble clic en el proyecto o destino en cuestión.
  • Bajo la ficha generación, marque la casilla en Ajustes > Vinculación de > Escribir el Enlace de Archivo de Mapa

Esa configuración es también conocido como LD_GENERATE_MAP_FILE.

  • En "Grupos y Archivos" > "Objetivos", haga clic en el triángulo desplegable de la meta que desea añadir esta característica.
  • Haga clic en el Enlace de "Binario Con las Bibliotecas de fase".
  • seleccione Agregar > Nueva Fase de construcción > Nueva secuencia de Comandos Ejecutar la Fase de construcción
  • opcional:Cambiar el nombre de la "Ejecutar Script" la fase que acaba de agregar a "Tratar a Sonar las Advertencias de Errores".
  • Haga doble clic en la nueva secuencia de fase, si no está ya abierto.

Copia el contenido de abajo y pegarlo en el "Guión" de la sección.

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

Actualización

Mike Vosseller tiene un versión actualizada de esta secuencia de comandos para Xcode 5.

¿Fue útil?

Solución

Hemos estado planeando tener un paso de compilación separado para ejecutar el analizador y verificar los resultados.De esa manera fallaremos la compilación en el servidor de compilación.Sin embargo, eso no te ayudará a nivel local.

Otros consejos

Xcode tiene una casilla de verificación "Tratar advertencias como errores".Si no puede encontrarlo, como se ha dicho para algunos proyectos de iPhone, simplemente agregue "-Werror" a su WARNING_CFLAGS en la Configuración de compilación para su(s) objetivo(s) en cuestión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top