(57)【特許請求の範囲】
【請求項１】
シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる第１実行ステップと、
前記分析対象プログラムのコード網羅率を前記シンボリック実行部から取得し、実行結果格納部に格納する取得ステップと、
前記実行結果格納部に格納されている前記コード網羅率が所定の基準を満たすか判断するステップと、
前記コード網羅率が前記所定の基準を満たすと判断された場合、前記分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納するステップと、
を含み、コンピュータにより実行される繰返しシンボリック実行方法。
【請求項２】
前記取得ステップが、
前記第１実行ステップにおけるシンボリック実行により得られるパスコンディションのデータを前記シンボリック実行部から取得し、前記実行結果格納部に格納するステップ
を含み、
前記実行結果格納部に格納されているパスコンディションの各々について、前記分析対象プログラムに定義されている変数毎に当該変数に設定した具体値が格納されているデータ格納部から、当該パスコンディションに関連する変数に設定した具体値を特定し、特定された当該具体値が当該パスコンディションを充足するという条件を満たすか判断する判断ステップと、
前記判断ステップにおいて前記条件を満たさないと判断されたパスコンディションを充足する具体値を生成する生成ステップと、
前記シンボリック実行部に対して、前記分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させ、前記条件を満たさないと判断されたパスコンディションに関連する変数に具体値を設定する場合には前記生成ステップにおいて生成された具体値を設定して繰り返しシンボリック実行を行わせる第２実行ステップと、
前記第１実行ステップの実行結果と前記第２実行ステップの実行結果とを用いて算出されたコード網羅率である累積コード網羅率を前記シンボリック実行部から取得し、前記実行結果格納部に格納するステップと、
前記実行結果格納部に格納されている前記累積コード網羅率が前記所定の基準を満たすか判断するステップと、
前記累積コード網羅率が前記所定の基準を満たすと判断された場合、前記分析対象プログラムのテストが完了したことを表すデータを前記出力データ格納部に格納するステップと、
をさらに含む請求項１記載の繰返しシンボリック実行方法。
【請求項３】
前記第１実行ステップ及び前記第２実行ステップにおいて、シンボル化対象の変数を１つとし、前記分析対象プログラムに定義されている全ての変数をカバーするように当該シンボル化対象の変数を変化させる
ことを特徴とする請求項２記載の繰返しシンボリック実行方法。
【請求項４】
シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる実行部と、
前記分析対象プログラムのコード網羅率を前記シンボリック実行部から取得し、実行結果格納部に格納する取得部と、
前記実行結果格納部に格納されている前記コード網羅率が所定の基準を満たすか判断し、前記コード網羅率が前記所定の基準を満たすと判断された場合に、前記分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納する判断部と、
を有する繰返しシンボリック実行装置。
【請求項５】
シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる第１実行ステップと、
前記分析対象プログラムのコード網羅率を前記シンボリック実行部から取得し、実行結果格納部に格納する取得ステップと、
前記実行結果格納部に格納されている前記コード網羅率が所定の基準を満たすか判断するステップと、
前記コード網羅率が前記所定の基準を満たすと判断された場合、前記分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納するステップと、
を、コンピュータに実行させるための繰返しシンボリック実行プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、シンボリック実行技術に関する。
【背景技術】
【０００２】
コードカバレッジ（code coverage）とは、プログラムの内部構造に対してどれだけ網羅的にテストを行ったかを示す指標である。コードカバレッジには、ステートメントカバレッジ（statement coverage）やブランチカバレッジ（branch coverage）、コンディションカバレッジ（condition coverage）、パスカバレッジ（path coverage）等の種類がある。プログラムのテストを行う際には、このような指標が基準値（例えば１００％）に達するようにテストデータやシナリオを設計する。
【０００３】
例として、図１に示すような制御構造を有するプログラムのテストを行い、ブランチカバレッジを１００％にすることを考える。まず、テストデータ｛a=11,b=1｝を用いてテスト実行を行う。すると、分岐Ｂ1、Ｂ3及びＢ4を実行することができる。さらに、テストデータ｛a=10,b=1｝を用いてテスト実行を行えば、分岐Ｂ1、Ｂ3及びＢ5を実行することができる。そして、残りの分岐Ｂ2及びＢ6を実行するために、テストデータ｛a=0,b=0｝を用いてテスト実行を行う。このようにすれば、（実行した分岐の数）／（全分岐の数）＊１００＝１００となり、ブランチカバレッジは１００％である。但し、このようなテストデータのセットは、人間がプログラムの内部構造を把握した上で作成するのが一般的であり、非常に手間がかかる。
【０００４】
一方で、シンボリック実行（symbolic execution）という技術を利用してプログラムのテストを行うことが知られている。シンボリック実行は、プログラム内の変数をシンボル化し、シンボルのまま実行を行う技術である。なお、シンボリック実行についての基礎的な事項は、例えば、玉井哲雄、福永光一、「記号実行システム」、情報処理、pp18-28、1982/01/15などに詳しく述べられているので、そちらを参照されたい。
【０００５】
ここで、図１に示すような制御構造を有するプログラムに対してシンボリック実行を行うことを考える。このプログラムには変数ａ及び変数ｂが存在するため、変数ａ及び変数ｂをシンボル化してシンボリック実行を行う。このプログラムに対してシンボリック実行を行う場合における制御フローを図２に示す。図２に示すように、シンボリック実行では、シンボル化した変数が関わる分岐では、分岐における全てのケースについて実行を行う。これにより、プログラムにおける６つの経路（パス）全てを実行することができるようになっている。すなわち、パスカバレッジは１００％である。
【０００６】
このように、従来のシンボリック実行は、原理的には、全ての経路を実行するようになっている（但し、無限ループを有する等、プログラムの構造によっては全ての経路を実行することができない場合がある）。一方、全ての分岐を実行できればよいのであれば、必ずしも全ての経路を実行しなくてもよい場合が多い。例えば図１の例であれば、「Ｂ1→Ｂ3→Ｂ4」、「Ｂ1→Ｂ3→Ｂ5」及び「Ｂ2→Ｂ6」という３経路を実行すれば、全ての分岐を網羅することができる。
【０００７】
従って、ブランチカバレッジ等について基準値を達成できればよいという場合において、従来のようにシンボリック実行を行うと、本来は行わなくてもよいテスト実行を行うことになる。これは、図１の例のような単純なプログラムであれば問題は無い。しかし、一般的なサイズのプログラムの場合、プログラム内の分岐構造に起因する組合せ爆発を起こし、膨大な数のテスト実行を行わなければならないため、テスト完了までの時間が非常に長くなる。従って、実質的にはテストが完了しているのに長時間テスト実行を続けることになるため、効率的ではない。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００９−８７３５５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
従って、本技術の目的は、一側面によれば、シンボリック実行を用いてより効率的にプログラムのテストを行うための技術を提供することである。
【課題を解決するための手段】
【００１０】
本繰返しシンボリック実行方法は、シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる第１実行ステップと、分析対象プログラムのコード網羅率をシンボリック実行部から取得し、実行結果格納部に格納する取得ステップと、実行結果格納部に格納されているコード網羅率が所定の基準を満たすか判断するステップと、コード網羅率が所定の基準を満たすと判断された場合、分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納するステップとを含む。
【発明の効果】
【００１１】
シンボリック実行を用いてより効率的にプログラムのテストを行うことができるようになる。
【図面の簡単な説明】
【００１２】
【図１】図１は、テストプログラムの制御構造の一例を示す図である。
【図２】図２は、テストプログラムの制御フローの一例を示す図である。
【図３】図３は、本実施の形態に係るシステム概要図である。
【図４】図４は、既定値格納部に格納されているデータの一例を示す図である。
【図５】図５は、分析対象のプログラムを示す図である。
【図６】図６は、本実施の形態におけるメインの処理フローを示す図である。
【図７】図７は、実行データ格納部に格納されるデータの一例を示す図である。
【図８】図８は、実行データ格納部に格納されるデータの一例を示す図である。
【図９】図９は、ドライバ格納部に格納されるデータの一例を示す図である。
【図１０】図１０は、ドライバ格納部に格納されるデータの一例を示す図である。
【図１１】図１１は、ドライバコードの一例を示す図である。
【図１２】図１２は、網羅率算出処理の処理フローを示す図である。
【図１３】図１３は、実行データ格納部に格納されるデータの一例を示す図である。
【図１４】図１４は、解析処理の処理フローを示す図である。
【図１５】図１５は、実行データ格納部に格納されるデータの一例を示す図である。
【図１６】図１６は、具体値設定処理の処理フローを示す図である。
【図１７】図１７は、充足値格納部に格納されるデータの一例を示す図である。
【図１８】図１８は、実行データ格納部に格納されるデータの一例を示す図である。
【図１９】図１９は、ドライバ格納部に格納されるデータの一例を示す図である。
【図２０】図２０は、ドライバ格納部に格納されるデータの一例を示す図である。
【図２１】図２１は、ドライバコードの一例を示す図である。
【図２２】図２２は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１３】
図３に、本実施の形態に係るシステム概要図を示す。図３の例では、例えばＬＡＮ（Local Area Network）等のネットワークを介して繰返し実行支援装置１と、シンボリック実行装置３と、判定装置５とを含む。
【００１４】
繰返し実行支援装置１は、プログラム格納部１０１と、既定値格納部１０２と、抽出部１０３と、実行データ格納部１０４と、実行パターン生成部１０５と、ドライバ生成部１０６と、ドライバ格納部１０７と、実行要求部１０８と、網羅率格納部１０９と、解析部１１０と、判定要求部１１１と、充足値格納部１１２と、出力部１１３と、出力データ格納部１１４とを含む。
【００１５】
抽出部１０３は、プログラム格納部１０１に格納されている分析対象のプログラム及び既定値格納部１０２に格納されているデータを用いて処理を行い、処理結果を実行データ格納部１０４に格納する。実行パターン生成部１０５は、実行データ格納部１０４に格納されているデータを用いて処理を行い実行パターンを生成してドライバ格納部１０７に格納したり、ドライバ生成部１０６にドライバの生成を指示する処理を行う。ドライバ生成部１０６は、ドライバ格納部１０７に格納されている実行パターンに対応するドライバコードを生成し、ドライバ格納部１０７に格納する。実行要求部１０８は、ドライバ格納部１０７に格納されているデータを用いてシンボリック実行装置３にシンボリック実行の実行要求を送信する処理等を行い、処理結果を実行データ格納部１０４及び網羅率格納部１０９に格納する。解析部１１０は、網羅率格納部１０９及び実行データ格納部１０４に格納されているデータを用いて処理を行い、処理結果を判定要求部１１１に通知したり、処理結果を出力データ格納部１１３に格納する処理等を行う。判定要求部１１１は、判定装置５に充足値の生成指示を送信したり、実行データ格納部１０４に格納されているデータを更新する処理等を行う。出力部１１４は、出力データ格納部１１３に格納されているデータを表示装置等に表示する処理を行う。
【００１６】
シンボリック実行装置３は、実行部３１と、網羅率算出部３２とを含む。実行部３１は、既存のシンボリック実行を行うモジュールであり、例えばＪａｖａ（登録商標） ＰａｔｈＦｉｎｄｅｒの拡張であるＳｙｍｂｏｌｉｃ ＰａｔｈＦｉｎｄｅｒなどであってもよい。網羅率算出部３２は、実行部３１によるシンボリック実行の実行結果を用いて、コード網羅率（例えばブランチカバレッジ）を算出する。網羅率算出部３２は、例えばＥｃｌＥｍｍａ（http://www.eclemma.org/）を用いればよい。なお、シンボリック実行部３１及び網羅率算出部３２は、例えばｅｃｌｉｐｓｅ（http://www.eclipse.org/）上で実現するようにしてもよい。
【００１７】
判定装置５は、充足可能性判定を行う装置（例えばＳＡＴ（SATisfiability）ソルバやＳＭＴ（Satisfiability Modulo Theory）ソルバ等）であり、繰返し実行支援装置１における判定要求部１１１からの要求に応じてパスコンディション（論理制約とも呼ばれる）を満たす充足値を生成する。例えば「（10≧x）and（5≦x）」というパスコンディションを充足する充足値の生成を要求された場合、充足値として例えば「７」を生成する。
【００１８】
図４に、既定値格納部１０２に格納されているデータの一例を示す。図４の例では、変数の型の列と、既定値の列とが含まれる。
【００１９】
なお、本実施の形態の処理の対象となる分析対象プログラムは、図５に示したプログラムであるとする。このプログラムの制御構造及び制御フローは、図１及び図２に示したものである。本実施の形態では、図５に示したプログラムのブランチカバレッジが所定基準（例えば１００％）に達するようにシンボリック実行を行う。
【００２０】
次に、図６乃至図２１を用いて、図３に示したシステムの処理内容について説明する。まず、抽出部１０３は、プログラム格納部１０１に格納されている分析対象のプログラム（図５）から、当該分析対象のプログラムに定義されている変数及び当該変数の型を抽出し、実行データ格納部１０４に格納する（図６：ステップＳ１）。
【００２１】
図７に、ステップＳ１が行われた時点で実行データ格納部１０４に格納されているデータの一例を示す。図７の例では、変数と、変数の型とが格納されるようになっている。
【００２２】
また、抽出部１０３は、ステップＳ１において抽出された変数の型に対応する具体値を既定値格納部１０２（図４）から特定し、実行データ格納部１０４に格納する（ステップＳ３）。
【００２３】
図８に、ステップＳ３が行われた時点で実行データ格納部１０４に格納されているデータの一例を示す。図８の例では、変数と、変数の型と、具体値とが格納されるようになっている。
【００２４】
そして、実行パターン生成部１０５は、実行データ格納部１０４（図８）に格納されている変数の各々について実行パターンを生成し、ドライバ格納部１０７に格納する（ステップＳ５）。
【００２５】
図９に、ステップＳ５が行われた時点でドライバ格納部１０７に格納されているデータの一例を示す。図９の例に示したように、本実施の形態では、分析対象のプログラムに定義されている変数のうち１つをシンボル化し、残りの変数にはステップＳ３において特定した具体値を設定する。１行目の実行パターンは、変数ａがシンボル化され、変数ｂには具体値「０」が設定された実行パターンである。２行目の実行パターンは、変数ｂがシンボル化され、変数ａには具体値「０」が設定された実行パターンである。
【００２６】
そして、ドライバ生成部１０６は、ドライバ格納部１０７（図９）に格納されている実行パターンの各々に対応するドライバコードを生成し、ドライバ格納部１０７に格納する（ステップＳ７）。
【００２７】
図１０に、ステップＳ７が行われた時点でドライバ格納部１０７に格納されているデータの一例を示す。図１０の例では、実行パターンと、ドライバコードとが格納されるようになっている。ここでは、「int a=$,int b=0」という実行パターンに対してはドライバコード１が生成され、「int a=0,int b=$」という実行パターンに対してはドライバコード２が生成されている。
【００２８】
図１１に、ドライバコード１及びドライバコード２の一例を示す。本実施の形態では、図１１に示したようなドライバコードと、分析対象のプログラムとを用いて、シンボリック実行装置３においてシンボリック実行を行う。
【００２９】
図６の説明に戻り、実行要求部１０８は、網羅率算出処理を実施する（ステップＳ９）。網羅率算出処理については、図１２乃至図１４を用いて説明する。
【００３０】
まず、実行要求部１０８は、ドライバ格納部１０７に格納されているドライバコードのうち未処理のドライバコードと、プログラム格納部１０１に格納されている分析対象のプログラムとを含む実行要求をシンボリック実行装置３に送信する（図１２：ステップＳ２１）。
【００３１】
これに応じ、シンボリック実行装置３における実行部３１は、シンボリック実行を実施する。シンボリック実行では、プログラム内に定義されているパスコンディションのうちシンボル化変数が関連するパスコンディションを通過する毎に当該パスコンディションを蓄積するようになっている。例えば図１１に示したドライバコード１と分析対象プログラムとを用いてシンボリック実行を行った場合、「ａ＞０」及び「ａ≦０」というパスコンディションを蓄積する。そして、実行部３１は、蓄積されたパスコンディションを含む実行結果を繰返し実行支援装置１に送信する。
【００３２】
また、実行部３１によりシンボリック実行が行われると、網羅率算出部３２は、ブランチカバレッジを算出する。シンボリック実行装置３では、シンボリック実行時に通過したパスコンディションを実行部３１が管理テーブル（図示せず）にて管理しており、当該管理テーブルを用いて分析対象のプログラムの制御フローを把握できるようになっている。網羅率算出部３２は、この管理テーブルを用いて分析対象のプログラムの全分岐の数を取得する。図５のプログラムの場合には、全分岐の数は６となる。一方で、図５に示した分析対象プログラムに対してドライバコード１を用いてシンボリック実行を行うと、分岐Ｂ1、Ｂ2及びＢ6という３つの分岐を実行することができる。従って、ブランチカバレッジは３／６＊１００≒５０（％）となる。
【００３３】
そして、ドライバコード１を用いてシンボリック実行を行った後、さらにドライバコード２を用いてシンボリック実行を行った場合には、さらに分岐Ｂ2、Ｂ3、Ｂ5及びＢ6を実行することができる。この場合、ドライバコード１を用いたシンボリック実行の結果と併せると、分岐Ｂ1、Ｂ2、Ｂ3、Ｂ5及びＢ6を実行することができたので、ブランチカバレッジは５／６＊１００≒８３（％）となる。網羅率算出部３２は、このようにして算出したブランチカバレッジを繰返し実行支援装置１に送信する。なお、網羅率算出部３２は、実行した分岐のデータをメインメモリ等の記憶装置に格納しておき、後に再度ブランチカバレッジを算出する際に用いる。
【００３４】
一方、繰返し実行支援装置１の実行要求部１０８は、パスコンディションをシンボリック実行装置３から受信し、実行データ格納部１０４に格納すると共に、ブランチカバレッジをシンボリック実行装置３から受信し、網羅率格納部１０９に格納する（ステップＳ２３）。なお、網羅率格納部１０９には、既に受信したブランチカバレッジを更新するように新たに受信したブランチカバレッジを格納する。
【００３５】
図１３に、ステップＳ２３が行われた時点で実行データ格納部１０４に格納されているデータの一例を示す。図１３の例では、変数と、型と、具体値と、パスコンディションとが格納されるようになっている。
【００３６】
そして、実行要求部１０８は、ドライバ格納部１０７に未処理のドライバコードが有るか判断する（ステップＳ２５）。未処理のドライバコードがあると判断された場合（ステップＳ２５：Ｙｅｓルート）、未処理のドライバコードについて処理するため、ステップＳ２１に戻る。一方、ドライバ格納部１０７に未処理のドライバコードが無いと判断された場合（ステップＳ２５：Ｎｏルート）、元の処理に戻る。
【００３７】
以上のようにしてブランチカバレッジを取得することにより、分析対象のプログラムのテストを完了するか判断できるようになる。また、シンボル化する変数が１つであるので、例えば乗算等の非線形演算を含むプログラムであってもシンボリック実行によるプログラムテストを行うことができるようになる。
【００３８】
図６の説明に戻り、解析部１１０は、網羅率格納部１０９に格納されているブランチカバレッジが１００％であるか判断する（ステップＳ１１）。なお、１００％ではなく、予め定められた所定の基準値以上であるか判断するようにしてもよい。
【００３９】
そして、ブランチカバレッジが１００％である場合（ステップＳ１１：Ｙｅｓルート）、解析部１１０は、プログラムテストが完了したことを表すテスト完了メッセージを生成し、出力データ格納部１１３に格納する（ステップＳ１７）。そして、出力部１１４は、出力データ格納部１１３に格納されているテスト完了メッセージを表示装置に表示する。そして処理を終了する。
【００４０】
一方、ブランチカバレッジが１００％ではない場合（ステップＳ１１：Ｎｏルート）、解析部１１０は、解析処理を実施する（ステップＳ１３）。解析処理については、図１４及び図１５を用いて説明する。
【００４１】
まず、解析部１１０は、実行データ格納部１０４に格納されている変数のうち未処理の変数（以下、処理対象の変数と呼ぶ）を１つ特定する（図１４：ステップＳ４１）。そして、解析部１１０は、実行データ格納部１０４に、処理対象の変数に対応するパスコンディションが格納されているか判断する（ステップＳ４３）。処理対象の変数に対応するパスコンディションが格納されていないと判断された場合（ステップＳ４３：Ｎｏルート）、解析部１１０は、処理対象の変数に対応付けて判定フラグ「−１」を実行データ格納部１０４に格納する（ステップＳ４５）。
【００４２】
一方、処理対象の変数に対応するパスコンディションが格納されていると判断された場合（ステップＳ４３：Ｙｅｓルート）、解析部１１０は、処理対象の変数に対応するパスコンディションのうち未処理のパスコンディション（以下、処理対象のパスコンディションと呼ぶ）を１つ特定する（ステップＳ４７）。
【００４３】
そして、解析部１１０は、処理対象の変数に設定した具体値を実行データ格納部１０４から特定し、当該具体値が処理対象のパスコンディションを充足するか判断する（ステップＳ４９）。処理対象の変数に設定した具体値が処理対象のパスコンディションを充足すると判断された場合（ステップＳ４９：Ｙｅｓルート）、解析部１１０は、処理対象のパスコンディションに対応付けて判定フラグ「ｔｒｕｅ」を実行データ格納部１０４に格納する（ステップＳ５１）。一方、処理対象の変数に設定した具体値が処理対象のパスコンディションを充足しないと判断された場合（ステップＳ４９：Ｎｏルート）、解析部１１０は、処理対象のパスコンディションに対応付けて判定フラグ「ｆａｌｓｅ」を実行データ格納部１０４に格納する（ステップＳ５３）。
【００４４】
図１５に、ステップＳ５３が行われた時点で実行データ格納部１０４に格納されているデータの一例を示す。図１５の例では、変数と、型と、具体値と、パスコンディションと、判定フラグとが格納されるようになっている。
【００４５】
そして、解析部１１０は、処理対象の変数について未処理のパスコンディションが有るか判断する（ステップＳ５５）。未処理のパスコンディションが有ると判断された場合（ステップＳ５５：Ｙｅｓルート）、未処理のパスコンディションについて処理するため、ステップＳ４７の処理に戻る。
【００４６】
一方、未処理のパスコンディションが無いと判断された場合（ステップＳ５５：Ｎｏルート）、解析部１１０は、実行データ格納部１０４に未処理の変数が有るか判断する（ステップＳ５７）。未処理の変数が有ると判断された場合（ステップＳ５７：Ｙｅｓルート）、未処理の変数について処理するため、ステップＳ４１の処理に戻る。
【００４７】
一方、未処理の変数が無いと判断された場合（ステップＳ５７：Ｎｏルート）、解析部１１０は、判定フラグ「ｆａｌｓｅ」が対応付けられているパスコンディションが実行データ格納部１０４に格納されているか判断する（ステップＳ５９）。判定フラグ「ｆａｌｓｅ」が対応付けられているパスコンディションが実行データ格納部１０４に格納されていないと判断された場合（ステップＳ５９：Ｎｏルート）、後で説明する具体値設定処理を行うことはできないため、処理は端子Ａを介して終了する。一方、判定フラグ「ｆａｌｓｅ」が対応付けられているパスコンディションが実行データ格納部１０４に格納されていると判断された場合（ステップＳ５９：Ｙｅｓルート）、元の処理に戻る。
【００４８】
以上のような処理を実施することにより、既に行われたシンボリック実行において設定されていた具体値によっては充足できないパスコンディションを特定することができるようになる。
【００４９】
図６の説明に戻り、判定要求部１１１は、具体値設定処理を実施する（ステップＳ１５）。具体値設定処理については、図１６乃至図１８を用いて説明する。
【００５０】
まず、判定要求部１１１は、実行データ格納部１０４から未処理の変数（以下、処理対象の変数と呼ぶ）を１つ特定する（図１６：ステップＳ７１）。そして、判定要求部１１１は、処理対象の変数に判定フラグ「−１」が設定されているか判断する（ステップＳ７３）。すなわち、処理対象の変数に関連するパスコンディションが存在するか判断する。処理対象の変数に判定フラグ「−１」が設定されていると判断された場合（ステップＳ７３：Ｙｅｓルート）、ステップＳ７７の処理に移行する。
【００５１】
一方、処理対象の変数に判定フラグ「−１」が設定されていないと判断された場合（ステップＳ７３：Ｎｏルート）、判定要求部１１１は、処理対象の変数に関連するパスコンディションに判定フラグ「ｆａｌｓｅ」が設定されているか判断する（ステップＳ７５）。処理対象の変数に関連するパスコンディションに判定フラグ「ｆａｌｓｅ」が設定されていないと判断された場合（ステップＳ７５：Ｎｏルート）、判定要求部１１１は、元の具体値（ステップＳ３において特定した具体値）を処理対象の変数に対応付けて充足値格納部１１２に格納する（ステップＳ７７）。
【００５２】
一方、処理対象の変数に関連するパスコンディションに判定フラグ「ｆａｌｓｅ」が設定されていると判断された場合（ステップＳ７５：Ｙｅｓルート）、判定要求部１１１は、処理対象の変数、当該変数の型及び判定フラグが「ｆａｌｓｅ」であるパスコンディションを含む判定要求を判定装置５に送信する（ステップＳ７９）。
【００５３】
なお、ステップＳ７９の処理に応じ、判定装置５は、受信したパスコンディションを充足する具体値を生成する処理を行う。例えば型が「int」（整数）である変数ａについてパスコンディション「ａ＞０」を充足する具体値を生成する場合、判定装置５は例えば「１」を生成する。そして、判定装置５は、生成した具体値を含む判定結果を繰返し実行支援装置１に送信する。
【００５４】
一方、繰返し実行支援装置１の判定要求部１１１は、生成された具体値を含む判定結果を判定装置５から受信し（ステップＳ８１）、充足値格納部１１２に格納する（ステップＳ８３）。
【００５５】
図１７に、ステップＳ８３が行われた時点で充足値格納部１１２に格納されているデータの一例を示す。図１７の例では、変数と、変数の型と、パスコンディションと、具体値とが格納されるようになっている。なお、ステップＳ７７の処理が行われた変数については、パスコンディションの列にはデータは格納されない。
【００５６】
そして、判定要求部１１１は、実行データ格納部１０４に未処理の変数が有るか判断する（ステップＳ８５）。未処理の変数が有ると判断された場合（ステップＳ８５：Ｙｅｓルート）、未処理の変数について処理を実施するため、ステップＳ７１の処理に戻る。一方、未処理の変数が無いと判断された場合（ステップＳ８５：Ｎｏルート）、判定要求部１１１は、充足値格納部１１２に格納されている変数、型及び具体値で実行データ格納部１０４を更新する（ステップＳ８７）。そして、元の処理に戻る。
【００５７】
図１８に、ステップＳ８７が行われた時点で実行データ格納部１０４に格納されているデータの一例を示す。図１８の例では、変数と、変数の型と、具体値とが格納されるようになっている。
【００５８】
以上のようにして生成された具体値を用いて再度シンボリック実行を行えば、既に行われたシンボリック実行によっては実行できなかったパスを実行できるようになり、コード網羅率を高くすることができるようになる。
【００５９】
具体値設定処理（Ｓ１５）が行われると、処理はステップＳ５に戻り、新たに設定した具体値を用いて再び上で述べたような処理が行われる。以下では、処理がステップＳ５に戻った後、ステップＳ１１において「ブランチカバレッジが１００％」であると判断されるまでに行われる処理を簡単に説明する。
【００６０】
まず、実行パターン生成部１０５は、実行データ格納部１０４（図１８）に格納されている変数の各々について実行パターンを生成し、ドライバ格納部１０７に格納する（ステップＳ５）。
【００６１】
図１９に、ステップＳ５の処理が行われた時点でドライバ格納部１０７に格納されているデータの一例を示す。１行目の実行パターンは、変数ａがシンボル化され、変数ｂには具体値「１」（ステップＳ１５において生成された具体値）が設定された実行パターンである。２行目の実行パターンは、変数ｂがシンボル化され、変数ａには具体値「１」（ステップＳ１５において生成された具体値）が設定された実行パターンである。
【００６２】
そして、ドライバ生成部１０６は、ドライバ格納部１０７（図１９）に格納されている実行パターンの各々に対応するドライバコードを生成し、ドライバ格納部１０７に格納する（ステップＳ７）。
【００６３】
図２０に、ステップＳ７が行われた時点でドライバ格納部１０７に格納されているデータの一例を示す。図２０の例では、実行パターンと、ドライバコードとが格納されるようになっている。ここでは、「int a=$,int b=1」という実行パターンにはドライバコード３が生成され、「int a=1,int b=$」という実行パターンにはドライバコード４が生成されている。なお、図２１は、ドライバコード３及びドライバコード４の一例を示す図である。
【００６４】
そして、実行要求部１０８は、網羅率算出処理を実施する（ステップＳ９）。網羅率算出処理については、図１２乃至図１４を用いて説明したとおりである。ここでは、ドライバコード３を用いてシンボリック実行を行うと、分岐Ｂ1、Ｂ2、Ｂ3、Ｂ4及びＢ5を実行することができる。また、ドライバコード４を用いてシンボリック実行を行うと、分岐Ｂ1、Ｂ3、Ｂ4及びＢ6を実行することができる。そして、再度網羅率を算出する際には、上で述べたように、既に行ったシンボリック実行の実行結果と今回行ったシンボリック実行の実行結果とを用いる。既に行ったシンボリック実行では分岐Ｂ1、Ｂ2、Ｂ3、Ｂ5及びＢ6を実行しており、今回行ったシンボリック実行ではＢ4を新たに実行している。従って、ブランチカバレッジは６／６＊１００＝１００（％）となる。
【００６５】
そして、解析部１１０は、ブランチカバレッジが１００％であるか判断する（ステップＳ１１）。ここでは、ブランチカバレッジが１００％であると判断されるので（ステップＳ１１：Ｙｅｓルート）、処理はステップＳ１７を経て終了する。
【００６６】
以上のような処理を実施することにより、ブランチカバレッジが基準値を満たすようなテストをシンボリック実行を用いて効率的に行うことができるようになる。
【００６７】
以上本技術の一実施の形態を説明したが、本技術はこれに限定されるものではない。例えば、上で説明した繰返し実行支援装置１及びシンボリック実行装置３の機能ブロック図は必ずしも実際のプログラムモジュール構成に対応するものではない。また、１台ではなく複数台のコンピュータで機能を分担するようにしてもよい。
【００６８】
また、上で説明した各テーブルの構成は一例であって、必ずしも上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【００６９】
また、上で述べた例では、ブランチカバレッジを１００％にするための処理について説明したが、ステートメントカバレッジやコンディションカバレッジ等についても同様の処理にて対応することができる。
【００７０】
また、繰返し実行支援装置１、シンボリック実行装置３及び判定装置５は一体であってもよい。
【００７１】
なお、上で述べた繰返し実行支援装置１、シンボリック実行装置３及び判定装置５は、コンピュータ装置であって、図２２に示すように、メモリ２５０１とＣＰＵ２５０３とハードディスク・ドライブ（ＨＤＤ）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【００７２】
なお、図３に示した抽出部１０３及び実行パターン生成部１０５等の各処理部は、ＣＰＵ２５０３及びプログラムの組み合わせ、すなわち、ＣＰＵ２５０３がプログラムを実行することにより実現してもよい。より具体的には、ＣＰＵ２５０３は、ＨＤＤ２５０５又はメモリ２５０１に記憶されたプログラムに従った動作を行うことで、上で述べたような処理部として機能してもよい。
【００７３】
また、図３に示したプログラム格納部１０１及び既定値格納部１０２等の各データ格納部は、図２２におけるメモリ２５０１やＨＤＤ２５０５等として実現してもよい。
【００７４】
以上述べた本技術の実施の形態をまとめると以下のようになる。
【００７５】
本繰返しシンボリック実行方法は、（Ａ）シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる第１実行ステップと、（Ｂ）分析対象プログラムのコード網羅率（例えばブランチカバレッジやステートメントカバレッジ等）をシンボリック実行部から取得し、実行結果格納部に格納する取得ステップと、（Ｃ）実行結果格納部に格納されているコード網羅率が所定の基準を満たすか判断するステップと、（Ｄ）コード網羅率が所定の基準を満たすと判断された場合、分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納するステップとを含む。
【００７６】
上で述べた方法では、従来のように全ての変数をシンボル化して一度にシンボリック実行を実施するのではなく、カバレッジは低いが高速に処理可能な個別のシンボリック実行を繰り返し実行するようになっている。但し、個別のシンボリック実行のカバレッジを累積した結果であるコード網羅率が所定の基準を満たせばテストとして十分であり、全ての変数をシンボル化して一度にシンボリック実行を行う場合のように、当該シンボリック実行内において余分なテストを行ってしまうというような事態が抑制されることが期待される。従って、プログラムのテストが効率化される。
【００７７】
また、上で述べた取得ステップが、第１実行ステップにおけるシンボリック実行により得られるパスコンディションのデータをシンボリック実行部から取得し、実行結果格納部に格納するステップを含むようにしてもよい。そして、上で述べた本方法は、（Ｅ）実行結果格納部に格納されているパスコンディションの各々について、分析対象プログラムに定義されている変数毎に当該変数に設定した具体値が格納されているデータ格納部から、当該パスコンディションに関連する変数に設定した具体値を特定し、特定された当該具体値が当該パスコンディションを充足するという条件を満たすか判断する判断ステップと、（Ｆ）判断ステップにおいて条件を満たさないと判断されたパスコンディションを充足する具体値を生成する生成ステップと、（Ｇ）シンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ条件を満たさないと判断されたパスコンディションに関連する変数に具体値を設定する場合には生成ステップにおいて生成された具体値を設定して繰り返しシンボリック実行を行わせる第２実行ステップと、（Ｈ）第１実行ステップの実行結果と第２実行ステップの実行結果とを用いて算出されたコード網羅率である累積コード網羅率をシンボリック実行部から取得し、実行結果格納部に格納するステップと、（Ｉ）実行結果格納部に格納されている累積コード網羅率が所定の基準を満たすか判断するステップと、（Ｊ）累積コード網羅率が所定の基準を満たすと判断された場合、分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納するステップとをさらに含むようにしてもよい。このようにすれば、既に行ったシンボリック実行によっては実行できていないパスを実行できるようになるので、累積コード網羅率を高くすることができる。
【００７８】
また、上で述べた第１実行ステップ及び第２実行ステップにおいて、シンボル化対象の変数を１つとし、分析対象プログラムに定義されている全ての変数をカバーするように当該シンボル化対象の変数を変化させるようにしてもよい。このように、シンボル化対象の変数を１つとすれば、非線形演算（例えば変数同士の乗算等）を含むプログラムであってもシンボリック実行を行うことができるようになる。
【００７９】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【００８０】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００８１】
（付記１）
シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる第１実行ステップと、
前記分析対象プログラムのコード網羅率を前記シンボリック実行部から取得し、実行結果格納部に格納する取得ステップと、
前記実行結果格納部に格納されている前記コード網羅率が所定の基準を満たすか判断するステップと、
前記コード網羅率が前記所定の基準を満たすと判断された場合、前記分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納するステップと、
を含み、コンピュータにより実行される繰返しシンボリック実行方法。
【００８２】
（付記２）
前記取得ステップが、
前記第１実行ステップにおけるシンボリック実行により得られるパスコンディションのデータを前記シンボリック実行部から取得し、前記実行結果格納部に格納するステップ
を含み、
前記実行結果格納部に格納されているパスコンディションの各々について、前記分析対象プログラムに定義されている変数毎に当該変数に設定した具体値が格納されているデータ格納部から、当該パスコンディションに関連する変数に設定した具体値を特定し、特定された当該具体値が当該パスコンディションを充足するという条件を満たすか判断する判断ステップと、
前記判断ステップにおいて前記条件を満たさないと判断されたパスコンディションを充足する具体値を生成する生成ステップと、
前記シンボリック実行部に対して、前記分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させ、前記条件を満たさないと判断されたパスコンディションに関連する変数に具体値を設定する場合には前記生成ステップにおいて生成された具体値を設定して繰り返しシンボリック実行を行わせる第２実行ステップと、
前記第１実行ステップの実行結果と前記第２実行ステップの実行結果とを用いて算出されたコード網羅率である累積コード網羅率を前記シンボリック実行部から取得し、前記実行結果格納部に格納するステップと、
前記実行結果格納部に格納されている前記累積コード網羅率が前記所定の基準を満たすか判断するステップと、
前記累積コード網羅率が前記所定の基準を満たすと判断された場合、前記分析対象プログラムのテストが完了したことを表すデータを前記出力データ格納部に格納するステップと、
をさらに含む付記１記載の繰返しシンボリック実行方法。
【００８３】
（付記３）
前記第１実行ステップ及び前記第２実行ステップにおいて、シンボル化対象の変数を１つとし、前記分析対象プログラムに定義されている全ての変数をカバーするように当該シンボル化対象の変数を変化させる
ことを特徴とする付記２記載の繰返しシンボリック実行方法。
【００８４】
（付記４）
シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる実行部と、
前記分析対象プログラムのコード網羅率を前記シンボリック実行部から取得し、実行結果格納部に格納する取得部と、
前記実行結果格納部に格納されている前記コード網羅率が所定の基準を満たすか判断し、前記コード網羅率が前記所定の基準を満たすと判断された場合に、前記分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納する判断部と、
を有する繰返しシンボリック実行装置。
【００８５】
（付記５）
シンボリック実行を実施するシンボリック実行部に対して、分析対象プログラムに定義されている全ての変数をカバーするようにシンボル化対象の変数を変化させつつ繰り返しシンボリック実行を行わせる第１実行ステップと、
前記分析対象プログラムのコード網羅率を前記シンボリック実行部から取得し、実行結果格納部に格納する取得ステップと、
前記実行結果格納部に格納されている前記コード網羅率が所定の基準を満たすか判断するステップと、
前記コード網羅率が前記所定の基準を満たすと判断された場合、前記分析対象プログラムのテストが完了したことを表すデータを出力データ格納部に格納するステップと、
を、コンピュータに実行させるための繰返しシンボリック実行プログラム。
【符号の説明】
【００８６】
１  繰返し実行支援装置    １０１  プログラム格納部
１０２  既定値格納部    １０３  抽出部
１０４  実行データ格納部    １０５  実行パターン生成部
１０６  ドライバ生成部    １０７  ドライバ格納部
１０８  実行要求部    １０９  網羅率格納部
１１０  解析部    １１１  判定要求部
１１２  充足値格納部    １１３  出力データ格納部
１１４  出力部    ３  シンボリック実行装置
３１  実行部    ３２  網羅率算出部
５  判定装置
【図１】
0005505227.tif 000002
【図２】
0005505227.tif 000003
【図３】
0005505227.tif 000004
【図４】
0005505227.tif 000005
【図５】
0005505227.tif 000006
【図６】
0005505227.tif 000007
【図７】
0005505227.tif 000008
【図８】
0005505227.tif 000009
【図９】
0005505227.tif 000010
【図１０】
0005505227.tif 000011
【図１１】
0005505227.tif 000012
【図１２】
0005505227.tif 000013
【図１３】
0005505227.tif 000014
【図１４】
0005505227.tif 000015
【図１５】
0005505227.tif 000016
【図１６】
0005505227.tif 000017
【図１７】
0005505227.tif 000018
【図１８】
0005505227.tif 000019
【図１９】
0005505227.tif 000020
【図２０】
0005505227.tif 000021
【図２１】
0005505227.tif 000022
【図２２】
0005505227.tif 000023