2013-05-06 21 views
8

Ich baue Tool zum Testen ansi 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, bei der Ausgabe von Control Flow Graph mit -fdump-tree-cfg oder -fdump-tree-vcg Zeilennummern zu erhalten?Geeting Control Flow Graph von ANSI C-Code

+0

Mögliches Duplikat von [Werkzeuge, um eine grafische Funktionsaufrufgrafik des Codes zu erhalten] (http://stackoverflow.com/questions/517589/tools-to-get-a-pictorial-function-call-graph-of-code) –

Antwort

6

Also habe ich etwas mehr Forschung gemacht und es ist nicht schwer, Zeilennummern für Knoten zu bekommen. Fügen Sie einfach lineno Option zu einer dieser Optionen hinzu, um es zu bekommen. Verwenden Sie also -fdump-tree-cfg-lineno oder -fdump-tree-vcg-lineno. Es dauerte einige Zeit, um zu überprüfen, ob diese Zahlen zuverlässig sind. Im Falle eines Graphen in VCG Format-Label jedes Knotens enthält zwei Nummern. Dies sind Zeilennummern für Anfang und Ende des durch diesen Knoten repräsentierten Codeabschnitts.

15

Für den Kontrollflussgraphen eines C-Programms Sie bei bestehenden Python-Parser für C aussehen könnte:

Call-Graphen sind ein eng verwandtes Konstrukt zur Steuerung von Flow-Graphen. Es gibt mehrere Ansätze zum Erstellen von Call-Graphen (Funktionsabhängigkeiten) für C-Code. Dies könnte hilfreich sein, um mit der Generierung von Kontrollflussgraphen fortzufahren. Wege zur Abhängigkeitsgraphen in C:

  • Mit cflow:

    • cflow + pycflow2dot + dot (GPL, BSD) cflow ist robust, da es Code verarbeiten kann, die nicht kompiliert werden können, beispielsweise fehlende umfasst. Wenn Präprozessordirektiven stark verwendet werden, muss möglicherweise die Option den Code vorverarbeiten.
    • cflow + cflow2dot + Punkt (GPL v2 GPL v3, Eclipse Public License (EPL) v1) (beachten Sie, dass cflow2dot einig Weg zur Festsetzung muss, bevor es funktioniert)
    • cflow + cflow2dot.bash (GPL v2?
    • )
    • cflow + cflow2vcg (GPL v2, GPL v2)
    • enhanced cflow (GPL v2) mit der Liste auszuschließen Symbole aus der Graphen
  • Mit cscope:

  • ncc (CFLOW mögen)

  • KCachegrind (KDE Abhängigkeitsbetrachter)
  • Calltree

Die folgenden Tools leider erforderlich, dass der Code übersetzbar sein, weil sie bei der Ausgabe von gcc abhängen:

  • CodeViz (GPL v2) (Schwachpunkt: needs übersetzbar Quelle, weil es verwendet gcc zum dump cdepn dateien)
  • gcc + egypt + dot (GPL v *, Perl = GPL | Künstlerische Lizenz, EPL v1) (egypt verwendet gcc, um RTL zu produzieren, so dass es keinen Buggy-Quellcode gibt, oder falls Sie nur auf eine einzelne Datei aus einem größeren Projekt konzentrieren wollen. Daher ist es im Vergleich zum robuster cflow -basierte Werkzeugketten. Man beachte, dass ägypten für den Ausschluss der Bibliothek Anrufe aus der grafischen Darstellung, die standardmäßig eine gute Unterstützung hat sauberer zu machen.

auch Dateiabhängigkeitsgraphen für C/C++ kann mit crowfood erstellt werden.

+0

Call Graph ist nicht das, was ich brauche. Ich brauche visuelle Zweige in Code. Ich muss alle Schleifen und Entscheidungspunkte im Code dem Benutzer zeigen. Ich habe meinen eigenen Parser für VCG erstellt, aber ich werde die von Ihnen geposteten Tools überprüfen. – Eloar