Ich arbeite an einem Abdeckungskriterium für Multithreading-Code und möchte als Teil davon Zugriffe auf Variablen aufzeichnen. Zum Beispiel möchte ich im folgenden Code die Variable x
in und y, z, a[i],
schreiben und von der ich gelesen habe.
Ich habe mir das mit dem RecursiveASTVisor von Clang angeschaut und die Quelle so modifiziert, dass sie Aufnahmefunktionen enthält. Ich bin mir jedoch nicht sicher, ob dies ein vernünftiger Ansatz ist, da mein Verständnis davon, wie Clang funktioniert, sehr unvollständig ist.
Momentan, wenn ich eine Aussage finde, überprüfe ich, ob es ein BinaryOperator, UnaryOperator, Cast, or DeclRefExpr
ist. (Ich werde erweitern, was es in der Lage ist, sobald ich die Grundlagen arbeiten.) Wenn es ein BinaryOperator, UnaryOperator, or Cast
ist, überprüfe ich die Teilausdrücke des Ausdrucks. Wenn es ein DeclRefExpr ist, kann ich überprüfen, ob der Ausdruck ein Lvalue oder Rvalue ist (wieder einmal vereinfacht), aber sobald ich DeclRefExpr gefunden habe, sind sie immer lvalues. Um zu bestimmen, ob sie als lvalues or rvalues
verwendet wurden, muss ich das übergeordnete Element überprüfen. Wenn es ein Wert von lvaluetorvalue war, wurde es als Rvalue verwendet.
Ich habe das Gefühl, dass ich das Problem falsch anwähle, da ich es nur viel komplizierter sehe, da ich komplexeren Code in Betracht ziehen muss.
Würde es einen besseren Weg geben, sich dem zu nähern?
Danke
Bearbeiten
Ich beabsichtige nicht, diese Informationen statisch aufzuzeichnen. Ich beabsichtige, Verwendungen von Variablen zu finden und Code einzufügen, der Zugriffe auf diese Variablen aufzeichnet, wenn der Code ausgeführt wird.
Zum Beispiel würde ich angesichts des obigen Codes ( x = y * (int)z + a[i];
) etwas wie
Wie andere angedeutet haben, macht das Aliasing dies unmöglich. Eine statische Analyse des Codes zur Beantwortung der Fragen, die Sie interessieren, ist nicht möglich. Wenn es irgendwie möglich wäre, eine Quellcodedatei zu nehmen und die Ausgabe nur durch Analysieren der Syntax zu bestimmen, würden Compiler die Ausgabe des resultierenden Programms anstelle eines kompilierten Programms erzeugen. Kurz gesagt, Sie versuchen, das Problem beim Anhalten zu beantworten.
Dynamische Analyse ist das, was Sie wirklich brauchen, um die Fragen zu beantworten, die Sie am wahrscheinlichsten interessieren. Es gibt bereits einen großen Markt in der dynamischen Analyse von Multithread-Software.
Das Hauptproblem hier ist, dass Sie kein Aliasing in Betracht ziehen. Sie können nur einfache direkte Zugriffe aufzeichnen.
Aber in diesem Fall ist ein einfacher Ausdruck AST Besucher der Hauptweg. Aber Clang's RecursiveASTVisitor sollte aus dem Speicher in der Lage sein, den Mist für Sie zu schneiden und Ihnen erlauben, die letzten variablen Knoten direkt zu besuchen. Immerhin sollte es jeden AST-Knoten besuchen.
Tags und Links c c++ clang code-coverage