2013-02-15 7 views
8

Ich mache interprozedurale Datenflussanalyse mit Clang. Momentan benutze ich libtooling, um Quelldateien zu analysieren und AST-Besucher anzurufen. Die Frage ist, wie ich eine einzelne AST für mehrere .c-Dateien erstellen?AST für mehrere Quelldateien mit Clang

Ich habe versucht, ASTImport-Klasse zu verwenden, aber es unterstützt nicht den Import einiger AST-Knoten. Außerdem mache ich etwas falsch, wenn ich CompilerIstance erstelle und manipuliere und es im Destruktor abstürzt.

Eine sehr ähnliche Option war ASTImportAction, aber mir ist nicht ganz klar, welche Kommandozeilenparameter in diesem Fall an das ClangTool übergeben werden sollten.

Die dritte Option bestand darin, ASTUnits für jede .c-Datei zu erstellen und nach Definitionen in jedem von ihnen zu suchen. Es ist nicht klar, wie man zwischen benutzerdefinierbaren Typen, z. Aufzeichnungen. In ASTImport verwenden sie die IsStructurallyEquivalent() - Funktion, aber sie wird im anonymen Namespace deklariert, so dass ich nur diesen ganzen Code in mein Programm kopieren kann. Und wieder unterstützt es nicht alle AST-Knoten.

Aus dem Internet scheint dieser Link http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html am besten geeignet, aber für mich sind die technischen Details der Lösung nicht klar.

Alle Vorschläge sind willkommen. Vielen Dank.

+1

Warum möchten Sie "eine" AST für mehrere Dateien produzieren? Warum können Sie nicht einfach für jede Datei einen AST verwalten? –

+1

Ich wünschte, jemand hätte eine Antwort dafür: \ Ich versuche das gleiche jetzt zu tun. –

Antwort

0

Ich habe versucht, etwas ähnliches zu tun. Ich habe nicht versucht, einen einzigen AST zu erstellen. Ich analysierte mehrere ASTs und versuchte, die Funktionen selbst zu mappen. Ich benutze die AST-Matcher, um die Funktionsaufrufe zu erhalten und dann in den anderen ASTs zu überprüfen.

Ich verwende die Datei compile_commands.json, um die Quelldateiliste bereitzustellen. OptionsParser.getCompilations(). GetAllFiles() kann alle Quelldateien abrufen, die in compile_commands.json angegeben sind.

Wenn wir ein clangTool erstellen und eine FrontendAction über das Tool mit unserem Matcher ausführen, sucht es nach der Übereinstimmung in allen Quelldateien.

Möglicherweise gibt es mehr optimale Möglichkeit, dies zu tun. Falls jemand davon weiß, weisen Sie bitte darauf hin.