Let's ソースコード静的解析!
ふとソースコード静的解析で遊んでみたくなりました。そこで、最近活発なclangでC++のソースコード静的解析プログラムを書こうと思います。
大分昔clangで遊んだことがあって構文木をXMLで出力させるのは標準機能であったなぁと思い出していたら、どうやら最新のclangにその機能(-ast-print-xml)はなくなっている模様です。勉強がてら真面目にclangの機能を利用してみようかと思います。
参考にしたリンク
まずはGoogleさんにちょっと聞いてみると
http://s8823.blogspot.com/2011/10/clangrelease30-rc1.html
http://amnoid.de/tmp/clangtut/tut.html
この辺りが参考になりそうです。
関数と変数のリスト
関数と変数のリストを出力させてみました。
ソースはあまりにも長かったのでgithubで...。
https://github.com/lambdasakura/sourcecodeanalyze/
これで、
- ソース中にある変数、関数のリスト
は取得できそうです。
今直面している課題
残るは、関数、変数の参照関係の情報なのですが、さっぱり資料がなくて死にたくなって来ました。
clang::idx::Indexerがそれに相当すると思うのですが、うまく動いてくれないです。Cursorを使う方法もあるようですが、これは機能が若干少ないとソースに書いてあったので遠慮したいところです。
実際、ParseASTを使って取得できる情報とCursorから取得出来る情報に違いがある模様です。
ある変数宣言を見つけた場合、
- その変数が、staticな変数かそうでないか
- externが付いているかどうか
これらの情報はParseASTを使った解析ではわかったのですが、Cursorを使う方法ではそれは出来なそうです。
ぐぬぬ。