(57)【要約】【課題】プログラムの動的検証においてテストカバレッジを効率的に拡大する。【解決手段】本発明の一態様としてのプログラム検証装置は、検証対象となるプログラムを実行し、複数の変数を監視する変数監視手段と、各前記変数の制約および前記変数間の制約を定めた制約条件を保持する制約条件保持手段と、前記状態監視手段により監視される前記複数の変数のうち１つ以上の対象変数の値の組からなる対象変数状態を取得する状態取得手段と、前記制約条件を満たすように前記状態取得手段によりまだ取得されていない対象変数状態を生成する状態生成手段と、生成された対象変数状態を前記検証対象となるプログラムに対して設定する状態設定手段と、を備える。【選択図】図１
2009157456.tif 000002
【特許請求の範囲】
【請求項１】
検証対象となるプログラムを実行し、複数の変数を監視する変数監視手段と、
各前記変数の制約および前記変数間の制約を定めた制約条件を保持する制約条件保持手段と、
前記状態監視手段により監視される前記複数の変数のうち１つ以上の対象変数の値の組からなる対象変数状態を取得する状態取得手段と、
前記制約条件を満たすように前記状態取得手段によりまだ取得されていない対象変数状態を生成する状態生成手段と、
生成された対象変数状態を前記検証対象となるプログラムに対して設定する状態設定手段と、
を備えたプログラム検証装置。
【請求項２】
前記制約条件は、前記変数の制約として、前記対象変数の範囲を含み、
前記状態取得手段は、前記対象変数の最小値および最大値を検出し、
前記状態生成手段は、前記対象変数の範囲から、検出された最小値および検出された最大値間の範囲を除いた残りの範囲において、前記対象変数の値からなる前記対象変数状態を生成することを特徴とする請求項１に記載のプログラム検証装置。
【請求項３】
前記制約条件は、前記変数間の制約として、２つ以上の対象変数を含む演算式の範囲を含み、
前記状態取得手段は、前記演算式を計算し、前記演算式の最小値および最大値を検出し、
前記状態生成手段は、前記演算式の範囲から、検出された最小値および検出された最大値間の範囲を除いた残りの範囲において前記２つ以上の対象変数の値の組からなる対象変数状態を生成する、
ことを特徴とする請求項１に記載のプログラム検証装置。
【請求項４】
前記制約条件は、前記変数の制約または前記変数間の制約として、１つ以上の対象変数を含む条件式を含み、
前記状態取得手段は、前記条件式の真偽を判定し、
前記状態生成手段は、前記条件式の真がまだ成立しておらずかつ前記条件式が偽のとき前記真に対応する前記条件式の範囲、前記条件式の偽がまだ成立しておらずかつ前記条件式が真のとき前記偽に対応する前記条件式の範囲において、前記１つ以上の対象変数の値からなる対象変数状態を生成する
ことを特徴とする請求項１に記載のプログラム検証装置。
【請求項５】
前記制約条件は、前記変数の制約または前記変数間の制約として、１つ以上の対象変数を含む条件式を含み、
前記状態取得手段は、前記条件式の成否を計算し、
前記状態生成手段は、前記条件式が成立していないとき前記条件式を満足する前記１つ以上の対象変数の値からなる前記対象変数状態を生成する
ことを特徴とする請求項１に記載のプログラム検証装置。
【請求項６】
前記状態監視手段により監視される前記複数の変数の値の関係に基づき、前記変数間に成立する第１の条件を生成する条件生成手段をさらに備え、
前記状態生成手段は、前記制約条件に加えて、前記第１の条件を満たすように、前記対象変数状態を生成する
ことを特徴とする請求項１に記載のプログラム検証装置。
【請求項７】
前記制約条件検生成手段は、前記状態監視手段により監視される前記複数の変数の値の関係に基づき前記変数間に成立する複数の第２の条件を生成し、前記複数の第２の条件において高い頻度で現れる複数の変数を検出し、検出した変数の値の関係に基づき前記第１の条件を生成することを特徴とする請求項６に記載のプログラム検証装置。
【請求項８】
検証対象となるプログラムを実行し、複数の変数を監視する変数監視ステップと、
各前記変数の制約および前記変数間の制約を定めた制約条件を保持する制約条件保持ステップと、
前記状態監視ステップにより監視される前記複数の変数のうち１つ以上の対象変数の値の組からなる対象変数状態を取得する状態取得ステップと、
前記状態取得ステップによりまだ取得されていない対象変数状態を前記制約条件を満たすように生成する状態生成ステップと、
生成された対象変数状態を前記検証対象となるプログラムに対して設定する状態設定ステップと、
を備えたプログラム検証方法。
【請求項９】
検証対象となるプログラムを実行し、複数の変数を監視する変数監視ステップと、
各前記変数の制約および前記変数間の制約を定めた制約条件を保持する制約条件保持ステップと、
前記状態監視ステップにより監視される前記複数の変数のうち１つ以上の対象変数の値の組からなる対象変数状態を取得する状態取得ステップと、
前記制約条件を満たすように前記状態取得ステップによりまだ取得されていない対象変数状態を生成する状態生成ステップと、
生成された対象変数状態を前記検証対象となるプログラムに対して設定する状態設定ステップと、
をコンピュータに実行させるための検証プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの動的検証を行うプログラム検証装置、プログラム検証方法、および検証プログラムに関する。
【背景技術】
【０００２】
ソフトウエア（プログラム）の動的検証を、ソフトウエアの上位モジュールであるドライバと、ソフトウェエアの下位モジュールであるスタブ（プログラム）とを用いて行う場合がある。この場合、ドライバからテストケースとしてコマンド群を発行し、発行したコマンド群をソフトウエアへの入力として用いてソフトウエアを動作させる。
【０００３】
ソフトウエアを検証した範囲をテストカバレッジといい、テストカバレッジが広範囲にわたるほどソフトウエアの信頼性を保障することができる。
【０００４】
テストカバレッジには、ソフトウエア内のステイトメントをどれだけ網羅したかを示すコードカバレッジ、ソフトウエア内の判定条件における真・偽の組合せをどれだけ網羅したかを示す条件カバレッジ、ソフトウエア内の実行経路をどれだけ網羅したかを示すパスカバレッジが知られている。また、ソフトウエアの変数値の組み合わせをソフトウエア状態とし、ソフトウエア状態をどれだけ網羅したかを示す状態カバレッジなるものもある。状態カバレッジは、他のテストカバレッジより細かい分類をする。例えば、パスカバレッジの場合、取りうる経路の数が分類数であるのに対し、状態カバレッジは各経路に複数の変数の組み合わせが存在する。そのため、分類数が多く、状態カバレッジの拡大は他のテストカバレッジの拡大に繋がりやすい。以降、テストカバレッジと表記する際は、状態カバレッジを意味するものとする。テストカバレッジを拡大させるには、検証対象のソフトウエアを隅々まで動作確認をする必要があり、様々な種類のテストケースを数多く、実行する必要がある。
【特許文献１】特開2000-20349号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかし、従来方法では、冗長なテストが起こりやすい問題がある。テストの回数を重ねるほど、ソフトウエアが検証済み領域内での動作に留まりやすくなり、テストカバレッジを拡大することが困難となる。テストカバレッジを拡大するためには、ソフトウエアの未検証領域に到達するテストケースを効率よく作成することが必要となる。しかし、一般的に、意図した領域に到達するテストケースを生成することは難しく、冗長なテストはどうしても繰り返されてしまう。
【０００６】
特許文献１（特開2000-20349号公報）では、対象ソフトウエアの実行中にソフトウエアの内部状態、およびスタブの状態を記憶し、これら状態情報を用いて、記憶した時点の動作を再現することで、冗長なテストを削減することを可能としている。しかし、テストカバレッジを拡大するためには、未検証のソフトウエア領域に到達するテストケースを用いる必要がある。しかし、そのようなテストケースを生成する方法に関し特許文献１では何ら言及されていない。
【０００７】
本発明は、プログラムの動的検証においてテストカバレッジを効率的に拡大できるようにしたプログラム検証装置、プログラム検証方法、および検証プログラムを提供する。
【課題を解決するための手段】
【０００８】
本発明の一態様としてのプログラム検証装置は、
検証対象となるプログラムを実行し、複数の変数を監視する変数監視手段と、
各前記変数の制約および前記変数間の制約を定めた制約条件を保持する制約条件保持手段と、
前記状態監視手段により監視される前記複数の変数のうち１つ以上の対象変数の値の組からなる対象変数状態を取得する状態取得手段と、
前記制約条件を満たすように前記状態取得手段によりまだ取得されていない対象変数状態を生成する状態生成手段と、
生成された対象変数状態を前記検証対象となるプログラムに対して設定する状態設定手段と、
を備える。
【０００９】
本発明の一態様としてのプログラム検証方法は、
検証対象となるプログラムを実行し、複数の変数を監視する変数監視ステップと、
各前記変数の制約および前記変数間の制約を定めた制約条件を保持する制約条件保持ステップと、
前記状態監視ステップにより監視される前記複数の変数のうち１つ以上の対象変数の値の組からなる対象変数状態を取得する状態取得ステップと、
前記制約条件を満たすように前記状態取得ステップによりまだ取得されていない対象変数状態を生成する状態生成ステップと、
生成された対象変数状態を前記検証対象となるプログラムに対して設定する状態設定ステップと、
を備える。
【００１０】
本発明の一態様としての検証プログラムは、
検証対象となるプログラムを実行し、複数の変数を監視する変数監視ステップと、
各前記変数の制約および前記変数間の制約を定めた制約条件を保持する制約条件保持ステップと、
前記状態監視ステップにより監視される前記複数の変数のうち１つ以上の対象変数の値の組からなる対象変数状態を取得する状態取得ステップと、
前記制約条件を満たすように前記状態取得ステップによりまだ取得されていない対象変数状態を生成する状態生成ステップと、
生成された対象変数状態を前記検証対象となるプログラムに対して設定する状態設定ステップと、
をコンピュータに実行させる。
【発明の効果】
【００１１】
本発明により、プログラムの動的検証においてテストカバレッジを効率的に拡大できる。
【発明を実施するための最良の形態】
【００１２】
図１は、本発明の一実施形態としてのソフトウエア検証システム（プログラム検証装置）の構成を概略的に示すブロック図である。
【００１３】
対象ソフトウエア１は、動的検証の対象となるソフトウエア（プログラム）である。対象ソフトウエア１は、あるソフトウエアに含まれる複数のモジュールのうちの部分モジュールであってもよいし、またあるシステムに搭載された複数のモジュールのうちの一モジュールであってもよい。動的検証とは、実際に対象ソフトウエア１を動作させ、正しく振る舞うかどうかを調べる検証のことである。一般的に、対象ソフトウエア１を動作させるために、ドライバおよびスタブと呼ばれるモジュールが必要となり、本実施形態でもドライバ２およびスタブ４を用いる。ただし、本発明はドライバおよびスタブを用いないソフトウエアの検証に用いることも有効である。
【００１４】
ドライバ２は、対象ソフトウエア１を動作させるための上位モジュールである。ドライバ２は、ドライバ指令３を発行することにより対象ソフトウエア１を動作させる。ドライバ指令３は、対象ソフトウエア１により実行可能なコマンド列、または対象ソフトウエア１内のサブルーチンを直接呼び出すコマンドである。
【００１５】
スタブ４は、対象ソフトウエア１により動作させられる下位モジュール（プログラム）である。スタブ４は、対象ソフトウエア１により呼び出され、呼び出しに応じて処理を行う。対象ソフトウエア１がシステム内部のソフトウエアである場合、スタブ４はハードウエアまたはメカを模倣するシミュレータでもよい。
【００１６】
ロガー１０は、ドライバ２が対象ソフトウエア１へドライバ指令３を出す前後に、対象ソフトウエア１およびスタブ４のすべての変数のログ情報を採取する。ロガー１０は、複数の変数を監視する変数監視手段を含んでいる。ログ情報には、カバレッジ情報１１とトレース情報１２とがあり、いずれも、対象ソフトウエア１の動作中に到達したＳＷ（ソフトウエア）状態およびスタブ状態に関する情報を含む。ＳＷ状態およびスタブ状態はプログラム状態と称されることもある。
【００１７】
ここでＳＷ状態は、対象ソフトウエア１におけるすべての変数の値の組（対象ソフトウエア１が参照する変数の値の組）である。スタブ状態は、スタブにおける全ての変数の値の組（スタブ４が参照する変数の値の組）である。なお、対象ソフトウエア１の変数およびスタブ４の変数は、ローカル変数およびグローバル変数のいずれであってもよい。またここでは対象ソフトウエア１における全ての変数の値の組をＳＷ状態、スタブ４における全ての変数の値の組をスタブ状態と定義したが、対象ソフトウエア１においてあらかじめ指定した変数の値の組をＳＷ状態、スタブ４においてあらかじめ指定した変数の値の組をスタブ状態と定義してもよい。この場合、ロガー１０は対象ソフトウエア１およびスタブ４において各々あらかじめ指定した変数のログ情報のみを採取してもよい。
【００１８】
カバレッジ情報１１は後述する未到達条件生成器１３で用いられ、トレース情報１２は後述する不変条件検出部（条件生成手段）１５で用いられる。カバレッジ情報１１およびトレース情報１２はそれぞれ使用目的に応じた内容を含み、互いに同一の情報であっても、互いに異なる情報であっても良い。
【００１９】
ここで、ロガー１０がログ情報（カバレッジ情報１１、トレース情報１２）を取得するためには、ロガー１０が、対象ソフトウエア１およびスタブ４の変数にアクセスできるようにする必要がある。このためには、例えば、ロガー１０をドライバ２内のルーチンとして記述し、対象ソフトウエア１およびスタブ４の変数を、ローカル変数からグローバル変数に定義し直すことにより実現できる。もしくは、対象ソフトウエア１およびスタブ４を動作させるコンピュータシステム内のメモリにロガー１０が直接にアクセスすることにより各変数値を取得することもできる。後者の場合は、ロガー１０は、各変数が割り当てられたメモリアドレスを保持したマッピング情報を参照することで、各変数に直接アクセスできる。
【００２０】
設計仕様１４は、対象ソフトウエア１およびスタブ４の仕様ならびに詳細設計に関する情報である。設計仕様１４には、少なくとも変数毎の制約情報、変数間の制約情報等に関する情報が含まれている。変数の制約情報としては、たとえば変数値の下限・上限に関する情報があり得る。この場合、下限・上限の値が設計仕様１４に直接記述されていてもよいし、あるいは、各変数の型が記述されていればその型から下限・上限を決定可能である。変数間の制約情報としては、たとえば複数の変数を含む関数式の下限・上限値の情報があり得る。
【００２１】
制約条件取得部１７は、変数毎または変数間の制約条件をユーザ入力する制約条件入力部を備えており、ユーザは制約条件入力部から制約条件を入力し、制約条件取得部１７は、ユーザから入力された制約条件を記憶する。制約条件取得部１７はユーザから入力された制約条件を保持する制約条件保持手段を備える。制約条件取得部１７は、記憶した制約条件をその使用先（未到達条件生成器１３、未到達状態生成器８）に送出する。各生成器８、１３で使用する制約条件の内容はそれぞれ異なり、その詳細は、後述する。
【００２２】
ユーザは、たとえば設計仕様１４に記述された制約情報を参照して制約条件を決定し、決定した制約条件を入力できる。たとえば設計仕様１４において、対象ソフトウエア１が最大エントリー数20のテーブルを保持しかつ参照するエントリーIDをentry_idに格納するようになっている場合、0≦entry_id<20という関係式を決定し、この関係式を制約条件として入力できる。対象ソフトウエア１の変数とスタブ４の変数との間で、制約が存在するケースもあり、この場合も、関係式を決定し、入力することもできる。
【００２３】
ここでは、制約条件取得部１７はユーザ入力に基づいて制約条件を取得すると説明したが、コンピュータ読み取り可能な設計仕様を用意しておき、制約条件取得部１７が、この設計仕様を読み取ることにより、各変数の制約条件または変数間の制約条件を取得するようにしてもよい。
【００２４】
未到達条件生成器１３は、制約条件取得部１７から対象変数（カバレッジ情報１１に含まれるすべての変数のうち、現時点において検証したい変数）に関する制約条件９を受け取る。対象変数の数は単数または複数である。未到達条件生成器１３は、各対象変数の制約条件９と、対象変数間の制約条件９とを受け取る。未到達条件生成器１３は、受け取った制約条件９と、カバレッジ情報１１とに基づき、対象ソフトウエア１が到達していない、対象変数の条件（未到達のＳＷ変数条件）、およびスタブ４が達していない、対象変数の条件（未到達のスタブ変数条件）を、未到達条件７として生成する。未到達条件生成部８は、生成した未到達条件７を未到達状態生成器８に出力する。
【００２５】
ここで未到達のＳＷ変数条件は、対象ソフトウエア１における対象変数の値の組からなる対象変数状態の全領域のうちいまだ到達していない領域に相当し、未到達のスタブ変数条件は、スタブ４における対象変数の値の組からなる対象変数状態の全領域のうちいまだ到達していない領域に相当する。
【００２６】
未到達条件生成器１３はロガー１０から受け取るカバレッジ情報１１に基づき、対象ソフトウエア１およびスタブ４における対象変数状態を逐次取得する状態取得手段を含む。
【００２７】
なお、未到達条件生成器１３は、対象変数について未到達の領域が無くなったら（検証が終了したら）、別の対象変数を選択し、再度、制約条件９の取得要求および未到達条件７の生成を行ってもよい。
【００２８】
以下、未到達条件７の生成例をいくつか説明する。
【００２９】
第１の例として、下限・上限値が設定された変数（対象変数）の最小値、最大値を含む制約条件９を利用して、未到達条件７を生成する例が挙げられる。動的検証中、カバレッジ情報１１に示される対象変数の値の移り変わりをチェックし、最小値・最大値のみを記憶し、下限・上限値に達していない対象変数を探す。そして、下限・上限値の少なくともいずれかに達していない対象変数について、未到達条件７を生成する。具体的には、下限・上限値間の範囲から、最小値・最大値間の範囲を除いた部分を、未到達条件７として生成する。たとえば対象変数xの最小値・最大値がそれぞれ3と5であり（3≦x≦15）、また、下限値・上限値がそれぞれ0と20であった場合、未到達条件７は0≦x≦2∨16≦x≦20となる。ただしｘは整数であるとする。「∨」は「OR」を表す。
【００３０】
第２の例として、制約条件９として、下限・上限値が設定された、１つ以上の対象変数を含む関数式を用いて未到達条件７を生成する例が挙げられる。カバレッジ情報１１に基づき、上記関数式の値を計算し、関数値の最小値・最大値のみを記憶する。そして、関数の下限・上限値の少なくとも一方に達していない関数式について、未到達条件７を生成する。具体的には、関数の下限・上限値間の範囲において、最小値・最大値間の範囲を除いた部分を、未到達条件７として生成する。たとえば関数式2x+yについて、最小値および最大値がそれぞれ６、１５であり（6≦2x+y≦15）、関数の下限値および上限値がそれぞれ0、100であった場合、未到達条件７は0≦2x+y≦5∨16≦2x+y≦100となる。
【００３１】
第３の例として、制約条件９として対象変数を含む条件式を用いて、未到達条件７を生成する方法が挙げられる。カバレッジ情報１１に基づき、条件式が成立したか否かを判定する。条件式としては、設計仕様１４から、真・偽の両方を取りうる条件式を選択することが望ましい。対象ソフトウエア１内に記述された判定文の条件を条件式として用いてもよく、その場合は、静的解析技術を用いて制約条件取得部１７等のコンピュータにより自動で条件式を抽出することも可能である。未到達条件生成器１３は、真・偽の片方しか満たさない条件式を探し、満たされていない方に対応する条件を未到達条件７として取得する。たとえば、条件式x+y<20が成立済みの場合、20≦x+yを未到達条件７として取得する。x,yは対象変数である。
【００３２】
ここで、上記第３の例における条件式の選定は、設計仕様１４から得られる対象変数間の制約情報を基に行ってもよい。たとえば対象変数x,y,zに関して、x+y+z≦10の制約情報が、設計仕様１４に記述されているとする。対象変数x,y,zは非負であるとする。この場合に、3つの対象変数x,y,zの取りうる値の範囲を3次元で表したものを図２に示す。(0,0,0)、(10,0,0)、(0,10,0)、(0,0,10)が当該範囲の形状の頂点となり、 x+y≦10 ∧ z=0、 x+z≦10 ∧ y=0、 y+z≦10 ∧ x=0、 x+y+z=10がこの形状の境界面となる。そして、各頂点、および各境界面に到達したか否かを判定する条件式を、制約条件９として用いる。たとえば頂点(0,0,10)に到達したか否かを判定する条件式はx=0∧y=0∧z=10であり、境界面x+y+z=10へ到達したか否かを判定する条件式はx+y+z=10である。そして、条件式を満たしていなければ、この条件式を未到達条件７として取得する。このように、n個の対象変数間の制約情報から、これらの対象変数の取りうる範囲をn次元空間内で定め、境界となるポイント（頂点または境界面）への到達の有無を判定する条件式を制約条件として選択し、いまだ成立していない条件式を未到達条件７として取得することができる。
【００３３】
不変条件検出部（条件生成手段）１５は、ロガー１０により生成されたトレース情報１２を参照し、ソフトウエア１の変数間、スタブ４の変数間および両者の変数間に成立する条件を不変条件（第１の条件）１６として検出する。不変条件１６は、トレース情報１２において常に成立する変数間の条件式であり、後述する未到達状態生成器８において尤もらしいＳＷ状態５およびスタブ状態６を生成するために用いられる。尤もらしいとは、トレース情報１２で常に成立している条件を満たしていることを意味する。不変条件検出部１５は、検出した条件式のうち、対象変数のみを含む条件式を除いて（対象変数と、対象変数と異なる他の変数との両方を含む条件式は除かない）、未到達状態生成器８に送る。不変条件１６の検出にはマサチューセッツ工科大学のM. Ernstの研究グループが開発したDaikon(http://groups.csail.mit.edu/pag/daikon/)を用いることができる。
【００３４】
Daikonは、ソフトウエア動作中の変数値の推移を調べ、機械学習により変数間で成立する条件・制約を発掘するツールである。得られる制約・条件は、変数間に成立する不変情報であり、たとえばx=y+3、または配列aは昇順に並ぶ、といった情報である。Daikonが必要とする実行時間は、トレース情報１２のサイズに依存し、特にログを取る変数の個数に強く依存する。対象ソフトウエア１とスタブ４に関する全ての変数のログを採取するのは現実的でないケースが殆どであるため、トレース情報１２としてログを採取する変数の個数を制限することが好ましい。たとえばログを採取する変数の総数をあらかじめ決めておくことができる。このように個数を制限する場合、ログを採取する変数を適切に決めることで、効率的に不変条件１６を抽出することができる。
【００３５】
トレース情報１２としてログを採取する変数の決定方法の一例を紹介する。まず全変数のログを取得する短時間の動的検証を行うことによりログ情報を取得し、得られたログ情報からDaikonより、不変条件（第２の条件）を取得する。短時間であるため、全ての変数のログを採取してもログ情報（トレース情報１２）のサイズは小さく、Daikonを短時間で実行可能である。ただし、取得した不変条件（第２の条件）は、短時間の動的検証により得られたものであるため、偶然成立した条件・制約である可能性も高く、信頼性は低い。こうして得られた不変条件を解析することにより、高い頻度で出現する変数を検出し、検出した変数のみをログ採取すべき変数として決定し、決定した変数のみを用いて不変条件（第１の条件）を生成する。このようにログを採取する変数を決定することにより、単に任意に変数を選択するよりも、効率的に不変条件１６を抽出することが可能となる。
【００３６】
ログを採取する変数の他の決定方法として、不変条件を解析し、高頻度で出現する不変条件（関係式）を探し、見つけた関係式に含まれる多項式をログの採取対象とすることもできる。たとえば多項式x+y+zが多発する場合、変数x,y,zのログを取る代わりに、多項式x+y+zのログを採取することで、ログを採取する変数を２つ削減することができる。
【００３７】
未到達状態生成器（状態生成手段、状態設定手段）８は、制約条件９と未到達条件７と不変条件１６とを満たすように、全変数の値を含む、ＳＷ状態５およびスタブ状態６を計算し、計算したＳＷ状態５およびスタブ状態６を対象ソフトウエア１およびスタブ４に対して設定する。ただし、対象変数以外の他の変数については未到達条件７に含まれないため、制約条件９と不変条件１６とを満たすように任意の値を設定すればよい。ここで、未到達状態生成器８が用いる制約条件９には、対象変数と異なる他の変数を有する各式（条件）を含む。これは、未到達状態生成器８は、対象変数以外の変数にも値を割り当てる必要があるためである。各式（条件）には、対象変数が含まれて良いが、この場合、対象変数以外の他の変数も同時に含まれるものとし、対象変数のみからなる式は含まれないものとする。対象変数のみからなる式（条件）は未到達条件７の生成のみに用いるためである。
【００３８】
このように、全変数に対応する離散値の有限集合から値を選択し、全ての制約を満たすように全変数に対して値を割り当てる問題を制約充足問題という。制約充足問題の解法としてバックトラック法が有名である。バックトラック法では、まず変数を選び、値を割り当てる。割り当てた際に、割り当てが済んでいる変数のみに関連する制約を全て充足するか調べる。充足している場合は、割り当てがされていない変数を選び、全ての変数に値が割り当てられるまで、割り当てを続ける。制約を充足しない場合は、割り当てる値を変更する。制約を満たす割り当て値が存在しない場合、充足できない制約に関係する既に割り当てた変数の割り当てを取り消し、再割り当てを行う。
【００３９】
ここで、先に、対象ソフトウエア１の変数とスタブ４の変数間の制約情報を設計仕様１４に含めてもよいと説明したが、この具体例と、この具体例に対応する制約条件の例について以下詳細に説明する。
【００４０】
例えば、図３の左側のように、対象ソフトウエア１がスタブ４の状態を変数stab_stateに保持する場合を考える。図３の右側はスタブ４の状態遷移図である。組み込みシステムにおいて、対象ソフトウエア１を制御ソフトウエアとして用いる場合、スタブ４は制御対象となるメカ・ハードウエアのシミュレータとなる。このように制御ソフトウエアが、メカの状態（スタブ４の状態）を変数で保持することは頻繁に行われることである。
【００４１】
ここで、設計仕様１４において、制御ソフトウエアの指令により状態遷移が行われ、状態遷移の終了が確認された際に、stab_stateを更新することが決められていたとする。この場合、変数stab_stateの値がAであるとすると、スタブの状態は、Aである場合と、Bに遷移済みの場合が考えられる。状態C又はDに遷移するためには、変数stab_stateが状態Bであることを制御ソフトウエアが認識する必要があるため、変数stab_sateがAのまま、状態C又はDに遷移すことは起こり得ない。図４に変数stab_sateと、取り得るスタブ状態との対応表を示す。
【００４２】
図４の表に反した組み合わせ（例えば、変数stab_sate=A、スタブ状態＝C）で、制御ソフトウエアを動作させることはできても、仕様外の状態での動作となり、正しく動作検証を行うことはできない。このような状況を避けるために、制約条件９として適切な条件を用いることで、仕様外の状態へ陥ることを防ぐ。スタブ状態は変数sb1の値により、以下のように定義されていたとする。
状態A：  0≦sb1<5
状態B：  5≦sb1<10
状態C：  10≦sb1<20
状態D：  20≦sb1
【００４３】
この場合、図４の表に基づき、以下の制約条件を抽出することが出来る。
制約条件：  stab_state==A ならば、0≦sb1<10
制約条件：  stab_state==B ならば、5≦sb1
制約条件：  stab_state==C ならば、10≦sb1
制約条件：  stab_state==D ならば、0≦sb1<5 または、20≦sb1
【００４４】
ところで、ＳＷ状態５およびスタブ状態６を求める際、各状態の取り得る領域は膨大になることも多い。
【００４５】
たとえば変数vt1,vt2,vt3が整数であり、各変数の取り得る範囲が、0≦vt1≦2, 1≦vt2≦3, 0≦vt3≦1である場合を想定する。この場合、対象ソフトウエア１の取り得るＳＷ状態は、(vt1,vt2,vt3)の組み合わせであることから、(0,1,0) (0,1,1) (0,2,0) (0,2,1) (0,3,0) (0,3,1) ・・・(1,3,0) (1,3,1)の計18通りとなる。また、変数vfが4バイト長の浮動小数点型の場合、vfは232通りの値を取り得るため、対象ソフトウエア１の取り得るＳＷ状態も232通りとなる。
【００４６】
このような状況において、同値分割に基づいた境界分析を活用し、ロガー１０および未到達条件生成器１３の処理を拡張することで、効率的な状態生成を行う方法の例を以下に示す。
【００４７】
たとえば対象ソフトウエア１の変数vdを対象変数とする場合を想定する。まず変数vdが関係する条件式を取得する。条件式は、ユーザが設計仕様１４またはソースコードから探してロガー１０および未到達条件生成器１３に与えてもよいし、ロガー１０がソースコードをスキャンすることにより取得してもよい。取得した条件式が、vd<5,23<vd,vd<100の場合、以下のように同値集合を導き出すことが出来る。
同値集合A：vd<5を満たす変数vd
同値集合B：5≦vd≦23を満たす変数vd
同値集合C：23<vd<100を満たす変数vd
同値集合D：100≦vdを満たす変数vd
【００４８】
このように、変数vdの値を4通りに同値分割した場合、vdの取り得る値を同値集合A,B,C,Dの4種類と見なすことができる。
【００４９】
ロガー１０はカバレッジ情報１１として同値集合に達したかどうかを表す情報を生成する。たとえば、生成されたカバレッジ情報１１に、たとえば“変数vdは同値集合Ａ、Ｃ、Ｄに到達済み”といった情報を含める。
【００５０】
未到達条件生成器１３は、ロガー１０から受けたカバレッジ情報１１を検査し、到達していない同値集合を検出する。本例の場合、カバレッジ情報１１から、変数vdが同値集合Ｂに達していないことを検出する。未到達条件生成器１３は、検出した同値集合Ｂに基づき未到達条件７を生成する。具体的には、未到達条件生成器１３は、未到達条件７として、変数vdの境界値を採用する。これは、境界分析手法を適用するためであり、同値集合の境界に不具合が潜みやすい性質を考慮したものである。このようにして対象変数の値を決定することで効率的な状態生成が可能となる。同値集合Ｂの境界値は5、23であるため、未到達条件７はたとえばvd=5となる。ただし、制約条件取得部１７から未到達条件生成器１３へ送られる制約条件９は満たすものとする。この未到達条件７（vd=5）を満たすように未到達状態生成器８がＳＷ状態５またはスタブ状態６を生成できれば、変数vdについての検証は終了である。一方、できなかった場合は、同値集合Ｂに他の境界値があれば、その値を未到達条件７として採用する。同値集合Ｂには他の境界値23があるため、この値を未到達条件７として採用し、再度、ＳＷ状態５またはスタブ状態６の生成を試みる。すべての境界値を試して、ＳＷ状態５またはスタブ状態６が生成できなければ、同値集合Ｂの条件を未到達条件７として生成する。すなわち5≦vd≦23を未到達条件７として用いる。
【００５１】
上記の説明では、変数vdのみを含む条件式の例を示したが、変数vdと異なる他の対象変数が混ざっても構わない。たとえば、求めた条件式が、vd≦5,vd1<vdのように、他の対象変数vdが含まれる場合、以下のような同値集合を導き出すことができる。
同値集合A’：vd≦5∧vd1<vdを満たす変数vd
同値集合B’：5<vd∧vd1<vdを満たす変数vd
同値集合C’： vd≦5∧vd1≧vdを満たす変数vd
同値集合D’： 5<vd∧vd1≧vdを満たす変数vd
【００５２】
図５は、本発明の一実施の形態にしたがったソフトウエア検証方法（プログラム検証方法）の処理の手順を示すフローチャートである。
【００５３】
まず、ステップS11では、制約条件取得部１７により制約条件９を取得する。制約条件９を取得する処理の詳細フローの一例を図７のフローチャートに示す。全ての変数の上限・下限値を求め(S31)、また、変数間に成立する条件を列挙する(S32)。S31、S32で得られた内容が制約条件９となる。制約条件９はユーザ入力に基づき取得してもよいし、設計仕様１４から読み出すことにより取得してもよい。
【００５４】
図５のステップS12では、未到達条件生成器１３により未到達条件７を取得する。未到達条件生成器１３を取得する処理の詳細フローを図６のフローチャートに示す。まず、対象ソフトウエア１，ドライバ２およびスタブ４を実行させ、ドライバ２からのドライバ指令３を用いて、従来テスト手法による動的検証を行う(S21)。なお、この処理は、後述するS16や図８のS41と同一の動的検証であって構わない。動的検証の間、ロガー１０からカバレッジ情報１１を取得および蓄積し(S22)、また、制約条件取得部１７から、対象変数に関する制約条件９を取得する(S23)。そしてステップS23で取得した制約条件９と、カバレッジ情報１１（いままで蓄積したカバレッジ情報）とに基づき、未到達条件７を取得する(S24)。
【００５５】
図５のステップS13では、不変条件検出部１５において、不変条件１６を求める。不変条件１６を用いることで、設計仕様１４から抽出できなかった条件や、設計仕様１４から見いだすことのできない暗黙条件を加味することが可能となり、検証の信頼性を高めることができる。ここで、不変条件１６は、図８のフローチャートの手順で取得できる。まず、従来通りの動的検証を行う(S41)。この処理は、上述した通り、S16、S21と同一の動的検証であって構わない。この動的検証の間に、ロガー１０から、トレース情報１２を取得する(S42)。そして、取得したトレース情報１２に基づき、不変条件１６を抽出する(S43)。
【００５６】
図５のステップS14では、未到達状態生成器８により、未到達条件７と制約条件９と不変条件１６を満たすように、ＳＷ状態５とスタブ状態６を生成する。
【００５７】
図５のステップS15では、生成したＳＷ状態５とスタブ状態６を対象ソフトウエア１およびスタブ４に反映させる。ＳＷ状態５とスタブ状態６とは各々変数値の集合であるため、ＳＷ状態５とスタブ状態６を反映させるためには、全ての変数に値を代入すればよい。各変数に値を代入するルーチンを用いて変数への値の代入を行ってもよいし、各変数が割り当てられたメモリアドレスのマップを利用し、直接メモリに値を書き込んでもよい。
【００５８】
図５のステップS16では、再度、従来の動的検証を行う。ステップS15の処理により、未到達なＳＷ状態５、未到達なスタブ状態６から、対象ソフトウエア１の動作が開始されるため、テストカバレッジを確実かつ効率的に拡大することができる。
【００５９】
図５〜図８のフローチャートに示した各フローの処理を実行する命令コードを記述した検証プログラムを通常のプログラミング技術により作成し、作成した検証プログラムをＣＰＵ等のコンピュータに実行させることにより各フローの処理が実現されてもよい。またこの検証プログラムは、当該コンピュータによって読み取り可能な記録媒体に記憶され、コンピュータによって読み出され、実行されてもよい。
【００６０】
以上のように本発明の実施の形態によれば、対象ソフトウエア１およびスタブ４の動的検証中に、未到達のＳＷ状態および未到達のスタブ状態を取得し、取得したＳＷ状態およびスタブ状態から動的検証を行うようにしたことにより、テストカバレッジを効率的に拡大することができ、ソフトウエアの開発コスト・時間を削減することができる。
【図面の簡単な説明】
【００６１】
【図１】本発明の一実施形態としてのソフトウエア検証システム（プログラム検証装置）の構成を概略的に示すブロック図。
【図２】条件式の範囲を３次元空間において示す図。
【図３】スタブの状態遷移を説明する図。
【図４】変数と、取り得るスタブ状態との対応表を示す図。
【図５】本発明の一実施の形態にしたがったソフトウエア検証方法（プログラム検証方法）の処理の手順を示すフローチャート。
【図６】未到達条件を取得する処理の詳細フローを示すフローチャート。
【図７】制約条件を取得する処理の詳細フローを示すフローチャート。
【図８】不変条件を取得する処理の詳細フローを示すフローチャート。
【符号の説明】
【００６２】
１：対象ソフトウエア（プログラム）
２：ドライバ
３：ドライバ指令
４：スタブ（プログラム）
５：ＳＷ状態（プログラム状態）
６：スタブ状態（プログラム状態）
７：未到達条件
８：未到達状態生成器（状態生成手段、状態設定手段）
９：制約条件
１０：ロガー（変数監視手段、状態取得手段）
１１：カバレッジ情報
１２：トレース情報
１３：未到達状態生成器（状態取得手段）
１４：設計仕様
１５：不変条件検出部（条件生成手段）
１６：不変条件
１７：制約条件取得部（制約条件保持手段）
【図１】
2009157456.tif 000003
【図２】
2009157456.tif 000004
【図３】
2009157456.tif 000005
【図４】
2009157456.tif 000006
【図５】
2009157456.tif 000007
【図６】
2009157456.tif 000008
【図７】
2009157456.tif 000009
【図８】
2009157456.tif 000010