2016-05-25 7 views
7

Kann die Sequenz von Mustern in einem Programm mit clang matchers identifiziert werden?Verwenden von Clang-Matcher zum Erkennen von Musterfolgen

Zum Beispiel muss ich Fälle finden, in denen Muster1 vor Muster2 passiert.

Zum Beispiel:

Pattern1 = Wert Zeiger P Zuordnung
pattern2 = dereferencing Zeiger P

I Fälle identifizieren kann, dass pattern1 und pattern2 im Code passieren, aber ist es möglich, eine spezifizieren Bestellung? (sagen wir, Muster1 muss vor Muster2 passieren und passt nur zu diesen Fällen) Danke!

Antwort

1

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.

Verwandte Themen