AST für mehrere Quelldateien mit Clang

10

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

Ich habe versucht, die ASTImport-Klasse zu verwenden, unterstützt jedoch nicht den Import einiger AST-Knoten. Außerdem mache ich etwas falsch, wenn ich CompilerIstance erstelle und manipuliere und es in 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.B. Aufzeichnungen. In ASTImport verwenden sie die IsStructurallyEquivalent () - Funktion, aber sie wird im anonymen Namespace deklariert, sodass 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 Ссылка am besten geeignet zu sein aber für mich sind die technischen Details der Lösung nicht klar.

Irgendwelche Vorschläge sind willkommen. Vielen Dank.

    
Julia Demyanova 15.02.2013, 11:50
quelle

1 Antwort

1

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 überprüfe sie dann in den anderen ASTs.

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 Werkzeug mit unserem Matcher ausführen, sucht es nach der Übereinstimmung in allen Quelldateien.

Es gibt möglicherweise einen optimalen Weg, dies zu tun. Falls jemand davon weiß, weisen Sie bitte darauf hin.

    
user8210314 24.07.2017 18:27
quelle