2016-05-25 21 views
7

È possibile utilizzare clang matchers per identificare la sequenza di motivi in ​​un programma?Utilizzare clang matcher per rilevare la sequenza di modelli

Ad esempio, ho bisogno di trovare casi in cui pattern1 accade prima di pattern2.

Ad esempio:

Pattern1 = assegnando un valore di puntatore P
pattern2 = dereferenziazione puntatore P

posso identificare casi pattern1 e pattern2 accadono nel codice, ma è possibile specificare un ordinazione? (per esempio pattern1 deve accadere prima di pattern2 e abbinare solo quei casi) Grazie!

risposta

1

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.

Problemi correlati