Gibt es ein Tool, um alle möglichen Pfade zwischen zwei Stellen im Code zu extrahieren?

Ich debugge einen Fehler in C++-Code, den ich nicht geschrieben habe. Ich weiß, dass zwischen Position A und B in der Quelle etwas passiert ist, um diese unerwartete Ausgabe zu erzeugen. Das ist oft die einzige Information, mit der ich anfangen kann.

Mir ist aufgefallen, dass ich die meiste Zeit mit dem Aufspüren von Fehlern nicht versuche, die Logik zu verstehen, sondern vielmehr versuche, die möglichen Routen zwischen A und B zu identifizieren. Gibt es ein Tool, das dies für mich erledigt?

Besonderheiten:

  • Funktioniert mit C++-Quellcode
  • Stellt Informationen zu allen möglichen Pfaden von A nach B bereit, die im Code angegeben sind
  • Erfordert keine Verwendung von Haltepunkten. Dh es kann den Code analysieren ohne ihn auszuführen
  • (Am besten) eine kleine Anwendung
"am liebsten eine kleine Anwendung"? Es muss einen vollständigen C++-Parser und eine Analyse-Engine enthalten. „Klein“ ist hier nicht das richtige Adjektiv.
Verwenden Sie eines der vielen kostenlosen All-Tree-Programme und ignorieren Sie die Teile, die Sie nicht möchten. Das ist der schnellste & einfachste Weg.

Antworten (2)

Ich bezweifle, dass Sie zu einem Tool gehen, das genau das tut, was Sie von Anfang an wollen. Sie können diese Informationen von einem C++-"Parser" sammeln, der weiß, wie C++-Namen vollständig aufgelöst werden (dh ein vollständiges C++-Frontend).

Unser DMS Software Reengineering Toolkit mit seinem C++ Frontend kann diese Informationen liefern.

Das Paar besteht aus einer vollwertigen C++-Parsing- und statischen Analyse-Engine, die Kontrollflüsse (die OP will) und Datenflüsse (die OP nicht benötigt) berechnen und Graphen aufrufen kann. Sehen Sie sich das SVG-Beispiel für Steuerung/Datenfluss auf der Site-Seite an.

Mit diesen Kontrollflussinformationen könnte OP einen Kontrollflussdiagramm-Spaziergang beginnend bei „Punkt A“ codieren und verschiedene Routen zu „Punkt B“ finden. Dies wird eine ziemlich einfache Tiefensuche im Kontrollflussdiagramm sein, wenn die Punkte A und B in derselben Funktion sind. Wenn sie sich in unterschiedlichen Funktionen fA und fB befinden, muss er einen gemeinsamen Aufrufer-Elternteil S von fA und fB finden, sodass S fA aufruft, und dann den Kontrollflusspfad von A nach B über den Aufrufgraphen verfolgen. Dies ist komplizierter, besteht aber wahrscheinlich nur aus ein paar Seiten Code, wenn Sie wissen, was Sie tun. Es sollte offensichtlich sein, dass man den Umgang mit einem Tool wie DMS nicht am Nachmittag lernt; Alles, was mit C++ umgehen kann, ist bereits sehr ausgeklügelt und verarbeitet Tonnen von Details.

Zusammenfassung:

  • Vollständiger Parser für verschiedene C++-Dialekte, einschließlich GCC und MS, bis hin zu C++14 (mit C++17 in Arbeit)
  • Erstellt funktionslokale Steuerungs- (und Datenfluss-) Diagramme
  • Kann Anrufbaum aufbauen
  • Erfordert benutzerdefinierten Code, um interessante Fakten über C++-Programme zu extrahieren

Sie können wahrscheinlich auch Clang oder GCC anpassen, um dies zu tun, aber ich vermute, dass es keine leichte Aufgabe ist, und Sie werden aus den gleichen Gründen mit der gleichen Art von Lernkurvenproblemen konfrontiert sein, die Sie mit DMS haben würden. GCC hat den Ruf, dass es sehr schwierig ist, mit ihm zu arbeiten. Ich habe keine Erfahrung mit Clang; Ich glaube nicht, dass es Kontrollflussgraphen auf C++-Code berechnet, sondern eher auf dem LLVM-Back-End, also müssten Sie Kontrollfluss auf LLVM-Graphen berechnen und dann in den C++-Quellcode zurückverfolgen.

Sie können CppDepend ausprobieren , um alle möglichen Pfade zwischen A und B zu verfolgen. Das DSM und das Abhängigkeitsdiagramm werden bereitgestellt, um die Abhängigkeiten zwischen zwei oder vielen Elementen zu verstehen.