クラス最高の解析エンジン
検知可能なマルチスレッド・バグの種類
Coverity Dynamic Analysisは、マルチスレッドのJavaプログラムを実行時に解析して、競合状態やデッドロック、リソース・リークなどの同時処理に起因するバグを見つけます。競合状態が起きると、アプリケーション・ソフトウエアの動作が不適切になるほか、セキュリティか脅かされます。競合状態は、通常、アクセスを保護するロックを取得せずにフィールド(メンバー変数)や配列、コレクションに2つ以上のスレッドが同時にアクセスすると発生します。
デッドロックは、マルチスレッド・プログラムでよく発生するバグです。2つ以上のJavaスレッドが互いに、別のスレッドがかけたロックが解除されるのを待ってしまうことで発生します。
リソース・リークは過剰に同期処理を実行することで発生し、パフォーマンスの低下やボトルネックを引き起こします。
Coverity Static Analysisとの統合
動的解析するCoverity Dynamic Analysisは、静的解析ツールであるCoverity Static Analysisとの統合機能を備えている業界初で唯一のツールです。2つのツールは緊密に連携し、ソース・コード内のバグ検知について、静的解析精度と動的検出速度を高めます。
静的解析は、可能性のあるすべての実行パスをたどってバグを検出するのに対して、動的解析は、あらかじめ作成したテスト・ケースを使って集中的に解析する、相互に補完し合う技術です。例えば、実行してみないと表面化しないマルチスレッド処理にまつわるバグは静的解析では見落とす恐れがあるのに対して、動的解析なら特定することができるため、Javaアプリケーションの解析には両方の技術が必要です。静的解析と動的解析を組み合わせることで、バグ検出の精度と速度が高まり、競合やデッドロック、リソース・リークなどを徹底的に解析することが可能になります。
バグの理解、優先順位付け、インパクト・マッピング
「多くの場合、エラーについて説明することは、エラーを見つけることよりも難しいです。説明が正しく理解されないと、エラーが無視され、さらには誤検出にもつながりかねません」
(出典 : A Few Billion Lines of Code Later)
数千件ものバグに直面した場合、何から始めればよいでしょうか。それは、次の3つの重要事項を検討することです。
- どのバグが最も重大か
- どのバグを最初に修正すべきか(そもそも、修正すべきバグなのか)
- このバグの影響を受けるプロジェクトがほかにあるか
Coverity Dynamic Analysisは、検出されたすべてのバグごとに、その内容や重大度、影響に関する明確な説明を提供するので、上記事項についての明確な答えを出せるようになります。そして、提供する情報を図で示すので、バグを調査したり、重大なバグから修正し始めたり、バグの所在をすべて特定できるので迅速にバグを選別したりすることが可能になり、時間を節約できるようになります。さらに、1つのプロジェクト内での影響のほか、すべてのプロジェクトにわたる影響や、ビジネスへの影響に基づいてバグ修正の要否を決定するための実践的な情報がもたらされます。これにより、複数の製品にわたってスケジュールの遅れや品質に関連した問題が起きるリスクを低減できます。
バグの説明
Coverity Dynamic Analysisは、バグの内容を、ソース・コードやプログラムに対する影響とともに分かりやすく説明します。
Common Weakness Enumeration(CWE)とのマッピング
Coverity Dynamic Analysis は、CWE仕様へのリンクを提供する業界初のツールです。CWE とはバグを収録した辞書で、コミュニティによって開発されています。バグに関する情報を収録してあり、バグの重大度についての理解を深められるほか、そのバグに対する既知の攻撃を特定し、修正策としての有効なガイダンスが得られます。画面に表示されるリンクを1回クリックするだけでそのバグに関する詳細な知識ベースにアクセスでき、新しくてまだなじみのないバグを調査する際の憶測を排除し、根本原因を迅速に特定できるようになります。
バグのナビゲーション
直感的で正確なナビゲーション機能を備えており、条件分岐があるソース・コードの流れを図示できます。ナビゲーション・マーカーをソース・コードのガイドとして利用することで、バグの内容を把握できるようになります。シンボルの強調表示は、特定のファイルでそのシンボルが出現する個所(または使用される個所)を強調する機能で、そのシンボルを宣言している個所や定義している個所に誘導します。
関数呼び出しのインライン展開
プロシージャ間にかかわるバグの場合は、関数呼び出しをインライン展開し、多重の入れ子構造になっている実行パスを把握して、バグに関する包括的な説明を提供します。このような方法は、手作業でコードを調査するときには事実上不可能です。
チェッカーの分類
クラッシュの原因となるエラーや、セキュリティ関連の脆弱性、予期しない動作、パフォーマンスの低下といったカテゴリごとにチェッカーを分類することによって、容易にバグに対して優先順位を付けられます。この分類機能では、メモリーの破損や、リソース・リーク、セキュリティのベスト・プラクティス違反、安全性を欠くデータ処理など、バグの症状がどのように現れるかという点に基づいて、各チェッカーを適切なカテゴリにマッピングします。次に、数百万行ものオープンソース・コードを検査してきた当社の豊富な経験に基づいて、これらのバグのタイプを高インパクト、中インパクト、低インパクトのいずれかに優先順位付けします。
ソース・コードのナビゲーション
直感的なナビゲーション機能を提供しており、元のファイルやディレクトリ構造を使用して、ソース・コードの残りの部分に対して問題が及ぶ範囲を評価したり、理解したりすることができます。
フィルタ条件の反復的な調整
解析する必要のあるバグを正確に見極めるための効率的な方法です。フィルタ用クエリーを段階的に構築することにより、部分的な結果に関するフィードバックを得てから、容易にフィルタを構築したり必要に応じてバックトラックしたりできます。
プロジェクトや製品のインパクト・マッピング
ソース・コードの再利用は、今日の大半のソフトウエア開発チームで生産性向上のために一般的に行われています。ただし、コード資産が増大するに伴い、ソース・コードの共有やコード・ブランチの作成は、バグ検出を複雑で難しくする原因になります。一般的なデバッグ支援ツールを利用した場合は、バグの一覧は得られても、それらのバグの影響に関する情報は提供されません。また、コードを再利用したため同じバグが複数のコードで発見されても、複数の異なるバグであるかのように報告されることがあるほか、プロジェクト全体に対するそのバグの影響を総合的に理解するには、情報を手作業でまとめなければなりません。
これに対してCoverity Dynamic Analysisは、コード資産全体にわたってバグの影響を自動的にマッピングする機能を備えた、業界初のツールです。この機能では、バグが見つかったソース・コードを共有している別のプロジェクトが存在する場合に、そのことを警告できます。また、ソース・コードのすべてのコード・ブランチをまとめて図示することで、お客様自身にとって重大なバグを表示することもできます。
ソース・コードのある個所に存在するバグが製品ポートフォリオ全体に及ぼす影響を素早く特定できるので、バグの修正プロセスが明確で扱いやすいものになります。また、以前は同じバグなのに複数のバグとして報告されていたものが1つのバグとして報告されれば、効率よく迅速にバグを修正できるようになると同時に、可視性が高まるため、大きな影響を及ぼす優先度の高いバグの修正に集中的に取り組めるようになります。
静的解析のバグと動的解析のバグを統合表示
Coverity Integrity Managerのユーザー・インターフェイスを使うことで、Coverity Static AnalysisとCoverity Dynamic Analysisで検知したすべてのバグを簡単に一括表示し、管理できます。静的解析で発見したバグと動的解析で発見したバグを1つの画面にまとめて表示すると、そのバグのリスクや影響を考慮してバグ修正に取り組めるため、バグ修正プロセスの効率を高められ、プロジェクトや製品ポートフォリオ全体のバグ・ステータスと傾向を把握できます。
使いやすさと柔軟性
Coverity Dynamic Analysisは、既存のソフトウエア開発環境やテスト環境に簡単に統合でき、用途に応じてソース・コードの一部からアプリケーション全体までに適用可能です。
その場の状況に応じた解析
Coverity Dynamic Analysisを使って同時処理にかかわるバグを突き止めるには、アプリケーション全体をCoverity Dynamic Analysisと一緒に実行させます。そして、さまざまなテスト・ケースを使って処理の流れを変えたり、複数のユーザーやタスクを同時に使用して複数のスレッドを共有データにアクセスさせたりしてコードの振る舞いを調べます。
デスクトップ解析
コード資産の一部に変更を加えた場合、アプリケーション全体ではなく、当該のコード部分にのみ Coverity Dynamic Analysisを適用できます。このシナリオでは、開発中のコードや、そのコードとやりとりするコードを集中的に解析できます。Coverity Dynamic Analysisには、コードをビルドにチェックインする前に、手元でバグを直接修正するためのEclipse用プラグインを用意しています。
自動解析
Coverity Dynamic Analysisによるテスト処理は、既存のビルド・プロセスの最後に追加することで、ビルド処理中に自動的にテストを実行して、開発中に特定できないバグを検知できます。また、夜間のビルド・プロセスや、負荷テストなどの定期テストに統合して、Coverity Dynamic Analysisによるテストを自動的に実行できます。
バグ・レポート
Coverity Dynamic Analysisが提供するレポートは、コード・ブランチごとやプロジェクトごと、あるいは複数のプロジェクトにわたってバグの履歴と解決状態を表示します。そのため、効果的に意思を決定し、ソフトウエア開発者の生産性と品質の向上を一定の期間にわたって測定できます。さらに、独自に開発したコードと第三者から入手したコードのどちらについてもその品質を、社内あるいは外部の顧客、さらには監査チームに対して認定するための手段としても利用できます。
Coverity Dynamic Analysisのバグ・レポートは、Coverity Integrity Managerを使って表示します。このレポートは、次の3つの重要な質問に答えるための情報を提供します。
- どのバグが修正されているか。そして重大なバグはすべて修正されているか
- 共有ソース・コードに存在するバグのすべてに優先順位が付けられており、修正されているか(あるいは、修正不要と判断されているか)
- バグの数と品質の推移をプロジェクトごとやリリースごと、チェッカー/バグ・タイプごと、ユーザーごとに見た場合、どのようなトレンドが認められるか
マトリックスとトレンド分析
プロジェクト管理者は、バグに関するデータを正確に追跡し、監視することで、開発リソースをどこにどのように投入すべきかを的確に決定できます。どのプロジェクトに関しても、バグの合計数や、未解決のバグの数、解決済みのバグの数、バグ密度の推移といった値を確認できます。
ダッシュボード
特定のプロジェクト内、あるいは複数のプロジェクトにまたがったソフトウエア品質の状態を、グラフィカルに要約して表示します。これらのビューはカスタマイズ可能で、この画面へのリンクを電子メールで送信したり、Excel文書としてエクスポートしたりして、ソフトウエア開発者同士で共有し、意思決定に役立てることができます。企業の幹部は、プロジェクトごとや、プロジェクトに含まれているソフトウエア・コンポーネントごとにソフトウエア品質の状態を正確に把握できるようになります。
メインのダッシュボードには、バグの現在のプロファイルがグラフィカルなスナップショットとして表示され、バグの検出基準や傾向、新規/未解決/解決済み/修正済みの上位5件のバグがソフトウエア開発者ごとに強調表示されます。プロジェクト単位のダッシュボードには、プロジェクト管理者やチーム・ リーダー、開発マネジャー向けに、これらの情報がさらに細分化されて表示されます。