[最新記事] [過去ログ]

2/27(Sun)

/** astyle */ 例外処理の見直しを全体的にやらなければならないことになって、 さすがに何百本とあるプログラムを、逐一全部見ていくのは辛かったので、 なんかソースを解析するツールを作ってみることにしました。 ちなみに見逃しちゃいけないパターンとして、 (1) 例外受け取ったときに投げ直してるけど、例外チェインしてない (2) 例外受け取ってそのまま無視 なんてのがありました。 ちなみに、意図があればもちろんOKとはします。 例えば、 catch(HogeHogeException e) { throw new FugaFugaException(e); // OK throw new FugaFugaException(); // (1)のパターンNG // 何もthrowしてなかったら(2)のパターンNG } てな具合。 で、(1)のパターンは、throwでgrepかけて、 throwsやらコメントやらを抜いていったら、意外と数が少なくなったし、 例外チェインをしているかどうか(受け取った例外を渡しているか)は、 throwの行を見れば、大概判断はつきます。 ところが、(2)のパターンは、「catchブロックの間にthrowしてなかったら」 という条件のため、ソースを解析してみるより他に手はありません。 もしかしたら、そんな便利チェックツールとかあったのかも知れませんが、 探してる時間もなかったので、作ってしまいました。 そこで問題になったのが、ソースの記述についてです。 中カッコの配置が、今のプロジェクトでは、 if ( ... ) { } スタイルになっているために、行指向の解析ツールを作ることができませんでした。 キーワードごとに分割しようかとも一瞬考えましたが、 いっそソースの中カッコ配置を変えてしまおうということで、 探し出したのがastyleです。 これは、ソースのスタイルを変えてくれるもので、 僕が期待した、 if ( ... ) { } を、 if ( ... ) { } に変えてくれることもしてくれます。 (astyle --style=ansi [元のソース] > [変換先のソース]) おかげで、比較的容易に行指向の解析ツールを作ることができ、 例外処理の(2)のパターンを洗い出すことができました。 ちなみに、あまりにもネストが深いものはうまく変換できないようです。 なんか昔、indentとかいうUNIX用プログラムがあった気がしたのですが、 そっちも実は使えたのかも知れないですねぇ。(C言語用だったかも?) ちなみに、astyleはC、C++、Javaに対応しているようです。
[最新記事] [過去ログ]