Ich baue ein Tool zum Testen von anis c-Anwendungen. Einfach Code laden, Kontrollflussdiagramm anzeigen, Test ausführen, alle Eckpunkte markieren, die getroffen wurden. Ich versuche, CFG ganz allein aus dem Parsing-Code zu erstellen. Leider wird es durcheinander gebracht, wenn Code verschachtelt ist. GCC bietet die Möglichkeit, CFG aus kompiliertem Code zu erhalten. Ich könnte Parser für seine Ausgabe schreiben, aber ich brauche Zeilennummern zum Setzen von Haltepunkten. Gibt es eine Möglichkeit, Zeilennummern zu erhalten, wenn Sie Control Flow Graph mit -fdump-tree-cfg
oder -fdump-tree-vcg
ausgeben?
Also habe ich etwas mehr Nachforschungen angestellt und es ist nicht schwer, Zeilennummern für Knoten zu bekommen. Fügen Sie einfach lineno
-Option zu einer dieser Optionen hinzu, um sie zu erhalten. Verwenden Sie also -fdump-tree-cfg-lineno
oder -fdump-tree-vcg-lineno
. Ich habe einige Zeit gebraucht, um zu überprüfen, ob diese Zahlen zuverlässig sind. Im Falle eines Graphen im VCG Format enthält das Label jedes Knotens zwei Zahlen . Dies sind Zeilennummern für den Anfang und das Ende des Codeabschnitts, die von diesem Knoten dargestellt werden.
Für das Kontrollflussdiagramm eines C-Programms könnten Sie vorhandene Python-Parser für C betrachten:
Call-Graphen sind ein eng verwandtes Konstrukt zur Steuerung von Flow-Graphen. Es gibt verschiedene Ansätze, um Call-Graphen (Funktionsabhängigkeiten) für C-Code zu erstellen. Dies könnte hilfreich sein, um mit der Erzeugung von Kontrollflussgraphen fortzufahren. Möglichkeiten zum Erstellen von Abhängigkeitsgraphen in C:
Verwenden Sie cflow :
--cpp
zum Vorverarbeiten des Codes benötigt werden. Verwenden von cscope :
ncc (cflow wie)
Die folgenden Tools erfordern leider, dass der Code kompilierbar ist, da sie von der Ausgabe von gcc abhängen:
egypt
verwendet gcc
, um RTL
zu erzeugen, also scheitert es an einem fehlerhaften Quellcode, oder falls Sie sich nur auf eine einzelne Datei konzentrieren wollen ein größeres Projekt, daher ist es nicht sehr nützlich im Vergleich zu den robusteren cflow
-basierten Toolchains. Beachten Sie, dass Ägypten standardmäßig eine gute Unterstützung für das Ausschließen von Bibliotheksaufrufen aus dem Graphen bietet, um es sauberer zu machen. Außerdem können Dateiabhängigkeitsgraphen für C / C ++ mit crowfood
erstellt werden.