(57)【特許請求の範囲】
【請求項１】
モデル検査において任意のテスト項目に対してプログラムのテストベクタを生成できない場合にテストベクタを生成できない要因を解析するプログラム解析装置であって、
前記テストベクタを生成できないテスト項目を段階的に分解し、サブテスト項目を生成するサブテスト項目生成手段と、
前記サブテスト項目生成手段でサブテスト項目を生成する毎に、該サブテスト項目に対してモデル検査を行い、該サブテスト項目に対するテストベクタを生成するモデル検査手段と、
前記モデル検査手段でテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目に基づいてテストベクタを生成できない要因の箇所を特定する要因特定手段と、
を備えることを特徴とするプログラム解析装置。
【請求項２】
前記モデル検査手段は、サブテスト項目をアサーションとして論理表現に変換し、サブテスト項目に対応する箇所にフラグを挿入してプログラムを加工し、該加工済みのプログラムとサブテスト項目に対応するアサーションをモデル検査にかけることを特徴とする請求項１に記載のプログラム解析装置。
【請求項３】
データベースを備え、
前記モデル検査手段でテストベクタを生成できる場合に該テストベクタを生成できるサブテスト項目をデータベースに登録することを特徴とする請求項１又は請求項２に記載のプログラム解析装置。
【請求項４】
前記モデル検査手段でテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目を前記要因特定手段で特定した要因の箇所としてデータベースに登録することを特徴とする請求項３に記載のプログラム解析装置。
【請求項５】
モデル検査において任意のテスト項目に対してプログラムのテストベクタを生成できない場合にテストベクタを生成できない要因を解析するプログラム解析方法であって、
前記テストベクタを生成できないテスト項目を段階的に分解し、サブテスト項目を生成するサブテスト項目生成ステップと、
前記サブテスト項目生成ステップでサブテスト項目を生成する毎に、該サブテスト項目に対してモデル検査を行い、該サブテスト項目に対するテストベクタを生成するモデル検査ステップと、
前記モデル検査ステップでテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目に基づいてテストベクタを生成できない要因の箇所を特定する要因特定ステップと、
を含むことを特徴とするプログラム解析方法。
【請求項６】
モデル検査において任意のテスト項目に対してプログラムのテストベクタを生成できない場合にテストベクタを生成できない要因を解析するためのプログラム解析プログラムであって、
コンピュータに、
前記テストベクタを生成できないテスト項目を段階的に分解し、サブテスト項目を生成するサブテスト項目生成機能と、
前記サブテスト項目生成機能でサブテスト項目を生成する毎に、該サブテスト項目に対してモデル検査を行い、該サブテスト項目に対するテストベクタを生成するモデル検査機能と、
前記モデル検査機能でテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目に基づいてテストベクタを生成できない要因の箇所を特定する要因特定機能と、
を実現させることを特徴とするプログラム解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モデル検査において任意のテスト項目に対してプログラムのテストベクタを生成できない場合にテストベクタを生成できない要因を解析するプログラム解析装置、プログラム解析方法及びプログラム解析プログラムに関する。
【背景技術】
【０００２】
開発したプログラムを評価するために、所望の特性を満たすテストベクタを生成し、そのテストベクタをプログラムに入力して評価を行っている。このようなテストベクタは、モデル検査装置によって自動で生成される。特許文献１には、システムに付随する不利益や問題の低減に役立てるために、所望の特性を否定した仕様（テスト項目）をモデル検査にかけることにより、その反例としてテストベクタを自動で生成することが開示されている。テスト項目は、プログラム内に存在する分岐の切り替えの組み合わせである。テストベクタは、テスト項目における分岐の切り替えの組み合わせを満たすテスト入力である。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００９−８７３５４号公報
【特許文献２】特開２００３−５０７２２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
テスト項目をモデル検査にかけても、テストベクタを生成できない場合がある。このようにテストベクタが見つからないのは、テスト項目における分岐の切り替えの組み合わせの中に分岐の切り替え側に入れないものがあり（例えば、ある分岐Ａの切り替えとある分岐Ｂの切り替えとが論理的に衝突している）、プログラム内の分岐の設定において論理的な矛盾（論理的な不整合）がある。そのようなプログラム内の矛盾要因箇所を特定しておく必要があるが、特定するためには人手でプログラムを解析する必要がある。しかし、この解析作業はプログラムが大きくなるほど困難な作業となり、大規模プログラムに対しては人手で解析を行うのは実質的に不可能である。
【０００５】
そこで、本発明は、任意のテスト項目に対してテストベクタを生成できない場合にその要因箇所を自動的に特定するプログラム解析装置、プログラム解析方法及びプログラム解析プログラムを提供することを課題とする。
【課題を解決するための手段】
【０００６】
本発明に係るプログラム解析装置は、モデル検査において任意のテスト項目に対してプログラムのテストベクタを生成できない場合にテストベクタを生成できない要因を解析するプログラム解析装置であって、テストベクタを生成できないテスト項目を段階的に分解し、サブテスト項目を生成するサブテスト項目生成手段と、サブテスト項目生成手段でサブテスト項目を生成する毎に、該サブテスト項目に対してモデル検査を行い、該サブテスト項目に対するテストベクタを生成するモデル検査手段と、モデル検査手段でテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目に基づいてテストベクタを生成できない要因の箇所を特定する要因特定手段とを備えることを特徴とする。
【０００７】
テスト項目は、プログラム（分岐を１つ以上含むプログラム）内に存在する分岐の切り替えの組み合わせである。テストベクタは、テスト項目における分岐の切り替えの組み合わせを満たすテスト入力である。任意のテスト項目でテストベクタを生成できない場合、そのテスト項目における分岐の切り替えの組み合わせの中に分岐の切り替え側に入れないものが含まれている。そこで、プログラム解析装置では、テストベクタを生成できないテスト項目が入力されると、サブテスト項目生成手段によりそのテスト項目を段階的に分解してサブテスト項目を順次生成する。サブテスト項目は、テスト項目の分岐の切り替えの組み合わせを分解して一部を取り出し、テスト項目よりも条件を緩和したテスト項目である。プログラム解析装置では、サブテスト項目が生成される毎に、モデル検査手段によりそのサブテスト項目に対してモデル検査を行う。このモデル検査でサブテスト項目に対するテストベクタを生成できる場合、そのサブテスト項目の分岐の切り替えの組み合わせについては論理的な矛盾（論理的な不整合）がない。一方、テストベクタを生成できない場合、そのサブテスト項目の分岐の切り替えの組み合わせについては論理的な矛盾を含んでいる。そこで、プログラム解析装置では、モデル検査手段でテストベクタを生成できない場合、要因特定手段によりそのテストベクタを生成できないサブテスト項目に基づいてテストベクタを生成できない要因の箇所を特定する。このように、プログラム解析装置は、任意のテスト項目に対してテストベクタを生成できない場合に、その任意のテスト項目よりも条件を緩和したサブテスト項目に対してモデル検査を繰り返し行い、テストベクタを生成できないサブテスト項目を探索することにより、プログラム内の論理的な矛盾要因箇所を自動的に特定することができる。人手では解析不可能な大規模プログラムに対しても自動で解析でき、大規模プログラム内の論理的な矛盾要因箇所を特定できる。この特定できた矛盾要因箇所により、プログラムの潜在的な不備や不具合を未然に防止するのに役立てることができる。
【０００８】
本発明の上記プログラム解析装置では、モデル検査手段は、サブテスト項目をアサーションとして論理表現に変換し、サブテスト項目に対応する箇所にフラグを挿入してプログラムを加工し、該加工済みのプログラムとサブテスト項目に対応するアサーションをモデル検査にかける。
【０００９】
このプログラム解析装置のモデル検査手段では、サブテスト項目における各分岐の切り替えをアサーションとして論理表現に変換するとともにサブテスト項目における各分岐の切り替え側の箇所にフラグを挿入してプログラムを加工し、その加工済みのプログラムとサブテスト項目に対応するアサーションをモデル検査にかける。これによって、プログラム解析装置は、サブテスト項目に対するモデル検査を自動かつ効率的にできる。
【００１０】
本発明の上記プログラム解析装置では、データベースを備え、モデル検査手段でテストベクタを生成できる場合に該テストベクタを生成できるサブテスト項目をデータベースに登録する。
【００１１】
このプログラム解析装置では、データベースを備えており、モデル検査手段でサブテスト項目に対するテストベクタを生成できる場合にはデータベースにそのテストベクタを生成できるサブテスト項目を登録する。このように、プログラム解析装置は、データベースにテストベクタを生成できるサブテスト項目を登録しておくことにより、テスト項目からサブテスト項目を生成する際にデータベースを参照して、データベースに登録されているサブテスト項目を除外してサブテスト項目を生成することにより、サブテスト項目を効率良く生成できる。
【００１２】
本発明の上記プログラム解析装置では、モデル検査手段でテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目を要因特定手段で特定した要因の箇所としてデータベースに登録する。
【００１３】
このプログラム解析装置では、データベースを備えており、モデル検査手段でサブテスト項目に対するテストベクタを生成できない場合にはデータベースにそのテストベクタを生成できないサブテスト項目をテストベクタを生成できない要因の箇所として登録する。このように、プログラム解析装置は、データベースにテストベクタを生成できないサブテスト項目（すなわち、矛盾要因箇所）を登録しておくことにより、データベースにプログラム内の論理的な矛盾要因箇所が自動的に蓄積され、その矛盾要因箇所を含むテスト項目に対する不要な解析を防止できる。
【００１４】
本発明に係るプログラム解析方法は、モデル検査において任意のテスト項目に対してプログラムのテストベクタを生成できない場合にテストベクタを生成できない要因を解析するプログラム解析方法であって、テストベクタを生成できないテスト項目を段階的に分解し、サブテスト項目を生成するサブテスト項目生成ステップと、サブテスト項目生成ステップでサブテスト項目を生成する毎に、該サブテスト項目に対してモデル検査を行い、該サブテスト項目に対するテストベクタを生成するモデル検査ステップと、モデル検査ステップでテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目に基づいてテストベクタを生成できない要因の箇所を特定する要因特定ステップとを含むことを特徴とする。このプログラム解析方法によれば、各ステップの処理を行うことにより、上記プログラム解析装置の作用及び効果を奏する。
【００１５】
本発明に係るプログラム解析プログラムは、モデル検査において任意のテスト項目に対してプログラムのテストベクタを生成できない場合にテストベクタを生成できない要因を解析するためのプログラム解析プログラムであって、コンピュータに、テストベクタを生成できないテスト項目を段階的に分解し、サブテスト項目を生成するサブテスト項目生成機能と、サブテスト項目生成機能でサブテスト項目を生成する毎に、該サブテスト項目に対してモデル検査を行い、該サブテスト項目に対するテストベクタを生成するモデル検査機能と、モデル検査機能でテストベクタを生成できない場合に該テストベクタを生成できないサブテスト項目に基づいてテストベクタを生成できない要因の箇所を特定する要因特定機能とを実現させることを特徴とする。このプログラム解析プログラムによれば、このプログラムをコンピュータに実行させることによって、上記プログラム解析装置の作用及び効果を奏する。
【発明の効果】
【００１６】
本発明によれば、任意のテスト項目に対してテストベクタを生成できない場合に、その任意のテスト項目よりも条件を緩和したサブテスト項目に対してモデル検査を繰り返し行い、テストベクタを生成できないサブテスト項目を探索することにより、プログラム内の論理的な矛盾要因箇所を自動的に特定することができる。
【図面の簡単な説明】
【００１７】
【図１】本実施の形態に係る要因解析装置の構成図である。
【図２】分岐を含むプログラムの一例であり、（ａ）が加工無しのプログラムであり、（ｂ）がモデル検査にかける加工済みのプログラムである。
【図３】図１の要因解析装置における処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１８】
以下、図面を参照して、本発明に係るプログラム解析装置及びプログラム解析方法並びにプログラム解析プログラムの実施の形態を説明する。なお、各図において同一又は相当する要素については同一の符号を付し、重複する説明を省略する。
【００１９】
本実施の形態では、本発明を、プログラムの要因解析装置に適用する。本実施の形態に係る要因解析装置は、モデル検査においてテスト項目に対してプログラムのテストベクタを生成できない場合に、プログラム内におけるテストベクタを生成できない要因を解析する装置である。
【００２０】
なお、プログラムは、コンピュータを動作させるためのプログラムであり、１つ以上の分岐を含むプログラムである。テスト項目は、プログラム内に存在する分岐の切り替えの組み合わせで表される。テストベクタは、テスト項目における分岐の切り替えの組み合わせを満たすテスト入力（テストデータ）であり、モデル検査によって探し出される。
【００２１】
図１及び図２を参照して、本実施の形態に係る要因解析装置１について説明する。図１は、本実施の形態に係る要因解析装置の構成図である。図２は、分岐を含むプログラムの一例であり、（ａ）が加工無しのプログラムであり、（ｂ）がモデル検査にかける加工済みのプログラムである。
【００２２】
要因解析装置１は、プログラムＰとそのプログラムＰのテストベクタを生成できなかったテスト項目ＴＩ（すなわち、論理的な矛盾要因を含むテスト項目）が入力されると、そのテスト項目ＴＩの条件を段階的に緩和しながらサブテスト項目ＳＴＩを順次生成し、サブテスト項目ＳＴＩが生成される毎にモデル検査を行い、テストベクタを生成できないサブテスト項目を探し出し、プログラムの論理的な矛盾要因箇所Ｃを特定する。
【００２３】
そのために、要因解析装置１は、テスト項目データベース２、テスト項目制御部３、プログラム制御部４、モデル検査部５、結果判定部６、要因制御部７、テスト項目データベース制御部８から構成される。要因解析装置１は、要因解析だけを行う専用装置でもよいし、あるいは、汎用コンピュータで要因解析用のアプリケーションを実行することによって構成されてもよい。
【００２４】
なお、本実施の形態では、テスト項目データベース２が特許請求の範囲に記載するデータベースに相当し、テスト項目制御部３が特許請求の範囲に記載するサブテスト項目生成手段に相当し、モデル検査部５（モデル検査の手法によりテスト項目制御部３、プログラム制御部４を含む場合がある）が特許請求の範囲に記載するモデル検査手段に相当し、結果判定部６及び要因制御部７が特許請求の範囲に記載する要因特定手段に相当する。
【００２５】
テスト項目データベース２は、要因解析装置１の記憶装置に構築され、テスト項目の情報、サブテスト項目の情報、矛盾要因箇所の情報が登録されるデータベースである。
【００２６】
登録されるテスト項目の情報は、要因解析装置１に入力されたテストベクタを生成できなかったテスト項目の情報である。テスト項目は、プログラム内に含まれる分岐の切り替えの組み合わせである。分岐は、例えば、図２に示すようなｉｆとｅｌｓｅを用いたものがあり、この例の場合、ｉｆの条件式を満たす「Ｔｒｕｅ（真）」への切り替えと条件式を満たさない「Ｆａｌｓｅ（偽）」への切り替えの２つの切り替えパターンがある。例えば、プログラム中に４つの分岐が少なくとも存在する場合、１番目の分岐が「Ｔｒｕｅ」と２番目の分岐が「Ｔｒｕｅ」と３番目の分岐が「Ｆａｌｓｅ」と４番目の分岐が「Ｔｒｕｅ」とからなる（Ｔ１，Ｔ２，Ｆ３，Ｔ４）とする組み合わせがテスト項目である。
【００２７】
登録されるサブテスト項目の情報は、要因解析装置１におけるモデル検査においてテストベクタを生成できたサブテスト項目の情報である。サブテスト項目は、テスト項目の分岐の切り替えの組み合わせを分解した一部であり（テスト項目の真部分集合であり）、テスト項目よりも組み合わされる分岐の条件を緩和したテスト項目である。したがって、サブテスト項目に含まれる分岐の個数は、１個以上かつ（元のテスト項目に含まれる分岐の個数−１）個以下である。例えば、上記の例で示した元のテスト項目ＴＩが（Ｔ１，Ｔ２，Ｆ３，Ｔ４）の場合、サブテスト項目としては、１番目の分岐の「Ｔｒｕｅ」と２番目の分岐の「Ｔｒｕｅ」と３番目の分岐の「Ｆａｌｓｅ」からなる（Ｔ１，Ｔ２，Ｆ３）、１番目の分岐の「Ｔｒｕｅ」と２番目の分岐の「Ｔｒｕｅ」からなる（Ｔ１，Ｔ２）、１番目の分岐の「Ｔｒｕｅ」だけからなる（Ｔ１）等がある。
【００２８】
登録される矛盾要因箇所の情報は、要因解析装置１におけるモデル検査においてテストベクタを生成できなかったサブテスト項目の情報（すなわち、このサブテスト項目に含まれる分岐の切り替え側の箇所が矛盾要因箇所であり、その分岐の切り替え側の箇所を通過できない）である。
【００２９】
テスト項目制御部３では、入力されたテスト項目ＴＩを段階的に分解（洗練）し、サブテスト項目ＳＴＩを生成する。この際、テスト項目制御部３では、テスト項目データベース２に登録されているサブテスト項目を探索するためにテスト項目データベース制御部８に指令を出し、テスト項目データベース２のサブテスト項目の情報を参照する。サブテスト項目ＳＴＩを生成する毎に、テスト項目制御部３では、そのサブテスト項目ＳＴＩに含まれる各分岐の切り替えに対応するアサーションとして論理表現に変換する。
【００３０】
サブテスト項目を段階的に分解する場合、サブテスト項目に含まれる分岐の切り替えの組み合わせが元のテスト項目の真部分集合になっていれば、どのような順に分解してもよい。例えば、サブテスト項目に含まれる分岐の個数については、１個から順に増やしていってもよいし、（元のテスト項目に含まれる分岐の数−１）個から順に少なくしていってもよいし、あるいは、分岐の個数についてはランダムに（又は所定の条件に従って）変更していってもよい。
【００３１】
プログラム制御部４では、テスト項目制御部３でサブテスト項目ＳＴＩを生成する毎に、入力されたプログラムＰを加工し、サブテスト項目ＳＴＩに含まれる各分岐の切り替えで通過する箇所にフラグを挿入する。
【００３２】
モデル検査部５では、テスト項目制御部３でサブテスト項目ＳＴＩを生成する毎に、サブテスト項目ＳＴＩに対するテストベクタ（反例）を自動生成するために、サブテスト項目ＳＴＩに対してモデル検査を行う。ここでは、プログラム制御部４で加工したプログラムとテスト項目制御部３で論理表現したサブテスト項目ＳＴＩに対応するアサーションをモデル検査にかける。そして、モデル検査部５では、そのサブテスト項目ＳＴＩに対するテストベクタの有無を判断する。
【００３３】
図２（ａ）には、ｉｆとｅｌｓｅによる分岐を含むプログラムの一部を示しており、ｉｆの条件式「（ｇｖａｒ１＋ｇｒａｒ２）＞１０」が「Ｔｒｕｅ」の場合には「ｔｅｍｐ＝１」を実行し、条件式「（ｇｖａｒ１＋ｇｒａｒ２）＞１０」が「Ｆａｌｓｅ」の場合には「ｔｅｍｐ＝２」を実行する。この分岐の切り替えがサブテスト項目に含まれており、切り替え側が「Ｆａｌｓｅ」だったとする。この場合、図２（ｂ）に示すように、プログラム制御部４によってｅｌｓｅ｛｝の中に「ｆｌａｇ＝１」が挿入されるとともに、テスト項目制御部３によってアサーションの論理表現として「ａｓｓｅｒｔ（！（ｆｌａｇ＝＝１））」（ｆｌａｇ＝１になるパスを探せというアサーション）が設定され、モデル検査部５でｆｌａｇを１にする入力データを探索する。その入力データ（テストベクタの一部）としては、例えば、「ｇｖａｒ１＝２，ｇｖａｒ２＝４」である。
【００３４】
なお、本実施の形態では、モデル検査として、サブテスト項目をアサーションとして論理表現に変換するとともにサブテスト項目に対向する通過する箇所にフラグを挿入してプログラムを加工してモデル検査を行う手法の一例を示したが、モデル検査についてはどのような手法で行ってもよい。
【００３５】
結果判定部６では、モデル検査部５でモデル検査を行う毎に、モデル検査部５での出力結果（テストベクタの有無）に基づいて、そのサブテスト項目ＳＴＩに対してテストベクタを生成できたか否かを判定する。テストベクタを生成できたと判定した場合、結果判定部６では、テストベクタを生成できたサブテスト項目ＳＴＩの情報をテスト項目データベース２に登録するようにテスト項目データベース制御部８に指令を出す。
【００３６】
要因制御部７では、結果判定部６で判定を行う毎に、結果判定部６でテストベクタを生成できなかったと判定している場合、そのテストベクタを生成できなかったサブテスト項目に含まれる分岐の切り替え箇所を論理的な矛盾要因箇所Ｃの情報としてテスト項目データベース２に登録するようにテスト項目データベース制御部８に指令を出すとともに、その矛盾要因箇所Ｃの情報を出力する。
【００３７】
テスト項目データベース制御部８では、結果判定部６からの指令を受けて、テストベクタを生成できたサブテスト項目ＳＴＩの情報をテスト項目データベース２に登録する。また、テスト項目データベース制御部８では、要因制御部７からの指令を受けて、矛盾要因箇所Ｃの情報をテスト項目データベース２に登録する。また、テスト項目データベース制御部８では、テスト項目制御部３からの指令を受けて、テスト項目データベース２に登録されているサブテスト項目の情報を探索する。
【００３８】
次に、要因解析装置１の処理の流れについて図３のフローチャートに沿って説明する。図３は、図１の要因解析装置における処理の流れを示すフローチャートである。ここでは、サブテスト項目に含まれる分岐の個数として、１個から順に増やしていく場合である。なお、各処理についての説明において、テストベクタを生成できなかったテスト項目ＴＩとして上記の例で示した（Ｔ１，Ｔ２，Ｆ３，Ｔ４）の場合のサブテスト項目の例を適宜挿入する。
【００３９】
要因解析装置１には、テストベクタを生成できなかった解析対象のテスト項目ＴＩとプログラムＰが入力される。まず、要因解析装置１では、テスト項目データベース２に登録されている矛盾要因箇所の情報（テストベクタを生成できなかったサブテスト項目の情報）を参照し、解析対象のテスト項目ＴＩが既知の矛盾要因を含んでいるか否かを判定する（Ｓ１）。Ｓ１にてテスト項目ＴＩが既知の矛盾要因を含んでいると判定した場合、矛盾要因箇所を探索する必要がないので、要因解析装置１では、その矛盾要因を特定し、処理を終了する。
【００４０】
Ｓ１にてテスト項目ＴＩが既知の矛盾要因を含んでいないと判定した場合、要因解析装置１では、テスト項目ＴＩから初期サブテスト項目ＳＴＩ０を設定する（Ｓ２）。初期サブテスト項目ＳＴＩ０は、テスト項目ＴＩの真部分集合（ＳＴＩ０⊂ＴＩ）であれば、任意のものを選んでよい。ここでは、処理の効率化を図るために、テスト項目データベース２に登録されているテストベクタを生成できたサブテスト項目（矛盾要因の無いサブテスト項目）を除外した中で上記の条件を満たすものを選んでもよい。例えば、テスト項目ＴＩの（Ｔ１，Ｔ２，Ｆ３，Ｔ４）の中から、１番目の分岐の「Ｔｒｕｅ」だけからなる（Ｔ１）を初期サブテスト項目（ＳＴＩ０⊂ＴＩ）とする。
【００４１】
サブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）を生成する毎に、要因解析装置１では、サブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）に対してアサーションへの変換を行うとともにサブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）に対応してフラグを挿入してプログラムを加工する（Ｓ３）。そして、要因解析装置１では、サブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）のモデル検査を行い、サブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）に対するテストベクタ（反例）が見つかったか否かを判定する（Ｓ３）。
【００４２】
Ｓ３にてサブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）に対してテストベクタが見つかったと判定した場合、要因解析装置１では、テストベクタを生成できたサブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）をテスト項目データベース２に登録する（Ｓ４）。さらに、要因解析装置１では、新たなサブテスト項目ＳＴＩｉ＋１を追加する。追加するサブテスト項目ＳＴＩｉ＋１は、現在のサブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）をさらに詳細化するために追加されるが、ＳＴＩ０∪・・・∪ＳＴＩｉ∪ＳＴＩｉ＋１⊂ＴＩ）を満たすものを任意選んでよい。例えば、サブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）が１番目の分岐の「Ｔｒｕｅ」と２番目の分岐の「Ｔｒｕｅ」からなる（Ｔ１，Ｔ２）の場合、３番目の分岐の「Ｆａｌｓｅ」を追加し、（Ｔ１，Ｔ２，Ｆ３）を追加後のサブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ∪ＳＴＩｉ＋１⊂ＴＩ）とする。そして、要因解析装置１では、このサブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ∪ＳＴＩｉ＋１⊂ＴＩ）に対してモデル検査を行う（Ｓ３）。
【００４３】
Ｓ３にてサブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ∪ＳＴＩｉ＋１⊂ＴＩ）に対してテストベクタが見つからなかったと判定した場合、要因解析装置１では、最後に追加したサブテスト項目ＳＴＩｉ＋１のみに対してアサーションへの変換を行うとともにサブテスト項目ＳＴＩｉ＋１に対応してフラグを挿入してプログラムを加工する（Ｓ６）。そして、要因解析装置１では、サブテスト項目ＳＴＩｉ＋１のモデル検査を行い、サブテスト項目ＳＴＩｉ＋１に対するテストベクタが見つかったか否かを判定する（Ｓ６）。
【００４４】
Ｓ６にて最後に追加したサブテスト項目ＳＴＩｉ＋１に対してテストベクタが見つかったと判定した場合、要因解析装置１では、最後に追加したサブテスト項目ＳＴＩｉ＋１とそれ以外の登録済みのサブテスト項目｛ＳＴＩ０，・・・，ＳＴＩｉ｝との組み合わせによって表現されるサブテスト項目を生成する。例えば、サブテスト項目（ＳＴＩ０∪・・・∪ＳＴＩｉ⊂ＴＩ）が１番目の分岐の「Ｔｒｕｅ」と２番目の分岐の「Ｔｒｕｅ」からなる（Ｔ１，Ｔ２）であり、最後に追加したサブテスト項目ＳＴＩｉ＋１が３番目の分岐の「Ｆａｌｓｅ」の（Ｆ３）だった場合、２番目の分岐の「Ｔｒｕｅ」と３番目の分岐の「Ｆａｌｓｅ」とを組み合わせた（Ｔ２，Ｆ３）となるサブテスト項目を生成する。ここでも、処理の効率化を図るために、テスト項目データベース２に登録されているテストベクタを生成できたサブテスト項目を除外した中でサブテスト項目を生成するとよい。
【００４５】
そして、要因解析装置１では、その組み合わせサブテスト項目に対してアサーションへの変換を行うとともに組み合わせサブテスト項目に対応してフラグを挿入してプログラムを加工する（Ｓ８）。そして、要因解析装置１では、その組み合わせサブテスト項目のモデル検査を行い、その組み合わせサブテスト項目に対するテストベクタが見つかったか否かを判定する（Ｓ８）。
【００４６】
Ｓ８には組み合わせサブテスト項目に対してテストベクタが見つかったと判定した場合、要因解析装置１では、その組み合わせサブテスト項目をテスト項目データベース２に登録する（Ｓ９）。さらに、要因解析装置１では、最後に追加したサブテスト項目ＳＴＩｉ＋１と既に組み合わせた以外のサブテスト項目｛ＳＴＩ０，・・・，ＳＴＩｉ｝との組み合わせによって表現されるサブテスト項目を生成する。ここでは、テスト項目データベース２に登録した組み合わせ済みのサブテスト項目を除外して組み合わせを行う。そして、要因解析装置１では、その組み合わせサブテスト項目に対してモデル検査を行う（Ｓ８）。
【００４７】
Ｓ６にて最後に追加したサブテスト項目ＳＴＩｉ＋１に対してテストベクタが見つらなかったと判定した場合又はＳ８には組み合わせサブテスト項目に対してテストベクタが見つからなかったと判定した場合、要因解析装置１では、そのサブテスト項目に含まれる分岐の切り替え箇所を論理的な矛盾要因箇所Ｃの情報としてテスト項目データベース２に登録するとともに、矛盾要因箇所Ｃの情報を出力する（Ｓ１０）。そして、要因解析装置１では、処理を終了する。
【００４８】
プログラムの開発者は、テスト項目データベース２に登録されている矛盾要因箇所Ｃの情報を参照し、プログラム内のその論理的な矛盾箇所を把握し、修正する必要がある場合にはプログラムを修正する。
【００４９】
この要因解析装置１によれば、テストベクタを生成できなかったテスト項目が入力されると、そのテスト項目よりも条件を段階的に分解したサブテスト項目に対してモデル検査を繰り返し行い、テストベクタを生成できないサブテスト項目を探索することにより、プログラム内の論理的な矛盾要因箇所を自動的に特定することができる。これによって、人手では解析不可能な大規模プログラムに対しても自動で解析でき、大規模プログラム内の論理的な矛盾要因箇所を特定できる。この特定できた矛盾要因箇所により、プログラムの潜在的な不備や不具合を未然に防止するのに役立てることができる。
【００５０】
また、要因解析装置１によれば、サブテスト項目に対してアサーションへの変換を行うとともにサブテスト項目に対応してフラグを挿入してプログラムを加工してモデル検査を行うことにより、サブテスト項目に対するモデル検査を自動かつ効率的にできる。
【００５１】
また、要因解析装置１によれば、テスト項目データベース２を構築し、テストベクタを生成できるサブテスト項目の情報を登録しておくことにより、登録されているサブテスト項目を除外して新たなサブテスト項目を生成でき、解析効率が向上する。また、要因解析装置１によれば、テスト項目データベース２を構築し、矛盾要因箇所の情報（テストベクタを生成できないサブテスト項目の情報）を登録しておくことにより、その矛盾要因箇所を含むテスト項目に対する不要な解析を防止でき、解析効率が向上する。
【００５２】
以上、本発明に係る実施の形態について説明したが、本発明は上記実施の形態に限定されることなく様々な形態で実施される。
【００５３】
例えば、本実施の形態ではプログラムの矛盾要因箇所を特定する要因解析装置に適用したが、ＣＤ−ＲＯＭ等の記憶媒体に格納されたプログラムやインタネット等のネットワークを介して利用可能なプログラム等に適用し、このようなプログラムをコンピュータ上で実行することによってプログラムの矛盾要因箇所を特定する構成としてもよい。
【００５４】
また、本実施の形態では要因解析装置にデータベースを備える構成としたが、データベースが無くても構成可能である。また、上記したようにモデル検査についてどのような手法を適用してもよい。
【符号の説明】
【００５５】
１…要因解析装置、２…テスト項目データベース、３…テスト項目制御部、４…プログラム制御部、５…モデル検査部、６…結果判定部、７…要因制御部、８…テスト項目データベース制御部。
【図１】
0005505316.tif 000002
【図２】
0005505316.tif 000003
【図３】
0005505316.tif 000004