(57)【要約】      （修正有）【課題】シンボリック実行において変数の演算を適切に行う。【解決手段】シンボル値演算装置１は、シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換すると共に、第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換する第１変換部１２０と、第１変換部による変換後の具体値を、第１の記憶領域に格納すると共に、第１変換部による変換後のシンボル値を、第１の記憶領域とは異なる第２の記憶領域に格納する第１格納処理部１０４とを有する。【選択図】図４
2015072538.tif 000002
【特許請求の範囲】
【請求項１】
シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換すると共に、前記第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換する第１変換部と、
前記第１変換部による変換後の具体値を、第１の記憶領域に格納すると共に、前記第１変換部による変換後のシンボル値を、前記第１の記憶領域とは異なる第２の記憶領域に格納する第１格納処理部と、
を有する演算装置。
【請求項２】
前記第１の記憶領域に格納された具体値を、転記先の変数である第２の変数の形式に変換すると共に、前記第２の記憶領域に格納されたシンボル値を、前記第２の変数の形式に変換する第２変換部と、
前記第２変換部による変換後の具体値を第３の記憶領域に格納すると共に、前記第２変換部による変換後のシンボル値を、前記第３の記憶領域とは異なる第４の記憶領域に格納する第２格納処理部と、
をさらに有する請求項１記載の演算装置。
【請求項３】
前記第２の記憶領域に格納されたシンボル値の桁のうち空である桁を前記第１の記憶領域に格納された具体値の同じ桁で置換して第１の混合値を生成すると共に、第５の記憶領域に格納された具体値を前記第１の形式に変換し、第６の記憶領域に格納されたシンボル値を前記第２の形式に変換し、変換後の前記シンボル値の桁のうち空である桁を、変換後の前記具体値における同じ桁で置換して第２の混合値を生成する生成部と、
前記第１の混合値と前記第２の混合値との比較を行う比較部と、
をさらに有する請求項１又は２記載の演算装置。
【請求項４】
シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換し、第１の記憶領域に格納し、
前記第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換し、前記第１の記憶領域とは異なる第２の記憶領域に格納する
処理を演算装置が実行する演算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シンボリック実行技術に関する。
【背景技術】
【０００２】
プログラム内に条件分岐が有る場合、プログラムには複数の処理パスが存在する。プログラムのテストを行う際には、テスト実施者は、プログラムにおける複数の処理パスを網羅的に実行できるようにテストデータやシナリオを設計する。
【０００３】
プログラムをテストする１つの方法として、シンボリック実行（symbolic execution）という技術が知られている。シンボリック実行とは、変数の初期値を、実数値ではなく不定のシンボル値に設定し、プログラムにおける複数の処理パスを網羅するように、擬似的にプログラムを実行する技術である。シンボリック実行を行うことによって、プログラムにおける複数の処理パスの各々について、条件分岐を辿った履歴を表すパス条件を得ることができる。そこで、各パスについてパス条件を満たす変数の値を求めることで、プログラムのテストデータを得ることができる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１１−２７２５０３号公報
【特許文献２】特開平６−２９００３９号公報
【特許文献３】特開２０１１−１９１９８５号公報
【特許文献４】特公昭６１−５１６９号公報
【非特許文献】
【０００５】
【非特許文献１】Corina S. P.as.areanu, Peter C. Mehlitz, David H. Bushnell, Karen Gundy-Burlet, Michael Lowry, Suzette Person, Mark Pape, "Combining unit-level symbolic execution and system-level concrete execution for testing nasa software", the 2008 international symposium on Software testing and analysis, Pages 15-26.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ところで、プログラムにおける演算（例えば、転記演算或いは比較演算等）の対象となる変数には、様々な形式（内部形式とも呼ばれる）が存在する。例えばＣＯＢＯＬというプログラミング言語には、１バイトに１桁を割り当てる形式（以下、外部１０進形式と呼ぶ）、１バイトに２桁を割り当てる形式（以下、内部１０進形式と呼ぶ）、及び値を２進表現で格納する形式（以下、内部２進形式と呼ぶ）等がある。
【０００７】
しかし、従来の技術においては、シンボリック実行における変数の形式の取り扱いについて、十分な検討がなされていない。そのため、従来のシンボリック実行だと、正しい演算結果を得ることができず、その結果、テストデータを漏れなく抽出することができない場合がある。
【０００８】
従って、本発明の目的は、１つの側面では、シンボリック実行において変数の演算を適切に行うための技術を提供することである。
【課題を解決するための手段】
【０００９】
本発明に係る演算装置は、シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換すると共に、第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換する第１変換部と、第１変換部による変換後の具体値を、第１の記憶領域に格納すると共に、第１変換部による変換後のシンボル値を、第１の記憶領域とは異なる第２の記憶領域に格納する第１格納処理部とを有する。
【発明の効果】
【００１０】
１つの側面では、シンボリック実行において変数の演算を適切に行えるようになる。
【図面の簡単な説明】
【００１１】
【図１】図１は、シンボリックの対象となるプログラムの一例を示す図である。
【図２】図２は、本実施の形態の方法を用いない場合において主記憶装置に格納されるデータの一例を示す図である。
【図３】図３は、情報処理装置の機能ブロック図である。
【図４】図４は、シンボル値演算装置の機能ブロック図である。
【図５】図５は、主記憶装置に格納されるデータの一例を示す図である。
【図６】図６は、外部レジスタに格納されるデータの一例を示す図である。
【図７】図７は、メインの処理フローを示す図である。
【図８】図８は、具体値の転記演算の処理フローを示す図である。
【図９】図９は、シンボル値の転記演算の処理フローを示す図である。
【図１０】図１０は、桁数形式に変換する処理の処理フローを示す図である。
【図１１】図１１は、転記演算によってデータレジスタに格納される具体値の一例を示す図である。
【図１２】図１２は、転記演算によってデータレジスタに格納されるシンボル値の一例を示す図である。
【図１３】図１３は、転記演算によって主記憶装置に格納されるデータの一例を示す図である。
【図１４】図１４は、転記演算によって主記憶装置に格納されるデータの一例を示す図である。
【図１５】図１５は、転記演算によって主記憶装置に格納されるデータの一例を示す図である。
【図１６】図１６は、転記演算によってデータレジスタに格納される具体値の一例を示す図である。
【図１７】図１７は、転記演算によってデータレジスタに格納されるシンボル値の一例を示す図である。
【図１８】図１８は、転記演算によって主記憶装置に格納されるデータの一例を示す図である。
【図１９】図１９は、転記演算によって主記憶装置に格納されるデータの一例を示す図である。
【図２０】図２０は、転記演算によってデータレジスタに格納される具体値の一例を示す図である。
【図２１】図２１は、転記演算によってデータレジスタに格納されるシンボル値の一例を示す図である。
【図２２】図２２は、転記演算によって主記憶装置に格納されるデータの一例を示す図である。
【図２３】図２３は、転記演算によって主記憶装置に格納されるデータの一例を示す図である。
【図２４】図２４は、比較演算の処理フローを示す図である。
【図２５】図２５は、混合値生成処理の処理フローを示す図である。
【図２６】図２６は、外部レジスタに格納されるデータの一例を示す図である。
【図２７】図２７は、混合値の生成の具体例を示す図である。
【図２８】図２８は、混合値の生成の具体例を示す図である。
【発明を実施するための形態】
【００１２】
図１に、シンボリックの対象となるプログラムの一例を示す。図１に示されたプログラムは、ＣＯＢＯＬで書かれたプログラムであり、以下のような特徴がある。
【００１３】
（１）内部形式が異なる複数の変数が存在する。変数Ａは外部１０進形式で主記憶装置の領域を確保する。変数Ｂは内部１０進形式で主記憶装置の領域を確保する。変数Ｃは内部２進形式で主記憶装置の領域を確保する。
【００１４】
（２）同じ変数についてシンボル値と具体値とが混在する状況が生じる。具体的には、プログラムの１１０行目では、変数Ａの２桁目のみを具体値「４」に書き換える。また、１２０行目では、変数Ａの３桁目のみを具体値「９」に書き換える。一方、その他の桁は具体値ではなくシンボル値等である。
【００１５】
（３）或る変数に格納される、シンボル値及び具体値の両方を含む値が、転記演算によって別の変数に転記され、また比較演算によって別の変数と比較される。具体的には、１４０行目においては、変数Ａに格納されている値が、変数Ｂに転記され、１５０行目においては、変数Ａに格納されている値が、変数Ｃに転記される。１６０行目および１９０行目においては、変数Ａに格納されている値が変数Ｂ及び変数Ｃに格納されている値と比較される。
【００１６】
シンボリック実行をする場合、１６０行目の「IF (変数Ａ＝変数Ｂ) THEN」においては、処理パスを網羅するため、真も偽も成立すべきである。しかし、以下で説明する本実施の形態の方法を用いない場合、１４０行目の「MOVE 変数Ａ TO 変数Ｂ」および１５０行目「MOVE 変数Ａ TO 変数Ｃ」の転記によって、例えば図２のように主記憶装置の領域が書き換えられる。具体的には、変数Ａについては、アドレスＡ２及びＡ３に具体値が格納され、その他のアドレスにシンボル値等が格納される。変数Ｂについては、アドレスＡ５に具体値が格納され、その他のアドレスにシンボル値等が格納される。変数Ｃについては、アドレスＡ８に具体値が格納され、その他のアドレスにシンボル値等が格納される。なお、小数点の位置は別途レジスタ上に格納される。
【００１７】
従って、１６０行目の「IF (変数Ａ＝変数Ｂ) THEN」においては、「［００］［４９］［０＿０］＝［４９］［００］」が成立するか判定するので、真のみ成立するという結果になる。なお、本例では、括弧は１バイトを表し、例えば［００］であれば１バイトに「００」という値が格納される。また、末尾の値は符号部の値であり、本実施の形態においては、正の値、負の値、及び値無しの３とおりがある。
【００１８】
同様に、１９０行目の「IF (変数Ａ＝変数Ｃ) THEN」についても、シンボリック実行では真も偽も成立すべきである。しかし、本実施の形態を用いない場合、「［００］［４９］［００］＝［００］［４９］［００］」が成立するか判定するので、真のみ成立するという結果になる。
【００１９】
なお、ＣＯＢＯＬの文法仕様により、値の比較時には、桁が不足する箇所に０が補完される。左辺及び右辺のいずれも末尾は符号部である。文法仕様については、例えば、「NetCOBOL V10.5 COBOL文法書（http://software.fujitsu.com/jp/manual/manualfiles/m120024/b1wd1361/06z000/b1wd-1361-06z0.pdf）」を参照のこと。
【００２０】
このように、以下で説明する本実施の形態を用いない場合、同じ変数についてシンボル値と具体値とが混在する（すなわち、異なる桁にシンボル値及び具体値が存在する）状況において、転記が適切に行われなくなる。さらに、比較も適切に行われなくなる。すなわち、シンボリック実行であるにもかかわらず、分岐において真のみ成立すると判定してしまうので、偽である場合の処理パスを網羅することができなくなる。その結果、偽である場合の処理パスについてテストデータを抽出することができなくなる。
【００２１】
そこで、本実施の形態においては、以下で示すような形式で変数の値を保持することによって、シンボリック実行における演算の誤りを無くすことができるようにする。
【００２２】
図３に、本実施の形態における情報処理装置１０のブロック図を示す。情報処理装置１０は、プログラム格納部６と、プログラム読み出し部５１、命令実行装置５２、カウンタ制御部５３及び記録部５４を含むシンボリック実行装置５と、実行履歴格納部４と、外部レジスタ３と、主記憶装置２と、シンボル値演算装置１とを有する。
【００２３】
プログラム格納部６には、シンボリック実行の対象となるプログラムが格納される。プログラム読み出し部５１は、プログラム格納部６に格納されているプログラムを読み出し、命令実行装置５２に出力する。命令実行装置５２は、プログラムを実行すると共に、所定の命令（本実施の形態では、転記命令及び比較命令）を、シンボル値演算装置１に出力する。また、命令実行装置５２は、プログラムにおける演算の結果を外部レジスタ３に格納する。命令実行装置５２は、プログラム読み出し部５１から受け取ったプログラムの実行が完了すると、その旨をカウンタ制御部５３に通知する。カウンタ制御部５３は、プログラムカウンタを管理しており、プログラム読み出し部５１による読み出しを制御する。記録部５４は、命令実行装置５２から受け取った情報に基づき実行履歴（例えば、パス条件等）を生成し、実行履歴格納部４に格納する。シンボル値演算装置１は、外部レジスタ３に格納されているデータ及び主記憶装置２に格納されているデータ等を用いて転記演算を行い、結果を主記憶装置２に格納する。また、シンボル値演算装置１は、主記憶装置２に格納されているデータを用いて比較演算を行い、結果を外部レジスタ３に格納する。
【００２４】
図４に、シンボル値演算装置１のブロック図を示す。シンボル値演算装置１は、命令デコーダ１００と、読み出し部１０１と、第１転送処理部１１１及び第２転送処理部１１２を含む転送処理部１１０と、第１形式変換部１２１及び第２形式変換部１２２を含む第１変換部１２０と、第３形式変換部１３１及び第４形式変換部１３２を含む第２変換部１３０と、変換装置１０２と、データレジスタ１０３と、書き出し部１０４と、比較演算部１０５と、混合値生成部１０６とを有する。
【００２５】
命令デコーダ１００は、シンボリック実行装置５から受け取った命令をデコードし、変数（本実施の形態においては、転記元変数及び転記先変数、又は、比較元変数及び比較先変数）の情報を特定する。そして、命令デコーダ１００は、変数の情報及びデコードされた命令に基づく処理の実行を、読み出し部１０１に指示する。
【００２６】
読み出し部１０１は、命令デコーダ１００からの指示に従い、外部レジスタ３から変数の値を読み出し又は主記憶装置２から変数の値を読み出す。読み出し部１０１は、命令が転記命令である場合には、読み出した転記元変数の値を転送処理部１１０に出力する。読み出し部１０１は、命令が比較命令である場合には、読み出した比較元変数及び比較先変数の値を比較演算部１０５に出力する。
【００２７】
第１転送処理部１１１は、読み出し部１０１から受け取った転記元変数の値（ここでは具体値）を、第１形式変換部１２１及び第３形式変換部１３１に出力する。第２転送処理部１１２は、読み出し部から受け取った転記元変数の値（ここではシンボル値）を、第２形式変換部１２２及び第４形式変換部１３２に出力する。
【００２８】
第１形式変換部１２１は、第１転送処理部１１１から受け取った転記元変数の具体値の形式をパック形式（パック形式は、内部１０進形式と同じである）に変換する処理を行い、処理結果を変換装置１０２に出力する。第２形式変換部１２２は、第２転送処理部１１２から受け取った転記元変数のシンボル値の形式を桁数形式に変換する処理を行い、処理結果を変換装置１０２に出力する。桁数形式は、桁毎に値を有する形式（すなわち、各要素が１桁の値を表す配列）である。
【００２９】
第３形式変換部１３１は、第１転送処理部１１１から受け取った転記元変数の具体値及び命令デコーダ１００から受け取った転記先変数の情報を用いて、データレジスタ１０３に格納されているパック形式の具体値を転記先変数の形式に変換する処理を行う。そして、第３形式変換部１３１は、処理結果を変換装置１０２に出力する。第４形式変換部１３２は、第２転送処理部１１２から受け取った転記元変数のシンボル値及び命令デコーダ１００から受け取った転記先変数の情報を用いて、データレジスタ１０３に格納されている桁数形式の転記元変数のシンボル値を転記先変数の形式に変換する処理を行う。そして、第４形式変換部１３２は、処理結果を変換装置１０２に出力する。
【００３０】
変換装置１０２は、第１変換部１２０から受け取った処理結果及び第２変換部１３０から受け取った処理結果をデータレジスタ１０３に格納する。
【００３１】
書き出し部１０４は、命令デコーダ１００から受け取った転記先変数の情報を用いて、データレジスタ１０３に格納されているデータを、主記憶装置２に格納する。
【００３２】
比較演算部１０５は、混合値生成部１０６に、混合値の生成を指示する。混合値生成部１０６は、比較元の変数及び比較先の変数の各々について混合値を生成し、データレジスタ１０３に格納する。また、比較演算部１０５は、比較元の変数の混合値と比較先の変数の混合値とを比較する処理を行い、処理結果を外部レジスタ３に格納する。
【００３３】
なお、図４における太い矢印はデータの読み出しを表し、図４における太い点線の矢印はデータの書き出しを表す。
【００３４】
図５に、主記憶装置２に格納されるデータの一例を示す。図５の例では、各変数について、値が格納されるアドレスと、各アドレスに対応する具体値と、各アドレスに対応するシンボル値とが格納される。このように、主記憶装置２には、具体値が格納される領域とシンボル値が格納される領域とが別々に設けられる。アドレスＡ１乃至Ａ８の各々は、１バイトの容量を有する格納領域のアドレスである。Ｓ１乃至Ｓ４、Ｓ６乃至Ｓ８、及びＳ１０乃至Ｓ１２はシンボル値を表し、Ｆ５、Ｆ９及びＦ１３は符号部の値を表す。なお、内部２進形式においては、１バイトあたり２桁として記憶領域が確保される。図５において、アドレスＡ７に格納されているＳ１１は変数Ｃの１００の位に対応する。
【００３５】
図６に、外部レジスタ３に格納されるデータの一例を示す。図６の例では、各アドレスに対応する具体値と、各アドレスに対応するシンボル値とが格納される。「ＮＡ」は、値が空であることを表す。主記憶装置２と同様、外部レジスタ３には、具体値が格納される領域とシンボル値が格納される領域とが別々に設けられる。
【００３６】
次に、図７乃至図２８を用いて、シンボル値演算装置１の動作について説明する。
【００３７】
まず、シンボル値演算装置１における命令デコーダ１００は、シンボリック実行装置５から受け取った命令をデコードし、転記元変数及び転記先変数の情報、又は、比較元変数及び比較先変数の情報を特定する（図７：ステップＳ１）。ステップＳ１において特定される情報には、例えば、開始アドレス、データ長、開始位置の情報、桁数、小数部、及び変数の形式の情報等が含まれる。
【００３８】
読み出し部１０１は、命令デコーダから受け取った変数の情報に従い、変数の値を外部レジスタ３又は主記憶装置２から読み出す（ステップＳ３）。また、読み出し部１０１は、命令の種類が転記命令であるか判断する（ステップＳ５）。転記命令である場合（ステップＳ５：Ｙｅｓルート）、読み出し部１０１は、読みだされた転記元変数の値を、転送処理部１１０に出力する。また、命令デコーダ１００は、転記元変数及び転記先変数の情報を転送処理部１１０に出力し、転記元変数の情報を第１変換部１２０に出力し、転記先変数の情報を第２変換部１３０及び書き出し部１０４に出力する。
【００３９】
これに応じ、転送処理部１１０は、具体値の転記演算（ステップＳ７）及びシンボル値の転記演算（ステップＳ９）を実行する。はじめに、具体値の転記演算について、図８を用いて説明する。
【００４０】
まず、転送処理部１１０における第１転送処理部１１１は、転記元変数の具体値を第１形式変換部１２１及び第３形式変換部１３１に出力する。第１形式変換部１２１は、転記元変数の具体値をパック形式に変換し、データレジスタ１０３のアドレスＲＡに格納する（図８：ステップＳ２１）。なお、データレジスタ１０３への格納は、変換装置１０２が行う。
【００４１】
第１転送処理部１１１は、命令デコーダ１００から受け取った転記先変数の情報を用いて、転記元変数の小数値桁数と転記先変数の小数値桁数との差異を計算し、差異の分だけ、アドレスＲＡに格納されている変換後の具体値をシフトする（ステップＳ２３）。すなわち、小数点の位置を合わせる処理を実行する。
【００４２】
第１転送処理部１１１は、転記先変数の符号部に値が格納されていない場合には、ステップＳ２３の処理が実行された後の具体値の符号部に、正の符号値を設定する（ステップＳ２５）。
【００４３】
第１転送処理部１１１は、ステップＳ２５の処理が実行された後の具体値を、転記先変数の桁数に格納できる桁数に変換する（ステップＳ２７）。
【００４４】
第３形式変換部１３１は、ステップＳ２７の処理が実行された後の具体値を、命令デコーダ１００から受け取った転記先変数の情報を用いて転記先変数の形式に変換し、データレジスタ１０３のアドレスＲＡに上書きする（ステップＳ２９）。そして、呼び出し元の処理に戻る。なお、データレジスタ１０３への上書きは、変換装置１０２が行う。
【００４５】
次に、シンボル値の転記演算について、図９を用いて説明する。
【００４６】
まず、転送処理部１１０における第２転送処理部１１２は、転記元変数のシンボル値を第２形式変換部１２２及び第４形式変換部１３２に出力する。第２形式変換部１２２は、転記元変数のシンボル値を桁数形式に変換し、データレジスタ１０３のアドレスＲＢに格納する（図９：ステップＳ３１）。なお、データレジスタ１０３への格納は、変換装置１０２が行う。
【００４７】
ここで、第２形式変換部１２２が実行する、桁数形式への変換について図１０を用いて説明する。まず、第２形式変換部１２２は、格納に使用するアドレスの数を計算する（図１０：ステップＳ４１）。ここで、格納に使用するアドレスの数は、（（（元のデータ長）−１）／２＋（（元のデータ長）−１）％２）＋１によって求める。「％」は、剰余を求めるための演算子であり、「％２」によって２で割った際の剰余を求めることができる。また、第２形式変換部１２２は、データレジスタ１０３のアドレスＲＢにおける末尾のアドレスから順に、変換後のシンボル値を格納する（ステップＳ４３）。そして処理を終了する。
【００４８】
図９の説明に戻り、第２転送処理部１１２は、命令デコーダ１００から受け取った転記先変数の情報を用いて、転記元変数の小数値桁数と転記先変数の小数値桁数との差異を計算し、差異の分だけ、アドレスＲＢに格納されている変換後のシンボル値をシフトする（ステップＳ３３）。すなわち、小数点の位置を合わせる処理を実行する。
【００４９】
第２転送処理部１１２は、転記先変数の符号部に値が格納されていない場合には、ステップＳ３３の処理が実行された後のシンボル値の符号部に、正の符号値を設定する（ステップＳ３５）。
【００５０】
第２転送処理部１１２は、ステップＳ３５の処理が実行された後のシンボル値を、転記先変数の桁数に格納できる桁数に変換する（ステップＳ３７）。
【００５１】
第４形式変換部１３２は、ステップＳ３７の処理が実行された後のシンボル値を、命令デコーダ１００から受け取った転記先変数の情報を用いて転記先変数の形式に変換し、データレジスタ１０３のアドレスＲＢに上書きする（ステップＳ３９）。そして呼び出し元の処理に戻る。なお、データレジスタ１０３への上書きは、変換装置１０２が行う。
【００５２】
図７の説明に戻り、書き出し部１０４は、データレジスタ１０３に格納されている具体値及びシンボル値を、主記憶装置２に書き出す（ステップＳ１１）。そして処理を終了する。
【００５３】
以上のように、桁毎に値を有する形式で具体値及びシンボル値を管理すると共に、両者を別々の領域に保存することで、同じ変数における異なる桁に具体値とシンボル値とが存在するような場合であっても、適切な演算を行えるようになる。
【００５４】
また、変数がどのような形式であっても、一旦は共通の形式に変換するので、演算に用いられる部品を共通化することが容易になる。
【００５５】
また、上で述べた例では、変数の値における或る桁に具体値が転記された場合に、シンボル値を空としている。これにより、変数の値における各桁が具体値及びシンボル値のいずれであるかを、シンボル値が空であるか否かによって判定できるようになる。
【００５６】
ここで、上で説明した転記演算について具体例を示す。
【００５７】
例えば、図５に示したデータが主記憶装置２に格納され、図６に示したデータが外部レジスタ３に格納されているとする。そして、以下のような転記命令があったとする。
・転記元の具体値は、開始アドレスがＲ１であり、データ長が１であり、開始位置が１（桁目）であり、桁数が１であり、小数部が０であり、形式が外部１０進形式である。
・転記先変数（変数Ａ）は、開始アドレスがＡ１であり、データ長が４であり、開始位置が２であり、桁数が１であり、小数部が０であり、形式が外部１０進形式である。
【００５８】
図１１に、上で述べたような状況においてデータレジスタ１０３に格納される具体値の変化を示す。図１１の例では、最初の段階で具体値［４］がデータレジスタ１０３に格納されており、その後、第１転送処理部１１１の処理等を経た後も、変化がない。
【００５９】
図１２に、上で述べたような状況においてデータレジスタ１０３に格納されるシンボル値の変化を示す。図１２の例では、最初の段階でシンボル値［ＮＡ］がデータレジスタ１０３に格納されており、その後、第２転送処理部１１２の処理等を経た後も、変化がない。これは、上で述べた命令が具体値の転記命令であり、転送元にシンボル値が無いからである。
【００６０】
図１３に、上で述べた転記命令における具体値の転記が終了した際に主記憶装置２に格納されるデータの一例を示す。図１３においては、図５に示したデータと異なる部分に色が付されている。データレジスタ１０３における具体値［４］は、主記憶装置２におけるアドレスＡ２に格納されている。この段階では、シンボル値は格納されていない。
【００６１】
図１４に、上で述べた転記命令におけるシンボル値の転記が終了した際に主記憶装置２に格納されるデータの一例を示す。図１４においては、図５に示したデータと異なる部分に色が付されている。データレジスタ１０３におけるシンボル値［ＮＡ］は、主記憶装置２におけるアドレスＡ２に格納されている。但し、具体値とシンボル値とは別々の領域に格納されている。
【００６２】
また、例えば図１５に示したデータが主記憶装置２に格納されている状態において、以下のような転記命令があったとする。
・転記元変数（変数Ａ）の具体値は、開始アドレスがＡ１であり、データ長が４であり、開始位置が１であり、桁数が４であり、小数部が２であり、形式が外部１０進形式である。
・転記先変数（変数Ｂ）は、開始アドレスがＡ５であり、データ長が２であり、開始位置が１であり、桁数が３であり、小数部が２であり、形式が内部１０進形式である。
【００６３】
図１６に、上で述べたような状況においてデータレジスタ１０３に格納される具体値の変化を示す。図１６の例では、最初の段階で具体値［０］［４］［９］［００］が主記憶装置２から読み出され、第１形式変換部１２１の処理によって、［００］［４９］［００］というパック形式に変換される。さらに、第１転送処理部１１１の処理によって、［４９］［００］という形式に変換される。
【００６４】
図１７に、上で述べたような状況においてデータレジスタ１０３に格納されるシンボル値の変化を示す。図１７の例では、最初の段階でシンボル値［Ｓ１］［ＮＡ］［ＮＡ］［Ｓ４＿Ｆ５］が主記憶装置２から読み出され、第２形式変換部１２２の処理によって、［ＮＡ＿Ｓ１］［ＮＡ＿ＮＡ］［Ｓ４＿Ｆ５］という桁数形式に変換される。さらに、第２転送処理部１１２の処理によって、［ＮＡ＿ＮＡ］［Ｓ４＿Ｆ５］という形式に変換される。
【００６５】
図１８に、上で述べた転記命令における具体値の転記が終了した際に主記憶装置２に格納されるデータの一例を示す。図１８においては、図１５に示したデータと異なる部分に色が付されている。変数Ｂは内部１０進形式であるため、アドレスＡ５に具体値「４」及び具体値「９」が格納される。この段階では、シンボル値は格納されていない。
【００６６】
図１９に、上で述べた転記命令におけるシンボル値の転記が終了した際に主記憶装置２に格納されるデータの一例を示す。図１９においては、図１５に示したデータと異なる部分に色が付されている。アドレスＡ５における、シンボル値を格納する領域に、具体値「４」に対応するシンボル値「ＮＡ」及び具体値「９」に対応するシンボル値「ＮＡ」が格納される。
【００６７】
また、例えば図１９に示したデータが主記憶装置２に格納されている状態において、以下のような転記命令があったとする。
・転記元変数（変数Ａ）の具体値は、開始アドレスがＡ１であり、データ長が４であり、開始位置が１であり、桁数が４であり、小数部が２であり、形式が外部１０進形式である。
・転記先変数（変数Ｃ）は、開始アドレスがＡ７であり、データ長が２であり、開始位置が１であり、桁数が３であり、小数部が１であり、形式が内部２進形式である。
【００６８】
図２０に、上で述べたような状況においてデータレジスタ１０３に格納される具体値の変化を示す。図２０の例では、最初の段階で具体値［０］［４］［９］［００］が主記憶装置２から読み出され、第１形式変換部１２１の処理によって、［００］［４９］［００］というパック形式に変換される。また、第１転送処理部１１１が、小数点の位置を合わせるため、右シフトして［０４］［９０］という形式にする。さらに、第３形式変換部１３１の処理によって、［０ｘ００］［０ｘ３１］という転記先変数の形式に変換される。
【００６９】
図２１に、上で述べたような状況においてデータレジスタ１０３に格納されるシンボル値の変化を示す。図２１の例では、最初の段階でシンボル値［Ｓ１］［ＮＡ］［ＮＡ］［Ｓ４＿Ｆ５］が主記憶装置２から読み出され、第２形式変換部１２２の処理によって、［ＮＡ＿Ｓ１］［ＮＡ＿ＮＡ］［Ｓ４＿Ｆ５］という桁数形式に変換される。また、第２転送処理部１１２が、小数点の位置を合わせるため、右シフトして［Ｓ１＿ＮＡ］［ＮＡ＿Ｆ５］という形式にする。
【００７０】
図２２に、上で述べた転記命令における具体値の転記が終了した際に主記憶装置２に格納されるデータの一例を示す。図２２においては、図１９に示したデータと異なる部分に色が付されている。変数Ｃは内部２進形式であるため、アドレスＡ７に具体値「０ｘ００」が格納され、アドレスＡ８に具体値「０ｘ３１」が格納される。この段階では、シンボル値は格納されていない。
【００７１】
図２３に、上で述べた転記命令におけるシンボル値の転記が終了した際に主記憶装置２に格納されるデータの一例を示す。図２３においては、図１９に示したデータと異なる部分に色が付されている。アドレスＡ７における、シンボル値を格納する領域に、具体値「０ｘ００」に対応するシンボル値「Ｓ１」及び「ＮＡ」が格納され、アドレスＡ８における、シンボル値を格納する領域に、具体値「０ｘ３１」に対応するシンボル値「ＮＡ」が格納される。
【００７２】
図７の説明に戻り、ステップＳ５において命令の種類は転記ではない場合（ステップＳ５：Ｎｏルート）、命令の種類は比較である。よって、読み出し部１０１は、読みだされた比較元変数の値及び比較先変数の値を、比較演算部１０５に出力する。そして、比較演算部１０５は、比較演算を実行する（ステップＳ１３）。比較演算については、図２４及び図２５を用いて説明する。
【００７３】
まず、比較演算部１０５は、比較元変数の値及び比較先変数の値を、混合値生成部１０６に出力する。これに応じ、混合値生成部１０６は、比較元変数及び比較先変数の各々について、混合値生成処理を実行する（図２４：ステップＳ５１）。混合値生成処理については、図２５を用いて説明する。
【００７４】
まず、混合値生成部１０６は、比較元変数のシンボル値及び比較先変数のシンボル値の形式を、桁数形式に変換し、データレジスタ１０３のアドレスＲＡに格納する（図２５：ステップＳ６１）。なお、ステップＳ６１において、混合値生成部１０６は、第１変換部１２０における第２形式変換部１２２に変換を実行させる。
【００７５】
混合値生成部１０６は、比較元変数の具体値及び比較先変数の具体値の形式を、パック形式に変換し、データレジスタ１０３のアドレスＲＢに格納する（ステップＳ６３）。なお、ステップＳ６３において、混合値生成部１０６は、第１変換部１２０における第１形式変換部１２１に変換を実行させる。
【００７６】
混合値生成部１０６は、アドレスＲＡに格納されている、比較元変数のシンボル値及び比較先変数のシンボル値において、空である桁が有るか判断する（ステップＳ６５）。空である桁が無い場合（ステップＳ６５：Ｎｏルート）、呼び出し元の処理に戻る。一方、空である桁が有る場合（ステップＳ６５：Ｙｅｓルート）、空である桁に、アドレスＲＢに格納されている具体値における同じ桁の値を設定する（ステップＳ６７）。そして呼び出し元の処理に戻る。例えば、比較元変数のシンボル値における３桁目が空である場合は、比較元変数の具体値における３桁目の値を設定する。また、例えば、比較先変数のシンボル値における２桁目が空である場合は、比較先変数の具体値における２桁目の値を設定する。上で述べたように、シンボル値の桁のうち空である桁には、具体値が存在する。
【００７７】
以上のような処理を実行すれば、具体値及びシンボル値が異なる桁に存在する値を生成できるようになる。
【００７８】
図２４の説明に戻り、比較演算部１０５は、混合値生成処理により生成された２つの混合値について、小数値桁数の差異を計算し、差異の分だけ、小数の桁数が少ない方の混合値を左シフトする（ステップＳ５３）。すなわち、小数点の位置を調整する処理を実行する。
【００７９】
比較演算部１０５は、比較元の混合値及び比較先の混合値のいずれかに符号が無い（すなわち、符号部に値が無い）場合には、両者の符号部に正の符号値を設定する（ステップＳ５５）。
【００８０】
比較演算部１０５は、充足可能性の判定を行う（ステップＳ５７）。なお、充足可能性の判定は、制約ソルバ等を用いて行ってもよい。制約ソルバについては、例えば、上で示した非特許文献１を参照のこと。
【００８１】
比較演算部１０５は、充足可能性の判定結果を外部レジスタ３に格納する（ステップＳ５９）。そして、図７の説明に戻り、処理を終了する。
【００８２】
図２６に、ステップＳ５９の処理によって外部レジスタ３に格納されるデータの一例を示す。図２６の例では、アドレスＲＴに、分岐条件が真である状態を充足するか否かを表す情報が格納され、アドレスＲＦに、分岐条件が偽である状態を充足するか否かを表す情報が格納される。図２６の例では、「１」であれば条件が成立することを表し、「０」であれば条件が成立しないことを表す。従って、本例では、分岐条件が真である状態と偽である状態との両方を充足する。
【００８３】
例えば、図１に示したプログラムの１４０行目「MOVE 変数Ａ TO 変数Ｂ」および１５０行目「MOVE 変数Ａ TO 変数Ｃ」の転記演算によって、図２３に示したデータが主記憶装置２に格納されたとする。そして、そのデータを用いて、１６０行目「IF (変数Ａ＝変数Ｂ) THEN」において、混合値［０＿Ｓ１］［４＿９］［Ｓ４＿Ｆ５］と混合値［４＿９］［Ｓ４＿Ｆ５］との比較を行うとする。ここで、Ｓ１の値が０以外なら（変数Ａ＝変数Ｂ）の分岐条件は偽であり、Ｓ１の値が０なら（変数Ａ＝変数Ｂ）の分岐条件は真である。
【００８４】
また、１９０行目「IF (変数Ａ＝変数Ｃ) THEN」において、混合値［０＿Ｓ１］［４＿９］［Ｓ４＿Ｆ５］」と混合値［０＿Ｓ１］［４＿９］［０＿Ｆ５］」との比較を行うとする。ここで、Ｓ４の値が０以外なら（変数Ａ＝変数Ｃ）の分岐条件は偽であり、Ｓ４の値が０なら（変数Ａ＝変数Ｃ）の分岐条件は真である。
【００８５】
よって、本実施の形態の方法によれば、分岐条件について真及び偽の両方が成立すると判定され、両方の処理パスを実行することができる。これにより、シンボリック実行において、処理パスを網羅することができるので、テストデータの抽出漏れが無くなる。
【００８６】
ここで、上で説明した混合値生成について具体例を示す。
【００８７】
図２７に、変数Ａについての混合値生成の一例を示す。図２７の例では、主記憶装置２に、図２３に示したデータが格納されているとする。この場合、まず主記憶装置２から変数Ａの具体値［０］［４］［９］［００］が読み出され、また、主記憶装置２から変数Ａのシンボル値［Ｓ１］［ＮＡ］［ＮＡ］［Ｓ４＿Ｆ５］が読み出される。具体値［０］［４］［９］［００］は、第１形式変換部１２１の処理によって［００］［４９］［００］というパック形式に変換される。また、シンボル値［Ｓ１］［ＮＡ］［ＮＡ］［Ｓ４＿Ｆ５］は、第２形式変換部１２２の処理によって［ＮＡ＿Ｓ１］［ＮＡ＿ＮＡ］［Ｓ４＿Ｆ５］という桁数形式に変換される。そして、混合値生成部１０６が、具体値［００］［４９］［００］及びシンボル値［ＮＡ＿Ｓ１］［ＮＡ＿ＮＡ］［Ｓ４＿Ｆ５］によって混合値を生成すると、［０＿Ｓ１］［４＿９］［Ｓ４＿Ｆ５］になる。
【００８８】
図２８に、変数Ｃについての混合値生成の一例を示す。図２８の例では、主記憶装置２に、図２３に示したデータが格納されているとする。この場合、まず主記憶装置２から変数Ｃの具体値［０ｘ００］［０ｘ３１］が読み出され、また、主記憶装置２から変数Ｃのシンボル値［Ｓ１］［ＮＡ］［ＮＡ］［Ｓ４＿Ｆ５］が読み出される。具体値［０ｘ００］［０ｘ３１］は、第１形式変換部１２１の処理によって［０４］［９０］というパック形式に変換される。また、シンボル値［Ｓ１］［ＮＡ］［ＮＡ］［Ｓ４＿Ｆ５］は、第２形式変換部１２２の処理によって［Ｓ１＿ＮＡ］［ＮＡ＿Ｆ５］という桁数形式に変換される。そして、混合値生成部１０６が、具体値［０４］［９０］及びシンボル値［Ｓ１＿ＮＡ］［ＮＡ＿Ｆ５］によって混合値を生成すると、［Ｓ１＿４］［９＿Ｆ５］になる。なお、比較演算部１０５が、変数Ａについての混合値と小数点の位置を合わせる処理を実行すると、最終的に、混合値は［０＿Ｓ１］［４＿９］［０＿Ｆ５］という形式になる。
【００８９】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置１０の機能ブロック構成は実際のモジュール構成に一致しない場合もある。
【００９０】
また、上で説明した各テーブルの構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【００９１】
例えば、上で述べた例では、具体値の転記処理を実行した後にシンボル値の転記処理を実行するが、両者を並列に実行してもよい。
【００９２】
また、１バイトに２桁の値を保持する形式を桁数形式としたが、言語がサポートする形式によって、桁数形式を変更してもよい。例えば、１バイトに１桁の値を格納する形式にしてもよいし、１バイトに４桁の値を格納する形式にしてもよい。
【００９３】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【００９４】
本実施の形態の第１の態様に係る演算装置は、（Ａ）シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換すると共に、第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換する第１変換部と、（Ｂ）第１変換部による変換後の具体値を、第１の記憶領域に格納すると共に、第１変換部による変換後のシンボル値を、第１の記憶領域とは異なる第２の記憶領域に格納する第１格納処理部とを有する。
【００９５】
このようにすれば、シンボリック実行において変数の演算を適切に行えるようになる。具体的には、同じ変数における異なる桁に具体値とシンボル値とが存在するような場合であっても、演算の誤りを無くせるようになる。さらに、変数がどのような形式であったとしても、共通の形式に変換するので、転記演算等に用いられる部品を共通化しやすくなる。
【００９６】
また、上で述べた演算装置が、（Ｃ）第１の記憶領域に格納された具体値を、転記先の変数である第２の変数の形式に変換すると共に、第２の記憶領域に格納されたシンボル値を、第２の変数の形式に変換する第２変換部と、（Ｄ）第２変換部による変換後の具体値を第３の記憶領域に格納すると共に、第２変換部による変換後のシンボル値を、第３の記憶領域とは異なる第４の記憶領域に格納する第２格納処理部とをさらに有してもよい。このようにすれば、シンボリック実行において変数の間で転記演算を行えるようになる。
【００９７】
また、上で述べた演算装置が、（Ｅ）第２変換部による変換の実行前に、具体値及びシンボル値の各々について、小数点の位置を第２の変数に合わせる処理をすると共に、桁数を第２の変数の桁数に合わせる処理を行う第１処理部をさらに有してもよい。これにより、転記演算が適切に行われるようになる。
【００９８】
また、上で述べた演算装置が、（Ｆ）第２の記憶領域に格納されたシンボル値の桁のうち空である桁を第１の記憶領域に格納された具体値の同じ桁で置換して第１の混合値を生成すると共に、第５の記憶領域に格納された具体値を第１の形式に変換し、第６の記憶領域に格納されたシンボル値を第２の形式に変換し、変換後のシンボル値の桁のうち空である桁を、変換後の具体値における同じ桁で置換して第２の混合値を生成する生成部と、（Ｇ）第１の混合値と第２の混合値との比較を行う比較部とをさらに有してもよい。このようにすれば、シンボリック実行において変数の間で比較演算を行えるようになる。
【００９９】
また、上で述べた比較部は、（ｇ１）第１の混合値の小数点の位置と、第２の混合値の小数点の位置とを合わせる処理をしてもよい。このようにすれば、比較演算が適切に行われるようになる。
【０１００】
本実施の形態の第２の態様に係る演算方法は、（Ｈ）シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換し、第１の記憶領域に格納し、（Ｉ）第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換し、第１の記憶領域とは異なる第２の記憶領域に格納する処理を含む。
【０１０１】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【０１０２】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１０３】
（付記１）
シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換すると共に、前記第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換する第１変換部と、
前記第１変換部による変換後の具体値を、第１の記憶領域に格納すると共に、前記第１変換部による変換後のシンボル値を、前記第１の記憶領域とは異なる第２の記憶領域に格納する第１格納処理部と、
を有する演算装置。
【０１０４】
（付記２）
前記第１の記憶領域に格納された具体値を、転記先の変数である第２の変数の形式に変換すると共に、前記第２の記憶領域に格納されたシンボル値を、前記第２の変数の形式に変換する第２変換部と、
前記第２変換部による変換後の具体値を第３の記憶領域に格納すると共に、前記第２変換部による変換後のシンボル値を、前記第３の記憶領域とは異なる第４の記憶領域に格納する第２格納処理部と、
をさらに有する付記１記載の演算装置。
【０１０５】
（付記３）
前記第２変換部による変換の実行前に、前記具体値及びシンボル値の各々について、小数点の位置を前記第２の変数に合わせる処理をすると共に、桁数を前記第２の変数の桁数に合わせる処理をする第１処理部
をさらに有する付記２記載の演算装置。
【０１０６】
（付記４）
前記第２の記憶領域に格納されたシンボル値の桁のうち空である桁を前記第１の記憶領域に格納された具体値の同じ桁で置換して第１の混合値を生成すると共に、第５の記憶領域に格納された具体値を前記第１の形式に変換し、第６の記憶領域に格納されたシンボル値を前記第２の形式に変換し、変換後の前記シンボル値の桁のうち空である桁を、変換後の前記具体値における同じ桁で置換して第２の混合値を生成する生成部と、
前記第１の混合値と前記第２の混合値との比較を行う比較部と、
をさらに有する付記１乃至３のいずれか１つ記載の演算装置。
【０１０７】
（付記５）
前記比較部は、
前記第１の混合値の小数点の位置と、前記第２の混合値の小数点の位置とを合わせる処理をする
ことを特徴とする付記４記載の演算装置。
【０１０８】
（付記６）
シンボリック実行における演算の対象である第１の変数の具体値を、桁毎に値を有する形式である第１の形式に変換し、第１の記憶領域に格納し、
前記第１の変数のシンボル値を、桁毎に値を有する形式である第２の形式に変換し、前記第１の記憶領域とは異なる第２の記憶領域に格納する
処理を演算装置が実行する演算方法。
【符号の説明】
【０１０９】
１  シンボル値演算装置    ２  主記憶装置
３  外部レジスタ    ４  実行履歴格納部
５  シンボリック実行装置    ５１  プログラム読み出し部
５２  命令実行装置    ５３  カウンタ制御部
５４  記録部    ６  プログラム格納部
１０  情報処理装置    １００  命令デコーダ
１０１  読み出し部    １０２  変換装置
１０３  データレジスタ    １０４  書き出し部
１０５  比較演算部    １０６  混合値生成部
１１０  転送処理部    １１１  第１転送処理部
１１２  第２転送処理部    １２０  第１変換部
１２１  第１形式変換部    １２２  第２形式変換部
１３０  第２変換部    １３１  第３形式変換部
１３２  第４形式変換部
【図１】
2015072538.tif 000003
【図２】
2015072538.tif 000004
【図３】
2015072538.tif 000005
【図４】
2015072538.tif 000006
【図５】
2015072538.tif 000007
【図６】
2015072538.tif 000008
【図７】
2015072538.tif 000009
【図８】
2015072538.tif 000010
【図９】
2015072538.tif 000011
【図１０】
2015072538.tif 000012
【図１１】
2015072538.tif 000013
【図１２】
2015072538.tif 000014
【図１３】
2015072538.tif 000015
【図１４】
2015072538.tif 000016
【図１５】
2015072538.tif 000017
【図１６】
2015072538.tif 000018
【図１７】
2015072538.tif 000019
【図１８】
2015072538.tif 000020
【図１９】
2015072538.tif 000021
【図２０】
2015072538.tif 000022
【図２１】
2015072538.tif 000023
【図２２】
2015072538.tif 000024
【図２３】
2015072538.tif 000025
【図２４】
2015072538.tif 000026
【図２５】
2015072538.tif 000027
【図２６】
2015072538.tif 000028
【図２７】
2015072538.tif 000029
【図２８】
2015072538.tif 000030