C++-Code-Darstellung für die automatische Erkennung von Entwurfsmustern

Ich arbeite an einem Forschungsprojekt, in dem ich ein Tool bauen möchte, das automatisch die Implementierung bestimmter Entwurfsmuster in C++-Code erkennt.

Da C++-Code komplex ist, möchte ich eine vereinfachte Ansicht des gegebenen C++-Projektquellcodes haben, sagen wir XML.

Meine erste Frage ist: Wäre das ein guter Ansatz? Gibt es ein Tool, das mir helfen kann, dies zu erreichen?

C++ als XML vereinfacht? <if><condition>...</condition><then>...</then><else>...</else></if>OMG...
@ThomasWeller Ich glaube, du hast es nicht verstanden, es ist eher so:<Class name="ClassName" Visibility="Public" IsStatic="false"> <Fields> ... </Fields> <Methods> <Method name="DoSomething" visibility="Public" returnType="void"> <Parameters> ... </Parameters> ... </Methods> ... </Class>

Antworten (3)

Sie können CppDepend und die Codeabfragesprache CQLinq ausprobieren , um einige Entwurfsmuster zu erkennen. Hier ist ein Artikel , der erklärt, wie es geht.

Ihre "vereinfachte Ansicht" müsste zumindest den C/C++-Präprozessor anwenden, Includes anwenden und analysieren. Das ist der größte Teil des Front-End-Teils eines Compilers. Es ist wirklich keine gute Idee, so etwas selbst zu schreiben. Wenn Sie Code in einer kompilierten Sprache wie C++ statisch analysieren möchten, ist es eine gute Idee, sich auf einen vorhandenen Compiler oder ein Compiler-Framework zu setzen.

Ihr bevorzugtes Compiler-Framework ist wahrscheinlich LLVM , auf dem der clang++ -Compiler aufgebaut ist. Es ist ziemlich gut instrumentiert, wurde mir gesagt, obwohl ich es noch nicht selbst benutzt habe.

GCC kann auch eine Möglichkeit sein, wenn auch etwas weniger beliebt.

Schließlich, wenn Sie den abstrakten Syntaxbaum in irgendeiner Darstellung haben, die LLVM oder ein anderes Framework behält, glaube ich, dass Sie ihn nicht in XML konvertieren, sondern lieber etwas damit machen wollen, wie er ist; aber natürlich kann ich mich irren.

Unser C++-Front-End führt eine C++-sprachgenaue Analyse durch, erstellt ASTs, führt eine vollständige Namens- und Typauflösung durch und erstellt Steuerungs- und Datenflussdiagramme jeder Funktion/Methode. [In der Praxis können Sie nicht effektiv über Quellcode nur aus dem AST argumentieren. Sie müssen Informationen über die Bedeutung von Namen haben.]

Die zugrunde liegende Maschinerie, das DMS Software Reengineering Toolkit , bietet die Möglichkeit , Quellmusterabgleiche unter Verwendung expliziter Muster mit C++-Syntax durchzuführen , sowie viele andere Funktionen, die bei der allgemeinen Codeanalyse nützlich sind.

Läuft nativ unter Windows und nahtlos unter Wine/Linux mit sh-Skripten.

Wenn Sie darauf bestehen, können Sie die AST und andere Artefakte als XML exportieren. Wenn Sie das tun, verlieren Sie den Zugriff auf alle anderen nützlichen Maschinen, die von DMS bereitgestellt werden. Wir haben die Erfahrung gemacht, dass Sie viel mehr Fähigkeiten verlieren, als Sie gewinnen, wenn Sie XMLifizieren und dann alle erforderlichen Analysemaschinen neu erfinden müssen.