さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

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を使う方法ではそれは出来なそうです。

ぐぬぬ。