Cómo tratar las advertencias de ruido de análisis de código estático como errores en Xcode 3?
-
14-11-2019 - |
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.
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.