(57)【要約】  開発対象のソフトウェアを解析して、そのソフトウェアの欠陥を検出する欠陥検出部（２）と、欠陥検出部（２）により複数の欠陥が検出された場合、複数の欠陥の中から、依存関係がある欠陥の組として、一方の欠陥の修正が行われると、他方の欠陥が解消される関係にある欠陥の組を抽出する欠陥組抽出部（４）とを設け、依存関係提示部（７）が、欠陥組抽出部（４）により抽出された欠陥の組についての依存関係を提示するように構成する。
2017168560.tif 000002
【特許請求の範囲】
【請求項１】
開発対象のソフトウェアを解析して、前記ソフトウェアの欠陥を検出する欠陥検出部と、
前記欠陥検出部により複数の欠陥が検出された場合、前記複数の欠陥の中から、依存関係がある欠陥の組として、一方の欠陥の修正が行われると、他方の欠陥が解消される関係にある欠陥の組を抽出する欠陥組抽出部と、
前記欠陥組抽出部により抽出された欠陥の組についての依存関係を提示する依存関係提示部と
を備えた開発支援装置。
【請求項２】
前記依存関係提示部は、前記欠陥組抽出部により抽出された欠陥の組についての依存関係を示す有向グラフを構築し、前記有向グラフを提示することを特徴とする請求項１記載の開発支援装置。
【請求項３】
前記依存関係提示部は、前記欠陥検出部により検出された各々の欠陥をノードとし、前記欠陥組抽出部により抽出された欠陥の組についての依存関係にしたがって前記ノード間を繋ぐことで、前記有向グラフを構築することを特徴とする請求項２記載の開発支援装置。
【請求項４】
前記欠陥組抽出部は、前記欠陥検出部により複数の欠陥が検出された場合、前記複数の欠陥の中から、動作の分岐条件の誤りに関する欠陥を依存元の欠陥として抽出するとともに、前記分岐条件の誤りが原因で発生している欠陥を依存先の欠陥として抽出して、前記依存元の欠陥と前記依存先の欠陥との組を特定することを特徴とする請求項１記載の開発支援装置。
【請求項５】
前記欠陥組抽出部は、前記欠陥検出部により複数の欠陥が検出された場合、前記複数の欠陥の中から、ソフトウェアが使用している変数又は配列である実体に起因する欠陥を抽出し、前記抽出した欠陥の中で、同一の実体を共有している欠陥の組を特定することを特徴とする請求項１記載の開発支援装置。
【請求項６】
欠陥検出部が、開発対象のソフトウェアを解析して、前記ソフトウェアの欠陥を検出し、
欠陥組抽出部が、前記欠陥検出部により複数の欠陥が検出された場合、前記複数の欠陥の中から、依存関係がある欠陥の組として、一方の欠陥の修正が行われると、他方の欠陥が解消される関係にある欠陥の組を抽出し、
依存関係提示部が、前記欠陥組抽出部により抽出された欠陥の組についての依存関係を提示する
開発支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、開発対象のソフトウェアの欠陥を検出する開発支援装置及び開発支援方法に関するものである。
【背景技術】
【０００２】
開発対象のソフトウェアとして、例えば、コンピュータの処理手順を示すプログラムなどが考えられる。
例えば、プログラムにおけるソースコードの検証では、静的解析が行われることが多い。
静的解析を実行することが可能な開発支援装置では、ソースコードを静的解析することで、ソースコードの欠陥を検出して、その欠陥に関する警告情報を出力する。ここで、静的解析は、実際にソースコードを実行せずに欠陥を検出することを意味する。
静的解析では、大量の欠陥が検出されることがあり、その場合には、大量の警告情報が出力される。【０００３】
以下の特許文献１に開示されている開発支援装置では、大量の欠陥を修正する作業の効率化を図る目的で、優先的に対処すべき欠陥に関する警告情報に高い優先度を付加するようにしている。
即ち、この開発支援装置では、変更時期が新しいソースコードの欠陥に関する警告情報や、変更回数が多いソースコードの欠陥に関する警告情報には高い優先度を付与するようにしている。
また、この開発支援装置では、既に修正が済んでいる欠陥と誤りの種類が同じ未修正の欠陥が存在する場合、その未修正の欠陥には高い優先度を付与するようにしている。
そして、この開発支援装置では、優先度付きの各欠陥に関する警告情報を提示するようにしている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−２１２４４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
従来の開発支援装置は以上のように構成されているので、ユーザが優先度を確認すれば、優先的に対処すべき欠陥を認識することができる。しかし、優先度が高い欠陥から順番に修正作業を実施しても、修正作業の工数を削減できるとは限らず、全ての欠陥を解消するまでに膨大な工数を要することがあるという課題があった。【０００６】
この発明は上記のような課題を解決するためになされたもので、全ての欠陥を解消するまでに要する修正作業の工数を削減することができる開発支援装置及び開発支援方法を得ることを目的とする。
【課題を解決するための手段】
【０００７】
この発明に係る開発支援装置は、開発対象のソフトウェアを解析して、そのソフトウェアの欠陥を検出する欠陥検出部と、欠陥検出部により複数の欠陥が検出された場合、複数の欠陥の中から、依存関係がある欠陥の組として、一方の欠陥の修正が行われると、他方の欠陥が解消される関係にある欠陥の組を抽出する欠陥組抽出部とを設け、依存関係提示部が、欠陥組抽出部により抽出された欠陥の組についての依存関係を提示するようにしたものである。
【発明の効果】
【０００８】
この発明によれば、欠陥検出部により複数の欠陥が検出された場合、複数の欠陥の中から、依存関係がある欠陥の組として、一方の欠陥の修正が行われると、他方の欠陥が解消される関係にある欠陥の組を抽出する欠陥組抽出部を設け、依存関係提示部が、欠陥組抽出部により抽出された欠陥の組についての依存関係を提示するように構成したので、全ての欠陥を解消するまでに要する修正作業の工数を削減することができる効果がある。
【図面の簡単な説明】
【０００９】
【図１】この発明の実施の形態１による開発支援装置を示す構成図である。
【図２】この発明の実施の形態１による開発支援装置のハードウェア構成図である。
【図３】開発支援装置がソフトウェアやファームウェアなどで実現される場合のコンピュータのハードウェア構成図である。
【図４】開発支援装置がソフトウェアやファームウェアなどで実現される場合の処理手順である開発支援方法を示すフローチャートである。
【図５】Ｃ言語で記述されたプログラムにおけるソースコードの一例を示す説明図である。
【図６】欠陥間の制御依存関係を抽出するルールの一例を示す説明図である。
【図７】欠陥検出部２により検出されたバグに関する警告情報の一例を示す説明図である。
【図８】図５のソースコードの制御フローを示す説明図である。
【図９】「ｉｆ（ｘ＝＝０）」及び「ｉｆ（ｙ＞０）」の分岐条件が共に真である場合のパスＰ（１）を示す説明図である。
【図１０】「ｉｆ（ｘ＝＝０）」の分岐条件が偽で、「ｉｆ（ｙ＞０）」の分岐条件が真である場合のパスＰ（２）を示す説明図である。
【図１１】「ｉｆ（ｘ＝＝０）」の分岐条件が真で、「ｉｆ（ｙ＞０）」の分岐条件が偽である場合のパスＰ（３）を示す説明図である。
【図１２】「ｉｆ（ｘ＝＝０）」及び「ｉｆ（ｙ＞０）」の分岐条件が共に偽である場合のパスＰ（４）を示す説明図である。
【図１３】図５のソースコードが使用する実体の定義と参照先を行番号別に記述している説明図である。
【図１４】制御依存関係抽出部５の処理内容を示すフローチャートである。
【図１５】データ依存関係抽出部６の処理内容を示すフローチャートである。
【図１６】依存先のバグの情報が追加されている警告情報の一例を示す説明図である。
【図１７】図１７Ａは依存先のバグの情報を示す表図、図１７Ｂは有向グラフの構築処理の途中段階を示す説明図、図１７Ｃは最終的に構築される有向グラフを示す説明図である。
【発明を実施するための形態】
【００１０】
以下、この発明をより詳細に説明するために、この発明を実施するための形態について、添付の図面にしたがって説明する。
【００１１】
実施の形態１．
図１はこの発明の実施の形態１による開発支援装置を示す構成図であり、図２はこの発明の実施の形態１による開発支援装置のハードウェア構成図である。
図１及び図２において、データ取得部１は例えば図２のデータ取得処理回路２１で実現されるものであり、開発対象のソフトウェアや、ソフトウェアの欠陥間の制御依存関係を抽出するルールを取得する処理を実施する。欠陥間の制御依存関係については後述する。
この実施の形態１では、開発対象のソフトウェアが、コンピュータの処理手順を示すプログラムである例を説明するが、開発対象のソフトウェアは、開発対象の動作を記述している設計データであればよく、例えば、フローチャートやステートマシン図なども含まれる。
また、この実施の形態１では、Ｃ言語で記述されているプログラムについて説明するが、プログラムの言語はＣ言語に限るものではなく、どのような言語であってもよい。
【００１２】
欠陥検出部２は例えば図２の欠陥検出処理回路２２で実現されるものであり、データ取得部１により取得されたソフトウェアであるプログラムのソースコードを静的解析して、そのソースコード上の欠陥であるバグを検出する処理を実施する。
また、欠陥検出部２は検出したバグに関する警告情報を欠陥組抽出部４に出力する処理を実施する。
ここで、ソースコード上の欠陥であるバグには、論理的なバグと、誤記によるバグとがある。
論理的なバグは、ソースコードの記述パターンに不具合があるバグであり、例えば、動作の分岐条件の誤りに関するものが該当する。
動作の分岐条件の誤りに関するバグが存在する場合、例えば、複数の分岐先のうち、実行することが不可能な分岐先が存在してしまう不具合や、無限ループに至る不具合などが発生する。
誤記によるバグは、プログラムが使用している変数や配列などの実体に起因する記述の誤りなどが該当し、ソースコードの構文の誤りなども含まれる。
実体に起因する記述の誤りとしては、例えば、初期化されていない変数や配列を使用しているような誤りや、意図した範囲を超えた計算結果が得られる誤りなどが考えられる。
【００１３】
静的解析は、実際にソースコードを実行せずにバグを検出するものであり、この実施の形態１では、論理的なバグや、誤記によるバグを検出することが可能な静的解析を想定している。
欠陥検出部２から出力される警告情報は、検出したバグを特定する情報であり、例えば、バグを識別するＩＤ（ＩＤｄｅｎｔｉｆｉｃａｔｉｏｎ）、バグの種類を示す情報、バグが存在するソースコードの行番号などの位置情報、バグが存在するソースコードのパスを示すパス情報、バグが存在するソースコードによって使用されている実体の定義や参照先を示す情報などが含まれる。
ソースコードのパスは、ソースコードの制御フローを辿る処理経路を意味する。
Ｃ言語などのプログラムでは、変数や配列は、変数の型として、使用前に“ｉｎｔ”などの整数型や、“ｆｌｏａｔ”などの実数型が定義され、ソースコードには、使用する変数や配列の参照先が記述される。
【００１４】
ルール記憶部３は例えば図２のルール記憶処理回路２３で実現されるものであり、データ取得部１により取得されたルールを記憶する。
欠陥組抽出部４は制御依存関係抽出部５及びデータ依存関係抽出部６を備えており、欠陥検出部２により複数のバグが検出された場合、複数のバグの中から、依存関係があるバグの組として、一方のバグの修正が行われると、他方のバグが解消される関係にあるバグの組を抽出する処理を実施する。
【００１５】
制御依存関係抽出部５は例えば図２の制御依存関係抽出回路２４で実現されるものである。
制御依存関係抽出部５は欠陥検出部２により複数のバグが検出された場合、複数のバグの中から、ルール記憶部３に記憶されているルールにしたがって、動作の分岐条件の誤りに関するバグを依存元のバグとして抽出するとともに、分岐条件の誤りが原因で発生しているバグを依存先のバグとして抽出して、依存元のバグと依存先のバグとの組を特定する処理を実施する。
データ依存関係抽出部６は例えば図２のデータ依存関係抽出回路２５で実現されるものである。
データ依存関係抽出部６は欠陥検出部２により複数のバグが検出された場合、複数のバグの中から、ソースコードが使用している実体に起因するバグを抽出し、その抽出したバグの中で、同一の実体を共有しているバグの組を特定する処理を実施する。
【００１６】
依存関係提示部７はグラフ構築部８及び表示処理部９を備えており、欠陥組抽出部４により抽出されたバグの組についての依存関係、即ち、制御依存関係抽出部５により特定された依存元のバグと依存先のバグの組と、データ依存関係抽出部６により特定された同一の実体を共有しているバグの組とを提示する処理を実施する。
グラフ構築部８は例えば図２のグラフ構築処理回路２６で実現されるものであり、欠陥組抽出部４により抽出されたバグの組についての依存関係を示す有向グラフを構築する処理を実施する。
即ち、グラフ構築部８は欠陥検出部２により検出された各々のバグをノードとし、欠陥組抽出部４により抽出されたバグの組についての依存関係にしたがってノード間を繋ぐことで、有向グラフを構築する処理を実施する。
【００１７】
表示処理部９は例えば図２の表示処理回路２７で実現されるものであり、グラフ構築部８により構築された有向グラフをディスプレイ１０に表示する処理を実施する。
ディスプレイ１０は例えば液晶ディスプレイなどの表示装置である。
この実施の形態１では、依存関係提示部７が、有向グラフをディスプレイ１０に表示することで、記述の誤り間の依存関係を提示する例を示しているが、例えば、依存関係提示部７が、有向グラフをＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）などのネットワーク経由で他の装置に送信することで、記述の誤り間の依存関係を外部に提示するようにしてもよい。この場合には、表示処理部９及びディスプレイ１０が不要になるが、ネットワークに対するインタフェース機器が必要になる。
【００１８】
図１では、開発支援装置の構成要素であるデータ取得部１、欠陥検出部２、ルール記憶部３、制御依存関係抽出部５、データ依存関係抽出部６、グラフ構築部８及び表示処理部９のそれぞれが、図２に示すような専用のハードウェア、即ち、データ取得処理回路２１、欠陥検出処理回路２２、ルール記憶処理回路２３、制御依存関係抽出回路２４、データ依存関係抽出回路２５、グラフ構築処理回路２６及び表示処理回路２７で実現されるものを想定している。
ここで、ルール記憶処理回路２３は、例えば、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュメモリ、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＥＥＰＲＯＭ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒy）などの不揮発性又は揮発性の半導体メモリや、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ）などが該当する。
また、データ取得処理回路２１、欠陥検出処理回路２２、制御依存関係抽出回路２４、データ依存関係抽出回路２５、グラフ構築処理回路２６及び表示処理回路２７は、例えば、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）、または、これらを組み合わせたものが該当する。
なお、データ取得処理回路２１は、マウスやキーボードなどを備えるマンマシンインタフェース機器で実現されるものであってもよい。
【００１９】
また、開発支援装置の構成要素が専用のハードウェアで実現されるものに限るものではなく、開発支援装置がソフトウェア、ファームウェア、または、ソフトウェアとファームウェアとの組み合わせで実現されるものであってもよい。
ソフトウェアやファームウェアはプログラムとして、コンピュータのメモリに格納される。コンピュータは、プログラムを実行するハードウェアを意味し、例えば、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサ、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）などが該当する。
図３は開発支援装置がソフトウェアやファームウェアなどで実現される場合のコンピュータのハードウェア構成図である。
開発支援装置がソフトウェアやファームウェアなどで実現される場合、ルール記憶部３をコンピュータのメモリ３１上に構成するとともに、データ取得部１、欠陥検出部２、制御依存関係抽出部５、データ依存関係抽出部６、グラフ構築部８及び表示処理部９の処理手順をコンピュータに実行させるためのプログラムをメモリ３１に格納し、コンピュータのプロセッサ３２がメモリ３１に格納されているプログラムを実行するようにすればよい。
図４は開発支援装置がソフトウェアやファームウェアなどで実現される場合の処理手順である開発支援方法を示すフローチャートである。
【００２０】
また、図２では開発支援装置の構成要素のそれぞれが専用のハードウェアで実現される例を示し、図３では、開発支援装置がソフトウェアやファームウェアなどで実現される例を示しているが、開発支援装置における一部の構成要素が専用のハードウェアで実現され、残りの構成要素がソフトウェアやファームウェアなどで実現されるものであってもよい。
例えば、データ取得部１及び表示処理部９を専用のハードウェアで実現し、欠陥検出部２、ルール記憶部３、制御依存関係抽出部５、データ依存関係抽出部６及びグラフ構築部８をソフトウェアやファームウェアなどで実現することが可能である。ただし、専用のハードウェアとソフトウェア等の組み合わせは任意である。
【００２１】
次に動作について説明する。
図５はＣ言語で記述されたプログラムにおけるソースコードの一例を示す説明図である。
この実施の形態１では、図５に示すソースコードの欠陥であるバグを検出する例を説明する。
図１の開発支援装置は、図５に示すソースコードのバグの検出処理を開始する前に、データ取得部１が、欠陥間の制御依存関係を抽出するルールを取得して、ルール記憶部３が、当該ルールを記憶するものとする。
【００２２】
図６は欠陥間の制御依存関係を抽出するルールの一例を示す説明図である。
図６において、Ｒ（１），Ｒ（２）は動作の分岐条件の誤りに関するバグを抽出するルールを示している。
図６では、依存関係があるバグの組において、依存先のバグの種類と、依存元のバグの位置とが定義されている。
【００２３】
ルールＲ（１）は、複数の分岐先のうち、実行することが不可能な分岐先が存在しているバグを抽出するためのルールである。
即ち、ルールＲ（１）は、欠陥検出部２から出力された警告情報に含まれているバグの種類を示す情報が「到達できないソースコード」である場合、「到達できないソースコード」を依存先のバグとして抽出する旨を記述している。また、ルールＲ（１）は、「到達できないソースコード」の直前に存在している分岐条件を示すソースコードを依存元のバグとして抽出することを記述している。
ルールＲ（２）は、無限ループとなっているバグを抽出するためのルールである。
即ち、ルールＲ（２）は、欠陥検出部２から出力された警告情報に含まれているバグの種類を示す情報が「無限ループ内のソースコード」である場合、「無限ループ内のソースコード」を依存先のバグとして抽出する旨を記述している。また、ルールＲ（２）は、無限ループのループ条件を示すソースコードを依存元のバグとして抽出することを記述している。
【００２４】
データ取得部１は、開発対象のソフトウェアとして、図５に示すプログラムにおけるソースコードを読み込み、そのソースコードを欠陥検出部２に出力する（図４のステップＳＴ１）。
欠陥検出部２は、データ取得部１からソースコードを受けると、そのソースコードを静的解析して、そのソースコード上の欠陥であるバグを検出する（図４のステップＳＴ２）。
欠陥検出部２は、ソースコードのバグを検出すると、そのバグに関する警告情報を欠陥組抽出部４に出力する。
ソースコードの静的解析自体は公知の技術であるため詳細な説明を省略するが、例えば、以下の特許文献２，３に記載されている静的解析を行えば、ソースコード上の欠陥であるバグを検出することができる。
［特許文献２］特開２０１０−１９８５５８号公報
［特許文献３］特開２００４−１４５３８１号公報
【００２５】
ここで、図７は欠陥検出部２により検出されたバグに関する警告情報の一例を示す説明図である。
図７において、Ｗ（１）〜Ｗ（６）は欠陥検出部２により検出されたバグを識別するＩＤであり、例えば、ＩＤ＝Ｗ（１）のバグの種類は「分岐条件が常に真」であることを示している。
「分岐条件が常に真」となるバグは、分岐条件が偽になることがないため、複数の分岐先のうち、実行することが不可能な分岐先が存在する。即ち、到達できないソースコードが存在する。
この警告情報には、バグが存在するソースコードの行番号を示す情報が含まれており、ＩＤ＝Ｗ（１）のバグが存在するソースコードの行番号は“８”である。
図５に示すソースコードの行番号“８”には、「ｉｆ（ｘ＝＝０）」という分岐条件のソースコードが記述されており、変数“ｘ”の値が“０”であるか否かを判定する必要があるため、このソースコードが使用している実体の参照先は変数“ｘ”である。
このため、ＩＤ＝Ｗ（１）のバグに関する警告情報には、実体の参照先が“ｘ”であることを示す情報が含まれている。
【００２６】
例えば、ＩＤ＝Ｗ（２）のバグの種類は「到達できないソースコード」であることを示している。
ＩＤ＝Ｗ（２）のバグが存在するソースコードの行番号は“１１”であり、その行番号を示す情報が警告情報に含まれている。
ＩＤ＝Ｗ（２）のバグは、ＩＤ＝Ｗ（１）のバグが原因で、行番号“１１”のソースコードに到達できないために発生している。
図５に示すソースコードの行番号“１１”には、「ｙ＝１」のソースコードが記述されており、変数“ｙ”に“１”を代入するものであるため、このソースコードが使用している実体は“ｙ”である。
このため、ＩＤ＝Ｗ（２）のバグに関する警告情報には、実体が“ｙ”であることを示す情報が含まれている。
【００２７】
例えば、ＩＤ＝Ｗ（３）のバグの種類は「変数ｂの未初期化」であることを示している。
ＩＤ＝Ｗ（３）のバグが存在するソースコードの行番号は“１４”であり、その行番号を示す情報が警告情報に含まれている。
図５に示すソースコードの行番号“１４”には、「ａ＝ｂ＊１０」のソースコードが記述されており、変数“ａ”の値を求めるものであるため、このソースコードが使用している実体は“ａ”である。また、変数“ａ”の値を求めるために変数“ｂ”の値を代入するものであり、変数“ｂ”の値を確認する必要があるため、このソースコードが使用している実体の参照先は変数“ｂ”である。
このため、ＩＤ＝Ｗ（３）のバグに関する警告情報には、実体が“ａ”であることを示す情報と、実体の参照先が“ｂ”であることを示す情報とが含まれている。
ＩＤ＝Ｗ（３）のバグは、実体の参照先である“ｂ”が初期化されておらず、“ｂ”の値が不定であるために発生している。
【００２８】
例えば、ＩＤ＝Ｗ（４）のバグの種類は「変数ｙの未初期化」であることを示している。
ＩＤ＝Ｗ（４）のバグが存在するソースコードの行番号は“１６”であり、その行番号を示す情報が警告情報に含まれている。
図５に示すソースコードの行番号“１６”には、「ｉｆ（ｙ＞０）」のソースコードが記述されており、変数“ｙ”の値が“０”より大きいか否かを判定する必要があるため、このソースコードが使用している実体の参照先は変数“ｙ”である。
このため、ＩＤ＝Ｗ（４）のバグに関する警告情報には、実体の参照先が“ｙ”であることを示す情報が含まれている。
ＩＤ＝Ｗ（４）のバグは、行番号“１１”のソースコードに到達できない場合、「ｙ＞０」が真になることがないために発生している。
ＩＤ＝Ｗ（５），Ｗ（６）のバグの種類は、ＩＤ＝Ｗ（３）のバグの種類と同じであるため説明を省略する。
警告情報に含まれているパス情報については後述する。
【００２９】
図８は図５のソースコードの制御フローを示す説明図である。
図８の制御フローには、２つの分岐条件が含まれている。即ち、ソースコードの行番号“８”における「ｉｆ（ｘ＝＝０）」という分岐条件と、ソースコードの行番号“１６”における「ｉｆ（ｙ＞０）」という分岐条件とが含まれている。
このため、ソースコードの制御フローには、４通りの処理経路が存在するため、４つのパスＰ（１）〜Ｐ（４）が含まれている。
ただし、これらのパスは静的に得られるものであり、実際には、分岐条件の記述の誤りがあるために、通過できないパスも存在する。
【００３０】
図９は「ｉｆ（ｘ＝＝０）」及び「ｉｆ（ｙ＞０）」の分岐条件が共に真である場合のパスＰ（１）を示す説明図である。
図１０は「ｉｆ（ｘ＝＝０）」の分岐条件が偽で、「ｉｆ（ｙ＞０）」の分岐条件が真である場合のパスＰ（２）を示す説明図である。
図１１は「ｉｆ（ｘ＝＝０）」の分岐条件が真で、「ｉｆ（ｙ＞０）」の分岐条件が偽である場合のパスＰ（３）を示す説明図である。
図１２は「ｉｆ（ｘ＝＝０）」及び「ｉｆ（ｙ＞０）」の分岐条件が共に偽である場合のパスＰ（４）を示す説明図である。
図９〜図１２では、パスにおける処理の開始（ＳＴＡＲＴ）から処理の終了（ＥＮＤ）に至るまでの間に出現している各処理ブロックに、出現順序を示すステップ番号として、Ｓ１〜Ｓ９を付している。
【００３１】
図７に示す警告情報に含まれているパス情報は、バグが発生しているパスの識別情報と、そのパスにおけるバグの発生場所を表すステップ番号との組が記録されているものである。
例えば、ＩＤ＝Ｗ（１）のバグは、パスＰ（１）〜Ｐ（４）における４番目のステップＳ４で発生しているため、パス情報として、（Ｐ１, Ｓ４）、（Ｐ２, Ｓ４）、（Ｐ３, Ｓ４）、（Ｐ４, Ｓ４）が記録されている。
また、ＩＤ＝Ｗ（２）のバグは、パスＰ（２）とＰ（４）における５番目のステップＳ５で発生しているため、パス情報として、（Ｐ２, Ｓ５）、（Ｐ４, Ｓ５）が記録されている。
なお、ＩＤ＝Ｗ（４）のバグは、行番号“９”における「ｙ＝０」のソースコードを通るパスＰ（１），Ｐ（３）では発生しない。このため、ＩＤ＝Ｗ（４）のバグのパス情報として、（Ｐ１, Ｓ７）、（Ｐ３, Ｓ７）を記録する必要がないが、パスＰ（１），Ｐ（３）の場合も、７番目のステップＳ７を通るので、図９〜図１２の記述との整合を図るために記録している。
図１３は図５のソースコードが使用する実体の定義と参照先を行番号別に記述している説明図である。
図１３では、バグが発生しているソースコードで使用される実体だけでなく、図５のソースコードで使用される全ての実体の定義と参照先を記述している。
【００３２】
欠陥組抽出部４は、欠陥検出部２からバグに関する警告情報を受けると、その警告情報が示す複数のバグの中から、依存関係があるバグの組として、一方のバグの修正が行われると、他方のバグが解消される関係にあるバグの組を抽出する（図４のステップＳＴ３）。
即ち、欠陥組抽出部４の制御依存関係抽出部５は、複数のバグの中から、ルール記憶部３に記憶されているルールにしたがって、動作の分岐条件の誤りに関するバグを依存元のバグとして抽出するとともに、分岐条件の誤りが原因で発生しているバグを依存先のバグとして抽出して、依存元のバグと依存先のバグとの組を特定する。
また、欠陥組抽出部４のデータ依存関係抽出部６は、複数のバグの中から、ソースコードが使用している実体に起因するバグを抽出し、その抽出したバグの中で、同一の実体を共有しているバグの組を特定する。
【００３３】
以下、制御依存関係抽出部５による依存元のバグと依存先のバグとの組の特定処理を具体的に説明する。
図１４は制御依存関係抽出部５の処理内容を示すフローチャートであり、図１４を参照しながら説明する。
【００３４】
まず、制御依存関係抽出部５は、ルール記憶部３に記憶されているルールの読み込みを行う（ステップＳＴ１１）。
この実施の形態１では、ルール記憶部３に記憶されているルールが図６に示すルールＲ（１），Ｒ（２）であるものとして、制御依存関係抽出部５が、ルールＲ（１），Ｒ（２）の読み込みを行うものとする。
制御依存関係抽出部５は、読み込んだルールＲ（１），Ｒ（２）の中で、未だ依存関係があるバグの組の抽出に用いていない未使用のルールがあるか否かを判定する（ステップＳＴ１２）。この段階では、ルールＲ（１），Ｒ（２）のいずれも、依存関係があるバグの組の抽出に用いていないため、未使用のルールがあるものと判断する。
【００３５】
制御依存関係抽出部５は、未使用のルールがあるものと判断すると（ステップＳＴ１２：ＹＥＳの場合）、未使用のルールの中から、依存関係があるバグの組の抽出に用いるルールＲｘを選択する（ステップＳＴ１３）。
この段階では、ルールＲ（１），Ｒ（２）のいずれも、依存関係があるバグの組の抽出に用いていないため、ルールＲ（１）又はルールＲ（２）のいずれか一方を、ルールＲｘとして選択する。
【００３６】
制御依存関係抽出部５は、依存関係があるバグの組の抽出に用いるルールＲｘを選択すると、欠陥検出部２から出力されたバグに関する警告情報が示す複数のバグの中に、未だルールＲｘと照合していないバグが残っているか否かを判定する（ステップＳＴ１４）。
制御依存関係抽出部５は、未だルールＲｘと照合していないバグが残っている場合（ステップＳＴ１４：ＹＥＳの場合）、未だルールＲｘと照合していないいずれかのバグを、バグＷｘとして選択する（ステップＳＴ１５）。
【００３７】
制御依存関係抽出部５は、バグＷｘを選択すると、そのバグＷｘの種類とルールＲｘが示すバグの種類とを照合して、そのバグＷｘの種類が、ルールＲｘが示すバグの種類と一致しているか否かを判定する（ステップＳＴ１６）。
例えば、ルールＲｘがルールＲ（１）である場合、そのバグＷｘの種類が「到達できないソースコード」であれば、そのバグＷｘの種類が、ルールＲｘが示すバグの種類と一致していると判断する。
また、ルールＲｘがルールＲ（２）である場合、そのバグＷｘの種類が「無限ループ内のソースコード」であれば、そのバグＷｘの種類が、ルールＲｘが示すバグの種類と一致していると判断する。
【００３８】
制御依存関係抽出部５は、そのバグＷｘの種類が、ルールＲｘが示すバグの種類と一致している場合（ステップＳＴ１６：ＹＥＳの場合）、欠陥検出部２から出力されたバグに関する警告情報が示す複数のバグの位置を確認することで、その警告情報が示す複数のバグの中に、そのルールＲｘが示す「依存元のバグの位置」に存在しているバグがあるか否かを判定する（ステップＳＴ１７）。
例えば、ルールＲｘがルールＲ（１）である場合、バグＷｘの直前に存在している分岐条件の記載に誤りがあるか否かを判定する。
具体的には、欠陥検出部２から出力されたバグに関する警告情報が図７の場合、ＩＤ＝Ｗ（２）のバグの種類が「到達できないソースコード」であるため、ＩＤ＝Ｗ（２）のバグがバグＷｘとなる。
そして、ＩＤ＝Ｗ（２）のバグＷｘは、図１０及び図１２に示すように、パス（２）及びパス（４）におけるステップＳ５の位置に存在しており、ステップＳ５の直前のステップＳ４には、バグの種類が「分岐条件が常に真」であるＩＤ＝Ｗ（１）のバグが存在している。
このため、バグに関する警告情報が図７の場合、ルールＲｘが示す「依存元のバグの位置」に存在しているバグがあると判定される。
【００３９】
制御依存関係抽出部５は、ルールＲｘが示す「依存元のバグの位置」にバグが存在している場合（ステップＳＴ１７：ＹＥＳの場合）、そのバグを依存元のバグＷｙとして特定するとともに、バグＷｘを依存先のバグとして特定する（ステップＳＴ１８）。
制御依存関係抽出部５は、依存関係があるバグの組として、依存元のバグＷｙと依存先のバグＷｘとの組を依存関係提示部７に出力する。
制御依存関係抽出部５は、依存元のバグＷｙと依存先のバグＷｘとの組を依存関係提示部７に出力すると、バグＷｘを照合済みのバグにして（ステップＳＴ１９）、ステップＳＴ１４の処理に戻る。
また、制御依存関係抽出部５は、バグＷｘの種類が、ルールＲｘが示すバグの種類と一致しない場合（ステップＳＴ１６：ＮＯの場合）、あるいは、複数のバグの中に、ルールＲｘが示す依存元のバグの位置に存在しているバグがない場合（ステップＳＴ１７：ＮＯの場合）も、バグＷｘを照合済みのバグにして、ステップＳＴ１４の処理に戻る（ステップＳＴ１９）。
【００４０】
制御依存関係抽出部５は、ステップＳＴ１３で、未使用のルールの中から、依存関係があるバグの組の抽出に用いるルールＲｘを選択したのち、未だルールＲｘと照合していないバグが残っていない場合（ステップＳＴ１４：ＮＯの場合）、選択したルールＲｘを使用済みのルールとして（ステップＳＴ２０）、ステップＳＴ１２の処理に戻る。
制御依存関係抽出部５は、未使用のルールがないものと判断すると（ステップＳＴ１２：ＮＯの場合）、依存元のバグＷｙと依存先のバグＷｘとの組の特定処理を終了する。
【００４１】
次に、データ依存関係抽出部６による同一の実体を共有しているバグの組の特定処理を具体的に説明する。
図１５はデータ依存関係抽出部６の処理内容を示すフローチャートであり、図１５を参照しながら説明する。
【００４２】
データ依存関係抽出部６は、欠陥検出部２から出力されたバグに関する警告情報が示す複数のバグの中に、未だ他のバグとデータの依存関係の有無を判定していないバグが残っているか否かを判定する（ステップＳＴ３１）。
データ依存関係抽出部６は、その警告情報が示す複数のバグの中に、未判定のバグが残っている場合（ステップＳＴ３１：ＹＥＳの場合）、未判定のバグの中からいずれかのバグをバグＷａとして選択する（ステップＳＴ３２）。
【００４３】
データ依存関係抽出部６は、未判定のバグＷａを選択すると、その警告情報が示す複数のバグの中に、そのバグＷａとの間で、データの依存関係の有無を判定していないバグが残っているか否かを判定する（ステップＳＴ３３）。
データ依存関係抽出部６は、その警告情報が示す複数のバグの中に、未判定のバグが残っている場合（ステップＳＴ３３：ＹＥＳの場合）、未判定のバグの中からいずれかのバグをバグＷｂとして選択する（ステップＳＴ３４）。
【００４４】
データ依存関係抽出部６は、未判定のバグＷｂを選択すると、そのバグＷｂの全てのパスが、バグＷａのパスに含まれているか否かを判定する（ステップＳＴ３５）。
ここで、制御フローにおいて、上流に位置しているバグのパスと、下流に位置しているバグのパスとが一致していれば、上流に位置しているバグの修正を行えば、下流に位置しているバグについては修正することなく解消される。
これに対して、上流に位置しているバグのパスと、下流に位置しているバグのパスとが一致していなければ、上流に位置しているバグの修正を行っても、下流に位置しているバグは解消されない。
このため、データの依存関係があるバグの組が存在する条件は、制御フローにおいて、上流に位置しているバグのパスの集合が、下流に位置しているバグの集合を包含していることである。
【００４５】
データ依存関係抽出部６は、バグＷｂの全てのパスが、バグＷａのパスに含まれている場合（ステップＳＴ３５：ＹＥＳの場合）、制御フローにおいて、バグＷｂがバグＷａより下流に位置しているか否かを判定する（ステップＳＴ３６）。
データ依存関係抽出部６は、バグＷｂがバグＷａより下流に位置している場合（ステップＳＴ３６：ＹＥＳの場合）、バグＷｂとバグＷａが同一の実体を共有しているか否かを判定する（ステップＳＴ３７）。
欠陥検出部２から出力されたバグに関する警告情報が図７の場合、例えば、ＩＤ＝Ｗ（３）のバグがバグＷａ、ＩＤ＝Ｗ（５）のバグがバグＷｂであるとき、制御フローにおいて、ＩＤ＝Ｗ（３）のバグＷａは、図９〜図１２に示すように、ステップ番号Ｓ６の位置に存在し、ＩＤ＝Ｗ（５）のバグＷｂは、図９及び図１０に示すように、ステップ番号Ｓ８の位置に存在しているため、ＩＤ＝Ｗ（３）のバグＷａは、ＩＤ＝Ｗ（５）のバグＷｂより上流に位置している。
また、ＩＤ＝Ｗ（３）のバグＷａと、ＩＤ＝Ｗ（５）のバグＷｂは、実体の参照先が変数ｂで共通している。
なお、ＩＤ＝Ｗ（３）のバグＷａのパスはＰ（１），Ｐ（２），Ｐ（３），Ｐ（４）であり、ＩＤ＝Ｗ（５）のバグＷｂのパスはＰ（１），Ｐ（２）であるため、バグＷｂの全てのパスが、ＩＤ＝Ｗ（３）のバグＷａのパスに含まれている。
【００４６】
データ依存関係抽出部６は、例えば、ＩＤ＝Ｗ（３）のバグがバグＷａ、ＩＤ＝Ｗ（５）のバグがバグＷｂである場合、バグＷａとバグＷｂが同一の実体を共有していると判断し（ステップＳＴ３７：ＹＥＳの場合）、依存関係があるバグの組として、そのバグＷａとバグＷｂの組を特定し、そのバグＷａとバグＷｂの組を依存関係提示部７に出力する（ステップＳＴ３８）。
この場合、上流に位置しているＩＤ＝Ｗ（３）のバグＷａが依存元のバグ、下流に位置しているＩＤ＝Ｗ（５）のバグＷｂが依存先のバグとして依存関係提示部７に出力される。
データ依存関係抽出部６は、バグＷａとバグＷｂの組を依存関係提示部７に出力すると、そのバグＷｂを、バグＷａに対する依存関係の判定済みのバグにして（ステップＳＴ３９）、ステップＳＴ３３の処理に戻る。
また、データ依存関係抽出部６は、バグＷｂのパスの中に、バグＷａのパスに含まれていないパスがある場合（ステップＳＴ３５：ＮＯの場合）、バグＷｂがバグＷａより下流に位置していない場合（ステップＳＴ３６：ＮＯの場合）、あるいは、バグＷｂとバグＷａが同一の実体を共有していない場合（ステップＳＴ３７：ＮＯの場合）も、そのバグＷｂを、バグＷａに対する依存関係の判定済みのバグにして（ステップＳＴ３９）、ステップＳＴ３３の処理に戻る。
【００４７】
データ依存関係抽出部６は、ステップＳＴ３２で、未判定のバグＷａを選択したのち、欠陥検出部２から出力されたバグに関する警告情報が示す複数のバグの中に、そのバグＷａとの間で、データの依存関係の有無を判定していないバグが残っていない場合（ステップＳＴ３３：ＮＯの場合）、そのバグＷａを判定済みのバグにして（ステップＳＴ４０）、ステップＳＴ３１の処理に戻る。
データ依存関係抽出部６は、その警告情報が示す複数のバグの中に、未判定のバグが残っていない場合（ステップＳＴ３１：ＮＯの場合）、即ち、警告情報が示す複数のバグの全てが、既にバグＷａとして選択されている場合、同一の実体を共有しているバグの組の特定処理を終了する。
【００４８】
依存関係提示部７のグラフ構築部８は、欠陥組抽出部４が、依存関係があるバグの組を抽出すると、そのバグの組についての依存関係を示す有向グラフを構築する（図４のステップＳＴ４）。
以下、グラフ構築部８による有向グラフの構築処理を具体的に説明する。
図１６は依存先のバグの情報が追加されている警告情報の一例を示す説明図である。
図１７はグラフ構築部８による有向グラフの構築処理を示す説明図である。
図１７Ａは依存先のバグの情報を示す表図である。この表図は、説明の便宜上、図１６に示す警告情報から、依存先のバグの情報を抜き出したものであり、新たに作成されるものではない。
図１７Ｂは有向グラフの構築処理の途中段階を示し、図１７Ｃは最終的に構築される有向グラフを示している。
【００４９】
グラフ構築部８は、欠陥組抽出部４の制御依存関係抽出部５が、依存元のバグと依存先のバグとの組を特定すると、依存元のバグに関する警告情報に対して、依存先のバグを示す情報を追加する。
この実施の形態１では、制御依存関係抽出部５により、依存元のバグと依存先のバグとの組として、例えば、依存元のバグがＩＤ＝Ｗ（１）のバグ、依存先のバグがＩＤ＝Ｗ（２）のバグが特定されるため、図１６に示すように、ＩＤ＝Ｗ（１）のバグに関する警告情報における依存先のバグを示す欄に、ＩＤ＝Ｗ（２）のバグが追加される。
また、依存元のバグと依存先のバグとの組として、例えば、依存元のバグがＩＤ＝Ｗ（２）のバグ、依存先のバグがＩＤ＝Ｗ（４）のバグが特定されるため、図１６に示すように、ＩＤ＝Ｗ（２）のバグに関する警告情報における依存先のバグを示す欄に、ＩＤ＝Ｗ（４）のバグが追加される。
【００５０】
グラフ構築部８は、欠陥組抽出部４のデータ依存関係抽出部６が、同一の実体を共有しているバグの組を特定すると、そのバグの組のうち、依存元のバグに関する警告情報に対して、依存先のバグを示す情報を追加する。
この実施の形態１では、データ依存関係抽出部６により、依存元のバグと依存先のバグとの組として、例えば、依存元のバグがＩＤ＝Ｗ（３）のバグ、依存先のバグがＩＤ＝Ｗ（５）のバグが特定されるため、図１６に示すように、ＩＤ＝Ｗ（３）のバグに関する警告情報における依存先のバグを示す欄に、ＩＤ＝Ｗ（５）のバグが追加される。
また、依存元のバグがＩＤ＝Ｗ（３）のバグ、依存先のバグがＩＤ＝Ｗ（６）のバグが特定されるため、図１６に示すように、ＩＤ＝Ｗ（３）のバグに関する警告情報における依存先のバグを示す欄に、ＩＤ＝Ｗ（６）のバグが追加される。
【００５１】
次に、グラフ構築部８は、図１７Ｂに示すように、欠陥検出部２により検出された複数のバグを有向グラフのノードに設定する。
この実施の形態１では、ＩＤ＝Ｗ（１）〜（６）のバグが検出されているので、ＩＤ＝Ｗ（１）〜（６）のバグがノードに設定されている。
グラフ構築部８は、複数のバグを有向グラフのノードに設定すると、図１７Ｂに示すように、図１７Ａに示す依存先のバグの情報を参照して、依存関係があるノードを繋ぐことで、有向グラフを構築する。
図１７Ｂにおける“→”は、バグの依存関係を示しており、矢印の根側は依存元のバグ、矢印の矢先側は依存先のバグを表している。
ＩＤ＝Ｗ（４）〜Ｗ（６）のバグは、依存先のバグを有していないため、ＩＤ＝Ｗ（４）〜Ｗ（６）のバグにおけるノードから出力される矢印はない。
【００５２】
図１７Ｃはグラフ構築部８により最終的に構築される有向グラフを示しており、図１７Ｂよりも、複数のノードの依存関係を明確にするため、ＩＤ＝Ｗ（１）のバグに対して、依存先のバグであると同時に、ＩＤ＝Ｗ（４）のバグに対して、依存元のバグであるＩＤ＝Ｗ（２）のバグを、ＩＤ＝Ｗ（１）のバグと、ＩＤ＝Ｗ（４）のバグとの間に配置している。
また、ＩＤ＝Ｗ（５），Ｗ（６）のバグに対して、依存元のバグであるＩＤ＝Ｗ（３）のバグを１つのノードにまとめている。
依存関係提示部７の表示処理部９は、グラフ構築部８により構築された図１７Ｃの有向グラフをディスプレイ１０に表示する（図４のステップＳＴ５）。
【００５３】
以上で明らかなように、この実施の形態１によれば、欠陥検出部２により複数の欠陥が検出された場合、複数の欠陥の中から、依存関係がある欠陥の組として、一方の欠陥の修正が行われると、他方の欠陥が解消される関係にある欠陥の組を抽出する欠陥組抽出部４を設け、依存関係提示部７が、欠陥組抽出部４により抽出された欠陥の組についての依存関係を提示するように構成したので、全ての欠陥を解消するまでに要する修正作業の工数を削減することができる効果を奏する。
【００５４】
例えば、行番号“１１”のソースコードにも到達できるように、依存元のバグであるＩＤ＝Ｗ（１）のバグを修正すると、依存先のバグであるＩＤ＝Ｗ（２）のバグが解消される。
行番号“１１”のソースコードに到達できるようになることで、変数“ｙ”の値が初期化されるため、ＩＤ＝Ｗ（２）のバグに対して依存先のバグであるＩＤ＝Ｗ（４）のバグが同時に解消される。
また、変数“ｂ”の値が初期化されるように、依存元のバグであるＩＤ＝Ｗ（３）のバグを修正すると、ＩＤ＝Ｗ（３）のバグと同じ変数“ｂ”を使用している依存先のバグであるＩＤ＝Ｗ（５），Ｗ（６）のバグが同時に解消される。
したがって、全ての欠陥を解消するまでに要する修正作業の工数を削減することができる。
【００５５】
この実施の形態１によれば、依存関係提示部７が、欠陥組抽出部４により抽出された欠陥の組についての依存関係を示す有向グラフを構築し、その有向グラフを提示するように構成したので、依存関係をリスト形式で並べて提示する場合と比べて、ユーザが、どの欠陥と、どの欠陥が関連しているかを直感的に把握することができるようになる。このため、欠陥全体での関連性の把握や欠陥のグループ化、修正の作業分担決め等に要する工数を削減することができる。
【００５６】
なお、本願発明はその発明の範囲内において、実施の形態の任意の構成要素の変形、もしくは実施の形態の任意の構成要素の省略が可能である。
【産業上の利用可能性】
【００５７】
この発明は、開発対象のソフトウェアの欠陥を検出する開発支援装置及び開発支援方法に適している。
【符号の説明】
【００５８】
１  データ取得部、２  欠陥検出部、３  ルール記憶部、４  欠陥組抽出部、５  制御依存関係抽出部、６  データ依存関係抽出部、７  依存関係提示部、８  グラフ構築部、９  表示処理部、１０  ディスプレイ、２１  データ取得処理回路、２２  欠陥検出処理回路、２３  ルール記憶処理回路、２４  制御依存関係抽出回路、２５  データ依存関係抽出回路、２６  グラフ構築処理回路、２７  表示処理回路、３１  メモリ、３２  プロセッサ。
【図１】
2017168560.tif 000003
【図２】
2017168560.tif 000004
【図３】
2017168560.tif 000005
【図４】
2017168560.tif 000006
【図５】
2017168560.tif 000007
【図６】
2017168560.tif 000008
【図７】
2017168560.tif 000009
【図８】
2017168560.tif 000010
【図９】
2017168560.tif 000011
【図１０】
2017168560.tif 000012
【図１１】
2017168560.tif 000013
【図１２】
2017168560.tif 000014
【図１３】
2017168560.tif 000015
【図１４】
2017168560.tif 000016
【図１５】
2017168560.tif 000017
【図１６】
2017168560.tif 000018
【図１７】
2017168560.tif 000019
【国際調査報告】
2017168560.tif 000020
2017168560.tif 000021
2017168560.tif 000022
2017168560.tif 000023