関連記事

ソフトウェアエンジニアリング技術二課 天久慎介氏
静的解析ツールの使用が、早期にバグを取り除くことにつながる
業界、業種を問わずさまざまなミッションクリティカルなシステムの開発でJavaが使われている。とりわけ金融系や交通インフラ系などのシステムでは、万が一不具合が発生してしまうと業務が行えなくなるだけではなく、前者であれば個人や企業の資産に影響をおよぼすことや、後者であれば人や物の流れを止めてしまうなど、社会的にも大きなインパクトを与えてしまうことになる。システムの品質を高めるために重要となるのはテストだが、テストツールも有償のものから無償のものまでさまざまなツールが登場している。その中でも静的解析ツールについて。天久氏は次のように話す。
「Javaシステム開発の現場では『FindBugs』や『CheckStyle』などのオープンソースの静的解析ツールがポピュラーだが、その中でもよく使われているのはFindBugsだろう」
FindBugsはJavaのコードの中からバグを見つける静的解析ツールで、オープンソースの無償ツールだ。Javaのバイトコード(コンパイル後のクラスファイル)を解析することもできる。「無償ツールの中でもバグの検出精度に優れており、かつ統合開発環境やビルドツールをサポートしているため使いやすい」と天久氏は評価する。また、最近では『SpotBugs』としてフォークされ、改善が進められているのも人気のポイントだ。FindBugsでは次のバグを検出できる。
- null値を利用している可能性がある
- 配列インデックスは範囲外
- 参照等価性を使用して異なる型を比較している
- 全ての経路でロックが解除されないメソッド
- 反射型クロスサイトスクリプティング脆弱性があるサーブレット
- HTTPレスポンスプリッティング脆弱性 など
本来、バグを早期に取り除くには、実装中に高頻度で静的解析を実施するのが得策だ。しかし「開発現場では静的解析を積極的に実施していないのが現状で、FindBugsといったツールが使用されていないことも多い」と天久氏は語る。なぜ、静的解析が開発工程に組み込まれないのだろうか。
静的解析の実施を阻害する主な要因は2つあるという。第1の理由は解析に時間がかかること。第2に検出結果が多すぎることだ。せっかく開発者が自分のマシンで時間をかけて解析を行っても、大量の問題が検出されて一つひとつがバグかどうかを判定する作業や調査、修正に時間がかかってしまい、その結果「開発者は静的解析を諦めてしまっているのが現状だ」と天久氏は明かす。だが、こうした静的解析を阻む要因は、解析内容や実施タイミングを調整することで解消できる。具体的には開発者が実装中に行う解析を、とにかく解析スピードを重視したものにするということだ。

例えばFindBugsの設定で、ディテクターは「Fast」のみにする、報告バグ・カテゴリーは「Bad Practice」「Correctness」「Dodgy Code」のみにするといった具合だ。

一方、構成管理へのコミット後に行う解析については、開発時とは異なる時間・環境で行われるため、より深いバグの検出を重視した解析を行うよう解析内容を調整する。全てのディテクターを利用するのはもちろん、先の報告バグ・カテゴリーに加えて「Security」や「Performance」など、開発チームの課題となるルール+αの解析を実施するのである。

Jtestの無料体験版を入手!
Jtestの無料体験版を配布しております。以下のリンクからダウンロード可能です。