Risposta corretta
in realtà AST di movimento per sequenza patterning (che è la base di analisi statica) non è davvero l'approccio corretto, perché non si sa se la dichiarazione pattern1
in realtà sta per accadere prima pattern2
consideri
int foo() {
int a = 0;
int *b;
int c = -1;
if(c < 0) goto fixit;
nowhat:
b = &a;
fixit:
c = *b;
goto nowhat;
}
Come si può vedere l'AST non ha intenzione di aiutare qui, ma CFG è la cosa giusta da usare.
Un po 'di una risposta utilizzando AST
Se si guardano le Matchers Traversal in AST (v6.0.0) sono, più o meno, di natura gerarchica. Stai cercando di estendere la corrispondenza per cercare i fratelli.
Molto di quello che sto per assumere presuppone che tu sappia come implementare un matcher AST personalizzato. In caso contrario, è spiegato piuttosto bene da Manu Sánchez nel suo post del blog Writing AST Matchers for libclang.
Non sono sicuro se ottiene in realtà scrivere un matcher fratello, ma lui è molto vicino ad esso, in modo da cominciare da lì e poi si deve implementare qualcosa di simile a questo:
Diciamo che dato il codice:
class P {}; class Q {}; class R {};
vogliamo essere in grado di fare qualcosa di simile:
(matcher = recordDecl(hasName("P"), \
hasNextSibling(recordDecl(hasName("R"))))`
È possibile combinare matchesChild
e matchesParent
nella classe AstMatchFinder
e attraversano i figli del genitore del cursore corrente (questi sarebbero i fratelli: P). Leggi le note a piè di pagina come dovresti implementare BoundCursors per evitare la ricorsione in fuga.
fonte
2017-09-27 04:31:48