- blogs:
- cles::blog
2019/10/29

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




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でログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112120)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110763)
3 . 年次の人間ドックへ(110363)
4 . 2023 年分の確定申告完了!(1つめ)(109912)
5 . 三菱鉛筆がラミーを買収(109810)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110763)
3 . 年次の人間ドックへ(110363)
4 . 2023 年分の確定申告完了!(1つめ)(109912)
5 . 三菱鉛筆がラミーを買収(109810)
cles::blogについて
Referrers