(57)【要約】【課題】検査者の労力を減じ、また、テスト時間を短縮することができる、プログラム検査装置、プログラム検査方法、及びプログラム検査プログラムを提供する。【解決手段】検査対象プログラム８を関数単位に解析してプログラム解析データ２１を生成するプログラム解析部１１と、検査対象プログラム８を実行して得られるカバレッジ情報２２とプログラム解析データ２１とに基づき、検査対象プログラム８の入力変数及び／又は定数から未実行の文に至る経路である活性化経路と、該経路に存在する条件文を満たすために設定すべき入力変数及び／又は定数の集合である活性化条件とからなる解析データ２３を生成するカバレッジ情報解析部１２と、解析データ２３に基づき、未実行の文を実行させるために設定が必要な入力変数に適切な値を設定して入力データ２４を生成する入力データ生成部１３と、を備えたことを特徴とする。【選択図】図２
2008071075.tif 000002
【特許請求の範囲】
【請求項１】
検査対象プログラムを関数単位に解析し、外部変数情報と関数情報とからなるプログラム解析データを生成するプログラム解析部と、
前記検査対象プログラムを実行して得られるカバレッジ情報と前記プログラム解析データとに基づき、前記検査対象プログラムの入力変数及び／又は定数から未実行の文に至る経路である活性化経路と、前記経路に存在する条件文を満たすために設定すべき前記入力変数及び／又は前記定数の集合である活性化条件とからなる解析データを生成するカバレッジ情報解析部と、
前記活性化経路と前記活性化条件とに基づき、前記未実行の文を実行させるために設定が必要な前記入力変数を抽出し、抽出した前記入力変数に適切な値を設定する入力データ生成部と、
を備えたことを特徴とする、プログラム検査装置。
【請求項２】
前記カバレッジ情報解析部は、前記検査対象プログラムにおいて、生成した前記活性化経路と前記活性化条件とが該当する箇所を特定し、前記該当する箇所とその他の箇所とを識別可能に表示装置に表示することを特徴とする、請求項１に記載のプログラム検査装置。
【請求項３】
検査対象プログラムを関数単位に解析して外部変数情報と関数情報とからなるプログラム解析データを生成し、
前記検査対象プログラムを実行して得られるカバレッジ情報と前記プログラム解析データとに基づき、前記検査対象プログラムの入力変数及び／又は定数から未実行の文に至る経路である活性化経路と、前記経路に存在する条件文を満たすために設定すべき前記入力変数及び／又は前記定数の集合である活性化条件とからなる解析データを生成し、
前記活性化経路と前記活性化条件とに基づき、前記未実行の文を実行させるために設定が必要な前記入力変数を抽出し、抽出した前記入力変数に適切な値を設定することを特徴とする、プログラム検査方法。
【請求項４】
前記検査対象プログラムにおいて、生成した前記活性化経路と前記活性化条件とが該当する箇所を特定し、前記該当する箇所とその他の箇所とを識別可能に表示装置に表示することを特徴とする、請求項３に記載のプログラム検査方法。
【請求項５】
コンピュータに、
検査対象プログラムを関数単位に解析し、外部変数情報と関数情報とからなるプログラム解析データを生成するプログラム解析手順と、
前記検査対象プログラムを実行して得られるカバレッジ情報と前記プログラム解析データとに基づき、前記検査対象プログラムの入力変数及び／又は定数から未実行の文に至る経路である活性化経路と、前記経路に存在する条件文を満たすために設定すべき前記入力変数及び／又は前記定数の集合である活性化条件とからなる解析データを生成するカバレッジ情報解析手順と、
前記活性化経路と前記活性化条件とに基づき、前記未実行の文を実行させるために設定が必要な前記入力変数を抽出し、抽出した前記入力変数に適切な値を設定する入力データ生成手順と、
を実行させることを特徴とする、プログラム検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム検査装置、プログラム検査方法、及びプログラム検査プログラムに関し、特に、ソフトウェアプログラムの動的検査における、カバレッジテストについてのプログラム検査装置、プログラム検査方法、及びプログラム検査プログラムに関する。
【背景技術】
【０００２】
従来、プログラム言語によって実装されたソフトウェアプログラム（以下、単にプログラムと示す）の作成途中や作成後において、当該プログラムの品質を推定するために、様々な検査が行われている。プログラムの検査は、プログラムを実行させずに目視などで観察する静的検査と、実際にプログラムを実行させて結果を観察する動的検査とに大別される。このうち、プログラムの動的検査は、検査用の入力データを作成し、検査環境に当該入力データを入力して検査対象プログラムを実行させ、得られる出力データを観察することによって行われる。
【０００３】
このような検査に際し、検査用の入力データによってプログラムのどの部分が実行されて検査されたかを示す情報、すなわちカバレッジ情報は、プログラムの信頼性を推定する指標として使用されているほか、検査が十分に行われたか否かを判定する検査完了基準や、出荷（リリース）判定基準としても使用されている。カバレッジ情報とは、具体的には、プログラムに書かれた各文に対してその文が何回実行されたか、また、その文が条件文の場合には、更に、各条件分岐がどの程度の割合で実行されたか、を示す情報であり、一般的には、プログラム検査装置としてカバレッジツールを用いて自動的に計測される。このようなカバレッジツールとしては、例えば特許文献１に記載された手法を用いたプログラム検査装置が提案されている。
【０００４】
得られたカバレッジ情報により、検査が不十分であると判定された場合、検査が十分に行われるまで、入力データを変更して追加検査を行う必要がある。しかしながら、特許文献１に記載されたプログラム検査装置では、検査不十分な部分、すなわち、未実行の文・条件分岐の検査を行うことができ、また、効率よく検査の網羅度を向上させることができる、新たな入力データを作成するために必要な情報を得ることができなかった。このため、検査者がプログラムを目視などで解析することによって、新たな入力データを作成しなくてはならず、検査者の労力を要し、また、テスト時間の増大を招くという問題があった。
【特許文献１】特開平５−３２４４０２号公報（図１）
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明は、以上の点に鑑みてなされたもので、検査者の労力を減じ、また、テスト時間を短縮することができる、プログラム検査装置、プログラム検査方法、及びプログラム検査プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一形態に係るプログラム検査装置は、検査対象プログラムを関数単位に解析し、外部変数情報と関数情報とからなるプログラム解析データを生成するプログラム解析部と、前記検査対象プログラムを実行して得られるカバレッジ情報と前記プログラム解析データとに基づき、前記検査対象プログラムの入力変数及び／又は定数から未実行の文に至る経路である活性化経路と、前記経路に存在する条件文を満たすために設定すべき前記入力変数及び／又は前記定数の集合である活性化条件とからなる解析データを生成するカバレッジ情報解析部と、前記活性化経路と前記活性化条件とに基づき、前記未実行の文を実行させるために設定が必要な前記入力変数を抽出し、抽出した前記入力変数に適切な値を設定する入力データ生成部と、を備えたことを特徴とする。
【０００７】
また、本発明の一形態に係るプログラム検査方法は、検査対象プログラムを関数単位に解析して外部変数情報と関数情報とからなるプログラム解析データを生成し、前記検査対象プログラムを実行して得られるカバレッジ情報と前記プログラム解析データとに基づき、前記検査対象プログラムの入力変数及び／又は定数から未実行の文に至る経路である活性化経路と、前記経路に存在する条件文を満たすために設定すべき前記入力変数及び／又は前記定数の集合である活性化条件とからなる解析データを生成し、前記活性化経路と前記活性化条件とに基づき、前記未実行の文を実行させるために設定が必要な前記入力変数を抽出し、抽出した前記入力変数に適切な値を設定することを特徴とする。
【０００８】
更に、本発明の一形態に係る半導体集積回路のプログラム検査プログラムは、コンピュータに、検査対象プログラムを関数単位に解析し、外部変数情報と関数情報とからなるプログラム解析データを生成するプログラム解析手順と、前記検査対象プログラムを実行して得られるカバレッジ情報と前記プログラム解析データとに基づき、前記検査対象プログラムの入力変数及び／又は定数から未実行の文に至る経路である活性化経路と、前記経路に存在する条件文を満たすために設定すべき前記入力変数及び／又は前記定数の集合である活性化条件とからなる解析データを生成するカバレッジ情報解析手順と、前記活性化経路と前記活性化条件とに基づき、前記未実行の文を実行させるために設定が必要な前記入力変数を抽出し、抽出した前記入力変数に適切な値を設定する入力データ生成手順と、を実行させることを特徴とする。
【発明の効果】
【０００９】
検査者の労力を減じ、また、テスト時間を短縮することができる、プログラム検査装置、プログラム検査方法、及びプログラム検査プログラムを実現することができる。
【発明を実施するための最良の形態】
【００１０】
以下、図面を参照して本発明の実施の形態を説明する。
【００１１】
まず、図１に基づき、本実施の形態に係わるプログラム検査装置の構成を説明する。図１は、本実施の形態に係わるプログラム検査装置の構成を示す構成図である。図１に示すように、プログラム検査装置を構成するコンピュータ１は、中央処理装置（ＣＰＵ）、ＲＯＭ、ＲＡＭなどを含むコンピュータ本体２を有する。コンピュータ本体２には、ＣＲＴ、液晶パネルなどの表示装置３と、文字、数字などを入力するためのキーボード４と、表示装置３の画面上のカーソルの移動などをするためのポインティングデバイスであるマウス５と、各種プログラムをストアするためのメモリ装置６とが接続されている。メモリ装置６には、本実施の形態に係わるプログラム検査プログラム７と、検査対象プログラム８とが格納され、検査者９の指示に基づいて実行可能となっている。コンピュータ１は、メモリ装置６にストアされたプログラムを実行し、実行プログラムに従って、表示装置３に所定の画面を表示する。
【００１２】
図２は、図１に示すコンピュータ１におけるプログラム検査プログラム７の機能構成を示す機能ブロック図である。プログラム検査プログラム７は、検査対象プログラム８を解析してプログラム解析データ２１を生成するプログラム解析部１１と、プログラム解析データ２１と検査対象プログラム８のカバレッジ情報２２とから、検査対象プログラム８において未実行の文を実行するための経路や、該経路に存在する条件文を満たすために設定すべき入力変数・定数の集合などを導出し、解析データ２３として生成するカバレッジ情報解析部１２と、解析データを基に、未実行の文や未実行の条件を実行するために必要な具体的な入力データを生成する入力データ生成部１３とから構成される。
【００１３】
プログラム解析部１１は、検査対象プログラム８を関数単位に解析し、外部変数情報と関数情報とからなるプログラム解析データ２１を生成する。カバレッジ情報解析部１２は、検査対象プログラム８をデバッグオプション付きでコンパイルし、コンピュータ１に実行させることで得られるカバレッジ情報２２と、プログラム解析部１１で生成されるプログラム解析データ２１とを入力とし、検査対象プログラム８に記述されている関数の引数や関数内で使用されている外部変数（以下、関数の引数と外部変数とをまとめて入力変数と示す）、もしくは定数から未実行の文に至るまでの経路と、未実行の条件を実行するために必要な、入力変数もしくは定数の条件とからなる解析データ２３を導出して出力する。入力データ生成部１３は、解析データ２３と検査者９からの入力とに基づき、未実行の文や未実行の条件を実行するために必要な具体的な入力データ２４を生成する。
【００１４】
以下に、例を用いて、本実施の形態に係わるプログラム検査方法の内容を説明する。本実施の形態においては、C言語で記述されたプログラムを関数単位で検査する方法について、図３〜図１５を用いて説明する。図３は、本実施の形態におけるプログラム検査方法のデータ処理の流れを説明するデータフロー図、図４は本実施の形態におけるプログラム検査の処理手順を説明するフローチャートである。
【００１５】
まず、図３に示すように、検査対象プログラム８をプログラム解析部１１に入力する（図４、ステップＳ１）。プログラム解析部１１では、入力された検査対象プログラム８のプログラム解析データ２１（外部変数情報と関数情報）が生成される（図４、ステップＳ２）。外部変数情報は、検査対象プログラム８で定義されている外部変数について、変数名と型とから構成される。例えば、外部変数情報は（変数名、型）とすることができる。検査対象プログラム８が図５に示すプログラムである場合、外部変数は２つであり、外部変数情報は（x , int）、（y , int）となる。図５は、検査対象プログラム８の一例を示す図である。図５において、プログラムの左側に記載された番号は行番号を示している。
【００１６】
関数情報は、検査対象プログラム８で定義されている関数について、関数名情報、インタフェース情報、及び実装情報から構成される。図５に示すプログラムの場合、関数名情報はAとなる。
【００１７】
インタフェース情報は、関数の引数名と引数の型、関数内で使用されている外部変数名、及び、関数の戻り値の型から構成される。図５に示すプログラムの場合、インタフェース情報は、関数の引数名がｓ、引数ｓの型がshort、関数内で使用されている外部変数名はなし、関数の戻り値の型がint、となる。
【００１８】
実装情報は、文情報と接続情報とから構成される。文情報は、関数に含まれる文ごとに作成され、属性、位置情報、次実行文、前実行文、親文の５項目から成る基本情報と、文の種類に応じた付加情報とから構成される。
【００１９】
まず、基本情報について説明する。属性は、当該文の種類を識別するための情報であり、例えば代入文、block文、条件文、while文、do文、などと表現される。位置情報は、プログラム中における当該文の位置を識別するための情報であり、例えば行番号が記載される。次実行文は、当該文の次に実行される文を識別するための情報であり、例えば次に実行される文の文情報へのポインタとして表現される。前実行文は、当該文の前に実行される文を識別するための情報であり、例えば前に実行される文の文情報へのポインタとして表現される。親文は、当該文がblock文に含まれている場合、どのblockに含まれているのかを識別するための情報であり、例えば当該block文の文情報へのポインタとして表現される。
【００２０】
次に、付加情報について説明する。付加情報は文の種類によって項目が異なる。ここでは、代表的な種類である代入文、block文、条件文、while文について具体的な例をあげて説明する。
【００２１】
代入文の付加情報は、入力変数リスト、出力変数リスト、文の処理情報、の３項目から構成されている。入力変数リストは、当該文の右辺に出現する変数を識別するための情報である。複数の変数が出現する場合、例えばリストとして表現される。出力変数リストは、当該文の左辺に出現する変数を識別するための情報である。複数の変数が出現する場合、入力変数リストと同様に、例えばリストとして表現される。文の処理情報は、当該文の処理内容を識別するための情報であり、例えば右辺の構文木として表現される。
【００２２】
例えば、図５のプログラムにおいて８行目に出現するｘ = ａ＋ｂという式が代入文に該当する。この文に対応する文情報は、次の通りである。
【００２３】
属性：代入文
位置情報：８
次実行文：（９行目の文の文情報へのポインタ）
前実行文：（７行目の文の文情報へのポインタ）
親文：−（block文でないため、親文を持たない）
入力変数リスト：ａ，ｂ
出力変数リスト：ｘ
文の処理情報：ａ＋ｂ
上述の文情報は、例えば図６のように記載することができる。図６は、代入文に対して生成される文情報の一例を説明する図である。なお、図６において、基本情報の次実行文、前実行文についての記載は省略している。なお、等価な条件文などに変換可能な代入文は、変換後の文がプログラム中に記載されているものとして文情報が作成される。例えば、ｘ＝ｃ？ａ：ｂ；という代入文は、図７に示す条件文と等価であるため、変換後の条件文について文情報が作成される。図７は、代入文から変換した条件文の一例を説明するプログラムである。
【００２４】
block文の付加情報は子文である。子文は、当該blockに含まれる文を識別するための情報であり、例えば当該blockに含まれる文の文情報へのポインタとして表現される。当該blockに複数の文が含まれる場合、個々の文を子文とし、各子文へのポインタの集合を付加情報として有する。
【００２５】
条件文（if文もしくはswitch文）の付加情報は、条件式、（条件式の）入力変数リスト、条件値及び条件値を満たす場合の実行文、の３項目から構成されている。条件式は、if文もしくはswitch文の括弧内に記載されている式の内容を識別するための情報であり、例えば構文木として表現される。（条件式の）入力変数リストは、当該条件式に出現する変数を識別するための情報である。複数の変数が出現する場合、例えばリストとして表現される。条件値及び条件値を満たす場合の実行文は、条件値と条件式が条件値を満たした場合に実行される文とをセットとして識別するための情報であり、例えば、条件値と実行文の文情報へのポインタとが対にして表現される。条件値が複数存在する場合、全ての条件値及び条件値を満たす場合の実行文の集合を付加情報として有する。
【００２６】
block文と条件文(if文)の文情報の具体的な例を、図５のプログラムを用いて説明する。図５において、９行目〜１５行目に出現するif文を例にあげると、この文に対する文情報は、次の通りである。
【００２７】
属性：if文（条件文）
位置情報：９
次実行文：（１６行目の文の文情報へのポインタ）
前実行文：（８行目の文の文情報へのポインタ）
親文：−（block文でないため、親文を持たない）
条件式：ｃ０＆ｃ１
入力変数リスト：ｃ０，ｃ１
条件値及び条件値を満たす場合の実行文（１）：［条件値］値１，［実行文］（９行目〜１２行目のblock文の文情報へのポインタ）
条件値及び条件値を満たす場合の実行文（２）：［条件値］値０，［実行文］（１２行目〜１５行目のblock文の文情報へのポインタ）
また、上述のif文の実行文である２つのblock文の文情報は次の通りである。
【００２８】
属性：block文
位置情報：９
次実行文：−
前実行文：−
親文：（９行目のif文の文情報へのポインタ）
子文（１）：（１０行目の文（文０）の文情報へのポインタ）
子文（２）：（１１行目の文（文１）の文情報へのポインタ）
属性：block文
位置情報：１２
次実行文：−
前実行文：−
親文：（９行目のif文の文情報へのポインタ）
子文（１）：（１３行目の文の文情報へのポインタ）
子文（２）：（１４行目の文の文情報へのポインタ）
更に、上述のblock文のうち２番目に挙げたblock文の子文（１）（２）である文の文情報は、次の通りである。
【００２９】
属性：代入文
位置情報：１３
次実行文：（１４行目の文の文情報へのポインタ）
前実行文：−
親文：（１２行目のblock文の文情報へのポインタ）
入力変数リスト：（文２の右辺に出現する変数のリスト）
出力変数リスト：（文２の左辺に出現する変数のリスト）
文の処理情報：（文２の処理内容の構文木）
属性：代入文
位置情報：１４
次実行文：−
前実行文：（１３行目の文の文情報へのポインタ）
親文：（１２行目のblock文の文情報へのポインタ）
入力変数リスト：（文３の右辺に出現する変数のリスト）
出力変数リスト：（文３の左辺に出現する変数のリスト）
文の処理情報：（文３の処理内容の構文木）
上述の文情報は、例えば図８のように記載することができる。図８は、if文およびblock文に対して生成される文情報の一例を説明する図である。なお、switch文に関しては、if文とほぼ同様の文情報が生成されるため、具体的な例をあげての説明を省略する。
【００３０】
while文の付加情報は、条件式、（条件式の）入力変数リスト、条件式が成立した場合の実行文、の３項目から構成されている。条件式は、while文の括弧内に記載されている式の内容を識別するための情報であり、例えば構文木として表現される。（条件式の）入力変数リストは、当該条件式に出現する変数を識別するための情報である。複数の変数が出現する場合、例えばリストとして表現される。条件式が成立した場合の実行文は、例えば、実行文の文情報へのポインタとして表現される。実行文がblock文である場合、該block文の文情報が生成され、条件式が成立した場合の実行文は該block文の文情報へのポインタとして表現される。
【００３１】
while文の文情報の具体的な例を、図５のプログラムを用いて説明する。図５において、１６行目〜１８行目に出現するwhile文を例にあげると、この文に対する文情報は、次の通りである。
【００３２】
属性：while文
位置情報：１６
次実行文：（１９行目の文の文情報へのポインタ）
前実行文：（１５行目の文の文情報へのポインタ）
親文：−（block文でないため、親文を持たない）
条件式：ｃ０
入力変数リスト：ｃ０
条件式が成立した場合の実行文：（１６行目〜１８行目のblock文の文情報へのポインタ）
また、上述のwhile文の実行文であるblock文の文情報は次の通りである。
【００３３】
属性：block文
位置情報：１６
次実行文：−
前実行文：−
親文：（１６行目のwhile文の文情報へのポインタ）
子文（１）：（文４の文情報へのポインタ）
子文（２）：（文５の文情報へのポインタ）
…
子文（ｎ−３）：（文ｎの文情報へのポインタ）
上述の文情報は、例えば図９のように記載することができる。図９は、while文に対して生成される文情報の一例を説明する図である。
【００３４】
文の種類としては、上述の４つの種類のほかにもdo文、for文、break文、continue文、goto文などが考えられる。これらの種類に属する文の文情報について、簡単に説明する。do文はwhile文とほぼ同様の文情報が生成される。また、for文はwhile文を用いて等価な文に変換することができるため、変換後のプログラムについて文情報が生成される。例えば、for（式１；式２；式３）文；というfor文は、図１０に示すwhile文と等価であるため、変換後のwhile文について文情報が作成される。図１０は、if文から変換したwhile文の一例を説明するプログラムである。
【００３５】
break文、continue文、goto文は、付加情報を持たず基本情報のみで文情報が構成されるが、代入文など他の種類の文は次実行文として直下の行に記載された文の文情報を記載するのに対し、これらの種類の文は、文中に指定された行に記載された文の文情報を次実行文として記載する点が異なっている。
【００３６】
次に、実装情報のもう一つの構成要素である接続情報について説明する。接続情報は、文と文との接続に関する接続情報と、変数と文との接続に関する接続情報とに大別される。文と文との接続情報とは、文の実行順序を識別するための情報であり、具体的には、実装情報の基礎情報に含まれる次実行文、前実行文、親文の各項目で構成される。文と文との接続情報は、例えば、関連するノード（点）を接続線で結ぶことにより網目状の外観を有するグラフとして表現することができる。この場合、グラフ上のノードが個々の文に対応し、ノード間を結ぶ接続線によって、当該文に関する次実行文、前実行文、親文を表現することができる。変数と文との接続情報とは、変数がプログラム中にどの文に出現するかを識別するための情報である。
【００３７】
プログラム解析部１１において、上述のようにしてプログラム解析データ２１が作成される一方、検査対象プログラム８は、コンパイラ１４に入力されてデバックオプション付きでコンパイルされ、実行形式プログラム２５が生成される（図４、ステップＳ３）。引き続き、実行形式プログラム２５が実行され、カバレッジツール１５によってカバレッジ情報２２が生成される（図４、ステップＳ４）。カバレッジ情報２２は、個々の文が実行された回数と、条件分岐の実行有無および実行された割合とから主に構成されている。ここで、プログラムに記述されている文のトータル行数に対する実行された文の行数の割合と、プログラムに出現する条件分岐の総数に対する実行された条件分岐の数の割合とをカバレッジ率という。
【００３８】
なお、図４において、ステップＳ３はステップＳ２の終了を待たずに実行することが可能であり、ステップＳ１，ステップＳ２の処理と並行してステップＳ３，ステップＳ４の処理を実行してもよい。ステップＳ４によって得られたカバレッジ情報２２におけるカバレッジ率が予め設定された閾値を超えている場合、プログラムの検査を終了する（図４、ステップＳ５）。一方、取得したカバレッジ率が閾値を越えていない場合、ステップＳ２で得られたプログラム解析データ２１と、ステップＳ４で得られたカバレッジ情報２２とがカバレッジ情報解析部１２に入力され、解析データ２３が生成される（図４、ステップＳ６）。
【００３９】
解析データ２３は、入力変数もしくは定数から未実行の文に至る経路（以下、活性化経路と示す）と、該経路に存在する条件文を満たすために設定する必要がある入力変数もしくは定数の集合（以下、活性化条件と示す）とから構成される。活性化経路と活性化条件との具体的な導出方法を、図１１に示すようなプログラム（関数）を検査対象プログラム8とし、これに適当な入力を与えて実行させ解析データ２３を生成する場合を例にあげて説明する。図１１は、検査対象プログラム8の別の一例を示す図である。
【００４０】
例えば、カバレッジ情報２２において、図１１のプログラムのswitch文の０番目の分岐中に含まれる文（case(0)のblock文）が実行されていないことを示している場合、カバレッジ情報解析部１２では、まず、当該文に対応する文情報がプログラム解析データ２１から抽出される。この場合、output = input * input1+ input2という代入文（以下、文ｓｉと示す）に対応する文情報が抽出される。次に、プログラム解析データ２１における文ｓｉの文情報（主に、入力変数リストと出力変数リスト）と接続情報とに基づき、入力変数もしくは定数から文ｓｉに至る経路（活性化経路）を導出する。
【００４１】
活性化経路は、例えば、文ｓｉを根、入力変数もしくは定数を葉とする木構造として表され、例えば図１２に示す関数（getStatementTree（文情報））を用いて導出することができる。図１２は、活性化経路を導出する関数を説明するプログラム構成の一例である。getStatementTree（文情報）は文情報を引数としてその文の入力変数の集合を出力する関数（getInputSideVariables（文情報））と、変数を引数としてその変数を出力変数に有する文の集合を出力する関数（getInputSideStatements（変数））とを用いて定義される再帰関数である。
【００４２】
すなわち、getStatementTree（文情報）を実行すると、文ｓｉの入力変数を出力変数として有する文を抽出して文ｓｉに接続し、接続された文の入力変数を出力変数として有する文を更に抽出して接続する、といった文同士の接続が入力変数もしくは定数が葉として出現するまで繰り返し行われ、例えば図１３に示すような活性化経路を表す木構造３１が生成される。図１３は、活性化経路を表す木構造を説明する図である。
【００４３】
なお、図１３において、丸の中にアルファベットが書かれている記号は変数を、三角の中にアルファベットが書かれている記号は定数を、変数及び定数を包含する四角は文を、それぞれ示している。また、文を表す四角に設けられた点線の上側に記載された変数及び定数は入力変数（定数）を、点線の下側に記載された変数は出力変数を、それぞれ示している。更に、文を表す四角の外側に記載された変数は、プログラム（関数）への入力変数を示している。
【００４４】
図１３において、式１０１が活性化経路を導出したい未活性文である。getStatementTree（文情報）によって、式１０１への入力が変数ａ，変数ｇ，定数ｘ１１１の３つであることが判明すると、次に、getInputSideStatements（変数）によって変数ａ，変数ｇ，をそれぞれ出力変数に持つ式が抽出される。図１３の場合、変数ａを出力変数に持つ式が式１０２であり、変数ｇを出力変数に持つ式が式１０３である。次に、再び、getStatementTree（文情報）を用いて、式１０２と式１０３への入力を求める。図１３の場合、式１０２への入力は変数ｂ１２１，変数ｃ１２２，定数ｙ１１２の３つであり、式１０３への入力は変数ｄ１２３，変数ｅ１２４，定数ｗ１１０の３つである。導出された変数がすべてプログラム（関数）への入力変数であるため、ここで木構造３１が完成する。
【００４５】
図１３により、式１０１を実行するためには、変数ｂ１２１，変数ｃ１２２，変数ｄ１２３，変数ｅ１２４，定数ｗ１１０，定数ｙ１１２，定数ｘ１１１の６つの変数または定数の値に適当な値を与え、式１０２，式１０３を実行することが必要であることがわかる。なお、プログラム（関数）には変数ｆ１２５も入力変数として定義されているが、葉として抽出されていないため、式１０１の実行には無関係であることがわかる。
【００４６】
次に、この活性化経路を活性化するための条件値を設定するために、活性化条件を導出する。活性化条件は、例えば、実行したい文（条件文）を根、入力変数もしくは定数を葉とする木構造として表され、例えば図１４に示す関数（getConditionForest（木））を用いて導出することができる。図１４は、活性化条件を導出する関数を説明するプログラム構成の一例である。
【００４７】
getConditionForest（木）は、活性化経路を表す木構造を引数とする関数であり、活性化経路に出現する条件文を抽出する。次に、抽出した各条件文について、条件式の入力変数を出力変数とする文を抽出して該条件文に接続し、接続された文の入力変数を出力変数として有する文を更に抽出して接続する、といった文同士の接続が入力変数もしくは定数が葉として出現するまで繰り返し行われる。この手順によって、活性化条件として、例えば図１５に示すように、条件文１０５を根とする木構造３２と、条件文１０６を根とする木構造３３の集合である森構造３４が生成される。図１５は、活性化条件を表す森構造を説明する図である。なお、図１５の表記方法は図１３の表記方法に準ずる。
【００４８】
図１５により、活性化経路には２つの条件文１０５，１０６が存在しており、条件文１０５に示された条件を満たすためには、入力変数である変数ｂ１２１，変数ｄ１２３，定数１１３に適切な値を設定し、条件文１０６に示された条件を満たすためには、入力変数である変数ｂ１２１，変数ｃ１２２，変数ｅ１２４，変数ｆ１２５，定数ｔ１１５，定数ｕ１１４に適切な値を設定する必要があることがわかる。
【００４９】
上述のようにして得られた解析データ２３（活性化経路、活性化条件）を表示装置３に表示する場合、図１３や図１５のような木構造・森構造として表示することができる。また、検査対象プログラム8を表示装置３に表示させておき、木構造（もしくは森構造に含まれる木構造）を構成する文の文情報に含まれる位置情報を利用して、活性化経路に含まれる行を他の行と色を変えるなど強調して表示したり、木構造の葉である変数や定数を強調して表示したりすることもできる。また、未実行文の活性化経路を活性化することによりカバレッジ率がどれくらい向上するのかをコンピュータ１に計算させて表示させてもよい。
【００５０】
このようにして活性化経路や活性化条件を表示装置３などにわかりやすく示すことで、未実行文を実行するためにどの入力変数もしくは定数の値を変更したらよいかを検査者９が容易に判別することが可能となり、検査者９の労力を削減することができる。
【００５１】
ステップＳ６で生成された解析データ２３は、図３に示すように入力データ生成部１３に入力され、未実行の文を実行するために必要な具体的な入力データ２４が生成される（図４、ステップＳ７）。入力データ生成部１３では、解析データ２３から未実行文を実行するために設定する必要がある入力変数・定数を抽出した後、これらの変数・定数に具体的な数値を設定する。この際、乱数などを使用して自動的に数値を導出し、この数値を用いて活性化条件や活性化経路を活性化することが可能か否かを計算し、可能であると判定された場合に該数値を入力データ２４としてもよいし、検査者９に数値の入力を促すようにしてもよい。
【００５２】
ステップＳ７において入力データ２４が生成されると、ステップＳ４に戻り、該入力データ２４を用いて検査対象プログラム8を再実行する。
【００５３】
このように、本実施の形態においては、検査対象プログラムからプログラム解析データを生成し、カバレッジ情報に示される未実行文を実行させるために活性化する必要がある経路や、該経路を活性化させるために設定しなくてはならない入力変数・定数を自動的に抽出することができるため、検査者の労力を減じ、また、テスト時間を短縮することができる。
【００５４】
次に、本実施の形態のプログラム検査方法の応用例として、検査対象プログラム８がある処理を行う関数であり、性能を向上させるために、インタフェースを変更せずに実装のみを変更した場合に、実装変更後のプログラムの検査を行う方法について、図１６を用いて説明する。図１６は、本実施の形態のプログラム検査方法を応用した検査方法の処理手順を説明するフローチャートである。なお、実装変更前のプログラムは十分に検査されており、検査におけるカバレッジ率も設定された閾値を超えており、検査のために使用した入力データ２４が存在するものとする。
【００５５】
まず、ステップＳ１１において、既存の検査用入力データ２４を用い、実装変更前の検査対象プログラム８（以下、参照モデル８aと示す）を検査する。次に、ステップＳ１２において、ステップＳ１１で使用した入力データ２４を用い、実装変更後の検査対象プログラム８（以下、検査対象モデル８ｂと示す）を検査する。続いて、ステップS１３において、ステップＳ１１で得られた検査結果とステップＳ１２で得られた検査結果とを比較し、両者が一致するか否かを判定する。両者が一致しない場合、ステップＳ１４において、検査対象モデル８ｂを修正し、再びステップＳ１２に戻って検査を行う。
【００５６】
一方、ステップＳ１３において両者が一致する場合、ステップＳ１５に進み、ステップＳ１１で使用した入力データ２４を用いて検査対象モデル８ｂのカバレッジ検査を行う。なお、ステップＳ１５におけるカバレッジ検査は、図４のフローチャートに示す手順で実施される。すなわち、カバレッジ率が所定の閾値を超えるまで、検査対象モデル８ｂのプログラム解析データ２１、カバレッジ情報２２、解析データ２３を生成し、入力データ２４を変更しながら検査を実行する。
【００５７】
このように、本実施の形態のプログラム検査方法は、プログラムを修正した場合のリグレッションテストにも使用することができ、該テストに関する検査者の労力を減じ、テスト時間の短縮を図ることができる。
【図面の簡単な説明】
【００５８】
【図１】本実施の形態に係わるプログラム検査装置の構成を示す構成図。
【図２】コンピュータ１におけるプログラム検査プログラムの機能構成を示す機能ブロック図。
【図３】本実施の形態に係わるプログラム検査方法のデータ処理の流れを説明するデータフロー図。
【図４】本実施の形態に係わるプログラム検査の処理手順を説明するフローチャート。
【図５】検査対象プログラム8の一例を示す図。
【図６】代入文に対して生成される文情報の一例を説明する図。
【図７】代入文から変換した条件文の一例を説明するプログラム。
【図８】if文およびblock文に対して生成される文情報の一例を説明する図。
【図９】while文に対して生成される文情報の一例を説明する図。
【図１０】if文から変換したwhile文の一例を説明するプログラム。
【図１１】検査対象プログラム8の別の一例を示す図。
【図１２】活性化経路を導出する関数を説明するプログラム構成の一例。
【図１３】活性化経路を表す木構造を説明する図。
【図１４】活性化条件を導出する関数を説明するプログラム構成の一例。
【図１５】活性化条件を表す森構造を説明する図。
【図１６】本実施の形態のプログラム検査方法を応用した検査方法の処理手順を説明するフローチャート。
【符号の説明】
【００５９】
７…プログラム検査プログラム、１１…プログラム解析部、１２…カバレッジ情報解析部、１３…入力データ生成部、
【図１】
2008071075.tif 000003
【図２】
2008071075.tif 000004
【図３】
2008071075.tif 000005
【図４】
2008071075.tif 000006
【図５】
2008071075.tif 000007
【図６】
2008071075.tif 000008
【図７】
2008071075.tif 000009
【図８】
2008071075.tif 000010
【図９】
2008071075.tif 000011
【図１０】
2008071075.tif 000012
【図１１】
2008071075.tif 000013
【図１２】
2008071075.tif 000014
【図１３】
2008071075.tif 000015
【図１４】
2008071075.tif 000016
【図１５】
2008071075.tif 000017
【図１６】
2008071075.tif 000018