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の無料体験版を配布しております。以下のリンクからダウンロード可能です。

関連記事


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

著者プロフィール

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

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

バックナンバー

連載:早期に問題を発見、品質向上に貢献するJava対応静的解析・単体テストツール「Jtest」
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5