Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Java開発においてバグを除去する効率的な方法はこれだ――オープンソースツールの「FindBugs」とバグ検出に優れた「Jtest」の併用のすすめ

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/07/18 14:00

 システムに障害が発生すると、ビジネスが止まってしまうなどの影響はもちろん、場合によっては社会問題にまで発展してしまうこともある。そんな障害を未然に防ぐためにも、テストは重要な工程の一つだ。Javaシステム開発の現場では静的解析ツールとして「FindBugs」が使われていることが多いが、同ツールでは検出できないバグがある。そこでFindBugsをより効果的に活用するため、テクマトリックス株式会社が提唱するのが「Jtest」との併用だ。なぜ、併用を推奨するのか。また、静的解析を効果的に行うコツとは何か。同社の天久慎介氏に話をうかがった。

テクマトリックス株式会社 システムエンジニアリング事業部 ソフトウェアエンジニアリング技術部 ソフトウェアエンジニアリング技術二課 天久慎介氏
テクマトリックス株式会社 システムエンジニアリング事業部 ソフトウェアエンジニアリング技術部
ソフトウェアエンジニアリング技術二課 天久慎介氏

静的解析ツールの使用が、早期にバグを取り除くことにつながる

 業界、業種を問わずさまざまなミッションクリティカルなシステムの開発でJavaが使われている。とりわけ金融系や交通インフラ系などのシステムでは、万が一不具合が発生してしまうと業務が行えなくなるだけではなく、前者であれば個人や企業の資産に影響をおよぼすことや、後者であれば人や物の流れを止めてしまうなど、社会的にも大きなインパクトを与えてしまうことになる。システムの品質を高めるために重要となるのはテストだが、テストツールも有償のものから無償のものまでさまざまなツールが登場している。その中でも静的解析ツールについて。天久氏は次のように話す。

 「Javaシステム開発の現場では『FindBugs』や『CheckStyle』などのオープンソースの静的解析ツールがポピュラーだが、その中でもよく使われているのはFindBugsだろう」

 FindBugsはJavaのコードの中からバグを見つける静的解析ツールで、オープンソースの無償ツールだ。Javaのバイトコード(コンパイル後のクラスファイル)を解析することもできる。「無償ツールの中でもバグの検出精度に優れており、かつ統合開発環境やビルドツールをサポートしているため使いやすい」と天久氏は評価する。また、最近では『SpotBugs』としてフォークされ、改善が進められているのも人気のポイントだ。FindBugsでは次のバグを検出できる。

  • null値を利用している可能性がある
  • 配列インデックスは範囲外
  • 参照等価性を使用して異なる型を比較している
  • 全ての経路でロックが解除されないメソッド
  • 反射型クロスサイトスクリプティング脆弱性があるサーブレット
  • HTTPレスポンスプリッティング脆弱性 など

 本来、バグを早期に取り除くには、実装中に高頻度で静的解析を実施するのが得策だ。しかし「開発現場では静的解析を積極的に実施していないのが現状で、FindBugsといったツールが使用されていないことも多い」と天久氏は語る。なぜ、静的解析が開発工程に組み込まれないのだろうか。

 静的解析の実施を阻害する主な要因は2つあるという。第1の理由は解析に時間がかかること。第2に検出結果が多すぎることだ。せっかく開発者が自分のマシンで時間をかけて解析を行っても、大量の問題が検出されて一つひとつがバグかどうかを判定する作業や調査、修正に時間がかかってしまい、その結果「開発者は静的解析を諦めてしまっているのが現状だ」と天久氏は明かす。だが、こうした静的解析を阻む要因は、解析内容や実施タイミングを調整することで解消できる。具体的には開発者が実装中に行う解析を、とにかく解析スピードを重視したものにするということだ。

静的解析の解析内容や実施タイミングを調整する
静的解析の解析内容や実施タイミングを調整する

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

FindBugsで解析スピードを向上させるための設定例
FindBugsで解析スピードを向上させるための設定例

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

実装中とコミット後で別々の解析設定を準備する
実装中とコミット後で別々の解析設定を準備する

Jtestの無料体験版を入手!

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

FindBugsだけで本当に満足できる解析ができているか?

 しかし「FindBugsだけではコードの品質を担保することは難しい」と天久氏は続ける。というのも、各テストツールの解析精度や検出できるバグの種類(ルール)には違いがあるからだ。FindBugsには、クラスやメソッドが分かれている処理の問題を検出できない弱点がある。

 例えばNullPointerExceptionを検出したいとする。FindBugsでは「検出は可能だが不十分」と天久氏は指摘する。他のメソッドやクラスにまたがった場合、問題を検出できないからだ。

FindBugsでNullPointerExceptionが検出できない例
FindBugsでNullPointerExceptionが検出できない例

 また、クロスサイトスクリプティングの検出能力についても不十分だという。サーブレットの出力にHTTPパラメータを直接書き込む処理が一つのクラスに閉じていれば問題ないが、別のクラスで処理する場合には検出できない。

FindBugsでクロスサイトスクリプティングが検出できない例
FindBugsでクロスサイトスクリプティングが検出できない例

 こうしたFindBugsの弱点を補うツールとして「ぜひ使ってほしい」と天久氏が勧めるのが、Parasoftの「Jtest」である。

FindBugsでは検出できないNullPointerExceptionの例
FindBugsでは検出できないNullPointerExceptionの例
Jtestでは検出できる
Jtestでは検出できる

FindBugsの弱点を補う「Jtest」

Jtest
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で一気に刈り取る、といった運用が可能になる。

Jtestは有償ツールのため、まずプロジェクトで1ライセンスを用意し、コミット後の解析で利用すると効率がいい
Jtestは有償ツールのため、まずプロジェクトで1ライセンスを用意し、コミット後の解析で利用すると効率がいい

セキュリティやリソースリークのバグを減らし、レガシーコードの検証を楽に

 Java開発プロジェクトに参画している開発者はもちろん、品質保証部門やシステム開発の発注元や元請けのチームなどでも、セキュリティやリソースリークなどのバグに苦労している。天久氏は「レガシーコードの検証が必要、コーディング規約チェックをしたい人は、ぜひ一度Jtestを試してほしい」と勧める。セキュリティやリソースリークのバグは、本来なるべく早い工程で取り除くことが望ましい。なぜなら、システムテストなどの後工程で発生するとスケジュールに大きな影響が出るからだ。実際にはセキュリティ脆弱性を取り除くための工程は存在しないことが多く、事後対応になりがちだ。だが、Jtestを導入すればコード解析で検出できるようになり、大きな効果が得られるはずだ。

 また、長年運用されているシステムの場合はテスト資産が存在しないことも多い。そんなレガシーコードもJtestなら、静的フロー解析の実施によってバグ検出が可能になる。さらにコーディング規約チェックもJtestは得意としている。Jtestであれば社内で規定した規約に合わせたルールの作成が可能で、コードレビューの手間を削減することができる。具体的には「社内コーディングルールの標準化の仕掛けとしても使える」と天久氏。近年、ユーザー企業の多くがシステム開発を内製化する動きがあるが、大きなプロジェクトだと自社の社員だけでは人員が不足するため、複数のパートナー企業の支援を受けることになる。この場合気になるのがバラバラのコーディングルールだ。Jtestをコーディングルールの標準化の仕掛けとして活用すれば、ソフトウェア品質をより高められるというわけだ。

 現在FindBugsを導入しているが、ツールで見つけられないバグの検出を目視で行っているため負荷がかかっている、もっと効率的に静的解析を行いたい、品質を高めたいというのであればぜひ、Jtestを試してほしい。きっと満足する効果が得られるはずだ。

Jtestの無料体験版を入手!

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

お問い合わせ

 テクマトリックス株式会社

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 中村 仁美(ナカムラ ヒトミ)

     大阪府出身。教育大学卒。大学時代は臨床心理学を専攻。大手化学メーカー、日経BP社、ITに特化したコンテンツサービス&プロモーション会社を経て、2002年、フリーランス編集&ライターとして独立。現在はIT、キャリアというテーマを中心に活動中。IT記者会所属。趣味は読書、ドライブ、城探訪(日本の城)。...

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5