2009-05-13 12 views
15

Ich versuche mit clang ein Projekt zu profilieren, an dem ich gerade arbeite. Das Projekt enthält eine ziemlich große statische Bibliothek, die in Xcode als Abhängigkeit enthalten ist.Kann es vorkommen, dass bestimmte Dateien nicht analysiert werden?

Ich würde wirklich gerne Clang die Dateien der Abhängigkeiten nicht analysieren, da es Klänge scheitern scheint. Ist das möglich? Ich habe die Clang-Dokumentation gelesen und habe sie nicht gefunden.

+0

Apple ein ordentliches Forum für vertrauliche Gespräche von Produkten unter NDA wird veröffentlicht am http://devforums.apple.com in denen Fragen wie diese von Apple-Leuten und anderen offen gelegten Entwicklern beantwortet werden können. – cdespinosa

+0

(es sei denn, Sie fragen nach dem Scan-Build-Tool unter http://clang.llvm.org/StaticAnalysis.html, das tatsächlich öffentlich ist. In diesem Fall sollten Sie nur die Quelldateien auflisten, die Sie analysieren möchten, wie gezeigt in Basic Usage auf dieser Seite.) – cdespinosa

+0

Ich spreche nur über das Scan-Build-Tool. Leider hat es bei der grundlegenden Verwendung nichts dagegen, Dateien von der Analyse auszuschließen. Wenn Sie scan-build für ein Projekt verwenden, analysiert es standardmäßig alle Dateien in diesem Projekt, einschließlich meiner umfangreichen statischen Bibliothek. –

Antwort

4

Also, das ist nicht wirklich eine Antwort, aber es hat gut genug geklappt.

Was ich getan habe, war im Voraus die statische Bibliothek zu erstellen und dann das Projekt mit Hilfe von Scan-Build aufzubauen. Da die statische Bibliothek bereits aktuell erstellt wurde, wurde sie nicht neu erstellt und daher nicht gescannt.

Ich würde immer noch gerne eine echte Antwort dafür haben, obwohl.

13

Als letztes Mittel gibt es eine Brute-Force-Option.

Fügen Sie diese an den Anfang einer Datei:

// Omit from static analysis. 
#ifndef __clang_analyzer__ 

hinzufügen Zu Ende:

#endif // not __clang_analyzer__ 

und Klirren --analyze wird der Inhalt der Datei nicht sehen.

Referenz: Controlling Static Analyzer Diagnostics

+1

Das bedeutet, dass ich dieses Makro auf jede Quelldatei in der statischen Bibliothek setzen muss, oder? Das ist nicht überschaubar IMO. Ich werde meine Abhängigkeiten überhaupt nicht ändern, da ich CocoaPods für meine iOS-Projekte verwende. –

1

ich XCode nicht, aber unter Verwendung von Scan-build in Linux die folgenden Werke für mich. In meinem Fall möchte ich die statische Analyse auf allen nicht generierten Code der ersten Partei ausführen. Ich möchte es jedoch vermeiden, es mit dem Code von Drittanbietercode und generiertem Code auszuführen.

In der Befehlszeile wird clang-analyzer in den Build eingebunden, wenn scan-build CC- und CXX-Umgebungsvariablen in ccc-analyzer- und C++ - analyzer-Positionen setzt. Ich schrieb zwei einfache Skripte namens ccc-analyzer.py und C++ - analyzer.py und hakte sie in die Kompilierung anstelle des Standard-Skripts ein. In diesen Wrapper-Skripten habe ich einfach den Pfad der kompilierten Datei betrachtet und dann entweder den rohen Compiler direkt ausgeführt (wenn ich statische Analyse vermeiden möchte) oder den c * -Analyzer (wenn ich statische Analyse durchführen möchte). Mein Skript ist in Python und gebunden an meinem speziellen Build-System, sondern als Beispiel der Modifikation benötigt:

import subprocess 
import sys 

def main(argv): 
    is_third_party_code = False 
    for i in range(len(argv)): 
    arg = argv[i] 
    if arg == '-c': 
     file_to_compile = argv[i + 1] 
     if '/third_party/' in file_to_compile or \ 
      file_to_compile.startswith('gen/'): 
     is_third_party_code = True 
     break 
    if is_third_party_code: 
    argv[0] = '/samegoal/bin/clang++' 
    else: 
    argv[0] = '/samegoal/scan-build/c++-analyzer' 
    return subprocess.call(argv) 

if __name__ == '__main__': 
    sys.exit(main(sys.argv))