Comment traiter les avertissements de l'analyse du code statique Clang comme des erreurs dans Xcode 3 ?

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

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top