(57)【特許請求の範囲】
【請求項１】
プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、前記分岐命令と、実行された分岐条件と、前記プログラムの実行開始から前記分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードを生成する第１の生成部と、
前記第１の生成部によって生成されたノードを記憶装置に格納する第１の格納部と、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路上の末尾ノードが示す一連の分岐条件に基づいて、前記プログラムが終了するまでに実行された一連の分岐条件を生成する第２の生成部と、
前記第２の生成部によって生成された一連の分岐条件を前記記憶装置に格納する第２の格納部と、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードから前記実行経路の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定する特定部と、
前記特定部によって特定されたノードが示す分岐命令から前記プログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を前記特定されたノードが示す分岐命令に関連付けることにより、前記特定されたノードを前記記憶装置内において更新する更新部と、
未実行の分岐条件がなくなったノードを前記記憶装置から削除する削除部と、
を有することを特徴とする生成装置。
【請求項２】
前記生成されたノードに、前記生成されたノードが示す分岐命令を呼び出した関数の履歴を追加する追加部と、
前記追加部によって関数の履歴が追加された追加後のノード列を当該追加後のノード列の末尾ノードから前記追加後のノード列の逆順に探索することにより、前記追加後のノード列の末尾ノードと同一の分岐命令を示し、かつ、同一内容の関数の履歴を示すノードが閾値以上連続して出現するか否かを判定する判定部と、
前記判定部によって出現すると判定された場合、前記追加後のノード列の末尾ノードが示す分岐命令が閾値以上連続して実行された旨を示す情報を出力する出力部と、
を有することを特徴とする請求項１に記載の生成装置。
【請求項３】
前記第２の格納部は、
前記判定部によって出現すると判定された場合、前記追加後のノード列の末尾ノードが示す一連の分岐条件を前記記憶装置に格納し、
前記特定部は、
前記判定部によって出現すると判定された場合、前記追加後のノード列を前記追加後のノード列の末尾ノードから前記追加後のノード列の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定することを特徴とする請求項２に記載の生成装置。
【請求項４】
前記プログラムの入力になるデータが、前記第２の格納部によって前記記憶装置に格納された一連の分岐条件に該当するか否かを判断する判断部と、
前記記憶装置に記憶された一連の分岐条件の集合において、前記判断部によって該当すると判断される一連の分岐条件が占める割合を算出する算出部と、
を有することを特徴とする請求項１乃至３のいずれか一項に記載の生成装置。
【請求項５】
コンピュータに、
プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、前記分岐命令と、実行された分岐条件と、前記プログラムの実行開始から前記分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードを生成し、
生成されたノードを記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路上の末尾ノードが示す一連の分岐条件に基づいて、前記プログラムが終了するまでに実行された一連の分岐条件を生成し、
生成された一連の分岐条件を前記記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードから前記実行経路の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定し、
特定されたノードが示す分岐命令から前記プログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を前記特定されたノードが示す分岐命令に関連付けることにより、前記特定されたノードを前記記憶装置内において更新し、
未実行の分岐条件がなくなったノードを前記記憶装置から削除する、
処理を実行させることを特徴とする生成プログラム。
【請求項６】
コンピュータが、
プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、前記分岐命令と、実行された分岐条件と、前記プログラムの実行開始から前記分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードを生成し、
生成されたノードを記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路上の末尾ノードが示す一連の分岐条件に基づいて、前記プログラムが終了するまでに実行された一連の分岐条件を生成し、
生成された一連の分岐条件を前記記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードから前記実行経路の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定し、
特定されたノードが示す分岐命令から前記プログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を前記特定されたノードが示す分岐命令に関連付けることにより、前記特定されたノードを前記記憶装置内において更新し、
未実行の分岐条件がなくなったノードを前記記憶装置から削除する、
処理を実行することを特徴とする生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、生成装置、生成プログラム、および生成方法に関する。
【背景技術】
【０００２】
従来、テストデータをプログラムに与えた場合に、プログラムの実行経路を示す２分木をトレースして到達する葉ノードを特定し、２分木の葉ノードの中で特定された葉ノードの割合を、プログラムに対するテストデータの網羅性として算出する技術がある（例えば、下記特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平３−２９６１４８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、上述した従来技術では、２分木の生成過程において、プログラムの分岐命令ごとに２分木の末端ノードが枝分かれするため、ノードの個数が増大していく。また、プログラムの実行経路を示す２分木のトレースによりプログラムに対するテストデータの網羅性が算出されるため、２分木を記憶装置に保持し続けると、記憶領域を圧迫するといった問題がある。また、記憶領域が圧迫されるとプログラムの実行効率が低下し、テストデータの網羅性の算出が長期化することになる。また、記憶領域に２分木を保持しきれなくなった場合、プログラムの実行が中断される。これにより、２分木が完成せず、テストデータの網羅性の算出ができない場合がある。
【０００５】
本発明は、上述した従来技術による問題点を解消するため、記憶領域の使用量増加を抑制することができる生成装置、生成プログラム、および生成方法を提供することを目的とする。
【課題を解決するための手段】
【０００６】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、分岐命令と、実行された分岐条件と、プログラムの実行開始から分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードを生成し、生成されたノードを記憶装置に格納し、プログラムの実行が終了した場合、プログラムが終了するまでの実行経路上の末尾ノードが示す一連の分岐条件に基づいて、プログラムが終了するまでに実行された一連の分岐条件を生成し、生成された一連の分岐条件を記憶装置に格納し、プログラムの実行が終了した場合、プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードから前記実行経路の逆順に探索して未実行の分岐条件が最初に出現するノードを、記憶装置の中から特定し、特定されたノードが示す分岐命令からプログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を特定されたノードが示す分岐命令に関連付けることにより、特定されたノードを記憶装置内において更新し、未実行の分岐条件がなくなったノードを記憶装置から削除する生成装置、生成プログラム、および生成方法が提案される。
【発明の効果】
【０００７】
本発明の一側面によれば、記憶領域の使用量増加を抑制することができるという効果を奏する。
【図面の簡単な説明】
【０００８】
【図１】図１は、生成装置によるパス条件の生成の内容を示す説明図である。
【図２】図２は、実施の形態にかかる生成装置１００のハードウェア構成例を示すブロック図である。
【図３】図３は、生成装置１００の機能的構成例を示すブロック図である。
【図４】図４は、対象プログラムＴＰの一例を示す説明図である。
【図５】図５は、パス条件を生成する具体例を示す説明図（その１）である。
【図６】図６は、パス条件を生成する具体例を示す説明図（その２）である。
【図７】図７は、パス条件を生成する具体例を示す説明図（その３）である。
【図８】図８は、パス条件を生成する具体例を示す説明図（その４）である。
【図９】図９は、パス条件を生成する具体例を示す説明図（その５）である。
【図１０】図１０は、パス条件を生成する具体例を示す説明図（その６）である。
【図１１】図１１は、パス条件を生成する具体例を示す説明図（その７）である。
【図１２】図１２は、実行回数が閾値以上になったことを検出する具体例を示す説明図である。
【図１３】図１３は、パス条件生成処理の詳細な処理手順を示すフローチャート（その１）である。
【図１４】図１４は、パス条件生成処理の詳細な処理手順を示すフローチャート（その２）である。
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、この発明にかかる生成装置、生成プログラム、および生成方法の実施の形態を詳細に説明する。
【００１０】
（生成装置によるパス条件の生成の内容）
図１は、生成装置によるパス条件の生成の内容を示す説明図である。図１において、生成装置１００は、パス条件の生成対象になる対象プログラムＴＰをシンボリック実行するコンピュータである。パス条件とは、或る実行経路で対象プログラムＴＰを実行する場合に対象プログラムＴＰの入力になるデータが満たすべき条件であり、対象プログラムＴＰの実行が終了するまでの実行経路上において実行された一連の分岐条件である。
【００１１】
シンボリック実行とは、対象プログラムＴＰの変数に具体的な値を入力する代わりに、シンボル値（記号値）を入力し、シンボル値のまま対象プログラムＴＰを模擬的に実行することである。以降、シンボル値が入力される変数を「シンボル変数」と称す。生成装置１００は、対象プログラムＴＰのシンボリック実行中において、シンボル変数に関する分岐命令を実行するごとに、当該分岐命令に対応するノードＮを生成する。
【００１２】
（Ａ）は、生成されたノードＮのデータ構造を示す。分岐命令に対応するノードＮには、例えば、分岐命令に応じたプログラムカウンタ、および分岐命令までの実行経路上において実行された一連の分岐条件、実行された分岐条件が含まれる。プログラムカウンタとは、命令の番地（アドレス）である。
【００１３】
ここで、一般的なシンボリック実行の場合とは異なり、ノードＮには、実行された分岐条件が含まれる。これにより、生成装置１００は、ノードＮが示す分岐命令に、未実行の分岐条件があるか否かを判別できる。また、一般的なシンボリック実行の場合とは異なり、ノードＮには、分岐命令までの実行経路上において実行された一連の分岐条件が含まれる。これにより、生成装置１００は、ノードＮが示す一連の分岐条件を引き継ぐことにより、ノードＮが示す分岐命令から対象プログラムＴＰの実行を再開して、未実行の実行経路を途中から実行することができる。
【００１４】
また、生成装置１００は、対象プログラムＴＰの実行を終了した場合、対象プログラムＴＰの実行の終了に対応するノードＮを生成する。この場合、対象プログラムＴＰの実行の終了に対応するノードＮには、例えば、対象プログラムＴＰの実行の終了に応じたプログラムカウンタ、および対象プログラムＴＰの実行の終了までの実行経路上において実行された一連の分岐条件が含まれる。
【００１５】
また、各ノードＮは、実行経路上の親ノードＮへのリンクとして、親ノードのアドレスを含んでもよい。また、各ノードＮは、実行経路上の子ノードＮへのリンクとして、子ノードのアドレスを含んでもよい。ノードＮの子ノードとは、当該ノードＮから分岐したノードである。ノードＮの親ノードとは、当該ノードＮの直前の分岐元のノードＮである。
【００１６】
（Ｂ）は、対象プログラムＴＰの記述内容の一例を示す。対象プログラムＴＰは、シンボル変数「ａ」に関する分岐命令を３番地に含み、シンボル変数「ｂ」に関する分岐命令を４番地に含む。（Ｃ）〜（Ｅ）は、生成されたノード群により構成される木構造データの一例を示している。以下、（Ｂ）〜（Ｅ）を参照して、生成装置１００による対象プログラムＴＰのパス条件の生成の内容について説明する。
【００１７】
（Ｂ）において、（１）まず、生成装置１００は、対象プログラムＴＰの１番地からシンボリック実行を開始し、対象プログラムＴＰの３番地に到達する。そして、（Ｃ）において、（２）生成装置１００は、対象プログラムＴＰの３番地において、シンボル変数「ａ」に関する分岐命令「ｉｆ（ａ＞０）」が真になる分岐条件「ａ＞０」を実行すると、当該分岐命令に対応するノードＮ１を生成する。
【００１８】
ノードＮ１は、例えば、当該分岐命令の番地を示すプログラムカウンタ「３」と、３番地までに実行された一連の分岐条件と、当該分岐命令が真になる分岐条件を実行したことを示す「真」と、を含む。ここで、３番地までに実行された分岐条件がないため、ノードＮ１は、３番地までに実行された分岐条件がないことを示す情報「Ｔｒｕｅ」を含む。
【００１９】
次に、（Ｂ）において、（３）生成装置１００は、対象プログラムＴＰを３番地から再開し、対象プログラムＴＰの４番地に到達する。そして、（Ｃ）において、（４）生成装置１００は、対象プログラムＴＰの４番地において、シンボル変数「ｂ」に関する分岐命令「ｉｆ（ｂ＞０）」が真になる分岐条件「ｂ＞０」を実行すると、当該分岐命令に対応するノードＮ２を生成する。
【００２０】
ノードＮ２は、例えば、当該分岐命令の番地を示すプログラムカウンタ「４」と、４番地までに実行された一連の分岐条件「ａ＞０」と、当該分岐命令が真になる分岐条件を実行したことを示す「真」と、を含む。４番地までに実行された一連の分岐条件「ａ＞０」は、ノードＮ１が示す一連の分岐条件「Ｔｒｕｅ」と、３番地において実行された分岐条件「ａ＞０」を参照して生成される。
【００２１】
次に、（Ｂ）において、（５）生成装置１００は、対象プログラムＴＰを４番地から再開し、対象プログラムＴＰの８番地まで到達する。そして、（Ｃ）において、（６）生成装置１００は、対象プログラムＴＰの８番地で、対象プログラムＴＰの実行の終了を検出すると、対象プログラムＴＰの実行の終了に対応するノードＮ３を生成する。
【００２２】
ノードＮ３は、例えば、対象プログラムＴＰが終了した番地を示すプログラムカウンタ「８」と、８番地までに実行された一連の分岐条件「（ａ＞０）＆＆（ｂ＞０）」と、を含む。８番地までに実行された一連の分岐条件「（ａ＞０）＆＆（ｂ＞０）」は、ノードＮ２が示す一連の分岐条件「ａ＞０」と、４番地において実行された分岐条件「ｂ＞０」を参照して生成される。「＆＆」は論理積を示す。ここで、生成装置１００は、生成したノードＮ３が示す一連の分岐条件「ａ＞０＆＆ｂ＞０」をパス条件ＰＣ１として記憶装置に保持しておく。
【００２３】
また、（Ｂ）において、（７）生成装置１００は、対象プログラムＴＰの実行の終了を検出すると、ノードＮ３の親になるノードＮ２が示す分岐命令の番地「４」まで戻る。そして、（Ｄ）において、（８）生成装置１００は、ノードＮ２が示す分岐命令の番地「４」に戻ると、他のパス条件の生成に用いない不要なノードＮ３を削除する。これにより、生成装置１００は、記憶領域の使用量増加を抑制することができる。（９）そして、生成装置１００は、番地「４」の分岐命令に、未実行の分岐条件があるか否かを判定する。
【００２４】
次に、（Ｂ）において、（１０）生成装置１００は、ノードＮ２に分岐命令が偽になる分岐条件を実行したことを示す「偽」が含まれていないため、未実行の分岐条件があると判断する。
【００２５】
そのため、生成装置１００は、４番地の分岐命令「ｉｆ（ｂ＞０）」が偽になる未実行の分岐条件「！ｂ＞０」を実行し、対象プログラムＴＰを４番地から再開し、対象プログラムＴＰの８番地まで到達する。「！」は否定を示す。ここで、生成装置１００は、分岐命令が偽になる分岐条件を実行したことを示す「偽」を、ノードＮ２に追加する。（１１）そして、生成装置１００は、対象プログラムＴＰの８番地において、対象プログラムＴＰの実行の終了を検出すると、対象プログラムＴＰの実行の終了に対応するノードＮ４を生成する。
【００２６】
ノードＮ４は、例えば、対象プログラムＴＰの実行の終了の番地を示すプログラムカウンタ「８」と、８番地までに実行された一連の分岐条件「ａ＞０＆＆！ｂ＞０」と、を含む。８番地までに実行された一連の分岐条件「ａ＞０＆＆！ｂ＞０」は、ノードＮ２が示す一連の分岐条件「ａ＞０」と、４番地において実行された分岐条件「ｂ≦０」を参照して生成される。ここで、生成装置１００は、生成したノードＮ４が示す一連の分岐条件「ａ＞０＆＆！ｂ＞０」をパス条件ＰＣ２として保持しておく。
【００２７】
また、（Ｂ）において、（１２）生成装置１００は、対象プログラムＴＰが終了すると、ノードＮ４の親になるノードＮ２が示す分岐命令の番地「４」まで戻る。そして、（Ｅ）において、（１３）生成装置１００は、ノードＮ２が示す分岐命令の番地「４」に戻ると、ノードＮ４を削除する。（１４）そして、生成装置１００は、番地「４」の分岐命令に、未実行の分岐条件があるか否かを判定する。
【００２８】
次に、（Ｂ）において、（１５）ノードＮ２に「真」と「偽」が含まれているため、生成装置１００は、未実行の分岐条件がないと判断する。そのため、生成装置１００は、さらに、ノードＮ２の親になるノードＮ１が示す分岐命令の番地「３」まで戻る。そして、（Ｅ）において、（１６）生成装置１００は、ノードＮ１が示す分岐命令の番地「３」に戻ると、未実行の分岐条件がないノードＮ２を、他のパス条件の生成に用いない不要なノードＮとして削除する。これにより、生成装置１００は、記憶領域の使用量増加を抑制することができる。（１７）そして、生成装置１００は、番地「３」の分岐命令に、未実行の分岐条件があるか否かを判定する。
【００２９】
次に、（Ｂ）において、（１８）ノードＮ１に分岐命令が偽になる分岐条件を実行したことを示す「偽」が含まれていないため、生成装置１００は、未実行の分岐条件があると判断する。そのため、生成装置１００は、３番地の分岐命令「ｉｆ（ａ＞０）」が「偽」になる未実行の分岐条件「！ａ＞０」を実行し、対象プログラムＴＰを３番地から再開し、対象プログラムＴＰの８番地まで到達する。
【００３０】
そして、（Ｅ）において、（１９）生成装置１００は、対象プログラムＴＰの８番地で、対象プログラムＴＰの実行の終了を検出すると、対象プログラムＴＰの実行の終了に対応するノードＮ５を生成する。ノードＮ５は、対象プログラムＴＰの実行の終了の番地を示すプログラムカウンタ「８」と、１番地から８番地までに実行された分岐条件「！ａ＞０」と、を含む。８番地までに実行された一連の分岐条件「！ａ＞０」は、ノードＮ１が示す一連の分岐条件「Ｔｒｕｅ」と、３番地において実行された分岐条件「！ａ＞０」を参照して生成される。ここで、生成装置１００は、生成したノードＮ５が示す分岐条件「！ａ＞０」をパス条件ＰＣ３として保持しておく。
【００３１】
これにより、生成装置１００は、対象プログラムＴＰの各々の実行経路に対応するパス条件ＰＣ１〜ＰＣ３を生成することができる。この際、生成装置１００は、パス条件の生成に伴って、パス条件の生成を終えた実行経路上のノードＮを、パス条件の生成に用いない不要なノードＮとして削除していくことにより、記憶領域の使用量増加を抑制することができる。
【００３２】
このように、生成装置１００は、記憶領域に保持されるノードＮの個数増加を抑制し、ノードＮの保持によるワークエリアになる記憶領域の圧迫を抑制する。そして、生成装置１００は、ワークエリアの圧迫によるプログラムの実行効率の低下を抑制することができる。生成装置１００は、例えば、テストデータの対象プログラムＴＰに対する網羅性の算出効率の低下を抑制することができる。また、生成装置１００は、記憶領域にノードＮが保持しきれずに、ワークエリアとして使用可能な領域がなくなることを防止することができる。そして、生成装置１００は、ワークエリアとして使用可能な領域がなくなり、パス条件の生成が中断することを防止することができる。
【００３３】
また、生成装置１００は、生成したパス条件ＰＣ１〜ＰＣ３から、対象プログラムＴＰの動作確認に用いられるテストデータが、各々の実行経路をどの程度網羅しているかを示す網羅性を算出することができる。ここで、テストデータは、例えば、生成装置１００の利用者によって生成される。例えば、テストデータが「（ａ，ｂ）＝（１，１），（１，−１）」であれば、上述した３つのパス条件ＰＣ１〜ＰＣ３のうち、２つのパス条件ＰＣ１，ＰＣ２を満たすため、当該テストデータの網羅性は「６６％」である。
【００３４】
これにより、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性が１００％に満たない場合、対象プログラムＴＰの実行経路の各々を１００％網羅して動作確認ができるように、テストデータを追加することができる。生成装置１００の利用者は、例えば、上記テストデータ「（ａ，ｂ）＝（１，１），（１，−１）」に、パス条件ＰＣ３を満たす「（ａ，ｂ）＝（−１，−１）」を追加して、網羅性を１００％にする。
【００３５】
また、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性が１００％である場合、テストデータから不要なデータを削除し、対象プログラムＴＰの動作確認の効率化を図ってもよい。生成装置１００の利用者は、例えば、テストデータ「（ａ，ｂ）＝（１，１），（２，１），（−１，−１），（１，−１）」から、「（ａ，ｂ）＝（２，１）」を削除しても網羅性が１００％のままであるため、「（ａ，ｂ）＝（２，１）」を削除する。
【００３６】
また、生成装置１００は、生成したパス条件の各々を満たすテストデータを生成してもよい。生成装置１００は、例えば、パス条件「（ａ＞０）＆＆（ｂ＞０）」を満たすテストデータとして、「（ａ，ｂ）＝（１，１）」を生成する。
【００３７】
（生成装置１００のハードウェア構成例）
図２は、実施の形態にかかる生成装置１００のハードウェア構成例を示すブロック図である。図２において、生成装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、磁気ディスクドライブ２０４と、磁気ディスク２０５と、光ディスクドライブ２０６と、光ディスク２０７と、ディスプレイ２０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０９と、キーボード２１０と、マウス２１１と、スキャナ２１２と、プリンタ２１３と、を備えている。また、各構成部はバス２２０によってそれぞれ接続されている。
【００３８】
ここで、ＣＰＵ２０１は、生成装置１００の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される。磁気ディスクドライブ２０４は、ＣＰＵ２０１の制御にしたがって磁気ディスク２０５に対するデータのリード／ライトを制御する。磁気ディスク２０５は、磁気ディスクドライブ２０４の制御で書き込まれたデータを記憶する。
【００３９】
光ディスクドライブ２０６は、ＣＰＵ２０１の制御にしたがって光ディスク２０７に対するデータのリード／ライトを制御する。光ディスク２０７は、光ディスクドライブ２０６の制御で書き込まれたデータを記憶したり、光ディスク２０７に記憶されたデータをコンピュータに読み取らせたりする。
【００４０】
ディスプレイ２０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ２０８は、例えば、液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００４１】
インターフェース（以下、「Ｉ／Ｆ」と略する。）２０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１４に接続され、このネットワーク２１４を介して他の装置に接続される。そして、Ｉ／Ｆ２０９は、ネットワーク２１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０９には、例えばモデムやＬＡＮアダプタなどを採用することができる。
【００４２】
キーボード２１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス２１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を有するものであれば、トラックボールやジョイスティックなどであってもよい。
【００４３】
スキャナ２１２は、画像を光学的に読み取り、生成装置１００内に画像データを取り込む。なお、スキャナ２１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ２１３は、画像データや文書データを印刷する。プリンタ２１３には、例えば、レーザプリンタやインクジェットプリンタを採用することができる。
【００４４】
（生成装置１００の機能的構成例）
図３は、生成装置１００の機能的構成例を示すブロック図である。生成装置１００は、入力部３０１と、実行部３０２と、第１の生成部３０３と、第１の格納部３０４と、第２の生成部３０５と、第２の格納部３０６と、特定部３０７と、更新部３０８と、削除部３０９と、追加部３１０と、判定部３１１と、出力部３１２と、判断部３１３と、算出部３１４と、を含む構成である。
【００４５】
入力部３０１、実行部３０２、第１の生成部３０３、第１の格納部３０４、第２の生成部３０５、第２の格納部３０６、特定部３０７、更新部３０８、削除部３０９、追加部３１０、判定部３１１、出力部３１２、判断部３１３、および、算出部３１４は、具体的には、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶装置３００に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０９により、その機能を実現する。
【００４６】
ここで、生成装置１００は、対象プログラムＴＰについて実行可能な各々の実行経路に対応するパス条件を生成する機能を有する。ここで、実行経路とは、対象プログラムＴＰの実行に伴って生成されたノードＮの集合における先頭ノードＮから末尾ノードＮまでの経路である。また、生成装置１００は、或る分岐命令の実行回数が閾値以上になったことを検出する機能を有する。また、生成装置１００は、生成したパス条件の集合から、テストデータの網羅性を算出する機能を有する。
【００４７】
まず、パス条件を生成する機能について説明する。パス条件を生成する機能は、入力部３０１〜削除部３０９によって実現される。パス条件を生成する具体例については、図５〜図１１を用いて後述する。
【００４８】
入力部３０１は、プログラムの入力を受け付ける。ここで、プログラムとは、パス条件の生成対象になるプログラムであり、例えば、上述した対象プログラムＴＰである。これにより、入力部３０１は、対象プログラムＴＰのシンボリック実行を実行部３０２に開始させるトリガを発生することができる。ここで、図４を用いて、入力部３０１によって入力される対象プログラムＴＰについて説明する。
【００４９】
図４は、対象プログラムＴＰの一例を示す説明図である。図４に示すように、対象プログラムＴＰは、３番地に、変数「ａ」にシンボル値を入力する命令「ｋｌｅｅ＿ｍａｋｅ＿ｓｙｍｂｏｌｉｃ（＆ａ）；」を含む。また、対象プログラムＴＰは、４番地に、変数「ｂ」にシンボル値を入力する命令「ｋｌｅｅ＿ｍａｋｅ＿ｓｙｍｂｏｌｉｃ（＆ｂ）；」を含む。ここで、シンボル値を入力された変数を、シンボル変数という。
【００５０】
また、対象プログラムＴＰは、１７番地に、シンボル変数に関する分岐命令であるｉｆ文「ｉｆ（ｂ＜１０）  ｎ＋＋；」を含む。ｉｆ文「ｉｆ（ｂ＜１０）  ｎ＋＋；」は、シンボル変数「ｂ」が１０より小さいか否かにより分岐する。また、対象プログラムＴＰは、２２番地に、シンボル変数に関する分岐命令になるｉｆ文「ｉｆ（ｘ＜０）  ｒｅｔｕｒｎ  −ｘ；」を含む。ｉｆ文「ｉｆ（ｘ＜０）  ｒｅｔｕｒｎ  −ｘ；」は、変数「ｘ」の引数になるシンボル変数「ａ」が０より小さいか否かにより分岐する。
【００５１】
図３に戻り、実行部３０２は、入力部３０１によって入力されたプログラムをシンボリック実行する。ここで、シンボリック実行とは、上述したように、対象プログラムＴＰの変数に具体的な値を入力する代わりに、シンボル値（記号値）を入力し、シンボル値のまま対象プログラムＴＰを模擬的に実行することである。実行部３０２は、具体的には、例えば、プログラムカウンタが示す対象プログラムＴＰの番地から命令を読み出し、読み出した命令を実行する。
【００５２】
また、実行部３０２は、シンボル変数に関する分岐命令を読み出した場合、未実行の分岐条件を実行し、第１の生成部３０３に未実行の分岐命令を実行したことを通知する。実行部３０２は、具体的には、例えば、図４の１７番地のｉｆ文「ｉｆ（ｂ＜１０）  ｎ＋＋；」を読み出した場合、当該ｉｆ文が真になる未実行である分岐条件「ｂ＜１０」を実行する。これにより、実行部３０２は、第１の生成部３０３にノードＮの生成を開始させることができる。
【００５３】
また、実行部３０２は、具体的には、例えば、図４の１７番地のｉｆ文「ｉｆ（ｂ＜１０）  ｎ＋＋；」を読み出した場合、分岐条件「ｂ＜１０」を実行済みであれば、当該ｉｆ文が偽になる未実行である分岐条件「ｂ≧１０」を実行してもよい。これにより、実行部３０２は、第１の生成部３０３にノードＮの生成を開始させることができる。
【００５４】
また、実行部３０２は、プログラムの終了命令を読み出した場合、第２の生成部３０５にプログラムの終了を通知する。ここで、プログラムの終了命令とは、例えば、関数「ｍａｉｎ（）」の終了を示す、図４の８番地の閉じ括弧である。これにより、実行部３０２は、第２の生成部３０５にパス条件の生成を開始させることができる。
【００５５】
第１の生成部３０３は、プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、分岐命令と、実行された分岐条件と、プログラムの実行開始から分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードＮを生成する。
【００５６】
ここで、実行部３０２によって図４の２２番地のｉｆ文が真になる分岐条件「ａ＜０」が実行された場合を例に挙げる。この場合、第１の生成部３０３は、具体的には、例えば、実行された分岐命令を示す番地「２２」と、実行された分岐条件「ａ＜０」と、２２番地までに実行された一連の分岐条件「Ｔｒｕｅ」と、を関連付けたノードＮを生成する。ここで、一連の分岐条件「Ｔｒｕｅ」とは、２２番地までに実行された分岐条件がないことを示す情報である。
【００５７】
また、実行部３０２によって図４の２２番地のｉｆ文の分岐条件「ｘ＜０」が実行された後に、１７番地のｉｆ文の分岐条件「ｂ＜１０」が実行された場合を例に挙げる。この場合、第１の生成部３０３は、具体的には、例えば、実行された分岐命令を示す番地「１７」と、実行された分岐条件「ｂ＜１０」と、１７番地までに実行された一連の分岐条件「ａ＜０」と、を関連付けたノードＮを生成する。１７番地までに実行された一連の分岐条件「ａ＜０」は、２２番地の分岐命令に対応する親ノードＮが示す一連の分岐条件「Ｔｒｕｅ」と実行された分岐条件「ａ＜０」から生成される。
【００５８】
また、ノードＮは、親ノードＮへのリンクになる記憶装置３００における親ノードＮのアドレスを含んでもよい。また、親ノードＮは、ノードＮへのリンクになる記憶装置３００におけるノードＮのアドレスを含んでもよい。また、第１の生成部３０３は、ノードＮに、「ａ＜０」の代わりに、分岐命令が真になる分岐条件が実行されたことを示す「真」を関連付けてもよい。また、第１の生成部３０３は、ノードＮに、分岐命令に到達した場合の変数の値を関連付けてもよい。
【００５９】
これにより、特定部３０７は、第１の生成部３０３により生成されたノードＮが示す実行済みの分岐条件を参照して、ノードＮが示す分岐命令に未実行の分岐条件があるか否かを判別することができる。また、実行部３０２は、第１の生成部３０３により生成されたノードＮが示す一連の分岐条件と変数の値とを参照して、対象プログラムＴＰの実行を再開することができる。
【００６０】
第１の格納部３０４は、第１の生成部３０３によって生成されたノードＮを記憶装置３００に格納する。ここで、記憶装置３００は、図２に示したＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などである。これにより、特定部３０７は、第１の格納部３０４により格納されたノードＮが示す実行済みの分岐条件を、記憶装置３００から取得することができる。また、実行部３０２は、第１の格納部３０４により格納されたノードＮが示す一連の分岐条件と変数の値とを、記憶装置３００から取得することができる。
【００６１】
第２の生成部３０５は、プログラムの実行が終了した場合、プログラムが終了するまでの実行経路上の末尾ノードＮが示す一連の分岐条件に基づいて、プログラムが終了するまでに実行された一連の分岐条件を生成する。プログラムが終了するまでに実行された一連の分岐条件をパス条件という。パス条件は、当該実行経路（パス）でプログラムを実行する場合に各シンボル変数が満たすべき条件である。
【００６２】
ここで、分岐命令を示す番地「１７」と、実行された分岐条件「ｂ＜１０」と、１７番地までに実行された一連の分岐条件「ａ＜０」と、を関連付けたノードＮが末尾ノードＮである場合を例に挙げる。この場合、第２の生成部３０５は、具体的には、例えば、プログラムが終了するまでに実行された一連の分岐条件として、末尾ノードＮが示す１７番地において実行された分岐条件「ｂ＜１０」と、１７番地までに実行された一連の分岐条件「ａ＜０」と、の論理積「（ｂ＜１０）＆＆（ａ＜０）」を生成する。これにより、算出部３１４は、第２の生成部３０５により生成されたパス条件を参照して、対象プログラムＴＰの動作確認に用いられるテストデータの網羅性を算出することができる。
【００６３】
第２の格納部３０６は、第２の生成部３０５によって生成された一連の分岐条件を記憶装置３００に格納する。ここで、記憶装置３００は、図２に示したＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などである。これにより、削除部３０９は、第２の格納部３０６により記憶装置３００に格納済みのパス条件に対応する実行経路上のノードＮを、パス条件の生成に用いない不要なノードＮとして削除することができる。また、算出部３１４は、第２の格納部３０６により格納されたパス条件を、記憶装置３００から取得することができる。
【００６４】
特定部３０７は、プログラムの実行が終了した場合、プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードＮから実行経路の逆順に探索して、未実行の分岐条件が最初に存在するノードＮを記憶装置３００の中から特定する。ここで、逆順とは、ノードＮの生成された順序の逆の順序であり、実行経路上の各ノードＮが示す分岐命令が実行された順序の逆の順序である。実行経路を当該実行経路上の末尾ノードＮから実行経路の逆順に探索することを、バックトラックという。
【００６５】
特定部３０７は、具体的には、例えば、末尾ノードＮを始点にし、プログラムが終了するまでの実行経路上の各々のノードＮが示す親のノードＮのアドレスを参照して、親のノードＮに戻る。特定部３０７は、親のノードＮに戻ると、さらに、その親のノードに戻る。このようにして、特定部３０７は、プログラムが終了するまでの実行経路をその逆順に探索していくことになる。次に、特定部３０７は、プログラムが終了するまでの実行経路を探索する過程において、当該実行経路内のノードＮが示す実行済み分岐条件を取得する。そして、特定部３０７は、取得された分岐条件が１つ以下である場合に、未実行の分岐条件が存在すると判定し、分岐条件を取得したノードＮを、未実行の分岐条件が存在するノードＮとして特定する。
【００６６】
特定部３０７は、より具体的には、図４の１７番地の分岐命令に応じた末尾ノードＮから、実行された分岐条件「ｂ＜１０」を取得する。特定部３０７は、分岐条件「ｂ＜１０」が１つ以下であり、未実行の分岐条件「ｂ≧１０」が存在すると判定する。そして、特定部３０７は、１７番地の分岐命令に応じた末尾ノードＮを、未実行の分岐条件が存在するノードＮとして特定する。
【００６７】
これにより、実行部３０２は、特定部３０７により特定されたノードＮが示す分岐命令を起点にして、対象プログラムＴＰの実行を再開することができる。また、実行部３０２は、対象プログラムＴＰの実行を再開し、分岐命令が真になる分岐条件と、偽になる分岐条件と、を実行することができる。
【００６８】
この場合、実行部３０２は、特定されたノードＮが示す変数の値を各変数に設定し、特定されたノードＮが示す番地から対象プログラムＴＰを実行する。これにより、実行部３０２は、対象プログラムＴＰを最初から実行しなくても、途中から再開することができ、未実行の実行経路の実行を開始することができる。そのため、実行部３０２は、対象プログラムＴＰの実行可能な実行経路の各々を、効率的に実行していくことができる。
【００６９】
また、実行部３０２は、対象プログラムＴＰの実行を再開し、分岐命令が真になる分岐条件と、偽になる分岐条件と、を実行することができる。そのため、削除部３０９は、実行部３０２により実行され、未実行の分岐条件がなくなったノードＮを、パス条件の生成に用いないノードＮとして削除することができる。
【００７０】
更新部３０８は、特定部３０７によって特定されたノードＮが示す分岐命令からプログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を特定されたノードＮが示す分岐命令に関連付けることにより、特定されたノードＮを記憶装置３００内において更新する。
【００７１】
更新部３０８は、具体的には、例えば、実行部３０２により１７番地の分岐命令が偽になる分岐条件「ｂ≧１０」が実行され、対象プログラムＴＰが再開された場合、１７番地の分岐命令に応じた末尾ノードＮに、さらに「ｂ≧１０」を関連付けて更新する。また、更新部３０８は、末尾ノードＮに、「ｂ≧１０」の代わりに、分岐命令が偽になる分岐条件が実行されたことを示す「偽」を関連付けて更新してもよい。これにより、削除部３０９は、更新部３０８により更新された実行された分岐条件を参照して、未実行の分岐条件がなくなったノードＮを特定することができる。
【００７２】
削除部３０９は、未実行の分岐条件がなくなったノードＮを記憶装置３００から削除する。削除部３０９は、具体的には、例えば、実行された分岐条件として２つの分岐条件が関連付けられたノードＮを、パス条件の生成に用いない不要なノードＮと判断して削除する。これにより、削除部３０９は、メモリ使用量の増加を抑制することができる。
【００７３】
次に、分岐命令の実行回数が閾値以上になったことを検出する機能について説明する。分岐命令の実行回数が閾値以上になったことを検出する機能は、追加部３１０〜出力部３１２によって実現される。分岐命令の実行回数が閾値以上になったことを検出する具体例については、図１２を用いて後述する。
【００７４】
追加部３１０は、生成されたノードＮに、生成されたノードＮが示す分岐命令を呼び出した関数の履歴を追加する。関数の履歴とは、対象プログラムＴＰの実行により呼び出された一連の関数と当該関数の呼び出し順序とを示す情報である。関数の履歴は、例えば、ＬＩＦＯ（Ｌａｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）の記憶方式であり、呼び出された関数の履歴が、当該関数の終了に伴って消去されるコールスタックの内容である。また、関数の履歴は、呼び出された関数の履歴が、当該関数の終了に伴って消去されない履歴であってもよい。
【００７５】
追加部３１０は、具体的には、例えば、図４の２２番地に応じたノードＮに、２２番地の分岐命令におけるコールスタックを関連付ける。２２番地の分岐命令におけるコールスタックは、関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」と関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」と関数「ｉｎｔ  ｍａｉｎ（）」とを含む。これにより、判定部３１１は、追加部３１０により追加されたノードＮと同一の実行経路において、追加されたノードＮと、同一の関数の履歴を示し、かつ、同一の分岐命令を示すノードＮが何個あるかを特定することができる。
【００７６】
判定部３１１は、追加部３１０によって関数の履歴が追加された追加後のノード列を当該ノード列の末尾ノードから追加後のノード列の逆順に探索することにより、追加後のノード列の末尾ノードＮと同一内容の関数の履歴を示すノードＮが閾値以上連続して出現するか否かを判定する。ここで、追加後のノード列とは、各々のノードが示す分岐命令が実行された場合のコールスタックの内容を含むノードＮの集合であり、コールスタックが追加された最新のノードＮまでの実行経路である。追加後のノード列の末尾ノードＮとは、コールスタックが追加された最新のノードＮである。
【００７７】
判定部３１１は、具体的には、例えば、追加後のノード列の末尾ノードＮを始点にし、追加後のノード列の各々のノードＮが示す親のノードＮのアドレスを参照して、親のノードＮに戻る。判定部３１１は、親のノードＮに戻ると、さらに、その親のノードに戻る。このようにして、判定部３１１は、追加後のノード列をその逆順に探索していくことになる。次に、判定部３１１は、追加後のノード列を探索する過程において、追加後のノード列の末尾ノードＮを始点にして、同一の分岐命令を示し、かつ、同一のコールスタックの内容を示すノードＮが何個あるかを計数する。
【００７８】
そして、判定部３１１は、計数結果が閾値以上であるか否かを判定する。判定結果は、例えば、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶装置３００に記憶される。これにより、判定部３１１は、同一の実行経路上における実行回数が閾値以上である分岐命令を特定することができる。
【００７９】
出力部３１２は、判定部３１１によって出現すると判定された場合、追加後のノード列の末尾ノードＮが示す分岐命令が閾値以上連続して実行された旨を示す情報を出力する。出力部３１２は、具体的には、例えば、追加後のノード列の末尾ノードＮが示すコールスタックの内容から分岐命令を呼び出した関数と分岐命令の番地とを特定し、特定した関数と番地とを出力する。
【００８０】
出力形式としては、例えば、ディスプレイ２０８への表示、プリンタ２１３への印刷出力、Ｉ／Ｆ２０９による外部装置への送信がある。また、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶することとしてもよい。これにより、出力部３１２は、生成装置１００の利用者に、閾値以上連続して実行された分岐命令の対象プログラムＴＰにおける番地を通知することができる。
【００８１】
そのため、生成装置１００の利用者は、通知された番地を参照して、閾値以上連続して実行された分岐命令を特定することができる。そして、生成装置１００の利用者は、通知された番地の分岐命令をシンボル変数ではない通常の変数に関する分岐命令に変更したり、シンボル変数の取り得る値の範囲を狭めたりすることができる。ここで、生成装置１００の利用者は、番地が通知されているため、当該分岐命令を対象プログラムＴＰの中から特定する手間を省くことができる。これにより、生成装置１００の利用者は、対象プログラムＴＰのパス条件に不要なパス条件が入らないように対象プログラムＴＰに変更を加え、対象プログラムＴＰのパス条件の生成の効率化を図ることができる。
【００８２】
また、判定部３１１によって出現すると判定された場合、第２の格納部３０６は、追加後のノード列の末尾ノードＮが示す一連の分岐条件を記憶装置３００に格納してもよい。これにより、算出部３１４は、記憶装置３００を参照して、第２の格納部３０６により格納された対象プログラムＴＰのパス条件の各々を取得することができる。
【００８３】
また、判定部３１１によって出現すると判定された場合、特定部３０７は、追加後のノード列を追加後のノード列の末尾ノードＮから探索して未実行の分岐条件が最初に出現するノードＮを記憶装置３００の中から特定してもよい。この場合、特定部３０７は、具体的には、例えば、追加後のノード列の末尾ノードＮを始点にし、当該ノード列の各々のノードＮが示す親のノードＮのアドレスを参照することにより、追加後のノード列を探索していく。次に、特定部３０７は、追加後のノード列を探索する過程において、追加後のノード列内のノードＮが示す実行済み分岐条件を取得する。そして、特定部３０７は、取得された分岐条件が１つ以下である場合に、未実行の分岐条件が存在すると判定し、分岐条件を取得したノードＮを、未実行の分岐条件が存在するノードＮとして特定することになる。
【００８４】
これにより、実行部３０２は、特定部３０７により、特定されたノードＮが示す分岐命令から、対象プログラムＴＰの実行を再開することができ、分岐命令の実行回数が閾値以上になった実行経路以外の実行経路を実行することができる。そのため、実行部３０２は、分岐命令の実行回数が閾値以上になった実行経路の実行を停止し、対象プログラムＴＰのシンボリック実行にかかる処理量を低減することができる。
【００８５】
また、判定部３１１によって出現すると判定された場合、実行部３０２は、対象プログラムＴＰの実行を停止してもよい。これにより、実行部３０２は、分岐命令の実行回数が閾値以上になった対象プログラムＴＰの実行を停止し、対象プログラムＴＰのシンボリック実行にかかる処理量を低減することができる。
【００８６】
次に、テストデータの網羅性を算出する機能について説明する。テストデータの網羅性を算出する機能は、入力部３０１と、判断部３１３と、算出部３１４と、出力部３１２と、によって実現される。
【００８７】
入力部３０１は、対象プログラムＴＰの入力になるデータを受け付ける。対象プログラムＴＰの入力になるデータとは、プログラムの動作確認のために入力されるテストデータである。これにより、入力部３０１は、算出部３１４にテストデータの対象プログラムＴＰに対する網羅性を算出させることができる。
【００８８】
判断部３１３は、対象プログラムＴＰの入力になるデータが、第２の格納部３０６によって記憶装置３００に格納された一連の分岐条件に該当するか否かを判断する。判断結果は、例えば、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。これにより、判断部３１３は、テストデータがパス条件の集合のうち、いくつのパス条件を満たしているかを判断することができる。
【００８９】
算出部３１４は、記憶装置３００に記憶された一連の分岐条件の集合において、判断部３１３によって該当すると判断される一連の分岐条件が占める割合を算出する。算出部３１４は、パス条件の集合のうちで、テストデータがパス条件を満たしている割合を、テストデータの対象プログラムＴＰに対する網羅性として算出する。算出結果は、例えば、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。これにより、出力部３１２は、算出部３１４により算出されたテストデータの網羅性を出力することができる。
【００９０】
出力部３１２は、算出部３１４による算出結果を出力する。出力形式としては、例えば、ディスプレイ２０８への表示、プリンタ２１３への印刷出力、Ｉ／Ｆ２０９による外部装置への送信がある。また、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶することとしてもよい。これにより、出力部３１２は、生成装置１００の利用者に、テストデータの対象プログラムＴＰに対する網羅性を通知することができる。そして、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性から、テストデータを調整することができる。
【００９１】
生成装置１００の利用者は、例えば、テストデータの対象プログラムＴＰに対する網羅性が１００％に満たない場合、対象プログラムＴＰの実行経路の各々を１００％網羅して動作確認ができるように、テストデータを追加することができる。また、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性が１００％である場合、テストデータから不要なデータを削除し、対象プログラムＴＰの動作確認の効率化を図ってもよい。
【００９２】
（パス条件を生成する具体例）
次に、図５〜図１１を用いて、図４に示した対象プログラムＴＰを例に挙げて、パス条件を生成する具体例について説明する。
【００９３】
図５〜図１１は、パス条件を生成する具体例を示す説明図である。図５に示す生成装置１００は、対象プログラムＴＰの実行中において、シンボル変数に関する分岐命令を実行するごとに、当該分岐命令に対応するノードＮを生成する。ノードＮには、例えば、分岐命令に応じたプログラムカウンタ、分岐命令に到達した場合のコールスタック、分岐命令に到達した場合の変数の値、分岐命令までの実行経路上において実行された一連の分岐条件、分岐命令において実行された分岐条件、および実行カウンタが含まれる。実行カウンタは、同一の分岐命令が、同一の関数から連続して呼び出された回数を、分岐命令の実行回数として保持する。
【００９４】
実行カウンタには、ノードＮ２２とノードＮ２２の親になるノードＮ２１とが示すスタックとプログラムカウンタが一致する場合、ノードＮ２１が示す回数に１を加算した加算後の回数が採用される。また、実行カウンタには、ノードＮ２２とノードＮ２２の親になるノードＮ２１とが示すスタックまたはプログラムカウンタのいずれかが一致しない場合、１が採用される。
【００９５】
そして、生成装置１００は、実行カウンタが閾値以上になった場合、分岐命令の実行回数が閾値以上であると判断し、分岐命令の実行回数が閾値以上である旨を示す情報を出力する。これにより、生成装置１００は、生成装置１００の利用者に、閾値以上連続して実行された分岐命令の対象プログラムＴＰにおける番地を通知することができる。
【００９６】
図５において、（２１）まず、生成装置１００は、対象プログラムＴＰの１番地〜８番地が示す関数「ｉｎｔ  ｍａｉｎ（）」の実行を開始する。ここで、生成装置１００は、コールスタックに、実行された関数「ｉｎｔ  ｍａｉｎ（）」を格納する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【００９７】
そして、生成装置１００は、関数「ｉｎｔ  ｍａｉｎ（）」を１番地から実行し、５番地に到達する。生成装置１００は、５番地において、９番地〜１４番地が示す関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」を呼び出す。ここで、生成装置１００は、コールスタックに、呼び出した関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」を格納する。コールスタックへの格納方法は、「後入れ先出し」である。そのため、コールスタックは、先頭から順に、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【００９８】
（２２）次に、生成装置１００は、呼び出された関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」の９番地から実行を開始し、１１番地に到達する。生成装置１００は、１１番地において、２１番地〜２４番地が示す関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」を呼び出す。ここで、生成装置１００は、コールスタックに、呼び出した関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」を格納する。そのため、コールスタックは、先頭から順に、関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」、および関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【００９９】
（２３）そして、生成装置１００は、呼び出された関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」の２１番地から実行を開始し、２２番地に到達する。（２４）生成装置１００は、２２番地において、シンボル変数「ａ」に関する分岐命令「ｉｆ（ｘ＜０）」が真になる未実行の分岐条件「ｘ＜０」を実行すると、当該分岐命令に対応するノードＮ１１を生成する。
【０１００】
ノードＮ１１は、当該分岐命令の番地を示すプログラムカウンタ「２２」、当該分岐命令に到達した場合の変数の値「ｘ＝＊」、２２番地までに実行された一連の分岐条件「Ｔｒｕｅ」、および、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ１１は、当該分岐命令の実行回数を示す実行カウンタ「１」、および、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック（ｓｔａｃｋ）１を含む。
【０１０１】
スタック１は、当該分岐命令に到達した場合のコールスタックの内容である。スタック１は、例えば、関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」と、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」と、関数「ｉｎｔ  ｍａｉｎ（）」と、を含む。
【０１０２】
（２５）次に、生成装置１００は、対象プログラムＴＰを２３番地から再開し、２４番地に到達する。生成装置１００は、２４番地において、関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」を削除する。そのため、コールスタックは、先頭から順に、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１０３】
（２６）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」に戻ると、１１番地から実行を開始し、１４番地に到達する。生成装置１００は、１４番地において、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」を削除する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１０４】
（２７）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻ると、６番地から実行を開始する。生成装置１００は、６番地において、１５番地〜２０番地が示す関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を呼び出す。ここで、生成装置１００は、コールスタックに、呼び出した関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を格納する。そのため、コールスタックは、先頭から順に、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」、および関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１０５】
（２８）そして、生成装置１００は、呼び出された関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」の１５番地から実行を開始し、１７番地に到達する。（２９）生成装置１００は、１７番地において、シンボル変数「ｂ」に関する分岐命令「ｉｆ（ｂ＜１０）」が真になる未実行の分岐条件「ｂ＜１０」を実行すると、当該分岐命令に対応するノードＮ１２を生成する。
【０１０６】
ノードＮ１２は、当該分岐命令の番地を示すプログラムカウンタ「１７」、当該分岐命令に到達した場合の変数の値「ｂ＝＊，ｎ＝＊」、１７番地までに実行された一連の分岐条件「ａ＜０」、および、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ１２は、実行カウンタ「１」、および、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック２を含む。
【０１０７】
１７番地までに実行された一連の分岐条件「ａ＜０」は、ノードＮ１１が示す一連の分岐条件「Ｔｒｕｅ」と、実行された分岐条件が「真」であることと、を参照して生成される。スタック２は、当該分岐命令に到達した場合のコールスタックの内容である。スタック２は、例えば、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」と、関数「ｉｎｔ  ｍａｉｎ（）」と、を含む。次に、生成装置１００は、図６の（３０）に移行する。
【０１０８】
図６において、（３０）生成装置１００は、対象プログラムＴＰを１８番地から再開し、２０番地に到達する。生成装置１００は、２０番地において、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を削除する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１０９】
（３１）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻ると、７番地から実行を開始し、８番地に到達する。（３２）そして、生成装置１００は、対象プログラムＴＰの８番地において、対象プログラムＴＰの実行の終了を検出すると、対象プログラムＴＰの実行の終了に対応するノードＮ１３を生成する。
【０１１０】
ノードＮ１３は、対象プログラムＴＰが終了した番地を示すプログラムカウンタ「８」、当該分岐命令に到達した場合の変数の値「ａ＝＊，ｂ＝＊，ｎ＝１」、８番地までに実行された一連の分岐条件「（ａ＜０）＆＆（ｂ＜１０）」を含む。また、ノードＮ１３は、実行カウンタ「１」、および、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック３を含む。
【０１１１】
８番地までに実行された一連の分岐条件「（ａ＜０）＆＆（ｂ＜１０）」は、ノードＮ１２が示す一連の分岐条件「ａ＜０」と、実行された分岐条件が「真」であることと、を参照して生成される。スタック３は、対象プログラムＴＰが終了した場合のコールスタックの内容である。スタック３は、例えば、関数「ｉｎｔ  ｍａｉｎ（）」を含む。ここで、生成装置１００は、生成したノードＮ１３が示す一連の分岐条件「（ａ＜０）＆＆（ｂ＜１０）」をパス条件ＰＣ１１として保持しておく。次に、生成装置１００は、図７の（３３）に移行する。
【０１１２】
図７において、（３３）生成装置１００は、対象プログラムＴＰが終了すると、ノードＮ１３の親になるノードＮ１２が示す分岐命令の番地「１７」まで戻る。（３４）生成装置１００は、ノードＮ１２が示す分岐命令の番地「１７」に戻ると、他のパス条件の生成に用いない不要なノードＮ１３を削除する。
【０１１３】
（３５）次に、生成装置１００は、番地「１７」の分岐命令に、未実行の分岐条件があるか否かを判定する。（３６）ここで、生成装置１００は、ノードＮ１２に分岐命令が偽になる分岐条件を実行したことを示す「偽」が含まれていないため、未実行の分岐条件があると判断する。そのため、生成装置１００は、シンボル変数「ｂ」に関する分岐命令「ｉｆ（ｂ＜１０）」が偽になる未実行の分岐条件「ｂ≧１０」を実行して、対象プログラムＴＰを１８番地から再開する。ここで、生成装置１００は、分岐命令が偽になる分岐条件を実行したことを示す「偽」を、ノードＮ１２に追加する。
【０１１４】
次に、生成装置１００は、２０番地まで到達する。生成装置１００は、２０番地において、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を削除する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１１５】
（３７）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻ると、７番地から実行を開始し、８番地に到達する。（３８）そして、生成装置１００は、対象プログラムＴＰの８番地において、対象プログラムＴＰの実行の終了を検出すると、対象プログラムＴＰの実行の終了に対応するノードＮ１４を生成する。
【０１１６】
ノードＮ１４は、対象プログラムＴＰが終了した番地を示すプログラムカウンタ「８」、当該分岐命令に到達した場合の変数の値「ａ＝＊，ｂ＝＊，ｎ＝０」、８番地までに実行された一連の分岐条件「（ａ＜０）＆＆！（ｂ＜１０）」を含む。また、ノードＮ１４は、実行カウンタ「１」、および、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック３を含む。
【０１１７】
８番地までに実行された一連の分岐条件「（ａ＜０）＆＆（ｂ＜１０）」は、ノードＮ１２が示す一連の分岐条件「ａ＜０」と、実行された分岐条件が「偽」であることと、を参照して生成される。ここで、生成装置１００は、生成したノードＮ１４が示す一連の分岐条件「（ａ＜０）＆＆！（ｂ＜１０）」をパス条件ＰＣ１２として保持しておく。次に、生成装置１００は、図８の（３９）に移行する。
【０１１８】
図８において、（３９）生成装置１００は、対象プログラムＴＰが終了すると、ノードＮ１４の親になるノードＮ１２が示す分岐命令の番地「１７」まで戻る。（４０）生成装置１００は、ノードＮ１２が示す分岐命令の番地「１７」に戻ると、他のパス条件の生成に用いない不要なノードＮ１４を削除する。
【０１１９】
（４１）そして、生成装置１００は、番地「１７」の分岐命令に、未実行の分岐条件があるか否かを判定する。（４２）ここで、生成装置１００は、ノードＮ１２に「真」と「偽」が含まれているため、未実行の分岐条件がないと判断する。そのため、生成装置１００は、さらに、ノードＮ１２の親になるノードＮ１１が示す分岐命令の番地「２２」まで戻る。（４３）生成装置１００は、ノードＮ１１が示す分岐命令の番地「２２」に戻ると、他のパス条件の生成に用いない不要なノードＮ１２を削除する。次に、生成装置１００は、図９の（４４）に移行する。
【０１２０】
図９において、（４４）生成装置１００は、番地「２２」の分岐命令に、未実行の分岐条件があるか否かを判定する。（４５）ここで、生成装置１００は、ノードＮ１１に分岐命令が偽になる分岐条件を実行したことを示す「偽」が含まれていないため、未実行の分岐条件があると判断する。そのため、生成装置１００は、シンボル変数「ａ」に関する分岐命令「ｉｆ（ｘ＜０）」が偽になる未実行の分岐条件「ｘ≧０」を実行して、対象プログラムＴＰを２３番地から再開する。
【０１２１】
生成装置１００は、２４番地に到達する。生成装置１００は、２４番地において、関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ａｂｓ（ｉｎｔ  ｘ）」を削除する。そのため、コールスタックは、先頭から順に、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１２２】
（４６）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」に戻ると、１１番地から実行を開始し、１４番地に到達する。生成装置１００は、１４番地において、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ｆｕｎｃＡ（ｉｎｔ  ａ）」を削除する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１２３】
（４７）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻ると、６番地から実行を開始する。生成装置１００は、６番地において、１５番地〜２０番地が示す関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を呼び出す。ここで、生成装置１００は、コールスタックに、呼び出した関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を格納する。そのため、コールスタックは、先頭から順に、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」、および関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１２４】
（４８）そして、生成装置１００は、呼び出された関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」の１５番地から実行を開始し、１７番地に到達する。（４９）生成装置１００は、１７番地において、シンボル変数「ｂ」に関する分岐命令「ｉｆ（ｂ＜１０）」が真になる未実行の分岐条件「ｂ＜１０」を実行すると、当該分岐命令に対応するノードＮ１５を生成する。
【０１２５】
ノードＮ１５は、当該分岐命令の番地を示すプログラムカウンタ「１７」、当該分岐命令に到達した場合の変数の値「ｂ＝＊，ｎ＝０」、１７番地までに実行された一連の分岐条件「！（ａ＜０）」、および、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ１５は、実行カウンタ「１」、および、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック２を含む。
【０１２６】
１７番地までに実行された一連の分岐条件「！（ａ＜０）＆＆（ｂ＜１０）」は、ノードＮ１１が示す一連の分岐条件「Ｔｒｕｅ」と、実行された分岐条件が「偽」であることと、を参照して生成される。スタック２は、当該分岐命令に到達した場合のコールスタックの内容である。スタック２は、例えば、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」と、関数「ｉｎｔ  ｍａｉｎ（）」と、を含む。次に、生成装置１００は、図１０の（５０）に移行する。
【０１２７】
図１０において、（５０）生成装置１００は、対象プログラムＴＰを１８番地から再開し、２０番地に到達する。生成装置１００は、２０番地において、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を削除する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１２８】
（５１）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻ると、７番地から実行を開始し、８番地に到達する。（５２）そして、生成装置１００は、対象プログラムＴＰの８番地において、対象プログラムＴＰの実行の終了を検出すると、対象プログラムＴＰの実行の終了に対応するノードＮ１６を生成する。
【０１２９】
ノードＮ１６は、対象プログラムＴＰが終了した番地を示すプログラムカウンタ「８」、当該分岐命令に到達した場合の変数の値「ａ＝＊，ｂ＝＊，ｎ＝１」、８番地までに実行された一連の分岐条件「！（ａ＜０）＆＆（ｂ＜１０）」、および、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ１６は、実行カウンタ「１」、および、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック３を含む。
【０１３０】
８番地までに実行された一連の分岐条件「！（ａ＜０）＆＆（ｂ＜１０）」は、ノードＮ１５が示す一連の分岐条件「！（ａ＜０）」と、実行された分岐条件が「真」であることと、を参照して生成される。スタック３は、対象プログラムＴＰが終了した場合のコールスタックの内容である。スタック３は、例えば、関数「ｉｎｔ  ｍａｉｎ（）」を含む。ここで、生成装置１００は、生成したノードＮ１６が示す一連の分岐条件「！（ａ＜０）＆＆（ｂ＜１０）」をパス条件ＰＣ１３として保持しておく。次に、生成装置１００は、図１１の（５３）に移行する。
【０１３１】
図１１において、（５３）生成装置１００は、対象プログラムＴＰが終了すると、ノードＮ１６の親になるノードＮ１５が示す分岐命令の番地「１７」まで戻る。（５４）生成装置１００は、ノードＮ１５が示す分岐命令の番地「１７」に戻ると、他のパス条件の生成に用いない不要なノードＮ１６を削除する。
【０１３２】
（５５）次に、生成装置１００は、番地「１７」の分岐命令に、未実行の分岐条件があるか否かを判定する。（５６）ここで、生成装置１００は、ノードＮ１５に分岐命令が偽になる分岐条件を実行したことを示す「偽」が含まれていないため、未実行の分岐条件があると判断する。そのため、生成装置１００は、シンボル変数「ｂ」に関する分岐命令「ｉｆ（ｂ＜１０）」が偽になる未実行の分岐条件「ｂ≧１０」を実行して、対象プログラムＴＰを１８番地から再開する。ここで、生成装置１００は、分岐命令が偽になる分岐条件を実行したことを示す「偽」を、ノードＮ１５に追加する。
【０１３３】
次に、生成装置１００は、２０番地まで到達する。生成装置１００は、２０番地において、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了したことを検出する。そして、生成装置１００は、関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」が終了すると、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻る。ここで、生成装置１００は、コールスタックの先頭に格納された関数「ｉｎｔ  ｆｕｎｃＢ（ｉｎｔ  ｂ）」を削除する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１３４】
（５７）次に、生成装置１００は、呼び出し元の関数「ｉｎｔ  ｍａｉｎ（）」に戻ると、７番地から実行を開始し、８番地に到達する。（５８）そして、生成装置１００は、対象プログラムＴＰの８番地において、対象プログラムＴＰの実行の終了を検出すると、対象プログラムＴＰの実行の終了に対応するノードＮ１７を生成する。
【０１３５】
ノードＮ１７は、対象プログラムＴＰが終了した番地を示すプログラムカウンタ「８」、当該分岐命令に到達した場合の変数の値「ａ＝＊，ｂ＝＊，ｎ＝０」、８番地までに実行された一連の分岐条件「！（ａ＜０）＆＆！（ｂ＜１０）」、および、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ１７は、実行カウンタ「１」、および、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック３を含む。
【０１３６】
８番地までに実行された一連の分岐条件「！（ａ＜０）＆＆！（ｂ＜１０）」は、ノードＮ１５が示す一連の分岐条件「！（ａ＜０）」と、実行された分岐条件が「偽」であることと、を参照して生成される。ここで、生成装置１００は、生成したノードＮ１７が示す分岐条件「！（ａ＜０）＆＆！（ｂ＜１０）」をパス条件ＰＣ１４として保持しておく。
【０１３７】
これにより、生成装置１００は、記憶領域の使用量増加を抑制した上で、対象プログラムＴＰの各々の実行経路に対応するパス条件ＰＣ１１〜ＰＣ１４を生成することができる。例えば、２分木のノードＮのすべてを保持する場合の記憶領域の使用量に比べて、記憶領域の使用量をｎ／（２＾ｎ−１）に減少させることができる。ｎは２分木の分岐の数を示す。＾は累乗を示す。
【０１３８】
また、生成装置１００は、生成されたパス条件ＰＣ１１〜ＰＣ１４から、対象プログラムＴＰの動作確認のためのテストデータの対象プログラムＴＰに対する網羅性を算出し、算出結果を出力してもよい。網羅性とは、テストデータが、対象プログラムＴＰについて実行可能な実行経路をどの程度網羅しているかを示す割合である。
【０１３９】
これにより、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性が１００％に満たない場合、対象プログラムＴＰの実行経路の各々を１００％網羅して動作確認ができるように、テストデータを追加することができる。また、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性が１００％である場合、テストデータから不要なデータを削除し、対象プログラムＴＰの動作確認の効率化を図ってもよい。
【０１４０】
（実行回数が閾値以上になったことを検出する具体例）
次に、図１２を用いて、実行回数が閾値以上になったことを検出する具体例について説明する。
【０１４１】
図１２は、実行回数が閾値以上になったことを検出する具体例を示す説明図である。閾値は、例えば、予め、生成装置１００の利用者によって設定されている。図１２の例では、閾値は「８」とする。図１２において、（６１）まず、生成装置１００は、対象プログラムＴＰの１番地〜８番地が示す関数「ｉｎｔ  ｍａｉｎ（）」の実行を開始する。ここで、生成装置１００は、コールスタックに、実行された関数「ｉｎｔ  ｍａｉｎ（）」を格納する。そのため、コールスタックは、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１４２】
そして、生成装置１００は、関数「ｉｎｔ  ｍａｉｎ（）」を１番地から実行し、４番地に到達する。生成装置１００は、４番地において、６番地〜１３番地が示す関数「ｉｎｔ  ＣｏｕｎｔＢｉｔ（ｘ）」を呼び出す。ここで、生成装置１００は、コールスタックに、呼び出した関数「ｉｎｔ  ＣｏｕｎｔＢｉｔ（ｘ）」を格納する。そのため、コールスタックは、先頭から順に、関数「ｉｎｔ  ＣｏｕｎｔＢｉｔ（ｘ）」、関数「ｉｎｔ  ｍａｉｎ（）」が格納された状態になる。
【０１４３】
（６２）次に、生成装置１００は、呼び出された関数「ｉｎｔ  ＣｏｕｎｔＢｉｔ（ｘ）」の６番地から実行を開始し、８番地においてｆｏｒ文のループの条件が真であるため、ｆｏｒ文の中の命令を実行し、９番地に到達する。
【０１４４】
（６３）生成装置１００は、９番地において、シンボル変数「ｘ」に関する分岐命令「ｉｆ（（（ｘ＞＞１）＆１）！＝０）」が真になる分岐条件「（ｘ＞＞１）＆１）！＝０」を実行すると、当該分岐命令に対応するノードＮ２１を生成する。ノードＮ２１は、当該分岐命令の番地を示すプログラムカウンタ「９」、当該分岐命令に到達した場合の変数の値「ｘ＝＊」、９番地までに実行された一連の分岐条件「Ｔｒｕｅ」、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ２１は、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック１、当該分岐命令が呼び出された回数を示す実行カウンタ「１」を含む。スタック１は、呼び出された関数の履歴であり、関数「ｉｎｔ  ＣｏｕｎｔＢｉｔ（ｘ）」と、関数「ｉｎｔ  ｍａｉｎ（）」と、を含む。
【０１４５】
（６４）次に、生成装置１００は、対象プログラムＴＰを１０番地から再開し、１１番地に到達する。生成装置１００は、１１番地において、ｆｏｒ文が終了したため、８番地に戻る。（６５）次に、生成装置１００は、８番地においてｆｏｒ文のループの条件が真であるため、ｆｏｒ文の中の命令を実行し、９番地に到達する。（６６）生成装置１００は、９番地において、シンボル変数「ｘ」に関する分岐命令「ｉｆ（（（ｘ＞＞２）＆１）！＝０）」が真になる分岐条件「（（ｘ＞＞２）＆１）！＝０）」を実行すると、当該分岐命令に対応するノードＮ２２を生成する。
【０１４６】
ノードＮ２２は、当該分岐命令の番地を示すプログラムカウンタ「９」、当該分岐命令に到達した場合の変数の値「ｘ＝＊」、９番地までに実行された一連の分岐条件「（ｘ＞＞１）＆１）！＝０」、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ２２は、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック１、当該分岐命令が呼び出された回数を示す実行カウンタ「２」を含む。９番地までに実行された一連の分岐条件「（ｘ＞＞１）＆１）！＝０」は、ノードＮ２１が示す一連の分岐条件「Ｔｒｕｅ」と、実行された分岐条件が「真」であることと、を参照して生成される。
【０１４７】
実行カウンタには、ノードＮ２２とノードＮ２２の親になるノードＮ２１とが示すスタックとプログラムカウンタが一致する場合、ノードＮ２１が示す回数に１を加算した加算後の回数が採用される。また、実行カウンタには、ノードＮ２２とノードＮ２２の親になるノードＮ２１とが示すスタックまたはプログラムカウンタのいずれかが一致しない場合、１が採用される。そのため、ノードＮ２２が示す実行カウンタは、ノードＮ２１が示す実行カウンタに１を加算した加算後の回数「２」になっている。
【０１４８】
以降において、生成装置１００は、（６４）〜（６６）と同様にして、９番地の分岐命令を実行するごとに、ノードＮを生成する。ここで、生成装置１００は、７回目の分岐命令を実行し、ノードＮを生成したとする。
【０１４９】
（６７）生成装置１００は、対象プログラムＴＰを１０番地から再開し、１１番地に到達する。生成装置１００は、１１番地において、ｆｏｒ文が終了したため、８番地に戻る。（６８）次に、生成装置１００は、８番地においてｆｏｒ文のループの条件が真であるため、ｆｏｒ文の中の命令を実行し、９番地に到達する。（６９）生成装置１００は、９番地において、シンボル変数「ｘ」に関する分岐命令「ｉｆ（（（ｘ＞＞８）＆１）！＝０）」が真になる分岐条件「（（ｘ＞＞８）＆１）！＝０）」を実行すると、当該分岐命令に対応するノードＮ２８を生成する。
【０１５０】
ノードＮ２８は、当該分岐命令の番地を示すプログラムカウンタ「９」、当該分岐命令に到達した場合の変数の値「ｘ＝＊」、９番地までに実行された一連の分岐条件「（（ｘ＞＞１）＆１）！＝０）＆＆（（ｘ＞＞２）＆１）！＝０）＆＆・・・＆＆（（ｘ＞＞７）＆１）！＝０）」、当該分岐命令が真になる分岐条件を実行したことを示す「真」を含む。また、ノードＮ２８は、当該分岐命令に到達するまでに呼び出された関数の履歴を示すスタック１と、実行カウンタ「８」を含む。
【０１５１】
９番地までに実行された一連の分岐条件「（（ｘ＞＞１）＆１）！＝０）＆＆（（ｘ＞＞２）＆１）！＝０）＆＆・・・＆＆（（ｘ＞＞７）＆１）！＝０）」は、ノード２８の親になるノードＮ２７（不図示）が示す一連の分岐条件と、実行された分岐条件が真であることと、を参照して生成される。また、ノードＮ２８が示す実行カウンタは、ノードＮ２７（不図示）が示す実行カウンタに１を加算した加算後の回数「８」になっている。
【０１５２】
（７０）ここで、生成装置１００は、実行カウンタ「８」が閾値以上であるため、９番地の分岐命令の実行回数が閾値以上になったと判断する。そして、生成装置１００は、９番地の分岐命令の実行回数が閾値以上である旨を示す情報を出力する。
【０１５３】
これにより、生成装置１００は、生成装置１００の利用者に、閾値以上連続して実行された分岐命令の対象プログラムＴＰにおける番地を通知することができる。生成装置１００の利用者は、対象プログラムＴＰに、シンボル変数に関する分岐命令が連続して実行されている部分があると判断できる。例えば、分岐命令が連続して実行されている部分とは、ｆｏｒ文の中に分岐命令が含まれる場合である。
【０１５４】
そして、生成装置１００の利用者は、通知された番地の分岐命令をシンボル変数ではない通常の変数に関する分岐命令に変更したり、シンボル変数の取り得る値の範囲を狭めたりすることができる。ここで、生成装置１００の利用者は、番地が通知されているため、当該分岐命令を対象プログラムＴＰの中から特定する手間を省くことができる。これにより、生成装置１００の利用者は、対象プログラムＴＰのパス条件に不要なパス条件が入らないように対象プログラムＴＰに変更を加え、対象プログラムＴＰのパス条件の生成の効率化を図ることができる。
【０１５５】
また、生成装置１００は、９番地の分岐命令の実行回数が閾値以上である旨を示す情報を出力済みであることを示す警告済み判定フラグを保持していてもよい。そして、生成装置１００は、実行カウンタが「８」の場合に実行回数が閾値以上である旨を示す情報を出力した後、警告済み判定フラグを真に設定する。
【０１５６】
その後、生成装置１００は、９番地の分岐命令に関する実行カウンタが「９」の場合でも、警告済み判定フラグが真のため、実行回数が閾値以上である旨を示す情報を出力しない。また、生成装置１００は、別の実行経路において、９番地の分岐命令に関する実行カウンタが閾値以上の場合でも、警告済み判定フラグが真のため、実行回数が閾値以上である旨を示す情報を出力しない。
【０１５７】
そのため、生成装置１００は、同一の分岐命令について、実行回数が閾値以上である旨を示す情報を１回出力した後、２回目以降は出力しない。これにより、生成装置１００の利用者は、出力された数から、直感的に何ヶ所の分岐命令の実行回数が閾値以上であるかを把握することができる。
【０１５８】
（パス条件生成処理）
図１３および図１４は、パス条件生成処理の詳細な処理手順を示すフローチャートである。まず、生成装置１００は、対象プログラムＴＰと、分岐命令の実行回数の上限を規定する閾値と、の入力があったか否かを判定する（ステップＳ１３０１）。ここで、入力がない場合（ステップＳ１３０１：Ｎｏ）、生成装置１００は、ステップＳ１３０１に戻り、入力を待つ。
【０１５９】
一方、入力があった場合（ステップＳ１３０１：Ｙｅｓ）、生成装置１００は、入力された対象プログラムＴＰから１命令を読み出す（ステップＳ１３０２）。次に、生成装置１００は、読み出した命令がシンボル変数に関する命令か否かを判定する（ステップＳ１３０３）。ここで、シンボル変数に関する命令である場合（ステップＳ１３０３：Ｙｅｓ）、生成装置１００は、図１４のステップＳ１４０１に移行する。
【０１６０】
一方、シンボル変数に関する命令ではない場合（ステップＳ１３０３：Ｎｏ）、生成装置１００は、対象プログラムＴＰの次の命令を読み出し対象に設定する（ステップＳ１３０４）。次に、生成装置１００は、対象プログラムＴＰが終了したか否かを判定する（ステップＳ１３０５）。ここで、終了していない場合（ステップＳ１３０５：Ｎｏ）、生成装置１００は、ステップＳ１３０２に戻る。
【０１６１】
一方、対象プログラムＴＰが終了した場合（ステップＳ１３０５：Ｙｅｓ）、生成装置１００は、パス条件を記憶する（ステップＳ１３０６）。次に、生成装置１００は、親のノードＮが存在するか否かを判定する（ステップＳ１３０７）。ここで、親のノードＮが存在しない場合（ステップＳ１３０７：Ｎｏ）、生成装置１００は、パス条件生成処理を終了する。
【０１６２】
一方、親のノードＮが存在する場合（ステップＳ１３０７：Ｙｅｓ）、生成装置１００は、親のノードＮまで戻る（ステップＳ１３０８）。次に、生成装置１００は、偽のパスが実行済みか否かを判定する（ステップＳ１３０９）。ここで、偽の実行条件が実行済みである場合（ステップＳ１３０９：Ｙｅｓ）、生成装置１００は、ステップＳ１３０７に戻る。一方、偽の実行条件が実行済みではない場合（ステップＳ１３０９：Ｎｏ）、生成装置１００は、偽の実行条件を実行し、対象プログラムＴＰの実行を再開する（ステップＳ１３１０）。次に、生成装置１００は、ステップＳ１３０５に戻る。
【０１６３】
図１４において、生成装置１００は、親のノードＮのコールスタックと一致するか否かを判定する（ステップＳ１４０１）。一致しない場合（ステップＳ１４０１：Ｎｏ）、生成装置１００は、ステップＳ１４０３に移行する。一方、一致する場合（ステップＳ１４０１：Ｙｅｓ）、生成装置１００は、実行カウンタを「０」に設定する（ステップＳ１４０２）。次に、生成装置１００は、ステップＳ１４０３に移行する。
【０１６４】
そして、生成装置１００は、ノードＮにおける実行カウンタをインクリメントする（ステップＳ１４０３）。次に、生成装置１００は、実行カウンタが閾値以上であるか否かを判定する（ステップＳ１４０４）。ここで、実行カウンタが閾値以上ではない場合（ステップＳ１４０４：Ｎｏ）、生成装置１００は、ステップＳ１４０８に移行する。
【０１６５】
一方、実行カウンタが閾値以上である場合（ステップＳ１４０４：Ｙｅｓ）、生成装置１００は、警告済み判定フラグが偽か否かを判定する（ステップＳ１４０５）。ここで、警告済み判定フラグが偽ではない場合（ステップＳ１４０５：Ｎｏ）、生成装置１００は、ステップＳ１４０８に移行する。
【０１６６】
一方、警告済み判定フラグが偽である場合（ステップＳ１４０５：Ｙｅｓ）、生成装置１００は、ノードＮが示す分岐命令の実行回数が閾値以上である旨を示す警告を出力する（ステップＳ１４０６）。次に、生成装置１００は、警告済み判定フラグを真にする（ステップＳ１４０７）。
【０１６７】
そして、生成装置１００は、親のノードＮの実行カウンタを、各々の子のノードＮの実行カウンタに複製する（ステップＳ１４０８）。次に、生成装置１００は、子のノードＮに、コールスタックと、パス条件と、親のノードＮへのリンクを記憶する（ステップＳ１４０９）。
【０１６８】
そして、生成装置１００は、真の実行条件を実行し、対象プログラムＴＰの実行を再開する（ステップＳ１４１０）。次に、生成装置１００は、図１３のステップＳ１３０５に移行する。これにより、生成装置１００は、記憶領域の使用量増加を抑制しつつ、対象プログラムＴＰの各々の実行経路に対応するパス条件を生成することができる。
【０１６９】
以上説明したように、生成装置１００は、対象プログラムＴＰの実行経路上の分岐命令ごとに、分岐命令において実行された分岐条件と、分岐命令までに実行された一連の分岐条件と、を関連付けたノードＮを生成していく。次に、生成装置１００は、実行経路上の末尾ノードＮから、当該実行経路で対象プログラムＴＰを実行する場合に、対象プログラムＴＰの入力になるデータが満たすべきパス条件を生成する。そして、生成装置１００は、実行経路上の未実行の分岐条件が存在する分岐命令から対象プログラムＴＰの実行を再開し、他の実行経路についても同様にパス条件を生成する。また、生成装置１００は、パス条件の生成に伴って、未実行の分岐条件がなくなったノードＮがあれば、当該ノードＮを削除する。
【０１７０】
これにより、生成装置１００は、記憶領域の使用量増加を抑制した上で、対象プログラムＴＰの各々の実行経路に対応するパス条件を生成することができる。例えば、２分木のノードＮのすべてを保持する場合の記憶領域の使用量に比べて、記憶領域の使用量をｎ／（２＾ｎ−１）に減少させることができる。
【０１７１】
このように、生成装置１００は、記憶領域に保持されるノードＮの個数増加を抑制し、ワークエリアになる記憶領域の圧迫を抑制する。したがって、生成装置１００は、ワークエリアの圧迫によるプログラムの実行効率の低下を抑制することができる。これにより、生成装置１００は、例えば、テストデータの対象プログラムＴＰに対する網羅性の算出効率の低下を抑制することができる。また、生成装置１００は、記憶領域にノードＮが保持しきれずに、ワークエリアとして使用可能な領域がなくなることを防止することができ、パス条件の生成が中断することを防止することができる。したがって、利用者は、２分木のメモリ使用量を気にせずにシンボリック実行をおこなうことができる。
【０１７２】
また、生成装置１００は、分岐命令を実行した場合のコールスタックの内容を、ノードＮに関連付けておく。次に、生成装置１００は、生成したノードＮを始点にして、生成したノードＮと同一の実行経路上に、生成したノードＮと同一の分岐命令を示し、かつ、同一のコールスタックの内容を示すノードＮが閾値以上連続して出現するか否かを判断する。そして、生成装置１００は、閾値以上連続して出現する場合、生成したノードＮが示す分岐命令が閾値以上連続して実行された旨を示す情報と、当該分岐命令の番地と、を出力する。
【０１７３】
これにより、生成装置１００は、生成装置１００の利用者に、同一の実行経路上、かつ、同一のコールスタックの状態において、閾値以上連続して実行された分岐命令の対象プログラムＴＰにおける番地を通知することができる。生成装置１００の利用者は、対象プログラムＴＰに、シンボル変数に関する分岐命令が連続して実行されている部分があると判断できる。例えば、分岐命令が連続して実行されている部分とは、ｆｏｒ文の中に分岐命令が含まれる場合である。
【０１７４】
そして、生成装置１００の利用者は、通知された番地の分岐命令をシンボル変数ではない通常の変数に関する分岐命令に変更したり、シンボル変数の取り得る値の範囲を狭めたりすることができる。ここで、生成装置１００の利用者は、番地が通知されているため、当該分岐命令を対象プログラムＴＰの中から特定する手間を省くことができる。これにより、生成装置１００の利用者は、対象プログラムＴＰのパス条件に不要なパス条件が入らないように対象プログラムＴＰに変更を加え、対象プログラムＴＰのパス条件の生成の効率化を図ることができる。
【０１７５】
また、これにより、生成装置１００は、生成装置１００の利用者に、複数の実行経路における同一の分岐命令の実行回数の和が閾値以上になっても、分岐命令が閾値以上連続して実行されたと誤って通知することがない。また、生成装置１００は、対象プログラムＴＰの複数箇所から或る関数が呼び出され、当該関数内の分岐命令の実行回数が閾値以上になっても、分岐命令が閾値以上連続して実行されたと誤って通知することがない。
【０１７６】
また、生成装置１００は、生成されたパス条件の集合から、対象プログラムＴＰの動作確認のためのテストデータの対象プログラムＴＰに対する網羅性を算出し、算出結果を出力する。これにより、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性が１００％に満たない場合、対象プログラムＴＰの実行経路の各々を１００％網羅して動作確認ができるように、テストデータを追加することができる。また、生成装置１００の利用者は、テストデータの対象プログラムＴＰに対する網羅性が１００％である場合、テストデータから不要なデータを削除し、対象プログラムＴＰの動作確認の効率化を図ってもよい。
【０１７７】
なお、本実施の形態で説明した生成方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本生成プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本生成プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１７８】
また、本実施の形態で説明した生成装置１００は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡなどのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、例えば、上述した生成装置１００の機能（入力部３０１〜算出部３１４）をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、生成装置１００を製造することができる。
【０１７９】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１８０】
（付記１）プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、前記分岐命令と、実行された分岐条件と、前記プログラムの実行開始から前記分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードを生成する第１の生成部と、
前記第１の生成部によって生成されたノードを記憶装置に格納する第１の格納部と、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路上の末尾ノードが示す一連の分岐条件に基づいて、前記プログラムが終了するまでに実行された一連の分岐条件を生成する第２の生成部と、
前記第２の生成部によって生成された一連の分岐条件を前記記憶装置に格納する第２の格納部と、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードから前記実行経路の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定する特定部と、
前記特定部によって特定されたノードが示す分岐命令から前記プログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を前記特定されたノードが示す分岐命令に関連付けることにより、前記特定されたノードを前記記憶装置内において更新する更新部と、
未実行の分岐条件がなくなったノードを前記記憶装置から削除する削除部と、
を有することを特徴とする生成装置。
【０１８１】
（付記２）前記生成されたノードに、前記生成されたノードが示す分岐命令を呼び出した関数の履歴を追加する追加部と、
前記追加部によって関数の履歴が追加された追加後のノード列を当該追加後のノード列の末尾ノードから前記追加後のノード列の逆順に探索することにより、前記追加後のノード列の末尾ノードと同一の分岐命令を示し、かつ、同一内容の関数の履歴を示すノードが閾値以上連続して出現するか否かを判定する判定部と、
前記判定部によって出現すると判定された場合、前記追加後のノード列の末尾ノードが示す分岐命令が閾値以上連続して実行された旨を示す情報を出力する出力部と、
を有することを特徴とする付記１に記載の生成装置。
【０１８２】
（付記３）前記第２の格納部は、
前記判定部によって出現すると判定された場合、前記追加後のノード列の末尾ノードが示す一連の分岐条件を前記記憶装置に格納し、
前記特定部は、
前記判定部によって出現すると判定された場合、前記追加後のノード列を前記追加後のノード列の末尾ノードから前記追加後のノード列の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定することを特徴とする付記２に記載の生成装置。
【０１８３】
（付記４）前記判定部によって出現すると判定された場合、前記プログラムの実行を停止する停止部を有することを特徴とする付記２に記載の生成装置。
【０１８４】
（付記５）前記プログラムの入力になるデータが、前記第２の格納部によって前記記憶装置に格納された一連の分岐条件に該当するか否かを判断する判断部と、
前記記憶装置に記憶された一連の分岐条件の集合において、前記判断部によって該当すると判断される一連の分岐条件が占める割合を算出する算出部と、
を有することを特徴とする付記１乃至４のいずれか一つに記載の生成装置。
【０１８５】
（付記６）コンピュータに、
プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、前記分岐命令と、実行された分岐条件と、前記プログラムの実行開始から前記分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードを生成し、
生成されたノードを記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路上の末尾ノードが示す一連の分岐条件に基づいて、前記プログラムが終了するまでに実行された一連の分岐条件を生成し、
生成された一連の分岐条件を前記記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードから前記実行経路の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定し、
特定されたノードが示す分岐命令から前記プログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を前記特定されたノードが示す分岐命令に関連付けることにより、前記特定されたノードを前記記憶装置内において更新し、
未実行の分岐条件がなくなったノードを前記記憶装置から削除する、
処理を実行させることを特徴とする生成プログラム。
【０１８６】
（付記７）コンピュータが、
プログラムの実行中に到達した分岐命令において未実行の分岐条件が実行された場合、前記分岐命令と、実行された分岐条件と、前記プログラムの実行開始から前記分岐命令の分岐元の分岐命令までに実行された一連の分岐条件と、を関連付けたノードを生成し、
生成されたノードを記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路上の末尾ノードが示す一連の分岐条件に基づいて、前記プログラムが終了するまでに実行された一連の分岐条件を生成し、
生成された一連の分岐条件を前記記憶装置に格納し、
前記プログラムの実行が終了した場合、前記プログラムが終了するまでの実行経路を当該実行経路上の末尾ノードから前記実行経路の逆順に探索して未実行の分岐条件が最初に出現するノードを、前記記憶装置の中から特定し、
特定されたノードが示す分岐命令から前記プログラムが再開され、未実行の分岐条件が実行された場合、当該分岐条件を前記特定されたノードが示す分岐命令に関連付けることにより、前記特定されたノードを前記記憶装置内において更新し、
未実行の分岐条件がなくなったノードを前記記憶装置から削除する、
処理を実行することを特徴とする生成方法。
【符号の説明】
【０１８７】
１００  生成装置
ＴＰ  対象プログラム
Ｎ，Ｎ１〜Ｎ５，Ｎ１１〜Ｎ１７，Ｎ２１，Ｎ２２，Ｎ２８  ノード
３０１  入力部
３０２  実行部
３０３  第１の生成部
３０４  第１の格納部
３０５  第２の生成部
３０６  第２の格納部
３０７  特定部
３０８  更新部
３０９  削除部
３１０  追加部
３１１  判定部
３１２  出力部
３１３  判断部
３１４  算出部
【図１】
0005761056.tif 000002
【図２】
0005761056.tif 000003
【図３】
0005761056.tif 000004
【図４】
0005761056.tif 000005
【図５】
0005761056.tif 000006
【図６】
0005761056.tif 000007
【図７】
0005761056.tif 000008
【図８】
0005761056.tif 000009
【図９】
0005761056.tif 000010
【図１０】
0005761056.tif 000011
【図１１】
0005761056.tif 000012
【図１２】
0005761056.tif 000013
【図１３】
0005761056.tif 000014
【図１４】
0005761056.tif 000015