Comment traiter les avertissements de l'analyse du code statique Clang comme des erreurs dans Xcode 3 ?
-
14-11-2019 - |
Question
Question
Le paramètre du projet RUN_CLANG_STATIC_ANALYZER ("Run Static Analyzer") a détecté des problèmes importants dans notre projet.Nous les avons résolus et nous voulons éviter que de futurs problèmes ne s’installent.
Nous essayons d'obtenir des avertissements d'analyse de Clang pour être traités comme des erreurs briser notre construction.Jusqu'à présent, aucun succès malgré l'activation de -Werror ("Traiter les avertissements comme des erreurs").
Exemple de problème
L'appel d'analyse suivant généré dans Xcode :
/Developer/usr/bin/clang -x objective-c [...] --analyze [...]/TroubledCode.m -o [...]/TroubledTarget.build/StaticAnalyzer/normal/i386/TroubledCode. liste de plis
produit un avertissement d'analyse de code statique :
[...]/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.
mais Xcode rapporte "Build Succeeded...1 résultat analyseur".La solution que nous recherchons ferait en sorte que l’exemple ci-dessus génère un « Échec de la construction ».
Solution
J'ai suivi les conseils de Jim et créé un script de build.
Pour éviter les fausses alarmes, j'ai pris la peine de m'assurer qu'il ignore les résidus d'analyse étrangers.Cette solution devrait fonctionner lors de la construction à partir de l'IDE Xcode et lors de la construction de votre projet à l'aide de xcodebuild
.
Pour transformer les avertissements d'analyse Xcode 3 en erreurs de build :
- Double-cliquez sur le projet ou la cible en question.
- Sous l'onglet Construire, cochez la case sous Paramètres > Liaison > Écrire un fichier de carte de lien
Ce paramètre est également connu sous le nom LD_GENERATE_MAP_FILE
.
- Sous « Groupes et fichiers » > « Cibles », cliquez sur le triangle d'affichage de la cible à laquelle vous souhaitez ajouter cette fonctionnalité.
- Cliquez avec le bouton droit sur la phase "Lier le binaire aux bibliothèques".
- sélectionnez Ajouter > Nouvelle phase de construction > Nouvelle phase de construction de script d'exécution
- facultatif:Renommez la phase "Exécuter le script" que vous venez d'ajouter en "Traiter les avertissements Clang comme des erreurs".
- Double-cliquez sur la nouvelle phase de script si elle n'est pas déjà ouverte.
Copiez le contenu ci-dessous et collez-le dans la section "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
Mise à jour
Mike Vosseller a un version améliorée de ce script pour Xcode 5.
La solution
Nous prévoyons d'avoir une étape de construction distincte pour exécuter l'analyseur et vérifier les résultats.Nous ferons échouer la construction sur le serveur de construction de cette façon.Cela ne vous aidera cependant pas localement.
Autres conseils
Xcode a une case à cocher « Traiter les avertissements comme des erreurs ».Si vous ne le trouvez pas, ce qui a été dit pour certains projets iPhone, ajoutez simplement "-Werror" à votre warn_cflags dans les paramètres de construction de votre (vos) cible (s) en question.