関連記事
静的解析ツールの使用が、早期にバグを取り除くことにつながる
業界、業種を問わずさまざまなミッションクリティカルなシステムの開発で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の無料体験版を配布しております。以下のリンクからダウンロード可能です。
関連記事
FindBugsだけで本当に満足できる解析ができているか?
しかし「FindBugsだけではコードの品質を担保することは難しい」と天久氏は続ける。というのも、各テストツールの解析精度や検出できるバグの種類(ルール)には違いがあるからだ。FindBugsには、クラスやメソッドが分かれている処理の問題を検出できない弱点がある。
例えばNullPointerExceptionを検出したいとする。FindBugsでは「検出は可能だが不十分」と天久氏は指摘する。他のメソッドやクラスにまたがった場合、問題を検出できないからだ。
また、クロスサイトスクリプティングの検出能力についても不十分だという。サーブレットの出力にHTTPパラメータを直接書き込む処理が一つのクラスに閉じていれば問題ないが、別のクラスで処理する場合には検出できない。
こうしたFindBugsの弱点を補うツールとして「ぜひ使ってほしい」と天久氏が勧めるのが、Parasoftの「Jtest」である。
FindBugsの弱点を補う「Jtest」
Jtestは高速な静的解析とCIとの高い親和性を実現したJava対応テストツールだ。静的解析に加えてフロー解析が行え、検出するバグの種類(ルール)の豊富さとその解析精度の高さが大きな特長だ。静的解析は約1000種類のコーディングルールに従ってソースコードを静的に解析し、違反している箇所をレポートしてくれる。多くのルールにはカスタマイズ可能なパラメータがあり、ニーズに合わせて詳細な条件が設定できるようになっている。また、静的フロー解析は、クラスやメソッドにまたがった解析を行えるため、FindBugsで検出できないさまざまなソースコードの問題を検出できる。もちろん、例として先に挙げたバグも、Jtestなら検出可能だ。
Jtestを導入するメリットはそれだけではない。導入支援として「実プロジェクトの解析・簡易アセスメント」「ツールのトレーニング」「環境構築支援」などを、テクマトリックスが用意する。「お客さまの実プロジェクトの状況に併せてコーディングルールを選定し、要望に応じて、CI環境の構築も行うことができる」と天久氏。テクマトリックスの支援の下で静的解析を自動化する環境を実現可能というわけだ。
その他、Jtestでは次の機能が提供されている。例えば、コーディングルール作成ツール「RuleWizard」だ。これにより、ユーザー独自のコーディングルールを自由に追加できる。RuleWizard上では、フローチャートのような図を編集して視覚的にルールを作成できる他、不正なサンプルコードからルールを自動生成することも可能だ。また、コードメトリクスの計測によってメソッド数、オブジェクトの結合度、サイクロマティック複雑度などの約70種類のメトリクスをレポートしてくれる機能もある。さらに動的テストもカバーしており、これまでJUnitの利用に苦労してきた開発者が単体テストをすぐに行えるような単体テストアシスト機能や、テストカバレッジ収集機能などが搭載されている。
Jtestはすでに国内企業600社、5000ライセンス以上の導入実績がある。例えば、交通インフラ系のSI企業がJtestを選んだ理由は、導入していたオープンソースのテストツールで検出できなかったルールをカバーできるなど、標準で搭載されているルールの数が圧倒的に多かったからだ。それに加え、目視では見つけることが難しい複数のファイルにまたがったバグを解析する静的フロー解析が実施できることが決め手になったという。また、ある金融系企業では、細かな設定ができるコーディングルールと、目視では見つけることが難しいバグを発見可能な静的フロー解析に魅力を感じたのはもちろんのこと、設定作業の支援などのサポート体制が充実していることや、静的解析に限らず、動的解析やカバレッジ分析までカバーする優れた拡張性を評価した。
静的解析のベストプラクティス!
スピード重視の開発現場において、FindBugsの弱点を補うJtestの高度な静的解析とFindBugsの軽快な解析を併用するコツを、次ページでご紹介します。
Jtestの無料体験版を入手!
Jtestの無料体験版を配布しております。以下のリンクからダウンロード可能です。
関連記事
コード実装中の解析はFindBugs、コミット後の解析はJtest
さらに、JtestはFindBugsと組み合わせて併用することで、効率的に精度の高いソースコード解析を行うことができる。
天久氏が推奨する運用方法は、コード実装中に行うスピード重視の解析にFindBugsを、より深いバグの検出を重視するコミット後の解析にはJtestを使うことだ。これにより、実装中に書いたコードをその場でチェックし、FindBugsが取りこぼしたバグをJtestで一気に刈り取る、といった運用が可能になる。
セキュリティやリソースリークのバグを減らし、レガシーコードの検証を楽に
Java開発プロジェクトに参画している開発者はもちろん、品質保証部門やシステム開発の発注元や元請けのチームなどでも、セキュリティやリソースリークなどのバグに苦労している。天久氏は「レガシーコードの検証が必要、コーディング規約チェックをしたい人は、ぜひ一度Jtestを試してほしい」と勧める。セキュリティやリソースリークのバグは、本来なるべく早い工程で取り除くことが望ましい。なぜなら、システムテストなどの後工程で発生するとスケジュールに大きな影響が出るからだ。実際にはセキュリティ脆弱性を取り除くための工程は存在しないことが多く、事後対応になりがちだ。だが、Jtestを導入すればコード解析で検出できるようになり、大きな効果が得られるはずだ。
また、長年運用されているシステムの場合はテスト資産が存在しないことも多い。そんなレガシーコードもJtestなら、静的フロー解析の実施によってバグ検出が可能になる。さらにコーディング規約チェックもJtestは得意としている。Jtestであれば社内で規定した規約に合わせたルールの作成が可能で、コードレビューの手間を削減することができる。具体的には「社内コーディングルールの標準化の仕掛けとしても使える」と天久氏。近年、ユーザー企業の多くがシステム開発を内製化する動きがあるが、大きなプロジェクトだと自社の社員だけでは人員が不足するため、複数のパートナー企業の支援を受けることになる。この場合気になるのがバラバラのコーディングルールだ。Jtestをコーディングルールの標準化の仕掛けとして活用すれば、ソフトウェア品質をより高められるというわけだ。
現在FindBugsを導入しているが、ツールで見つけられないバグの検出を目視で行っているため負荷がかかっている、もっと効率的に静的解析を行いたい、品質を高めたいというのであればぜひ、Jtestを試してほしい。きっと満足する効果が得られるはずだ。
Jtestの無料体験版を入手!
Jtestの無料体験版を配布しております。以下のリンクからダウンロード可能です。
関連記事
お問い合わせ
テクマトリックス株式会社
- Java対応静的解析・単体テストツール「Jtest」
- コーポレートサイト
- TEL:03-4405-7853