Ich entwickle eine statische Analyse-Tool mit python-clang-3.6
-Bibliothek, die ich Funktion Call Graphen zeichnen lassen würde.Verwendung von Linkerbefehlen für die statische Analyse von Clang
Um ordnungsgemäß TranslationUnit
zu erstellen, muss ich den entsprechenden Kompilierbefehl verwenden (d. H. clang.cindex.Index.parse(c_file, compile_command)
). Allerdings glaube ich, um in der Lage zu sein, richtig zu verbinden TranslationUnits
Ich müsste auch Linker-Befehle verwenden, um zu wissen, welche TranslationUnit
Funktionen von anderen TranslationUnits
verwendet. Dies ist ein Problem in meinem Projekt, wo tatsächlich mehrere Binärdateien mit einem einzigen "make" -Aufruf erstellt werden und einige TranslationUnits
möglicherweise kollidierende Symbolnamen haben, so dass ich nicht davon ausgehen kann, dass alle miteinander verbunden sind.
Was ist der beste Weg, um dieses Problem zu beheben, so dass mein Tool würde wissen, welche Funktionen in C-Datei Funktionen aus anderen C-Dateien aufrufen können?
Vorerst sehe ich zwei Möglichkeiten:
- Linker Befehle Irgendwie abrufen und verwenden; Diese Option scheint knifflig zu sein, da sie nicht direkt in
clang
unterstützt wird (zumindest in der Python-Bibliothek); oder - Zum Zeitpunkt der Traversierung
TranslationUnit
AST Baum erinnern Sie den Speicherort der Funktion Deklaration in der Header-Datei. Diese Option scheint schwierig, wenn ich aufgrund der Makroverarbeitung verschiedene Zeilennummern oder implizite Funktionsdeklarationen für verschiedeneTranslationUnits
erhalten würde.
Gibt es noch andere Optionen? Welche Option und warum würden Sie wählen?