2016-05-25 8 views
7

clang matchersを使用して、プログラム内のパターンのシーケンスを識別できますか?パターンのシーケンスを検出するためにclang matcherを使用する

たとえば、pattern1がpattern2よりも先に発生するケースを見つける必要があります。例えば

パターン1 =ポインタPに値を割り当てる
PATTERN2 =間接参照ポインタP

Iはパターン1とパターン2がコード内で起こることケースを識別することができ、特定することができる

注文? (pattern1がpattern2の前に起こらなければならず、それらのケースにのみ一致していなければならない)Thanks!シーケンスパターン形成のための現実トラバースのASTでは

答えて

1

正解

(静的解析の基礎である)あなたは声明pattern1が実際にpattern2

前に起こるために起こっているかどうかわからないので、本当に正しいアプローチではありません

あなたはASTがここで助けに行くのではありませんが、CFGが使用する正しいものである見ることができるように

int foo() { 
     int a = 0; 
     int *b; 
     int c = -1; 
     if(c < 0) goto fixit; 
nowhat: 
     b = &a; 
fixit: 
     c = *b; 
     goto nowhat; 
} 

を考えてみましょう。

ややかなり多く、階層的な自然の中でのAST

あなたはAST(5月v6.0.0)彼らはでトラバーサルマッチャを見れば

を使用して答え、の。あなたは兄弟を探すためにマッチングを拡張しようとしています。

私は、あなたがカスタムASTマッチャーを実装する方法を知っていることを前提としています。もしそうでなければ、それは彼のWriting AST Matchers for libclangブログ記事でManuSánchezによってうまく説明されています。

ない彼は兄弟マッチャを書いて、実際にを取得するかどうかわからないが、彼はそれに非常に近くなるので、そこにして、起動しますが、これに似た何かを実装する必要があります。

のコード与えられたとしましょう:あなたはを組み合わせることができ

(matcher = recordDecl(hasName("P"), \ 
     hasNextSibling(recordDecl(hasName("R"))))` 

class P {}; class Q {}; class R {}; 

は、我々のような何かを行うことができるようにしたいですおよびmatchesParentAstMatchFinderクラスに置き、現在のカーソルの親の子をトラバースします(これらは兄弟:Pです)。暴走的な再帰を避けるためにBoundCursorsを実装する必要があるので、脚注を読んでください。

関連する問題