Domanda

domanda

L'impostazione del progetto RUN_CLANG_STATIC_ANALYZER ("Esegui Static Analyzer") ha trovato problemi importanti nel nostro progetto. Li abbiamo affrontati e vogliamo prevenire i problemi futuri di insinuarsi.

Stiamo cercando di ottenere avvertenze di analisi di Clang a Essere trattati come errori a Break la nostra build . Finora nessun successo nonostante abbia -werror ("Trattare gli avvertimenti come errori") abilitato.

Esempio di problema

La seguente chiamata di analisi generata all'interno di XCode:

.

/ Sviluppatore / usr / bin / clang -x objective-c [...] --analyze [...] / turbabledcode.m -o [...] / turbabletarget.build/staticanalyzer/normal/i386 /Troubledcode.plist

Produce un'analisi dei codici statici AVVERTENZA:

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

Ma i rapporti Xcode "Build ha avuto successo ... 1 risultato analizzatore". La soluzione che stiamo cercando renderebbe l'esempio sopra generare una "Build Failed".


.

Soluzione

Ho preso il consiglio di Jim e ho creato uno script di build.

Per evitare falsi allarmi, ho attraversato il problema di assicurarsi che ignorasse residui di analisi estranei. Questa soluzione dovrebbe funzionare durante la creazione dall'IDE XCode e quando si crea il progetto utilizzando xcodebuild.

Per attivare XCode 3 Avvertenze di analisi in errori di creazione:

    .
  • Fare doppio clic sul progetto o dal bersaglio in questione.
  • Sotto la scheda Build, selezionare la casella in Impostazioni> Collegamento> Scrivi il file Link Map

    L'impostazione è anche nota come LD_GENERATE_MAP_FILE.

      .
    • Sotto "Gruppi e file"> "Targets", fare clic sul triangolo di divulgazione del target che desideri aggiungere questa funzione a.
    • Fare clic con il pulsante destro del mouse sulla fase "Link Binary with Libraries".
    • Selezionare Aggiungi> Nuova fase di build> Nuovo esecuzione di fase di costruzione dello script
    • Opzionale: Rinominare la fase "Esegui script" che hai appena aggiunto a "Trattare gli avvertimenti di Crang come errori".
    • Fare doppio clic sulla nuova fase di script se non è già aperta.

      Copia il contenuto qui sotto e incollalo nella sezione "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
      
      .

      Aggiorna

      Mike Vosseller ha un Versione aggiornata di questo script per XCode 5 .

È stato utile?

Soluzione

We've been planning on having a separate build step to run the analyzer and check the results. We'll fail the build on the build server that way. That won't help you locally, though.

Altri suggerimenti

Xcode has a "Treat warnings as errors" checkbox. If you can't find it, which has been said for some iPhone projects, just add "-Werror" to your WARNING_CFLAGS in the Build Settings for your target(s) in question.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top