(57)【要約】【課題】バックトラック後に移行する別経路のノードにおいて適切に入出力処理をすること。【解決手段】作成部１１１は、クラス１２１から作成された複数のモデルクラス１２２に基づき、実行ツリーを作成する。判断部１１２は、ノードにおいて書込処理または読込処理が含まれる場合にシンボル変数が含まれるか否かを判断する。格納部１１３は、対象ファイル１２３に対して書込処理を実行する。格納部１１３は、対象ファイル１２３に書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０に記憶する。取得部１１４は、バックトラックして他の経路に移行した後に読込処理を実行する際、ノードに対応する退避ファイル１２４に対して読込処理を実行する。実行部１１５は、実行ツリーにおいてノードを探索する。実行部１１５は、書込処理および読込処理以外のメソッドを実行する。【選択図】図５
2015064696.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
第一のノードで作成した第一のファイルに対して、他ノードにおいて該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを記憶部に格納し、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードにおいて、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する
処理を実行することを特徴とするシンボリック実行方法。
【請求項２】
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、前記第二のファイルを前記第一のファイルに反映し、
前記第二の経路で最初に前記第一のファイルにシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する第二のノードにおいて、前記第一のファイルに対して前記シンボリック変数に格納された値または前記所定の値を書き込む処理を、さらに実行することを特徴とする請求項１に記載のシンボリック実行方法。
【請求項３】
前記書込処理において書き込む内容にシンボル変数が含まれているか否か、または前記読込処理において読み込む内容にシンボル変数が含まれているか否かを判断する処理をさらに実行することを特徴とする請求項１又は２に記載のシンボリック実行方法。
【請求項４】
前記第一の経路上にある前記第一のノードの子ノードから前記第一のノードにバックトラックする際に、前記記憶部に格納されており、前記子ノードに対応する前記第二のファイルを削除することを特徴とする請求項１〜３のいずれか一に記載のシンボリック実行方法。
【請求項５】
各ノードにおいてシンボリック変数に格納された値または所定の値を書き込む書込処理が実行された第一のファイルと、前記書込処理を実行する前の前記第一のファイルを複製した第二のファイルとを記憶する記憶部と、
第一のノードで作成された前記第一のファイルに対して、他ノードにおいて該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを前記記憶部に格納する格納部と、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードが、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する取得部と
を有することを特徴とするシンボリック実行装置。
【請求項６】
コンピュータに、
第一のノードで作成された第一のファイルに対して、他ノードにおいて該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを記憶部に格納し、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードが、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する
処理を実行させることを特徴とするシンボリック実行プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シンボリック実行方法、シンボリック実行装置、およびシンボリック実行プログラムに関する。
【背景技術】
【０００２】
シンボリック実行技術とは、プログラム中の変数を具体化せず、シンボル変数のままでプログラムにおける処理を実行する技術である。一般的に、プログラムは冒頭部分においてシンボル変数ａが整数型で、シンボル変数ｂが浮動小数点数型である等のようにシンボル変数のデータ型を定義する。また、プログラムは処理部分においてプログラム文中に記述されている具体的な値をシンボル変数に挿入することがある。さらに、プログラムは外部のテキストファイル等を読込んで取得した値をシンボル変数に挿入することもある。
【０００３】
一方、処理装置がシンボリック実行技術をモデル検査エンジンに実行させる場合、モデル検査エンジンは、シンボル変数に具体的な値を挿入せずに、変数が満たすべき条件、いわゆるパス条件を記憶部に保持する。モデル検査エンジンは、プログラムのソースコードに対して具体的なテストデータを与えなくてもシンボル変数のまま、プログラムでなされる様々な動作を実行するプログラムである。モデル検査エンジンは、プログラムに記述されているパス条件を全て実行するためのテストデータを生成する。そして、モデル検査エンジンは生成したテストデータを使用してプログラムをテストすることにより、当該プログラムが指定されたアプリケーションの仕様を満たしているか否かを確認する。なお、モデル検査エンジンの例としては、ＪＡＶＡ（登録商標）で記述されたプログラミングに対してはＪＰＦ（Java  Path  Finder）が挙げられる。以下、モデル検査エンジンの処理について説明する。
【０００４】
図１は、条件式を有するプログラムの第１の例を示す図である。また、図２は、第１の例に係るプログラムにおける処理を模式的に示した説明図である。図２を用いてモデル検査エンジンの処理について具体的に説明する。図１のプログラムにおいて、プログラムは、（１）の部分でシンボル変数であるａ、ｂ、およびｃのデータ型がint型であることを定義している。また、プログラムは（２）の部分に第一の条件式「if(a>5)」を含む。この第一の条件式は図２の(i)の分岐に対応する。プログラムは(i)の分岐においてａが５より大きい場合に、左側の経路の「a=a+1」の処理（ステップＳ１０）と後述する第二の条件式とを実行する。一方、プログラムは(i)の分岐においてａが５以下の場合に、右側の経路の「a=a+2」の処理（ステップＳ１３）を実行する。
【０００５】
プログラムは（３）の部分に第二の条件式「if(a==0)」を含む。第二の条件式は図２の(ii)の分岐に対応する。プログラムは、(ii)の分岐でａが０である場合に、左側の経路の「a=a+b」の処理（ステップＳ１１）を実行する。一方、プログラムは、(ii)の分岐でａが０以外である場合に、右側の経路の「a=a+c」の処理（ステップＳ１２）を実行する。次いで、プログラムは（４）の部分で第三の条件式「if(b<=0)」を含む。第三の条件式は図２の(iii)の分岐に対応する。プログラムは、(iii)の分岐でｂが０以下である場合に、左側の経路の「b=b-1」の処理（ステップＳ１４）を実行する。一方、プログラムは、(iii)の分岐でｂが０より大きい場合に、右側の経路の「b=b+3」の処理（ステップＳ１５）を実行する。
【０００６】
ここで、当該プログラムにおいて第二の条件式は、図１に示されるように第一の条件式の入れ子になっている。図２によると、プログラムは第一の条件式に対応する(i)の分岐においてａが５より大きい場合に、第二の条件式に対応する(ii)の分岐に到達する。次いで、プログラムは(ii)の分岐においてａが０の場合に左側の経路に移行する。ここで、シンボリック変数ａは(i)の分岐で５より大きいという条件と、(ii)の分岐でａが０であるという条件とを同時に満たすことができないので、プログラムが(ii)の分岐で左側の経路に進むことはない。モデル検査エンジンはこのような実行不可能なパスを検出する。
【０００７】
また、モデル検査エンジンはシンボリック実行により図１のプログラムの正当性を検証する際、各経路におけるパス条件を保持する。例えば、図２においてモデル検査エンジンは(i)の右側と(iii)の左側の経路を探索した場合にパス条件「(a<=5)  AND  (b<=0)」を保持する。
【０００８】
また、モデル検査エンジンは(i)の左側と(ii)の左側と(iii)の左側の経路を探索した場合に、パス条件「(a>5)  AND  (a==0)  AND  (b<=0)」を保持する。このとき、モデル検査エンジンは当該パス条件に矛盾があり、テストケースを作成することができないのでプログラムに実行不可能なパスがあることを検知する。なお、モデル検査エンジンはパス条件「(a>5)  AND  (a==0)  AND  (b>0)」の経路についても同様に実行不可能なパスとして検知する。このようにして、モデル検査エンジンはプログラムに含まれるパス条件の正当性を検証する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１１−０１３７９２号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、バックトラック後に移行する別経路のノードにおいて、シンボル変数値を格納した対象ファイルに対して適切に入出力処理をすることができないという問題がある。
【００１１】
モデル検査エンジンは、検査対象のプログラムに基づき、複数のノードで構成される実行ツリーを作成する。次いで、モデル検査エンジンは、作成した実行ツリーを深さ優先探索し、各ノードにおける処理を実行していく。モデル検査エンジンは、実行ツリーの各ノードを探索するとき、まず、実行ツリーの一つの経路における葉ノードまでを優先して探索する。モデル検査エンジンは、葉ノードに至るまでに対象ファイルに入出力処理があった場合、適宜、対象ファイルに対して書込処理または読込処理を実行する。そして、モデル検査エンジンは、実行ツリーの末端にある葉ノードに到達したとき、ノードから経路に分岐を有するノードまでバックトラックして別経路を探索する。モデル検査エンジンは、バックトラックする際に、書込処理により変更された対象ファイルをバックトラック前の状態に戻そうとする。ところが、モデル検査エンジンがバックトラックする際に、対象ファイルがバックトラック前の状態に戻っていないことがある。例えば、モデル検査エンジンがバックトラックすることにより、対象ファイルの状態が書込前の状態に戻ったのに対象ファイルの書込みが削除されないで残る場合がある。このため、モデル検査エンジンがバックトラックして別経路に移行する際に、当該別経路の各ノードにおいて正しい結果が得られないことがある。
【００１２】
一つの側面では、バックトラック後に移行する別経路のノードにおいて適切に入出力処理をすることができるシンボリック実行方法、シンボリック実行装置、およびシンボリック実行プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
第１の案では、シンボリック実行方法ではコンピュータが以下の処理を実行する。コンピュータが、第一のノードで第一のファイルに対して、該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、第一のファイルを複製した第二のファイルを記憶部に格納する処理を実行させる。コンピュータが、第一のノードを経由する第一の経路から第一のノードにバックトラックして、第一のノードを経由する第二の経路に移行する処理を実行させる。このとき、コンピュータが、該第二の経路で最初に第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードにおいて、読込処理を実行する際に第二のファイルからシンボル変数値を取得する処理を実行させる。
【発明の効果】
【００１４】
バックトラック後に探索する別経路のノードにおいて適切に入出力処理をすることができる。
【図面の簡単な説明】
【００１５】
【図１】図１は、条件式を有するプログラムの第１の例を示す図である。
【図２】図２は、第１の例に係るプログラムにおける処理を模式的に示した説明図である。
【図３】図３は、対象ファイルへの書込処理または読込処理を有するプログラムの第２の例を示す図である。
【図４】図４は、第２の例に係るプログラムにおける処理の一部を模式的に示した説明図である。
【図５】図５は、処理装置の構成を示す機能ブロック図の一例を示す説明図である。
【図６】図６は、シンボル変数リストのデータ構造の一例を示す図である。
【図７】図７は、ファイル入出力テーブルのデータ構造の一例を示す図である。
【図８】図８は、バックトラック管理テーブルのデータ構造の一例を示す図である。
【図９】図９は、本実施形態に係る実行ツリーの第１の模式図を示す図である。
【図１０】図１０は、ファイルへの書込処理または読込処理を有するプログラムの第３の例を示す図である。
【図１１】図１１は、本実施形態に係る実行ツリーの第２の模式図を示す図である。
【図１２】図１２は、ノード１に状態が移行した際のバックトラック管理テーブルの一例を示す図である。
【図１３】図１３は、ノード３に状態が移行した際のバックトラック管理テーブルの一例を示す図である。
【図１４】図１４は、ノード４に状態が移行した際のバックトラック管理テーブルの一例を示す図である。
【図１５】図１５は、ノード６に状態が移行した際のバックトラック管理テーブルの一例を示す図である。
【図１６】図１６は、ノード７に状態が移行した際のバックトラック管理テーブルの一例を示す図である。
【図１７】図１７は、各ノードにおける処理の流れの一例を示したフロー図である。
【図１８】図１８は、処理装置のハードウェア構成の一例を示す図である。
【発明を実施するための形態】
【００１６】
以下に、本願の開示するシンボリック実行方法、シンボリック実行装置、およびシンボリック実行プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの権利が限定されるものではない。各実施例は、処理内容を矛盾させない範囲で適宜組み合わせることが可能である。
【実施例１】
【００１７】
（ファイル書込、読込処理を含む場合のシンボル変数の引継ぎ）
プログラムは、テキストファイルから値を読込み、読込んだ値をプログラム内で使用するシンボル変数に挿入する場合がある。図３は、対象ファイルへの書込処理または読込処理を有するプログラムの第２の例を示す図である。図３のプログラムはＪＡＶＡで記述されている。図３のプログラムにおいて（１）の部分は、シンボリック変数であるａおよびｂのデータ型がint型であることを定義している。（２）の部分と（７）の部分とは対応しており、（２）の「try｛｝」括弧中の処理に例外が発生した場合に（７）の「catch｛｝」括弧中の処理をおこなう。図３に記載の（３）以降のプログラムの処理に関する詳細は、次に図４の模式図を用いて具体的に説明する。
【００１８】
図４は、第２の例に係るプログラムにおける処理の一部を模式的に示した説明図である。図３の（３）から（７）の部分の処理は図４に示される。プログラムは（３）の部分に第一の条件式「if(b==0)」を含む。第一の条件式は図４の(i)の分岐に対応する。プログラムは、(i)の分岐でｂが０である場合に、左側の経路の「b=b-2」の処理（ステップＳ２１）を実行する。一方、プログラムは、(i)の分岐でｂが０以外である場合に、右側の経路の「b=b+10」の処理（ステップＳ２２）を実行する。次いで、プログラムは、（４）の部分でシンボル変数ｂに挿入されている値をテキストファイル等の対象ファイルに書き込む処理をおこなう（ステップＳ２３）。次いで、プログラムは、（５）の部分で対象ファイルに書き込まれた値を読み取る処理をおこなう（ステップＳ２４）。プログラムは（６）の部分で第二の条件式「if(dis.readInt()<5)」を含む。第二の条件式は図４の(ii)の分岐に対応する。プログラムは、(ii)の分岐でｂが５より小さい場合に、左側の経路の「a=a-1」の処理（ステップＳ２５）を実行する。一方、プログラムは(ii)の分岐でｂが５以上の場合に、右側の経路の「a=a+1」の処理（ステップＳ２６）を実行する。次いで、プログラムは、（７）の部分で「try｛｝」括弧中の処理に例外が生じた場合にスタックトレースを出力する（ステップＳ２７）。なお、スタックトレースは、例外が発生したメソッド名と各メソッドが格納されている対象ファイルのファイル名等の情報を含む。
【００１９】
すなわち、図３のプログラムは、図４のステップＳ２１またはステップＳ２２の処理が終了した後、シンボル変数ｂを対象ファイルに書き込むことにより、シンボル変数ｂを永続化させる。しかし、モデル検査エンジンは、ステップＳ２４において対象ファイルから値を読み込む際にファイル出力されたｂの値がシンボル値であることを認識できない。このため、モデル検査エンジンが生成したテストケースには、第一の条件式「if(b==0)」が考慮されるので「b=0」と「b=1」とは含まれるが、第二の条件式「if(dis.readInt()<5)」は考慮されないので「b=5」は含まれないことになる。つまり、モデル検査エンジンは、プログラムに含まれる入出力処理によりシンボル変数が永続化された場合に、入出力処理前に宣言されたシンボル変数を、入出力処理後に認識できない。したがって、図４の(ii)の分岐に係るパス条件を検証するためのテストケースを生成できないという問題がある。
【００２０】
（処理装置の構成）
次に、処理装置１００の機能構成について説明する。図５は、処理装置の構成を示す機能ブロック図である。処理装置１００は、処理対象のプログラムに含まれるパス条件の正当性を検証することにより、処理対象のプログラムが、指定されたアプリケーションの仕様を満たしているかを確認する。処理装置１００は入力部１０１と、出力部１０２と、制御部１１０と、記憶部１２０とを有する。入力部１０１は、処理装置１００を操作するためのキーボード、マウス等の入力機器である。出力部１０２は、処理装置１００における処理結果を出力するためのモニタ、プリンタ等の出力機器である。
【００２１】
（処理装置の記憶部の各構成）
図５に示すように処理装置１００の記憶部１２０はクラス１２１と、モデルクラス１２２と、対象ファイル１２３と、退避ファイル１２４と、シンボル変数リスト１２５とを記憶する。さらに、記憶部１２０はファイル入出力テーブル１２６と、バックトラック管理テーブル１２７と、パス条件１２８とを記憶する。記憶部１２０は例えば、ＲＡＭ（Random  Access  Memory）、ＲＯＭ（Read  Only  Memory）、フラッシュメモリ（Flash  Memory）などの半導体メモリ素子、ハードディスクや光ディスクなどの記憶装置に対応する。
【００２２】
クラス１２１は、例えば、処理対象のプログラムである。クラス１２１は、シンボル変数を用いた演算式、条件式、対象ファイルへの入出力処理等の各種メソッドを含む。モデルクラス１２２は、クラス１２１から抽出されたメソッドの１つもしくは抽出されたメソッドを複数組み合わせたものである。モデルクラス１２２とは、例えば、図３の（４）の「DataOutputStream」メソッドと「writeInt」メソッドとを組み合わせたものである。この場合においてモデルクラス１２２は、「writeInt」メソッドに含まれるシンボル変数ｂに挿入されている値を「text1.txt」に係るテキストファイルに書き込む。なお、この場合においてモデルクラス１２２は「DataOutputStream」メソッドと「writeInt」メソッドとに加えて「FileOutputStream」メソッドを組み合わせてもよい。
【００２３】
対象ファイル１２３は、プログラムが入出力処理を実行する際に使用するファイルである。例えば、プログラムは書込処理を実行する際にプログラムにしたがい対象ファイル１２３に書き込む処理をおこなう。また、プログラムは書込処理にシンボル変数が含まれる場合、シンボル変数に挿入された値を対象ファイル１２３に書き込んでもよい。一方、プログラムは読込処理を実行する際にプログラムの記述にしたがい対象ファイル１２３を読み込む処理をおこなう。また、プログラムは読込処理にシンボル変数が含まれる場合、シンボル変数に対象ファイル１２３から読み込んだ値を挿入してもよい。
【００２４】
退避ファイル１２４は、あるノードで書込処理を実行する前に対象ファイル１２３を複製したものである。退避ファイル１２４は、書込処理をおこなう各ノードでそれぞれ作成される。また、退避ファイル１２４は、最も直近に書込処理をしたノードに対応付けられる。例えば、処理装置１００は、対象ファイル１２３のファイル名に、最も直近に書込処理をしたノードのノード名を付記したものを、退避ファイル１２４のファイル名としてもよい。例えば、処理装置１００は、退避ファイルのファイル名を「node1text1.txt」とする。なお、退避ファイル１２４を作成する際の処理、作成する時期等に関する詳細は後述する。
【００２５】
シンボル変数リスト１２５は、クラス１２１で使用される全てのシンボル変数を保持し、保持したシンボル変数のデータ型を示したリストである。図６は、シンボル変数リストのデータ構造の一例を示す図である。図６に示すようにシンボル変数リスト１２５は、シンボル変数と、データ型とを対応付ける。「シンボル変数」は、クラス１２１で使用されるシンボル変数を示す。「データ型」は、各シンボル変数に対応するデータ型を示す。例えば、シンボル変数リスト１２５は、データ型が「int」であった場合、シンボル変数に挿入される値が３２ビットで表される整数であることを示す。また、シンボル変数リスト１２５は、データ型が「float」であった場合、シンボル変数に挿入される値が３２ビットで表される浮動小数点数であることを示す。また、シンボル変数リスト１２５は、データ型が「byte」であった場合、シンボル変数に挿入される値が８ビットで表される整数であることを示す。
【００２６】
シンボル変数リスト１２５に記憶されているデータについて具体例を挙げて説明する。例えば、図６のシンボル変数リスト１２５は表示行１行目においてシンボル変数が「a」、データ型が「int」、すなわち、整数型であることを示す。また、シンボル変数リスト１２５は表示行２行目においてシンボル変数が「b」、データ型が「int」、すなわち、整数型であることを示す。
【００２７】
ファイル入出力テーブル１２６は、対象ファイルへ書込処理を実行するメソッドにシンボル変数が含まれる場合に書込処理をしたファイル名、書き込んだ位置等の情報を記憶したものである。図７は、ファイル入出力テーブルのデータ構造の一例を示す図である。ファイル入出力テーブル１２６は、ファイル名と、位置と、値とを対応付ける。「ファイル名」は、書込処理を実行した対象ファイルのファイル名を示す。「位置」は、シンボル変数の値を書き込んだファイルの先頭からの位置を示す。例えば、「位置」は、ファイルの先頭から何バイトの位置にシンボル変数の値を書き込んだかを示してもよい。「値」は、シンボル変数を含む入出力処理を実行する際に使用する値を示す。
【００２８】
ファイル入出力テーブル１２６に記憶されているデータについて具体例を挙げて説明する。例えば、ファイル入出力テーブル１２６は表示行１行目においてシンボル変数ａが格納された対象ファイルのファイル名が「text1.txt」で、シンボル変数の値を「text1.txt」に係るファイルの先頭から「0-4byte」の位置に書き込んだことを示す。また、ファイル入出力テーブル１２６は表示行１行目においてシンボル変数ａを含む入出力処理を実行する際に「s＿a＿3＿SYMINT＿STATIC＿FIELD  +  CONST＿1」を使用することを示す。例えば、処理装置１００は、シンボル変数ａを読み込む際に「s＿a＿3＿SYMINT＿STATIC＿FIELD  +  CONST＿1」に返り値を挿入する。一方、ファイル入出力テーブル１２６は表示行２行目においてシンボル変数ｂが格納された対象ファイルのファイル名が「text1.txt」で、シンボル変数の値を「text1.txt」に係るファイルの先頭から「5-8byte」の位置に書き込んだことを示す。また、ファイル入出力テーブル１２６は表示行２行目においてシンボル変数ｂを含む入出力処理を実行する際に「s＿b＿3＿SYMINT＿STATIC＿FIELD  +  CONST＿1」を使用することを示す。例えば、処理装置１００は、シンボル変数ｂを読み込む際に「s＿b＿3＿SYMINT＿STATIC＿FIELD  +  CONST＿1」に返り値を挿入する。
【００２９】
バックトラック管理テーブル１２７は、入出力処理を含むノードが参照すべき対象ファイル１２３および退避ファイル１２４のアドレスを示す。後述するように格納部１１３または取得部１１４は、バックトラック後に別経路を探索する場合に退避ファイル１２４のアドレスを参照する。また、バックトラック管理テーブル１２７は、入出力処理を含むノードが参照すべき対象ファイル１２３のアドレスを示す。なお、格納部１１３または取得部１１４は、バックトラックする際以外の通常時には対象ファイル１２３のアドレスを参照する。
【００３０】
図８は、バックトラック管理テーブルのデータ構造の一例を示す図である。バックトラック管理テーブル１２７は、ノードと、対象ファイルと、退避ファイルとを対応付ける。「ノード」は、対象ファイルに対して書込処理を実行したノード名を示す。「対象ファイル」は、各ノードが書込処理をおこなった対象ファイル１２３のアドレスを示す。「退避ファイル」は、作成された退避ファイル１２４のアドレスを示す。なお、バックトラック管理テーブル１２７の各行は、バックトラックする際に適宜削除される。また、図８において各ノードは同一の対象ファイル１２３に書込処理をおこなっているが、各ノードは別の対象ファイル１２３に書込処理をおこなってもよい。また、退避ファイル１２４の作成に関する詳細は後述する。
【００３１】
パス条件１２８は、実行ツリーの各経路においてシンボル変数が満たすべき条件を示す。パス条件１２８は、実行ツリーで経路が分岐する部分における条件式に基づいて作成される。例えば、パス条件１２８は、「a>3」で左側の経路に進み、「a<=3」で右側の経路に進むという条件式がある場合に、左側の経路に進むためのパス条件１２８は「a>3」となる。パス条件１２８は、経路に条件式が複数ある場合、各パス条件を、論理積を示す「AND」演算子を使って表される。例えば、パス条件１２８は「a>3  AND  a<6」というように表される。
【００３２】
（処理装置の制御部の各構成）
図５に示すように、処理装置１００の制御部１１０は作成部１１１と、判断部１１２と、格納部１１３と、取得部１１４と、実行部１１５とを有する。処理装置１００の制御部１１０の機能は例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）などの集積回路により実現することができる。また、制御部１１０の機能は例えば、ＣＰＵ（Central  Processing  Unit）が所定のプログラムを実行することで実現することができる。
【００３３】
処理装置１００は、各ノードにおいてシンボリック変数に格納された値または所定の値を書き込む書込処理が実行された第一のファイルと、書込処理を実行する前の第一のファイルを複製した第二のファイルとを記憶する記憶部１２０を有する。また、処理装置１００は第一のノードで第一のファイルに対して、第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、第一のファイルを複製した第二のファイルを記憶部に格納する格納部１１３を有する。また、処理装置１００は第一のノードを経由する第一の経路から第一のノードにバックトラックして、第一のノードを経由する第二の経路に移行する。処理装置１００は、この場合において第二の経路で最初に第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードにおいて、読込処理を実行する際に第二のファイルからシンボル変数値を取得する取得部１１４を有する。これにより、バックトラック後に移行する別経路のノードにおいて適切に読込処理をすることができるという効果が得られる。なお、処理装置１００はシンボリック実行装置の一例である。また、対象ファイルは第一のファイルの一例である。また、後述する退避ファイル１２４は第二のファイルの一例である。
【００３４】
また、格納部１１３は、第一のノードを経由する第一の経路から第一のノードにバックトラックして、第一のノードを経由する第二の経路に移行する際に、第二のファイルを第一のファイルに反映する。格納部１１３は、該第二の経路で最初に第一のファイルにシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する第二のノードにおいて、第一のファイルに対してシンボリック変数に格納された値または所定の値を書き込む。これにより、バックトラック後に探索する別経路のノードにおいて適切に書込処理をすることができるという効果が得られる。
【００３５】
制御部１１０の各構成について説明する。作成部１１１は、クラス１２１から、１または２以上のメソッドを含む複数のモデルクラス１２２を作成する。作成部１１１は、作成された複数のモデルクラス１２２に基づき、複数のノードで構成される実行ツリーを作成する。作成部１１１は、モデルクラス１２２に含まれる条件式に基づき、実行ツリーを構成する各ノードに分岐を設ける。なお、作成部１１１における各処理は、例えば、ＪＰＦ等のモデル検査エンジンがおこなってもよい。
【００３６】
判断部１１２は、ノードにおいて書込処理または読込処理に含まれる文字列が、シンボル変数リスト１２５に登録されているか否かにより、書込処理または読込処理にシンボル変数が含まれるか否かを判断する。例えば、判断部１１２は、書込処理に「ｃ」という文字列があった場合に、シンボル変数リスト１２５を参照する。判断部１１２は、シンボル変数リスト１２５に「シンボル変数ｃ」が登録されていた場合、当該書込処理にシンボル変数が含まれると判断する。また、判断部１１２は、後述する格納部１１３が対象ファイル１２３に対して書込処理を実行する際に上記処理をおこなう。もしくは、後述する取得部１１４が対象ファイル１２３に対して読込処理を実行する際に上記処理をおこなう。なお、実行ツリーの探索は、例えば、ＪＰＦ等のモデル検査エンジンがおこなってもよい。
【００３７】
格納部１１３は、対象ファイル１２３に対して書込処理を実行する。格納部１１３は、対象ファイル１２３に書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０に記憶する。さらに、格納部１１３は、書込処理を実行する際にバックトラック管理テーブル１２７を更新する。具体的には、格納部１１３は、バックトラック管理テーブル１２７に、直近に書込処理を実行したノードのノード名と、対象ファイル１２３のアドレスと、当該ノードに係る退避ファイル１２４のアドレスとを対応付けた行を追加する。
【００３８】
また、格納部１１３は、実行する書込処理にシンボル変数が含まれる場合にファイル入出力テーブル１２６を更新する。具体的には、格納部１１３は、ファイル入出力テーブル１２６に、シンボル変数の値を格納したファイルのファイル名、書き込んだファイルの位置、およびシンボル変数を含む入出力処理を実行する際に使用する値を対応付けた行を追加する。なお、格納部１１３は、書込処理にシンボル変数が含まれない場合、プログラムにしたがい対象ファイル１２３に書込処理をおこなう。
【００３９】
取得部１１４は、実行する読込処理にシンボル変数が含まれる場合、ファイル入出力テーブル１２６を参照して対象ファイル１２３のアドレスを確認する。そして、取得部１１４は対象ファイル１２３に対して読込処理を実行する。一方、後述する実行部１１５は、バックトラックした後に他の経路を探索する場合がある。この場合において取得部１１４は、当該他の経路に存在するノードにおいて読込処理を実行するときに、バックトラック管理テーブル１２７を参照して対応する退避ファイル１２４のアドレスを確認する。そして、取得部１１４は、確認した退避ファイル１２４に対して読込処理を実行することにより、シンボル変数に挿入する値を取得する。なお、取得部１１４は、読込処理にシンボル変数が含まれない場合、プログラムにしたがい対象ファイル１２３に読込処理をおこなう。
【００４０】
実行部１１５は、実行ツリーにおいてノードを探索し、ノードにおいてなされる書込処理および読込処理以外の各種メソッドを実行する。例えば、実行部１１５は、加算処理、減算処理等の演算処理に係るメソッドを実行する。また、実行部１１５は、対象ファイル１２３が作成されていない場合に、対象ファイル１２３を作成するメソッドを実行する。また、実行部１１５は、実行ツリーの各経路におけるパス条件１２８を作成し、それぞれ記憶部１２０に記憶する。実行部１１５は、実行ツリーに複数の条件式が含まれる場合、パス条件１２８を論理積「AND」で表してもよい。なお、実行部１１５における加算処理、減算処理等の演算処理に係るメソッドの実行は、例えば、ＪＰＦ等のモデル検査エンジンがおこなってもよい。
【００４１】
（制御部における処理）
すなわち、制御部１１０の各構成は以下の処理をおこなう。図９は、本実施形態に係る実行ツリーの第１の模式図を示す図である。図９において楕円形の図形に付された番号はノード番号を示す。第１の段階において制御部１１０は、クラス１２１に基づき実行ツリーを作成する。具体的には、作成部１１１は、クラス１２１から複数のモデルクラス１２２を作成する。次いで、作成部１１１は、作成された複数のモデルクラス１２２に基づき、複数のノードで構成される図９の実行ツリーを作成する。
【００４２】
第２の段階において制御部１１０は、根ノードであるノード１から葉ノードであるノード６までを探索する。具体的には、まず、実行部１１５は、ノード１において対象ファイル１２３を作成する処理をおこなう。次いで、実行部１１５は、ノード２においてシンボル変数ａに所定の数値を加算する演算式が含まれていた場合、シンボル変数ａに対して加算する演算処理をおこなう。なお、各ノードにおいておこなわれる加算、減算等の演算処理は、例えば、ＪＰＦ等のモデル検査エンジンによっておこなわれてもよい。以降についても同様である。
【００４３】
次いで、格納部１１３は、ノード３において書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０に記憶する。さらに、格納部１１３は、バックトラック管理テーブル１２７にノードを「ノード１」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「c:\taihi\node1text1.txt」とする行を１行追加する。つまり、格納部１１３は、ノード３において書込処理をおこなう前に退避ファイル１２４を作成して、バックトラック管理テーブル１２７に、退避ファイル１２４のアドレスをノード１に対応付けて記憶させる。また、格納部１１３は、退避ファイル１２４のファイル名を「text1.txt」に「node1」を付記して「node1text1.txt」とする。なお、格納部１１３は、他のノードで退避ファイルを作成する場合においても「text1.txt」にノード名を付記する。
【００４４】
次いで、格納部１１３は、ノード３においてシンボル変数ａの数値を対象ファイル１２３に書き込む書込処理をおこなう。なお、図９は、当該退避ファイル１２４をノード１に対応する退避ファイル１２４として、長方形の図形１０で示す。また、図９は、ノード３およびノード４においても、それぞれ図形１１、図形１２で退避ファイル１２４を示す。
【００４５】
次いで、格納部１１３は、ノード４において書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０に記憶する。さらに、格納部１１３は、バックトラック管理テーブル１２７にノードを「ノード３」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「c:\taihi\node3text1.txt」とする行を１行追加する。次いで、格納部１１３は、ノード４においてシンボル変数ｂの数値を対象ファイル１２３に書き込む書込処理をおこなう。
【００４６】
次いで、実行部１１５は、ノード５においてシンボル変数ｂに所定の数値を減算する演算式が含まれていた場合、シンボル変数ｂに所定の数値を減算する演算処理をおこなう。次いで、格納部１１３は、ノード６において書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０に記憶する。さらに、格納部１１３は、バックトラック管理テーブル１２７にノードを「ノード４」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「c:\taihi\node4text1.txt」とする行を１行追加する。次いで、格納部１１３は、ノード６においてシンボル変数ｂの数値を対象ファイル１２３に書き込む書込処理をおこなう。
【００４７】
このとき、実行部１１５は、ノード１からノード６までの経路に対応するパス条件１２８を記憶部１２０に記憶する。例えば、実行部１１５は、ノード１からノード２に移行する際のパス条件が「b>1」で、ノード３からノード４に移行する際のパス条件が「b>3」である場合、パス条件１２８として「b>1  AND  b>3」を記憶部１２０に記憶する。
【００４８】
第３の段階において制御部１１０は、葉ノードであるノード６に最も直近であり、別経路への分岐を有するノード３にバックトラックする。実行部１１５は、ノード４からノード３にバックトラックする際に、記憶部１２０からノード４に対応する図形１２の退避ファイル１２４を削除する。さらに、格納部１１３は、バックトラック管理テーブル１２７に追加されたノード４に係る行を削除する。
【００４９】
第４の段階において制御部１１０は、ノード３から別経路のノード７まで探索する。ノード７はシンボル変数ｂに挿入する値を対象ファイル１２３から読み込む読込処理を有する。このとき、取得部１１４は、ノード７においてシンボル変数ｂに挿入する値を対象ファイル１２３からではなく、ノード３に対応する図形１１の退避ファイル１２４から読み込む。次いで、取得部１１４は、退避ファイル１２４から読み込んだ値をシンボル変数ｂに挿入する。
【００５０】
そして、実行部１１５は、ノード１からノード２に移行する際のパス条件が「b>1」で、ノード３からノード７に移行する際のパス条件が「b<=3」である場合、パス条件１２８として「b>1  AND  b<=3」を記憶部１２０に記憶する。
【００５１】
第５の段階において制御部１１０は、ノード３の一つ前の分岐を有するノード１にバックトラックする。実行部１１５は、ノード３からノード２にバックトラックする際にノード３に対応する図形１１の退避ファイル１２４を削除する。さらに、格納部１１３は、バックトラック管理テーブル１２７に追加されたノード３に係る行を削除する。
【００５２】
第６の段階において制御部１１０は、ノード１から別経路のノード９まで探索する。実行部１１５は、ノード８において対象ファイル１２３が存在するか否かを確認する処理をおこなう。実行部１１５は、記憶部１２０に対象ファイル１２３が存在するのでファイルが存在する旨の応答を取得する。次いで、実行部１１５は、ノード９において対象ファイル１２３を削除する処理をおこなう。このとき、実行部１１５は、ノード１からノード８に移行する際のパス条件が「b<=1」である場合、パス条件１２８として「b<=1」を記憶部１２０に記憶する。
【００５３】
第７の段階において制御部１１０は、処理を終了させる。このとき、実行部１１５は、全ての退避ファイル１２４を削除する。また、実行部１１５は、バックトラック管理テーブル１２７の全ての行を削除する。なお、ファイル入出力テーブル１２６の参照および更新、バックトラック管理テーブル１２７の参照および更新、シンボル変数リスト１２５の参照等の処理の詳細に関しては、次の具体例にて説明する。
【００５４】
（制御部における処理の具体例）
図１０は、ファイルへの書込処理または読込処理を有するプログラムの第３の例を示す図である。図１０に示されるプログラムは、例えばクラス１２１である。第１の段階において制御部１１０は、クラス１２１に基づき実行ツリーを作成する。まず、作成部１１１は、当該プログラムに基づきモデルクラス１２２を作成する。例えば、作成部１１１は、図１０中の「ａ値の書込処理１」をモデルクラス１２２とする。具体的には、作成部１１１は、「DataOutputStream」メソッドと「readInt」メソッドとを一つのモデルクラス１２２とする。次いで、作成部１１１は、作成された複数のモデルクラス１２２に基づき、複数のノードで構成される実行ツリーを作成する。図１１は、本実施形態に係る実行ツリーの第２の模式図を示す図である。作成部１１１は、例えば図１１に示された実行ツリーを作成する。なお、図１１の実行ツリーを構成する各ノードは図９の実行ツリーに対応している。
【００５５】
第２の段階において制御部１１０は、根ノードであるノード１から葉ノードであるノード６までを探索する。具体的には、まず、実行部１１５は、ノード１において対象ファイル１２３を作成する処理をおこなう。図１２は、ノード１に状態が移行した際のバックトラック管理テーブルの一例を示す図である。格納部１１３は、図１２のようにバックトラック管理テーブル１２７にノードを「ノード１」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「−」とする行を１行追加する。
【００５６】
次いで、実行部１１５は、ノード２において「a=a+5」の加算処理を実行する。次いで、格納部１１３は、ノード３において書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０のアドレス「c:\taihi\」の配下に記憶する。また、格納部１１３は、退避ファイル１２４のファイル名をノード１に対応付けて「node1text1.txt」とする。図１３は、ノード３に状態が移行した際のバックトラック管理テーブルの一例を示す図である。図１３のように格納部１１３は、バックトラック管理テーブル１２７の１行目において、ノードを「ノード１」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「c:\taihi\node1text1.txt」に更新する。さらに、格納部１１３は、バックトラック管理テーブル１２７にノードを「ノード３」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「−」とする行を１行追加する。
【００５７】
次いで、判断部１１２は、図６のシンボル変数リスト１２５に「シンボル変数ａ」が登録されているので、ノード３の書込処理に含まれる文字列「ａ」がシンボル変数であると判断する。次いで、格納部１１３は、シンボル変数ａに挿入されている数値を対象ファイル１２３に書き込む書込処理をおこなう。このとき、格納部１１３はファイル入出力テーブル１２６にファイル名を「text1.txt」、位置を「0-4」、値を「s＿a＿3＿SYMINT＿STATIC＿FIELD  +  CONST＿1」とする行を１行追加する。なお、格納部１１３は、判断部１１２が書込処理にシンボル変数が含まれないと判断した場合、プログラムの記述にしたがい対象ファイル１２３に書込処理をおこなう。
【００５８】
次いで、格納部１１３は、ノード４において書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０のアドレス「c:\taihi\」の配下に記憶する。また、格納部１１３は、退避ファイル１２４のファイル名をノード３に対応付けて「node3text1.txt」とする。図１４は、ノード４に状態が移行した際のバックトラック管理テーブルの一例を示す図である。図１４のように格納部１１３は、バックトラック管理テーブル１２７の２行目において、ノードを「ノード３」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「c:\taihi\node3text1.txt」に更新する。さらに、格納部１１３は、バックトラック管理テーブル１２７にノードを「ノード４」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「−」とする行を１行追加する。
【００５９】
次いで、判断部１１２は、図６のシンボル変数リスト１２５に「シンボル変数ｂ」が登録されているので、ノード４の書込処理に含まれる文字列「ｂ」がシンボル変数であると判断する。次いで、格納部１１３は、シンボル変数ｂに挿入されている数値を対象ファイル１２３に書き込む書込処理をおこなう。このとき、格納部１１３はファイル入出力テーブル１２６にファイル名を「text1.txt」、位置を「5-8」、値を「s＿b＿3＿SYMINT＿STATIC＿FIELD  +  CONST＿1」とする行を１行追加する。
【００６０】
次いで、実行部１１５は、ノード５において「b=b-1」の加算処理を実行する。次いで、格納部１１３は、ノード６において書込処理を実行する前に、対象ファイル１２３を複製した退避ファイル１２４を記憶部１２０のアドレス「c:\taihi\」の配下に記憶する。また、格納部１１３は、退避ファイル１２４のファイル名をノード４に対応付けて「node4text1.txt」とする。図１５は、ノード６に状態が移行した際のバックトラック管理テーブルの一例を示す図である。図１５のように格納部１１３は、バックトラック管理テーブル１２７の３行目において、ノードを「ノード４」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「c:\taihi\node4text1.txt」に更新する。さらに、格納部１１３は、バックトラック管理テーブル１２７にノードを「ノード６」、対象ファイル１２３を「c:\temp\text1.txt」、退避ファイル１２４を「−」とする行を１行追加する。
【００６１】
次いで、判断部１１２は、図６のシンボル変数リスト１２５に「シンボル変数ｂ」が登録されているので、ノード６の書込処理に含まれる文字列「ｂ」がシンボル変数であると判断する。次いで、格納部１１３は、ファイル入出力テーブル１２６を参照し、シンボル変数ｂがファイル入出力テーブル１２６に登録されていることを確認する。格納部１１３は、ファイル入出力テーブル１２６に基づき対象ファイル１２３を上書きする。
【００６２】
このとき、実行部１１５は、ノード１からノード６までの経路に対応するパス条件１２８を記憶部１２０に記憶する。実行部１１５は、ノード１からノード２に移行する際のパス条件が「b>1」で、ノード３からノード４に移行する際のパス条件が「b>3」であるので、パス条件１２８として「b>1  AND  b>3」を記憶部１２０に記憶する。
【００６３】
第３の段階において制御部１１０は、葉ノードであるノード６に最も直近であり、別経路への分岐を有するノード３にバックトラックする。実行部１１５は、ノード４からノード３にバックトラックする際にノード４に対応する退避ファイル１２４を削除する。さらに、格納部１１３は、バックトラック管理テーブル１２７からノード４およびノード６に係る行を削除する。
【００６４】
第４の段階において制御部１１０は、ノード３から別経路のノード７までを探索する。ノード７は、対象ファイル１２３からシンボル変数ｂに挿入する値を読み込む読込処理を有する。まず、判断部１１２は、図６のシンボル変数リスト１２５に「シンボル変数ｂ」が登録されているので、ノード７の読込処理に含まれる文字列「ｂ」がシンボル変数であると判断する。
【００６５】
次いで、取得部１１４は、ノード７においてシンボル変数ｂに挿入する値を、対象ファイル１２３からではなく、ノード３に対応する退避ファイル１２４から読み込む。そのために、取得部１１４は、バックトラック管理テーブル１２７を参照してノード３に対応する退避ファイル１２４のアドレスを確認する。図１６は、ノード７に状態が移行した際のバックトラック管理テーブルの一例を示す図である。取得部１１４は、バックトラック管理テーブル１２７の表示行２行目からノード３に対応する退避ファイル１２４のアドレス「c:\taihi\node3test1.txt」を確認する。さらに、取得部１１４は、ファイル入出力テーブル１２６に基づき退避ファイル１２４からシンボル変数ｂの数値を読み込む。なお、取得部１１４は、判断部１１２が読込処理にシンボル変数が含まれないと判断した場合、プログラムの記述にしたがい退避ファイル１２４に対して読込処理をおこなう。
【００６６】
このとき、実行部１１５は、ノード１からノード２に移行する際のパス条件が「b>1」で、ノード３からノード７に移行する際のパス条件が「b<=3」であるので、パス条件１２８として「b>1  AND  b<=3」を記憶部１２０に記憶する。
【００６７】
第５の段階において制御部１１０は、ノード３の一つ前の分岐を有するノード１にバックトラックする。実行部１２５は、ノード３からノード２にバックトラックする際にノード３に対応する退避ファイル１２４を削除する。さらに、格納部１１３は、バックトラック管理テーブル１２７からノード３およびノード７に係る行を削除する。
【００６８】
第６の段階において制御部１１０は、ノード１から別経路のノード９まで探索する。実行部１２５は、ノード８において対象ファイル１２３が存在するかを確認する処理をおこなう。実行部１２５は、記憶部１２０に対象ファイル１２３が存在するのでファイルが存在する旨の応答を取得する。次いで、実行部１２５は、ノード９において対象ファイル１２３を削除する処理をおこなう。
【００６９】
このとき、実行部１１５は、ノード１からノード８に移行する際のパス条件が「b<=1」であるので、パス条件１２８として「b<=1」を記憶部１２０に記憶する。
【００７０】
第７の段階において制御部１１０は、処理を終了させる。このとき、実行部１２５は、全ての退避ファイル１２４を削除する。また、実行部１２５は、バックトラック管理テーブル１２７の全ての行を削除する。
【００７１】
記憶部１２０は、第７の段階を終了した時点でパス条件１２８に「b>1  AND  b>3」、「b>1  AND  b<=3」、「b<=1」の３つのパス条件を記憶している。これにより、処理装置１００はパス条件に基づきテストケースを生成することが可能である。例えば、処理装置１００は、「b=1」「b=3」「b=4」の３つのテストケースを生成する。このように、処理装置１００は、処理対象のプログラムに対象ファイルへシンボル変数を書き込む処理および読み込む処理が含まれ、シンボル変数を永続化する場合であっても適切にテストケースを生成することができる。また、以上説明したように、取得部１１４は、バックトラック後に移行する別経路のノードにおいて退避ファイル１２４を用いて入出力処理をするので、当該ノードで適切に入出力処理をすることができる。
【００７２】
（処理装置おける処理の流れ）
次に、処理装置１００における処理の流れについて説明する。図１７は、各ノードにおける処理の流れの一例を示したフロー図である。まず、作成部１１１は、クラス１２１から複数のモデルクラス１２２を作成する（ステップＳ３０）。次いで、格納部１１３および取得部１１４は、あるノードにおいて対象ファイル１２３への入出力処理があるか否かを判定する（ステップＳ３１）。
【００７３】
次いで、取得部１１４は、ノードにおいて対象ファイル１２３への読込処理がない場合（ステップＳ３２No）、ステップＳ３７に移行する。一方、取得部１１４は、ノードにおいて対象ファイル１２３への読込処理がある場合（ステップＳ３２Yes）、バックトラック管理テーブル１２７を参照する（ステップＳ３３）。このとき、取得部１１４は、バックトラック後に別ノードへ移行した場合、直近に対象ファイルに書込処理をおこなったノードに対応する退避ファイル１２４のアドレスを参照する。一方、取得部１１４は、それ以外の場合、直近に対象ファイルに書込処理をおこなったノードに対応する対象ファイル１２３のアドレスを参照する。
【００７４】
次いで、取得部１１４は、判断部１１２がシンボル変数リスト１２５を参照して読込処理にシンボル変数が含まれないと判定した場合（ステップＳ３４No）、プログラムにしたがい対象ファイル１２３または退避ファイル１２４に対して読込処理をおこなう。一方、取得部１１４は、判断部１１２がシンボル変数リスト１２５を参照して読込処理にシンボル変数が含まれると判定した場合（ステップＳ３４Yes）、ファイル入出力テーブル１２６を参照する（ステップＳ３５）。取得部１１４は、ファイル入出力テーブル１２６からシンボル変数が格納されているファイルのファイル名、ファイルの位置等を確認する。次いで、取得部１１４は、対象ファイル１２３または退避ファイル１２４を読み込む読込処理をおこなう（ステップＳ３６）。
【００７５】
次いで、格納部１１３は、ノードにおいて対象ファイル１２３への書込処理がない場合（ステップＳ３７No）、処理を終了させる。一方、格納部１１３は、ノードにおいて対象ファイル１２３への書込処理がある場合（ステップＳ３７Yes）、バックトラック管理テーブル１２７を参照する（ステップＳ３８）。このとき、格納部１１３は、バックトラック管理テーブル１２７において直近に対象ファイル１２３に書込処理をおこなったノードを確認する。次いで、格納部１１３は、当該書込処理をおこなったノードに対応する退避ファイル１２４を作成する（ステップＳ３９）。次いで、格納部１１３は、バックトラック管理テーブル１２７に、直近に書込処理を実行したノード名と、対象ファイル１２３のアドレスと、退避ファイル１２４のアドレスとを対応付けた行を追加することによりバックトラック管理テーブル１２７を更新する（ステップＳ４０）。
【００７６】
次いで、格納部１１３は、判断部１１２が書込処理にシンボル変数が含まれないと判定した場合（ステップＳ４１No）、プログラムの記述にしたがい対象ファイル１２３に対して書込処理をおこなう（ステップＳ４３）。一方、格納部１１３は、判断部１１２が書込処理にシンボル変数が含まれると判定した場合（ステップＳ４１Yes）、書き込んだファイルのファイル名、ファイルの位置等を含む行を追加することによりファイル入出力テーブル１２６を更新する（ステップＳ４２）。次いで、格納部１１３は、対象ファイル１２３にシンボル変数に格納されている値を書き込む書込処理をおこなう（ステップＳ４３）。
【００７７】
（実施例１に関連する他の実施例）
上記実施態様においては、作成部１１１は、書込処理、読込処理、演算処理等のように１または複数のメソッドを含むノードを設定した。これに限られず、作成部１１１はノードに含まれるメソッド数を変更してもよい。
【００７８】
上記実施態様においては、作成部１１１が実行ツリーを作成した。これに限られず、例えば、ＪＰＦ等のモデル検査エンジンが実行ツリーを作成してもよい。すなわち、判断部１１２、格納部１１３、取得部１１４および実行部１１５は、モデル検査エンジンが作成した実行ツリーに対して上記処理をおこなってもよい。
【００７９】
上記実施態様においては、実行部１１５が各ノードに含まれる加算、減算等の演算処理を実行した。これに限られず、例えば、ＪＰＦ等のモデル検査エンジンが加算、減算等の演算処理を実行してもよい。
【００８０】
上記実施態様においては、作成部１１１がプログラムに相当するクラス１２１から実行ツリーを作成する旨を説明した。これに限られず、作成部１１１は、プログラム自体が各処理にノードを設定している場合に、プログラムにより設定された実行ツリーを使用してもよい。
【００８１】
上記実施態様においては、制御部１１０が各ノードにおいて数値の演算処理、入出力処理をする旨を説明した。これに限られず、制御部１１０が各ノードにおいて文字データに対して各種処理をおこなってもよい。
【００８２】
上記実施態様においては、処理装置１００はＪＡＶＡに係るプログラムを取り扱う旨を説明した。これに限定されず、処理装置１００はＪＡＶＡ以外のプログラムを取り扱ってもよい。
【００８３】
上記実施態様においては、各ノードが同一の対象ファイル１２３に入出力処理をおこなう旨を説明した。これに限られず、各ノードは異なる対象ファイル１２３に入出力処理をおこなってもよい。
【００８４】
上記実施態様においては、処理装置１００はモデル検査エンジンにＪＰＦを使用してもよい旨を説明した。これに限られず、処理装置１００はＪＰＦ以外のモデル検査エンジンを使用してもよい。
【００８５】
（バックトラック後に移行する別経路のノードにおける書込処理）
図９において格納部１１３が、ノード６からノード３にバックトラックした後、ノード７で書込処理をおこなう場合について説明する。格納部１１３は、ノード７において書込処理を実行する前に、ノード３に対応する退避ファイル１２４を対象ファイル１２３に反映させる。すなわち、格納部１１３は、退避ファイル１２４の内容を対照ファイル１２３に上書きする等して、対象ファイル１２３の内容を退避ファイル１２４の内容に一致させる。そして、格納部１１３は、対象ファイル１２３に対して書込処理を実行する。これにより、バックトラック後に探索する別経路のノードにおいて適切に書込処理をすることができるという効果が得られる。
【００８６】
また、実施例１に示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００８７】
また、図５に示した処理装置１００の各構成要素は機能概念的なものであり、必ずしも物理的に図示のように構成されていることを要しない。すなわち、処理装置１００の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。
【００８８】
（表示端末のハードウェア構成）
図１８は、処理装置のハードウェア構成を示す図である。図１８が示すように、コンピュータ２００は、各種演算処理を実行するＣＰＵ２０１と、ユーザからのデータ入力を受け付ける入力装置２０２と、モニタ２０３とを有する。また、コンピュータ２００は、記憶媒体からプログラム等を読み取る媒体読取装置２０４と、他の装置と接続するためのインターフェース装置２０５と、他の装置と無線により接続するための無線通信装置２０６とを有する。また、コンピュータ２００は、各種情報を一時記憶するＲＡＭ（Random  Access  Memory）２０７と、ハードディスク装置２０８とを有する。また、各装置２０１〜２０８は、バス２０９に接続される。
【００８９】
ハードディスク装置２０８には、図５に示した制御部１１０の作成部１１１、判断部１１２、格納部１１３、取得部１１４、および実行部１１５の各処理部と同様の機能を有する情報処理画面出力プログラムが記憶される。また、ハードディスク装置２０８には、情報処理画面出力プログラムを実現するための各種データが記憶される。
【００９０】
ＣＰＵ２０１は、ハードディスク装置２０８に記憶された各プログラムを読み出して、ＲＡＭ２０７に展開して実行することで、各種の処理を行う。また、これらのプログラムは、コンピュータ２００を図５に示した作成部１１１、判断部１１２、格納部１１３、取得部１１４、および実行部１１５として機能させることができる。
【００９１】
なお、上記の情報処理画面出力プログラムは、必ずしもハードディスク装置２０８に記憶されている必要はない。例えば、コンピュータ２００が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ２００が読み出して実行するようにしてもよい。コンピュータ２００が読み取り可能な記憶媒体は、例えば、ＣＤ−ＲＯＭやＤＶＤディスク、ＵＳＢ（Universal  Serial  Bus）メモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、ＬＡＮ（Local  Area  Network）等に接続された装置にこのプログラムを記憶させておき、コンピュータ２００がこれらからプログラムを読み出して実行するようにしてもよい。
【００９２】
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００９３】
（付記１）コンピュータが、
第一のノードで第一のファイルに対して、該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを記憶部に格納し、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードにおいて、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する
処理を実行することを特徴とするシンボリック実行方法。
【００９４】
（付記２）前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、前記第二のファイルを前記第一のファイルに反映し、
前記第二の経路で最初に前記第一のファイルにシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する第二のノードにおいて、前記第一のファイルに対して前記シンボリック変数に格納された値または前記所定の値を書き込む処理を、さらに実行することを特徴とする付記１に記載のシンボリック実行方法。
【００９５】
（付記３）前記書込処理において書き込む内容にシンボル変数が含まれているか否か、または前記読込処理において読み込む内容にシンボル変数が含まれているか否かを判断する処理をさらに実行することを特徴とする付記１または２に記載のシンボリック実行方法。
【００９６】
（付記４）前記第一の経路上にある前記第一のノードの子ノードから前記第一のノードにバックトラックする際に、前記記憶部に格納されており、前記子ノードに対応する前記第二のファイルを削除することを特徴とする付記１〜３のいずれか一に記載のシンボリック実行方法。
【００９７】
（付記５）前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルに書込処理を実行する第二のノードが、前記第二のファイルを前記第一のファイルに一致させてから第二のファイルに書き込む処理をさらに実行することを特徴とするシンボリック実行方法。
【００９８】
（付記６）各ノードにおいてシンボリック変数に格納された値または所定の値を書き込む書込処理が実行された第一のファイルと、前記書込処理を実行する前の前記第一のファイルを複製した第二のファイルとを記憶する記憶部と、
第一のノードで前記第一のファイルに対して、該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを前記記憶部に格納する格納部と、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードが、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する取得部と
を有することを特徴とするシンボリック実行装置。
【００９９】
（付記７）コンピュータに、
第一のノードで第一のファイルに対して、該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを記憶部に格納し、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードが、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する
処理を実行させることを特徴とするシンボリック実行プログラム。
【符号の説明】
【０１００】
１００      処理装置
１０１      入力部
１０２      出力部
１１０      制御部
１１１      作成部
１１２      判断部
１１３      格納部
１１４      取得部
１１５      実行部
１２０      記憶部
１２１      クラス
１２２      モデルクラス
１２３      対象ファイル
１２４      退避ファイル
１２５      シンボル変数リスト
１２６      ファイル入出力テーブル
１２７      バックトラック管理テーブル
１２８      パス条件
【図１】
2015064696.tif 000003
【図２】
2015064696.tif 000004
【図３】
2015064696.tif 000005
【図４】
2015064696.tif 000006
【図５】
2015064696.tif 000007
【図６】
2015064696.tif 000008
【図７】
2015064696.tif 000009
【図８】
2015064696.tif 000010
【図９】
2015064696.tif 000011
【図１０】
2015064696.tif 000012
【図１１】
2015064696.tif 000013
【図１２】
2015064696.tif 000014
【図１３】
2015064696.tif 000015
【図１４】
2015064696.tif 000016
【図１５】
2015064696.tif 000017
【図１６】
2015064696.tif 000018
【図１７】
2015064696.tif 000019
【図１８】
2015064696.tif 000020