BLOGTIMES
2019/10/29

clang-query を使って cpp の AST を解析する

  cpp  c  clang  softwareengineering 
このエントリーをはてなブックマークに追加

C/C++ のソースコードの AST を使って簡単に解析する方法がないか調べていたら、clang-query というのが使えそうだったのでメモ。
clang-tools に入っているので Ubuntu 18.04 では apt install clang clang-tools で使えるようになりました。

実行例

例えば以下ような簡単なプログラムの構造を見てみます。

sample.c

#include <stdio.h> int main(void){ printf("Hello World"); return 0; }

コマンドラインから以下のようなコマンドを入力すると、出力を得ることができます。
クエリの内容を変更することで自在にカスタマイズができるので便利ですね。

cat <<EOS | clang-query example.c -- set output dump match functionDecl(hasName("main")) EOS

Match #1:

Binding for "root":
FunctionDecl 0x7fffd94a0d78 </home/hsur/example.c:3:1, line:6:1> line:3:5 main 'int (void)'
`-CompoundStmt 0x7fffd94a0f88 <col:15, line:6:1>
|-CallExpr 0x7fffd94a0ef0 <line:4:2, col:22> 'int'
| |-ImplicitCastExpr 0x7fffd94a0ed8 <col:2> 'int (*)(const char *, ...)' <FunctionToPointerDecay>
| | `-DeclRefExpr 0x7fffd94a0e18 <col:2> 'int (const char *, ...)' Function 0x7fffd948fe08 'printf' 'int (const char *, ...)'
| `-ImplicitCastExpr 0x7fffd94a0f38 <col:9> 'const char *' <BitCast>
| `-ImplicitCastExpr 0x7fffd94a0f20 <col:9> 'char *' <ArrayToPointerDecay>
| `-StringLiteral 0x7fffd94a0e78 <col:9> 'char [12]' lvalue "Hello World"
`-ReturnStmt 0x7fffd94a0f70 <line:5:2, col:9>
`-IntegerLiteral 0x7fffd94a0f50 <col:9> 'int' 0

1 match.

参考

以下の MS による解説がわかりやすいです。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/11313
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン