Frage

Wir wollen einig ziemlich einfache Analyse von Benutzer-C ++ Code zu tun, und diese Informationen dann zum Instrumente nutzen, um ihren Code (im Grunde Regeneration ihren Code mit einem wenig Instrumentationscode), so dass der Benutzer eine dynamische Analyse des Code ausgeführt werden kann und erhalten Statistiken über Dinge wie Wertebereiche von bestimmten numerischen Typen.

Klirren sollte in der Lage sein, genug, um C zu behandeln ++ jetzt die Art von Code unserer Nutzer daran zu werfen würden zu behandeln -. Und da Klappern der C ++ Abdeckung kontinuierlich durch die Zeit verbessert wir, es wird besser fertig sind sogar

Wie geht man über die Verwendung von Klirren wie diese als eigenständigen Parser? Wir denken wir konnten nur einen AST erzeugen und es dann zu Fuß für Objekte der Klassen suchen wir bei der Verfolgung interessiert sind. Würde hören von anderen interessiert sein, die Klirren verwenden ohne LLVM.

War es hilfreich?

Lösung

clang ist modular aufgebaut. Zitiert von seiner Seite:

  

Ein Hauptgestaltungskonzept für Klirren ist   seine Verwendung eines bibliotheksbasierten   die Architektur. In diesem Entwurf verschiedene   Teile des Front-End können sauber sein   aufgeteilt in getrennte Bibliotheken, die   kann dann für andere verwechselt werden   Bedürfnisse und Anwendungen.

Schauen Sie sich Klirren Bibliotheken wie libast für Ihre Bedürfnisse. Lesen Sie mehr hier .

Andere Tipps

Was Sie nicht angeben, welche Art von „Analysen“ Sie tun wollten. Die meisten C ++ Analysen erfordern, dass Sie genaue Symboltabelle Daten haben, so dass, wenn Sie ein Symbol begegnen foo Sie eine Vorstellung haben, was es ist. (Sie technisch nicht einmal wissen, was + ist ohne eine solche Symboltabelle!) Sie müssen auch generische Typinformationen; Wenn Sie einen Ausdruck „a * b“ haben, was ist der Typ des Ergebnisses? Mit „Name und Typ“ Information ist der Schlüssel für fast alles, was Sie für die Analyse machen wollen.

Wenn Sie auf Klirren bestehen, dann gibt es andere Antworten hier. Ich weiß nicht, es es für Namen und Typ Auflösung bereitstellt.

Wenn Sie Notwendigkeit Name und Typ Auflösung, dann eine andere Lösung würde die DMS Software Reengineering Toolkit . DMS bietet generic Compiler wie Infrastruktur für das Parsen, Analyse, Transformieren und un-Parsen (Quellcode von den Compiler-Datenstrukturen Regenerieren). DMS der industrietauglichen C ++ Frontend (es viele andere Sprache Front hat endet auch) bietet vollständigen Namen und Typ Auflösung gemäß dem ANSI-Standard sowie ein GCC und MS VC ++ Dialekte.

Code-Transformationen können durch DMS oder durch Muster gerichtetes Programm Transformationsregeln geschrieben in der Oberfläche Syntax Ihrer Zielsprache (in diesem Fall C ++), die über eine abstrakten-Syntaxbaum-Schnittstelle implementiert werden. Hier ist eine einfache Transformation mit der Regelsprache:

    domain Cpp~GCC3;  -- says we want patterns for C++ in the GCC3 dialect

    rule optimize_to_increment(lhs:left_hand_side):expression -> expression
      " \lhs = \lhs + 1 " ->   " \lhs++"  if no_side_effects(lhs).

Dies arbeitet implizit auf den von DMS gebaut Ästen, sie zu ändern. die bedingte können Sie beliebige Eigenschaften von Mustergrößen (in diesem Fall LHS ), einschließlich Namen und geben Sie Einschränkungen erkundigen, wenn Sie es wünschen.

DMS hat oft für sehr anspruchsvolle Programmanalyse und Transformation von C ++ Code verwendet. Wir bauen C ++ Test Coverage Tools von C ++ Code in einer ziemlich offensichtlichen Weise instrumentiert mit DMS. Auf der Website gibt es eine bibligraphy mit Papieren beschreiben, wie DMS verwendet wurde, die Architektur einer großen Produktpalette von Militärflugzeugen Mission Software zu restrukturieren. Diese Art von Aktivität buchstäblich gießt C ++ in einer architektonischen Form in einer anderen durch eine große Anzahl von Mustern gerichtet Transformationen wie beispielsweise die oben angewandt wird.

Es ist wahrscheinlich sehr einfach Ihre Instrumentierung zu implementieren. Und Sie müssen nicht warten, bis es reif zu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top