以下に、本願の開示するシンボリック実行方法、シンボリック実行装置、およびシンボリック実行プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの権利が限定されるものではない。各実施例は、処理内容を矛盾させない範囲で適宜組み合わせることが可能である。
(ファイル書込、読込処理を含む場合のシンボル変数の引継ぎ)
プログラムは、テキストファイルから値を読込み、読込んだ値をプログラム内で使用するシンボル変数に挿入する場合がある。図3は、対象ファイルへの書込処理または読込処理を有するプログラムの第2の例を示す図である。図3のプログラムはJAVAで記述されている。図3のプログラムにおいて(1)の部分は、シンボリック変数であるaおよびbのデータ型がint型であることを定義している。(2)の部分と(7)の部分とは対応しており、(2)の「try{}」括弧中の処理に例外が発生した場合に(7)の「catch{}」括弧中の処理をおこなう。図3に記載の(3)以降のプログラムの処理に関する詳細は、次に図4の模式図を用いて具体的に説明する。
図4は、第2の例に係るプログラムにおける処理の一部を模式的に示した説明図である。図3の(3)から(7)の部分の処理は図4に示される。プログラムは(3)の部分に第一の条件式「if(b==0)」を含む。第一の条件式は図4の(i)の分岐に対応する。プログラムは、(i)の分岐でbが0である場合に、左側の経路の「b=b-2」の処理(ステップS21)を実行する。一方、プログラムは、(i)の分岐でbが0以外である場合に、右側の経路の「b=b+10」の処理(ステップS22)を実行する。次いで、プログラムは、(4)の部分でシンボル変数bに挿入されている値をテキストファイル等の対象ファイルに書き込む処理をおこなう(ステップS23)。次いで、プログラムは、(5)の部分で対象ファイルに書き込まれた値を読み取る処理をおこなう(ステップS24)。プログラムは(6)の部分で第二の条件式「if(dis.readInt()<5)」を含む。第二の条件式は図4の(ii)の分岐に対応する。プログラムは、(ii)の分岐でbが5より小さい場合に、左側の経路の「a=a-1」の処理(ステップS25)を実行する。一方、プログラムは(ii)の分岐でbが5以上の場合に、右側の経路の「a=a+1」の処理(ステップS26)を実行する。次いで、プログラムは、(7)の部分で「try{}」括弧中の処理に例外が生じた場合にスタックトレースを出力する(ステップS27)。なお、スタックトレースは、例外が発生したメソッド名と各メソッドが格納されている対象ファイルのファイル名等の情報を含む。
すなわち、図3のプログラムは、図4のステップS21またはステップS22の処理が終了した後、シンボル変数bを対象ファイルに書き込むことにより、シンボル変数bを永続化させる。しかし、モデル検査エンジンは、ステップS24において対象ファイルから値を読み込む際にファイル出力されたbの値がシンボル値であることを認識できない。このため、モデル検査エンジンが生成したテストケースには、第一の条件式「if(b==0)」が考慮されるので「b=0」と「b=1」とは含まれるが、第二の条件式「if(dis.readInt()<5)」は考慮されないので「b=5」は含まれないことになる。つまり、モデル検査エンジンは、プログラムに含まれる入出力処理によりシンボル変数が永続化された場合に、入出力処理前に宣言されたシンボル変数を、入出力処理後に認識できない。したがって、図4の(ii)の分岐に係るパス条件を検証するためのテストケースを生成できないという問題がある。
(処理装置の構成)
次に、処理装置100の機能構成について説明する。図5は、処理装置の構成を示す機能ブロック図である。処理装置100は、処理対象のプログラムに含まれるパス条件の正当性を検証することにより、処理対象のプログラムが、指定されたアプリケーションの仕様を満たしているかを確認する。処理装置100は入力部101と、出力部102と、制御部110と、記憶部120とを有する。入力部101は、処理装置100を操作するためのキーボード、マウス等の入力機器である。出力部102は、処理装置100における処理結果を出力するためのモニタ、プリンタ等の出力機器である。
(処理装置の記憶部の各構成)
図5に示すように処理装置100の記憶部120はクラス121と、モデルクラス122と、対象ファイル123と、退避ファイル124と、シンボル変数リスト125とを記憶する。さらに、記憶部120はファイル入出力テーブル126と、バックトラック管理テーブル127と、パス条件128とを記憶する。記憶部120は例えば、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ(Flash Memory)などの半導体メモリ素子、ハードディスクや光ディスクなどの記憶装置に対応する。
クラス121は、例えば、処理対象のプログラムである。クラス121は、シンボル変数を用いた演算式、条件式、対象ファイルへの入出力処理等の各種メソッドを含む。モデルクラス122は、クラス121から抽出されたメソッドの1つもしくは抽出されたメソッドを複数組み合わせたものである。モデルクラス122とは、例えば、図3の(4)の「DataOutputStream」メソッドと「writeInt」メソッドとを組み合わせたものである。この場合においてモデルクラス122は、「writeInt」メソッドに含まれるシンボル変数bに挿入されている値を「text1.txt」に係るテキストファイルに書き込む。なお、この場合においてモデルクラス122は「DataOutputStream」メソッドと「writeInt」メソッドとに加えて「FileOutputStream」メソッドを組み合わせてもよい。
対象ファイル123は、プログラムが入出力処理を実行する際に使用するファイルである。例えば、プログラムは書込処理を実行する際にプログラムにしたがい対象ファイル123に書き込む処理をおこなう。また、プログラムは書込処理にシンボル変数が含まれる場合、シンボル変数に挿入された値を対象ファイル123に書き込んでもよい。一方、プログラムは読込処理を実行する際にプログラムの記述にしたがい対象ファイル123を読み込む処理をおこなう。また、プログラムは読込処理にシンボル変数が含まれる場合、シンボル変数に対象ファイル123から読み込んだ値を挿入してもよい。
退避ファイル124は、あるノードで書込処理を実行する前に対象ファイル123を複製したものである。退避ファイル124は、書込処理をおこなう各ノードでそれぞれ作成される。また、退避ファイル124は、最も直近に書込処理をしたノードに対応付けられる。例えば、処理装置100は、対象ファイル123のファイル名に、最も直近に書込処理をしたノードのノード名を付記したものを、退避ファイル124のファイル名としてもよい。例えば、処理装置100は、退避ファイルのファイル名を「node1text1.txt」とする。なお、退避ファイル124を作成する際の処理、作成する時期等に関する詳細は後述する。
シンボル変数リスト125は、クラス121で使用される全てのシンボル変数を保持し、保持したシンボル変数のデータ型を示したリストである。図6は、シンボル変数リストのデータ構造の一例を示す図である。図6に示すようにシンボル変数リスト125は、シンボル変数と、データ型とを対応付ける。「シンボル変数」は、クラス121で使用されるシンボル変数を示す。「データ型」は、各シンボル変数に対応するデータ型を示す。例えば、シンボル変数リスト125は、データ型が「int」であった場合、シンボル変数に挿入される値が32ビットで表される整数であることを示す。また、シンボル変数リスト125は、データ型が「float」であった場合、シンボル変数に挿入される値が32ビットで表される浮動小数点数であることを示す。また、シンボル変数リスト125は、データ型が「byte」であった場合、シンボル変数に挿入される値が8ビットで表される整数であることを示す。
シンボル変数リスト125に記憶されているデータについて具体例を挙げて説明する。例えば、図6のシンボル変数リスト125は表示行1行目においてシンボル変数が「a」、データ型が「int」、すなわち、整数型であることを示す。また、シンボル変数リスト125は表示行2行目においてシンボル変数が「b」、データ型が「int」、すなわち、整数型であることを示す。
ファイル入出力テーブル126は、対象ファイルへ書込処理を実行するメソッドにシンボル変数が含まれる場合に書込処理をしたファイル名、書き込んだ位置等の情報を記憶したものである。図7は、ファイル入出力テーブルのデータ構造の一例を示す図である。ファイル入出力テーブル126は、ファイル名と、位置と、値とを対応付ける。「ファイル名」は、書込処理を実行した対象ファイルのファイル名を示す。「位置」は、シンボル変数の値を書き込んだファイルの先頭からの位置を示す。例えば、「位置」は、ファイルの先頭から何バイトの位置にシンボル変数の値を書き込んだかを示してもよい。「値」は、シンボル変数を含む入出力処理を実行する際に使用する値を示す。
ファイル入出力テーブル126に記憶されているデータについて具体例を挙げて説明する。例えば、ファイル入出力テーブル126は表示行1行目においてシンボル変数aが格納された対象ファイルのファイル名が「text1.txt」で、シンボル変数の値を「text1.txt」に係るファイルの先頭から「0-4byte」の位置に書き込んだことを示す。また、ファイル入出力テーブル126は表示行1行目においてシンボル変数aを含む入出力処理を実行する際に「s_a_3_SYMINT_STATIC_FIELD + CONST_1」を使用することを示す。例えば、処理装置100は、シンボル変数aを読み込む際に「s_a_3_SYMINT_STATIC_FIELD + CONST_1」に返り値を挿入する。一方、ファイル入出力テーブル126は表示行2行目においてシンボル変数bが格納された対象ファイルのファイル名が「text1.txt」で、シンボル変数の値を「text1.txt」に係るファイルの先頭から「5-8byte」の位置に書き込んだことを示す。また、ファイル入出力テーブル126は表示行2行目においてシンボル変数bを含む入出力処理を実行する際に「s_b_3_SYMINT_STATIC_FIELD + CONST_1」を使用することを示す。例えば、処理装置100は、シンボル変数bを読み込む際に「s_b_3_SYMINT_STATIC_FIELD + CONST_1」に返り値を挿入する。
バックトラック管理テーブル127は、入出力処理を含むノードが参照すべき対象ファイル123および退避ファイル124のアドレスを示す。後述するように格納部113または取得部114は、バックトラック後に別経路を探索する場合に退避ファイル124のアドレスを参照する。また、バックトラック管理テーブル127は、入出力処理を含むノードが参照すべき対象ファイル123のアドレスを示す。なお、格納部113または取得部114は、バックトラックする際以外の通常時には対象ファイル123のアドレスを参照する。
図8は、バックトラック管理テーブルのデータ構造の一例を示す図である。バックトラック管理テーブル127は、ノードと、対象ファイルと、退避ファイルとを対応付ける。「ノード」は、対象ファイルに対して書込処理を実行したノード名を示す。「対象ファイル」は、各ノードが書込処理をおこなった対象ファイル123のアドレスを示す。「退避ファイル」は、作成された退避ファイル124のアドレスを示す。なお、バックトラック管理テーブル127の各行は、バックトラックする際に適宜削除される。また、図8において各ノードは同一の対象ファイル123に書込処理をおこなっているが、各ノードは別の対象ファイル123に書込処理をおこなってもよい。また、退避ファイル124の作成に関する詳細は後述する。
パス条件128は、実行ツリーの各経路においてシンボル変数が満たすべき条件を示す。パス条件128は、実行ツリーで経路が分岐する部分における条件式に基づいて作成される。例えば、パス条件128は、「a>3」で左側の経路に進み、「a<=3」で右側の経路に進むという条件式がある場合に、左側の経路に進むためのパス条件128は「a>3」となる。パス条件128は、経路に条件式が複数ある場合、各パス条件を、論理積を示す「AND」演算子を使って表される。例えば、パス条件128は「a>3 AND a<6」というように表される。
(処理装置の制御部の各構成)
図5に示すように、処理装置100の制御部110は作成部111と、判断部112と、格納部113と、取得部114と、実行部115とを有する。処理装置100の制御部110の機能は例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの集積回路により実現することができる。また、制御部110の機能は例えば、CPU(Central Processing Unit)が所定のプログラムを実行することで実現することができる。
処理装置100は、各ノードにおいてシンボリック変数に格納された値または所定の値を書き込む書込処理が実行された第一のファイルと、書込処理を実行する前の第一のファイルを複製した第二のファイルとを記憶する記憶部120を有する。また、処理装置100は第一のノードで第一のファイルに対して、第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、第一のファイルを複製した第二のファイルを記憶部に格納する格納部113を有する。また、処理装置100は第一のノードを経由する第一の経路から第一のノードにバックトラックして、第一のノードを経由する第二の経路に移行する。処理装置100は、この場合において第二の経路で最初に第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードにおいて、読込処理を実行する際に第二のファイルからシンボル変数値を取得する取得部114を有する。これにより、バックトラック後に移行する別経路のノードにおいて適切に読込処理をすることができるという効果が得られる。なお、処理装置100はシンボリック実行装置の一例である。また、対象ファイルは第一のファイルの一例である。また、後述する退避ファイル124は第二のファイルの一例である。
また、格納部113は、第一のノードを経由する第一の経路から第一のノードにバックトラックして、第一のノードを経由する第二の経路に移行する際に、第二のファイルを第一のファイルに反映する。格納部113は、該第二の経路で最初に第一のファイルにシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する第二のノードにおいて、第一のファイルに対してシンボリック変数に格納された値または所定の値を書き込む。これにより、バックトラック後に探索する別経路のノードにおいて適切に書込処理をすることができるという効果が得られる。
制御部110の各構成について説明する。作成部111は、クラス121から、1または2以上のメソッドを含む複数のモデルクラス122を作成する。作成部111は、作成された複数のモデルクラス122に基づき、複数のノードで構成される実行ツリーを作成する。作成部111は、モデルクラス122に含まれる条件式に基づき、実行ツリーを構成する各ノードに分岐を設ける。なお、作成部111における各処理は、例えば、JPF等のモデル検査エンジンがおこなってもよい。
判断部112は、ノードにおいて書込処理または読込処理に含まれる文字列が、シンボル変数リスト125に登録されているか否かにより、書込処理または読込処理にシンボル変数が含まれるか否かを判断する。例えば、判断部112は、書込処理に「c」という文字列があった場合に、シンボル変数リスト125を参照する。判断部112は、シンボル変数リスト125に「シンボル変数c」が登録されていた場合、当該書込処理にシンボル変数が含まれると判断する。また、判断部112は、後述する格納部113が対象ファイル123に対して書込処理を実行する際に上記処理をおこなう。もしくは、後述する取得部114が対象ファイル123に対して読込処理を実行する際に上記処理をおこなう。なお、実行ツリーの探索は、例えば、JPF等のモデル検査エンジンがおこなってもよい。
格納部113は、対象ファイル123に対して書込処理を実行する。格納部113は、対象ファイル123に書込処理を実行する前に、対象ファイル123を複製した退避ファイル124を記憶部120に記憶する。さらに、格納部113は、書込処理を実行する際にバックトラック管理テーブル127を更新する。具体的には、格納部113は、バックトラック管理テーブル127に、直近に書込処理を実行したノードのノード名と、対象ファイル123のアドレスと、当該ノードに係る退避ファイル124のアドレスとを対応付けた行を追加する。
また、格納部113は、実行する書込処理にシンボル変数が含まれる場合にファイル入出力テーブル126を更新する。具体的には、格納部113は、ファイル入出力テーブル126に、シンボル変数の値を格納したファイルのファイル名、書き込んだファイルの位置、およびシンボル変数を含む入出力処理を実行する際に使用する値を対応付けた行を追加する。なお、格納部113は、書込処理にシンボル変数が含まれない場合、プログラムにしたがい対象ファイル123に書込処理をおこなう。
取得部114は、実行する読込処理にシンボル変数が含まれる場合、ファイル入出力テーブル126を参照して対象ファイル123のアドレスを確認する。そして、取得部114は対象ファイル123に対して読込処理を実行する。一方、後述する実行部115は、バックトラックした後に他の経路を探索する場合がある。この場合において取得部114は、当該他の経路に存在するノードにおいて読込処理を実行するときに、バックトラック管理テーブル127を参照して対応する退避ファイル124のアドレスを確認する。そして、取得部114は、確認した退避ファイル124に対して読込処理を実行することにより、シンボル変数に挿入する値を取得する。なお、取得部114は、読込処理にシンボル変数が含まれない場合、プログラムにしたがい対象ファイル123に読込処理をおこなう。
実行部115は、実行ツリーにおいてノードを探索し、ノードにおいてなされる書込処理および読込処理以外の各種メソッドを実行する。例えば、実行部115は、加算処理、減算処理等の演算処理に係るメソッドを実行する。また、実行部115は、対象ファイル123が作成されていない場合に、対象ファイル123を作成するメソッドを実行する。また、実行部115は、実行ツリーの各経路におけるパス条件128を作成し、それぞれ記憶部120に記憶する。実行部115は、実行ツリーに複数の条件式が含まれる場合、パス条件128を論理積「AND」で表してもよい。なお、実行部115における加算処理、減算処理等の演算処理に係るメソッドの実行は、例えば、JPF等のモデル検査エンジンがおこなってもよい。
(制御部における処理)
すなわち、制御部110の各構成は以下の処理をおこなう。図9は、本実施形態に係る実行ツリーの第1の模式図を示す図である。図9において楕円形の図形に付された番号はノード番号を示す。第1の段階において制御部110は、クラス121に基づき実行ツリーを作成する。具体的には、作成部111は、クラス121から複数のモデルクラス122を作成する。次いで、作成部111は、作成された複数のモデルクラス122に基づき、複数のノードで構成される図9の実行ツリーを作成する。
第2の段階において制御部110は、根ノードであるノード1から葉ノードであるノード6までを探索する。具体的には、まず、実行部115は、ノード1において対象ファイル123を作成する処理をおこなう。次いで、実行部115は、ノード2においてシンボル変数aに所定の数値を加算する演算式が含まれていた場合、シンボル変数aに対して加算する演算処理をおこなう。なお、各ノードにおいておこなわれる加算、減算等の演算処理は、例えば、JPF等のモデル検査エンジンによっておこなわれてもよい。以降についても同様である。
次いで、格納部113は、ノード3において書込処理を実行する前に、対象ファイル123を複製した退避ファイル124を記憶部120に記憶する。さらに、格納部113は、バックトラック管理テーブル127にノードを「ノード1」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「c:\taihi\node1text1.txt」とする行を1行追加する。つまり、格納部113は、ノード3において書込処理をおこなう前に退避ファイル124を作成して、バックトラック管理テーブル127に、退避ファイル124のアドレスをノード1に対応付けて記憶させる。また、格納部113は、退避ファイル124のファイル名を「text1.txt」に「node1」を付記して「node1text1.txt」とする。なお、格納部113は、他のノードで退避ファイルを作成する場合においても「text1.txt」にノード名を付記する。
次いで、格納部113は、ノード3においてシンボル変数aの数値を対象ファイル123に書き込む書込処理をおこなう。なお、図9は、当該退避ファイル124をノード1に対応する退避ファイル124として、長方形の図形10で示す。また、図9は、ノード3およびノード4においても、それぞれ図形11、図形12で退避ファイル124を示す。
次いで、格納部113は、ノード4において書込処理を実行する前に、対象ファイル123を複製した退避ファイル124を記憶部120に記憶する。さらに、格納部113は、バックトラック管理テーブル127にノードを「ノード3」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「c:\taihi\node3text1.txt」とする行を1行追加する。次いで、格納部113は、ノード4においてシンボル変数bの数値を対象ファイル123に書き込む書込処理をおこなう。
次いで、実行部115は、ノード5においてシンボル変数bに所定の数値を減算する演算式が含まれていた場合、シンボル変数bに所定の数値を減算する演算処理をおこなう。次いで、格納部113は、ノード6において書込処理を実行する前に、対象ファイル123を複製した退避ファイル124を記憶部120に記憶する。さらに、格納部113は、バックトラック管理テーブル127にノードを「ノード4」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「c:\taihi\node4text1.txt」とする行を1行追加する。次いで、格納部113は、ノード6においてシンボル変数bの数値を対象ファイル123に書き込む書込処理をおこなう。
このとき、実行部115は、ノード1からノード6までの経路に対応するパス条件128を記憶部120に記憶する。例えば、実行部115は、ノード1からノード2に移行する際のパス条件が「b>1」で、ノード3からノード4に移行する際のパス条件が「b>3」である場合、パス条件128として「b>1 AND b>3」を記憶部120に記憶する。
第3の段階において制御部110は、葉ノードであるノード6に最も直近であり、別経路への分岐を有するノード3にバックトラックする。実行部115は、ノード4からノード3にバックトラックする際に、記憶部120からノード4に対応する図形12の退避ファイル124を削除する。さらに、格納部113は、バックトラック管理テーブル127に追加されたノード4に係る行を削除する。
第4の段階において制御部110は、ノード3から別経路のノード7まで探索する。ノード7はシンボル変数bに挿入する値を対象ファイル123から読み込む読込処理を有する。このとき、取得部114は、ノード7においてシンボル変数bに挿入する値を対象ファイル123からではなく、ノード3に対応する図形11の退避ファイル124から読み込む。次いで、取得部114は、退避ファイル124から読み込んだ値をシンボル変数bに挿入する。
そして、実行部115は、ノード1からノード2に移行する際のパス条件が「b>1」で、ノード3からノード7に移行する際のパス条件が「b<=3」である場合、パス条件128として「b>1 AND b<=3」を記憶部120に記憶する。
第5の段階において制御部110は、ノード3の一つ前の分岐を有するノード1にバックトラックする。実行部115は、ノード3からノード2にバックトラックする際にノード3に対応する図形11の退避ファイル124を削除する。さらに、格納部113は、バックトラック管理テーブル127に追加されたノード3に係る行を削除する。
第6の段階において制御部110は、ノード1から別経路のノード9まで探索する。実行部115は、ノード8において対象ファイル123が存在するか否かを確認する処理をおこなう。実行部115は、記憶部120に対象ファイル123が存在するのでファイルが存在する旨の応答を取得する。次いで、実行部115は、ノード9において対象ファイル123を削除する処理をおこなう。このとき、実行部115は、ノード1からノード8に移行する際のパス条件が「b<=1」である場合、パス条件128として「b<=1」を記憶部120に記憶する。
第7の段階において制御部110は、処理を終了させる。このとき、実行部115は、全ての退避ファイル124を削除する。また、実行部115は、バックトラック管理テーブル127の全ての行を削除する。なお、ファイル入出力テーブル126の参照および更新、バックトラック管理テーブル127の参照および更新、シンボル変数リスト125の参照等の処理の詳細に関しては、次の具体例にて説明する。
(制御部における処理の具体例)
図10は、ファイルへの書込処理または読込処理を有するプログラムの第3の例を示す図である。図10に示されるプログラムは、例えばクラス121である。第1の段階において制御部110は、クラス121に基づき実行ツリーを作成する。まず、作成部111は、当該プログラムに基づきモデルクラス122を作成する。例えば、作成部111は、図10中の「a値の書込処理1」をモデルクラス122とする。具体的には、作成部111は、「DataOutputStream」メソッドと「readInt」メソッドとを一つのモデルクラス122とする。次いで、作成部111は、作成された複数のモデルクラス122に基づき、複数のノードで構成される実行ツリーを作成する。図11は、本実施形態に係る実行ツリーの第2の模式図を示す図である。作成部111は、例えば図11に示された実行ツリーを作成する。なお、図11の実行ツリーを構成する各ノードは図9の実行ツリーに対応している。
第2の段階において制御部110は、根ノードであるノード1から葉ノードであるノード6までを探索する。具体的には、まず、実行部115は、ノード1において対象ファイル123を作成する処理をおこなう。図12は、ノード1に状態が移行した際のバックトラック管理テーブルの一例を示す図である。格納部113は、図12のようにバックトラック管理テーブル127にノードを「ノード1」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「−」とする行を1行追加する。
次いで、実行部115は、ノード2において「a=a+5」の加算処理を実行する。次いで、格納部113は、ノード3において書込処理を実行する前に、対象ファイル123を複製した退避ファイル124を記憶部120のアドレス「c:\taihi\」の配下に記憶する。また、格納部113は、退避ファイル124のファイル名をノード1に対応付けて「node1text1.txt」とする。図13は、ノード3に状態が移行した際のバックトラック管理テーブルの一例を示す図である。図13のように格納部113は、バックトラック管理テーブル127の1行目において、ノードを「ノード1」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「c:\taihi\node1text1.txt」に更新する。さらに、格納部113は、バックトラック管理テーブル127にノードを「ノード3」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「−」とする行を1行追加する。
次いで、判断部112は、図6のシンボル変数リスト125に「シンボル変数a」が登録されているので、ノード3の書込処理に含まれる文字列「a」がシンボル変数であると判断する。次いで、格納部113は、シンボル変数aに挿入されている数値を対象ファイル123に書き込む書込処理をおこなう。このとき、格納部113はファイル入出力テーブル126にファイル名を「text1.txt」、位置を「0-4」、値を「s_a_3_SYMINT_STATIC_FIELD + CONST_1」とする行を1行追加する。なお、格納部113は、判断部112が書込処理にシンボル変数が含まれないと判断した場合、プログラムの記述にしたがい対象ファイル123に書込処理をおこなう。
次いで、格納部113は、ノード4において書込処理を実行する前に、対象ファイル123を複製した退避ファイル124を記憶部120のアドレス「c:\taihi\」の配下に記憶する。また、格納部113は、退避ファイル124のファイル名をノード3に対応付けて「node3text1.txt」とする。図14は、ノード4に状態が移行した際のバックトラック管理テーブルの一例を示す図である。図14のように格納部113は、バックトラック管理テーブル127の2行目において、ノードを「ノード3」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「c:\taihi\node3text1.txt」に更新する。さらに、格納部113は、バックトラック管理テーブル127にノードを「ノード4」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「−」とする行を1行追加する。
次いで、判断部112は、図6のシンボル変数リスト125に「シンボル変数b」が登録されているので、ノード4の書込処理に含まれる文字列「b」がシンボル変数であると判断する。次いで、格納部113は、シンボル変数bに挿入されている数値を対象ファイル123に書き込む書込処理をおこなう。このとき、格納部113はファイル入出力テーブル126にファイル名を「text1.txt」、位置を「5-8」、値を「s_b_3_SYMINT_STATIC_FIELD + CONST_1」とする行を1行追加する。
次いで、実行部115は、ノード5において「b=b-1」の加算処理を実行する。次いで、格納部113は、ノード6において書込処理を実行する前に、対象ファイル123を複製した退避ファイル124を記憶部120のアドレス「c:\taihi\」の配下に記憶する。また、格納部113は、退避ファイル124のファイル名をノード4に対応付けて「node4text1.txt」とする。図15は、ノード6に状態が移行した際のバックトラック管理テーブルの一例を示す図である。図15のように格納部113は、バックトラック管理テーブル127の3行目において、ノードを「ノード4」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「c:\taihi\node4text1.txt」に更新する。さらに、格納部113は、バックトラック管理テーブル127にノードを「ノード6」、対象ファイル123を「c:\temp\text1.txt」、退避ファイル124を「−」とする行を1行追加する。
次いで、判断部112は、図6のシンボル変数リスト125に「シンボル変数b」が登録されているので、ノード6の書込処理に含まれる文字列「b」がシンボル変数であると判断する。次いで、格納部113は、ファイル入出力テーブル126を参照し、シンボル変数bがファイル入出力テーブル126に登録されていることを確認する。格納部113は、ファイル入出力テーブル126に基づき対象ファイル123を上書きする。
このとき、実行部115は、ノード1からノード6までの経路に対応するパス条件128を記憶部120に記憶する。実行部115は、ノード1からノード2に移行する際のパス条件が「b>1」で、ノード3からノード4に移行する際のパス条件が「b>3」であるので、パス条件128として「b>1 AND b>3」を記憶部120に記憶する。
第3の段階において制御部110は、葉ノードであるノード6に最も直近であり、別経路への分岐を有するノード3にバックトラックする。実行部115は、ノード4からノード3にバックトラックする際にノード4に対応する退避ファイル124を削除する。さらに、格納部113は、バックトラック管理テーブル127からノード4およびノード6に係る行を削除する。
第4の段階において制御部110は、ノード3から別経路のノード7までを探索する。ノード7は、対象ファイル123からシンボル変数bに挿入する値を読み込む読込処理を有する。まず、判断部112は、図6のシンボル変数リスト125に「シンボル変数b」が登録されているので、ノード7の読込処理に含まれる文字列「b」がシンボル変数であると判断する。
次いで、取得部114は、ノード7においてシンボル変数bに挿入する値を、対象ファイル123からではなく、ノード3に対応する退避ファイル124から読み込む。そのために、取得部114は、バックトラック管理テーブル127を参照してノード3に対応する退避ファイル124のアドレスを確認する。図16は、ノード7に状態が移行した際のバックトラック管理テーブルの一例を示す図である。取得部114は、バックトラック管理テーブル127の表示行2行目からノード3に対応する退避ファイル124のアドレス「c:\taihi\node3test1.txt」を確認する。さらに、取得部114は、ファイル入出力テーブル126に基づき退避ファイル124からシンボル変数bの数値を読み込む。なお、取得部114は、判断部112が読込処理にシンボル変数が含まれないと判断した場合、プログラムの記述にしたがい退避ファイル124に対して読込処理をおこなう。
このとき、実行部115は、ノード1からノード2に移行する際のパス条件が「b>1」で、ノード3からノード7に移行する際のパス条件が「b<=3」であるので、パス条件128として「b>1 AND b<=3」を記憶部120に記憶する。
第5の段階において制御部110は、ノード3の一つ前の分岐を有するノード1にバックトラックする。実行部125は、ノード3からノード2にバックトラックする際にノード3に対応する退避ファイル124を削除する。さらに、格納部113は、バックトラック管理テーブル127からノード3およびノード7に係る行を削除する。
第6の段階において制御部110は、ノード1から別経路のノード9まで探索する。実行部125は、ノード8において対象ファイル123が存在するかを確認する処理をおこなう。実行部125は、記憶部120に対象ファイル123が存在するのでファイルが存在する旨の応答を取得する。次いで、実行部125は、ノード9において対象ファイル123を削除する処理をおこなう。
このとき、実行部115は、ノード1からノード8に移行する際のパス条件が「b<=1」であるので、パス条件128として「b<=1」を記憶部120に記憶する。
第7の段階において制御部110は、処理を終了させる。このとき、実行部125は、全ての退避ファイル124を削除する。また、実行部125は、バックトラック管理テーブル127の全ての行を削除する。
記憶部120は、第7の段階を終了した時点でパス条件128に「b>1 AND b>3」、「b>1 AND b<=3」、「b<=1」の3つのパス条件を記憶している。これにより、処理装置100はパス条件に基づきテストケースを生成することが可能である。例えば、処理装置100は、「b=1」「b=3」「b=4」の3つのテストケースを生成する。このように、処理装置100は、処理対象のプログラムに対象ファイルへシンボル変数を書き込む処理および読み込む処理が含まれ、シンボル変数を永続化する場合であっても適切にテストケースを生成することができる。また、以上説明したように、取得部114は、バックトラック後に移行する別経路のノードにおいて退避ファイル124を用いて入出力処理をするので、当該ノードで適切に入出力処理をすることができる。
(処理装置おける処理の流れ)
次に、処理装置100における処理の流れについて説明する。図17は、各ノードにおける処理の流れの一例を示したフロー図である。まず、作成部111は、クラス121から複数のモデルクラス122を作成する(ステップS30)。次いで、格納部113および取得部114は、あるノードにおいて対象ファイル123への入出力処理があるか否かを判定する(ステップS31)。
次いで、取得部114は、ノードにおいて対象ファイル123への読込処理がない場合(ステップS32No)、ステップS37に移行する。一方、取得部114は、ノードにおいて対象ファイル123への読込処理がある場合(ステップS32Yes)、バックトラック管理テーブル127を参照する(ステップS33)。このとき、取得部114は、バックトラック後に別ノードへ移行した場合、直近に対象ファイルに書込処理をおこなったノードに対応する退避ファイル124のアドレスを参照する。一方、取得部114は、それ以外の場合、直近に対象ファイルに書込処理をおこなったノードに対応する対象ファイル123のアドレスを参照する。
次いで、取得部114は、判断部112がシンボル変数リスト125を参照して読込処理にシンボル変数が含まれないと判定した場合(ステップS34No)、プログラムにしたがい対象ファイル123または退避ファイル124に対して読込処理をおこなう。一方、取得部114は、判断部112がシンボル変数リスト125を参照して読込処理にシンボル変数が含まれると判定した場合(ステップS34Yes)、ファイル入出力テーブル126を参照する(ステップS35)。取得部114は、ファイル入出力テーブル126からシンボル変数が格納されているファイルのファイル名、ファイルの位置等を確認する。次いで、取得部114は、対象ファイル123または退避ファイル124を読み込む読込処理をおこなう(ステップS36)。
次いで、格納部113は、ノードにおいて対象ファイル123への書込処理がない場合(ステップS37No)、処理を終了させる。一方、格納部113は、ノードにおいて対象ファイル123への書込処理がある場合(ステップS37Yes)、バックトラック管理テーブル127を参照する(ステップS38)。このとき、格納部113は、バックトラック管理テーブル127において直近に対象ファイル123に書込処理をおこなったノードを確認する。次いで、格納部113は、当該書込処理をおこなったノードに対応する退避ファイル124を作成する(ステップS39)。次いで、格納部113は、バックトラック管理テーブル127に、直近に書込処理を実行したノード名と、対象ファイル123のアドレスと、退避ファイル124のアドレスとを対応付けた行を追加することによりバックトラック管理テーブル127を更新する(ステップS40)。
次いで、格納部113は、判断部112が書込処理にシンボル変数が含まれないと判定した場合(ステップS41No)、プログラムの記述にしたがい対象ファイル123に対して書込処理をおこなう(ステップS43)。一方、格納部113は、判断部112が書込処理にシンボル変数が含まれると判定した場合(ステップS41Yes)、書き込んだファイルのファイル名、ファイルの位置等を含む行を追加することによりファイル入出力テーブル126を更新する(ステップS42)。次いで、格納部113は、対象ファイル123にシンボル変数に格納されている値を書き込む書込処理をおこなう(ステップS43)。
(実施例1に関連する他の実施例)
上記実施態様においては、作成部111は、書込処理、読込処理、演算処理等のように1または複数のメソッドを含むノードを設定した。これに限られず、作成部111はノードに含まれるメソッド数を変更してもよい。
上記実施態様においては、作成部111が実行ツリーを作成した。これに限られず、例えば、JPF等のモデル検査エンジンが実行ツリーを作成してもよい。すなわち、判断部112、格納部113、取得部114および実行部115は、モデル検査エンジンが作成した実行ツリーに対して上記処理をおこなってもよい。
上記実施態様においては、実行部115が各ノードに含まれる加算、減算等の演算処理を実行した。これに限られず、例えば、JPF等のモデル検査エンジンが加算、減算等の演算処理を実行してもよい。
上記実施態様においては、作成部111がプログラムに相当するクラス121から実行ツリーを作成する旨を説明した。これに限られず、作成部111は、プログラム自体が各処理にノードを設定している場合に、プログラムにより設定された実行ツリーを使用してもよい。
上記実施態様においては、制御部110が各ノードにおいて数値の演算処理、入出力処理をする旨を説明した。これに限られず、制御部110が各ノードにおいて文字データに対して各種処理をおこなってもよい。
上記実施態様においては、処理装置100はJAVAに係るプログラムを取り扱う旨を説明した。これに限定されず、処理装置100はJAVA以外のプログラムを取り扱ってもよい。
上記実施態様においては、各ノードが同一の対象ファイル123に入出力処理をおこなう旨を説明した。これに限られず、各ノードは異なる対象ファイル123に入出力処理をおこなってもよい。
上記実施態様においては、処理装置100はモデル検査エンジンにJPFを使用してもよい旨を説明した。これに限られず、処理装置100はJPF以外のモデル検査エンジンを使用してもよい。
(バックトラック後に移行する別経路のノードにおける書込処理)
図9において格納部113が、ノード6からノード3にバックトラックした後、ノード7で書込処理をおこなう場合について説明する。格納部113は、ノード7において書込処理を実行する前に、ノード3に対応する退避ファイル124を対象ファイル123に反映させる。すなわち、格納部113は、退避ファイル124の内容を対照ファイル123に上書きする等して、対象ファイル123の内容を退避ファイル124の内容に一致させる。そして、格納部113は、対象ファイル123に対して書込処理を実行する。これにより、バックトラック後に探索する別経路のノードにおいて適切に書込処理をすることができるという効果が得られる。
また、実施例1に示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図5に示した処理装置100の各構成要素は機能概念的なものであり、必ずしも物理的に図示のように構成されていることを要しない。すなわち、処理装置100の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。
(表示端末のハードウェア構成)
図18は、処理装置のハードウェア構成を示す図である。図18が示すように、コンピュータ200は、各種演算処理を実行するCPU201と、ユーザからのデータ入力を受け付ける入力装置202と、モニタ203とを有する。また、コンピュータ200は、記憶媒体からプログラム等を読み取る媒体読取装置204と、他の装置と接続するためのインターフェース装置205と、他の装置と無線により接続するための無線通信装置206とを有する。また、コンピュータ200は、各種情報を一時記憶するRAM(Random Access Memory)207と、ハードディスク装置208とを有する。また、各装置201〜208は、バス209に接続される。
ハードディスク装置208には、図5に示した制御部110の作成部111、判断部112、格納部113、取得部114、および実行部115の各処理部と同様の機能を有する情報処理画面出力プログラムが記憶される。また、ハードディスク装置208には、情報処理画面出力プログラムを実現するための各種データが記憶される。
CPU201は、ハードディスク装置208に記憶された各プログラムを読み出して、RAM207に展開して実行することで、各種の処理を行う。また、これらのプログラムは、コンピュータ200を図5に示した作成部111、判断部112、格納部113、取得部114、および実行部115として機能させることができる。
なお、上記の情報処理画面出力プログラムは、必ずしもハードディスク装置208に記憶されている必要はない。例えば、コンピュータ200が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ200が読み出して実行するようにしてもよい。コンピュータ200が読み取り可能な記憶媒体は、例えば、CD−ROMやDVDディスク、USB(Universal Serial Bus)メモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、LAN(Local Area Network)等に接続された装置にこのプログラムを記憶させておき、コンピュータ200がこれらからプログラムを読み出して実行するようにしてもよい。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータが、
第一のノードで第一のファイルに対して、該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを記憶部に格納し、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードにおいて、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する
処理を実行することを特徴とするシンボリック実行方法。
(付記2)前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、前記第二のファイルを前記第一のファイルに反映し、
前記第二の経路で最初に前記第一のファイルにシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する第二のノードにおいて、前記第一のファイルに対して前記シンボリック変数に格納された値または前記所定の値を書き込む処理を、さらに実行することを特徴とする付記1に記載のシンボリック実行方法。
(付記3)前記書込処理において書き込む内容にシンボル変数が含まれているか否か、または前記読込処理において読み込む内容にシンボル変数が含まれているか否かを判断する処理をさらに実行することを特徴とする付記1または2に記載のシンボリック実行方法。
(付記4)前記第一の経路上にある前記第一のノードの子ノードから前記第一のノードにバックトラックする際に、前記記憶部に格納されており、前記子ノードに対応する前記第二のファイルを削除することを特徴とする付記1〜3のいずれか一に記載のシンボリック実行方法。
(付記5)前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルに書込処理を実行する第二のノードが、前記第二のファイルを前記第一のファイルに一致させてから第二のファイルに書き込む処理をさらに実行することを特徴とするシンボリック実行方法。
(付記6)各ノードにおいてシンボリック変数に格納された値または所定の値を書き込む書込処理が実行された第一のファイルと、前記書込処理を実行する前の前記第一のファイルを複製した第二のファイルとを記憶する記憶部と、
第一のノードで前記第一のファイルに対して、該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを前記記憶部に格納する格納部と、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードが、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する取得部と
を有することを特徴とするシンボリック実行装置。
(付記7)コンピュータに、
第一のノードで第一のファイルに対して、該第一のノードで使用されたシンボリック変数に格納された値または所定の値を書き込む書込処理を実行する際に、前記第一のファイルを複製した第二のファイルを記憶部に格納し、
前記第一のノードを経由する第一の経路から前記第一のノードにバックトラックして、前記第一のノードを経由する第二の経路に移行する際に、該第二の経路で最初に前記第一のファイルからシンボル変数に挿入する値を読み込む読込処理を実行する第二のノードが、前記読込処理を実行する際に前記第二のファイルからシンボル変数値を取得する
処理を実行させることを特徴とするシンボリック実行プログラム。