Frage

Frage

Die Projekteinstellung RUN_CLANG_STATIC_ANALYZER ("Run Static Analyzer") hat wichtige Probleme in unserem Projekt gefunden.Wir haben sie angesprochen und wollen verhindern, dass sich zukünftige Probleme einschleichen.

Wir versuchen, Warnungen zur Klanganalyse zu erhalten werden als Fehler behandelt brechen Sie unseren Build.Bisher kein Erfolg, obwohl -Werror ("Warnungen als Fehler behandeln") aktiviert ist.

Beispiel für ein Problem

Der folgende Analyseaufruf wurde in Xcode generiert:

/ Entwickler / usr / Behälter / klirren -x Ziel-c [...] --analysieren [...]/ Problemcode.m -o [...] / Problemziel.erstellen Sie/StaticAnalyzer/normal/i386/TroubledCode.plist

erzeugt eine Warnung zur statischen Codeanalyse:

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

aber Xcode meldet "Build erfolgreich...1 analysatorergebnis".Die Lösung, nach der wir suchen, würde dazu führen, dass das obige Beispiel einen "Build Failed" generiert.


Lösung

Ich habe Jims Rat befolgt und ein Build-Skript erstellt.

Um Fehlalarme zu vermeiden, habe ich mir die Mühe gemacht, sicherzustellen, dass fremde Analyserückstände ignoriert werden.Diese Lösung sollte beim Erstellen aus der Xcode-IDE und beim Erstellen Ihres Projekts mit funktionieren xcodebuild.

So verwandeln Sie Xcode 3-Analysewarnungen in Build-Fehler:

  • Doppelklicken Sie auf das betreffende Projekt oder Ziel.
  • Aktivieren Sie auf der Registerkarte Erstellen das Kontrollkästchen unter Einstellungen> Verknüpfen> Link-Map-Datei schreiben

Diese Einstellung ist auch bekannt als LD_GENERATE_MAP_FILE.

  • Klicken Sie unter "Gruppen & Dateien"> "Ziele" auf das Dreieck des Ziels, dem Sie diese Funktion hinzufügen möchten.
  • Klicken Sie mit der rechten Maustaste auf die Phase "Binärdatei mit Bibliotheken verknüpfen".
  • wählen Sie Hinzufügen > Neue Build-Phase > Neue Skript-Build-Phase ausführen
  • optional:Benennen Sie die soeben hinzugefügte Phase "Skript ausführen" in "Klirrwarnungen als Fehler behandeln" um.
  • Doppelklicken Sie auf die neue Skriptphase, falls sie noch nicht geöffnet ist.

Kopieren Sie den folgenden Inhalt und fügen Sie ihn in den Abschnitt "Skript" ein.

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

Update

Mike Vosseller hat eine aktualisierte Version dieses Skripts für Xcode 5.

War es hilfreich?

Lösung

Wir haben geplant, einen separaten Build-Schritt durchzuführen, um den Analysator auszuführen und die Ergebnisse zu überprüfen.Auf diese Weise wird der Build auf dem Build-Server fehlschlagen.Das wird dir vor Ort jedoch nicht helfen.

Andere Tipps

Xcode hat ein Kontrollkästchen "Warnungen als Fehler behandeln".Wenn Sie es nicht finden können, was für einige iPhone-Projekte gesagt wurde, fügen Sie einfach "-Werror" zu Ihren WARNING_CFLAGS in den Build-Einstellungen für Ihre fraglichen Ziele hinzu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top