Richtige Antwort
In Wirklichkeit Verfahrgeschwindigkeit Ast für die Sequenz Strukturierung (die die Grundlage der statischen Analyse ist) ist nicht wirklich der richtige Ansatz, weil Sie, ob die Aussage pattern1
nicht wissen, TATSäCHLICH vor pattern2
passieren wird
Betrachten
int foo() {
int a = 0;
int *b;
int c = -1;
if(c < 0) goto fixit;
nowhat:
b = &a;
fixit:
c = *b;
goto nowhat;
}
Wie Sie AST helfen wird nicht hier sehen können, aber CFG ist die richtige Sache zu verwenden.
Etwas einer Antwort Ast
mit dem Wenn Sie den Traversal Matchers in AST sehen (v6.0.0) sie sind, so ziemlich in der Natur hierarchisch aufgebaut. Sie möchten die Übereinstimmung erweitern, um nach Geschwistern zu suchen.
Vieles von dem, was ich in Angriff nehme, geht davon aus, dass Sie wissen, wie Sie einen benutzerdefinierten AST-Matcher implementieren. Wenn nicht, wird es von Manu Sánchez in seinem Writing AST Matchers for libclang Blogpost ziemlich gut erklärt.
nicht sicher, ob er in tatsächlich bekommt Geschwister Matcher zu schreiben, aber er kommt sehr nah an ihm, so dass es beginnen und dann muss man so etwas wie dies umzusetzen:
Lassen Sie uns den Code gegeben sagen:
class P {}; class Q {}; class R {};
Wir wollen in der Lage sein, etwas zu tun:
(matcher = recordDecl(hasName("P"), \
hasNextSibling(recordDecl(hasName("R"))))`
Siekombinierenund matchesParent
in AstMatchFinder
Klasse und durchlaufen die Kinder des übergeordneten Cursors (dies wären die Geschwister: P). Lesen Sie die Fußnoten, da Sie BoundCursors implementieren müssen, um eine Runaway-Rekursion zu vermeiden.