(57)【要約】【課題】参照先の記憶領域が部分的に重複する複数の変数がある場合でも、適切なテストデータを生成する。【解決手段】分割手段１１は、テスト対象プログラムに基づいて実行される処理の中の分岐条件に含まれる複数の変数１により参照される記憶領域を、共通の変数ごとに１以上のビット数のビット列とする、複数のビット列に対応するように分割する。決定手段１３は、処理を実行させるための複数の変数１に対する制約条件２に基づいて、複数のビット列に対する制約条件４を決定する。算出手段１４は、複数のビット列に対する制約条件４を満たす、ビット列それぞれの値を算出する。【選択図】図１
2014199478.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
テスト対象プログラムに基づいて実行される処理の中の分岐条件に含まれる複数の変数により参照される記憶領域を、共通の変数ごとに１以上のビット数のビット列とする、複数のビット列に対応するように分割し、
処理を実行させるための前記複数の変数に対する制約条件に基づいて、前記複数のビット列に対する制約条件を決定し、
前記複数のビット列に対する制約条件を満たす、ビット列それぞれの値を算出する、
処理を実行させるテストデータ生成プログラム。
【請求項２】
前記記憶領域の分割では、前記複数の変数それぞれの表現形式における１要素当たりのビット数の最大公約数分の連続するビットであるビット列に、前記記憶領域を均等に分割することを特徴とする請求項１記載のテストデータ生成プログラム。
【請求項３】
前記コンピュータに、さらに、
前記複数の変数に対する制約条件における条件式の左辺と右辺とにおける要素の表現形式が同じとなるように、少なくとも一方の辺の表現形式を変換する処理を実行させることを特徴とする請求項１または２に記載のテストデータ生成プログラム。
【請求項４】
表現形式の変換では、条件式の両辺の１要素当たりのビット数が同じとなるように変換すると共に、一方の辺のビット列と同じビット数ずつに、他方の辺の値を分割することを特徴とする請求項３記載のテストデータ生成プログラム。
【請求項５】
前記複数のビット列に対する制約条件の決定では、分岐条件ごとに、該分岐条件に含まれる変数で参照される記憶領域を分割したビット列を用いて、該ビット列に求められる条件を示す論理式を生成することを特徴とする請求項１乃至４のいずれかに記載のテストデータ生成プログラム。
【請求項６】
前記コンピュータに、さらに、
算出された前記複数のビット列ごとの値に基づいて、前記複数の変数それぞれの値を算出する、処理を実行させることを特徴とする請求項１乃至５のいずれかに記載のテストデータ生成プログラム。
【請求項７】
前記複数の変数それぞれの値の算出では、変数の表現形式に応じた値に変換することを特徴とする請求項６記載のテストデータ生成プログラム。
【請求項８】
コンピュータが、
テスト対象プログラムに基づいて実行される処理の中の分岐条件に含まれる複数の変数により参照される記憶領域を、共通の変数ごとに１以上のビット数のビット列とする、複数のビット列に対応するように分割し、
処理を実行させるための前記複数の変数に対する制約条件に基づいて、前記複数のビット列に対する制約条件を決定し、
前記複数のビット列に対する制約条件を満たす、ビット列それぞれの値を算出する、
テストデータ生成方法。
【請求項９】
テスト対象プログラムに基づいて実行される処理の中の分岐条件に含まれる複数の変数により参照される記憶領域を、共通の変数ごとに１以上のビット数のビット列とする、複数のビット列に対応するように分割する分割手段と、
処理を実行させるための前記複数の変数に対する制約条件に基づいて、前記複数のビット列に対する制約条件を決定する決定手段と、
前記複数のビット列に対する制約条件を満たす、ビット列それぞれの値を算出する算出手段と、
を有するテストデータ生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのテストに用いるテストデータを生成するテストデータ生成プログラム、テストデータ生成方法、およびテストデータ生成装置に関する。
【背景技術】
【０００２】
プログラムでは、実行される一連の処理（処理パス）を、条件分岐により変更できる。条件分岐とは、記述された条件（分岐条件）の真偽によって、処理の流れを変更することである。分岐条件には、変数の満たすべき条件などが定義される。このためプログラムには、条件分岐の数に応じた複数の処理パスが存在する。
【０００３】
一般にプログラムのテストを行うとき、テスト実施者は、それぞれの処理パスをテストするため、テストしたい処理パスの実行条件（パス条件）を満たすよう、テストデータを決定する。テストデータとはプログラムをテスト実行するための、変数などの入力値である。
【０００４】
多くの分岐条件が記述されているプログラムでは、パス条件が非常に複雑なものとなる。そのため、目的の処理パスをテストするためのテストデータを、人手によって正しく求めるのは困難である。そこで、テストデータを求めるための既存技術として、制約ソルバを利用する技術がある。処理パス上の分岐条件からパス条件を導出すると、制約ソルバを利用することで、導出されたパス条件を満たすテストデータを求めることができる。なおテストデータを自動生成する技術のなかには、変数名を、データ領域の先頭からのオフセットと、その変数が占有する領域の大きさの２つの数値を使ったシンボル名に変換する技術もある。これにより、複数の変数が任意の同一の記憶領域を参照している場合でも変数が満たすべき条件を算出できる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−６６９００号公報
【特許文献２】特開平１１−２７２５０３号公報
【非特許文献】
【０００６】
【非特許文献１】Nikolaj Bjorner, Nikolai Tillmann and Andrei Voronkov, "Path Feasibility Analysis for String-Manipulating Programs", Proc. of TACAS 2009, Tools and Algorithms for the Construction and Analysis of Systems, LNCS, vol 5505, pages 307-321, March 2009.
【非特許文献２】C.King, J.: Symbolic Execution and Program Testing, Comm.ACM, Vol. 19, No. 7, pp. 385.394 (1976).
【非特許文献３】佐々木裕介外  ”COBOLプログラムのためのSMTソルバによるテストデータ生成”，ソフトウェアエンジニアリングシンポジウム2012論文集，pp.1-8，2012年8月21日
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、従来技術では、参照先の記憶領域が部分的に重複する複数の変数が存在すると、テストしようとする処理パスを実行するための各変数の値を正しく算出することができない場合がある。
【０００８】
例えば、変数名を、データ領域の先頭からのオフセットと、その変数が占有する領域の大きさの２つの数値を使ったシンボル名に変換したとしても、参照先が部分的にしか重複しない場合、異なるシンボル名に変換される。異なるシンボル名に変換されると、ソルバで制約条件を充足する値を求めた際に、シンボル名ごとの値が算出される。そうすると、重複して参照される記憶領域に両方のシンボル名に応じた値を順番に書き込むと、先に書き込んだ値の少なくとも一部は上書きされる。その結果、先に書き込みを行ったシンボル名に対応する変数を用いた分岐条件において、テストしようとする処理パスに沿った分岐判断が行われる保証がなくなってしまう。
【０００９】
１つの側面では、本件は、参照先の記憶領域が部分的に重複する複数の変数がある場合でも、適切なテストデータを生成することを目的とする。
【課題を解決するための手段】
【００１０】
１つの側面では、コンピュータに、テスト対象プログラムに基づいて実行される処理の中の分岐条件に含まれる複数の変数により参照される記憶領域を、共通の変数ごとに１以上のビット数のビット列とする、複数のビット列に対応するように分割し、処理を実行させるための複数の変数に対する制約条件に基づいて、複数のビット列に対する制約条件を決定し、複数のビット列に対する制約条件を満たす、ビット列それぞれの値を算出する、処理を実行させるテストデータ生成プログラムが提供される。
【発明の効果】
【００１１】
１つの側面によれば、参照先の記憶領域が部分的に重複する複数の変数がある場合でも、適切なテストデータを生成することができる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態に係るテストデータ生成装置の機能を示すブロック図である。
【図２】第２の実施の形態のシステム構成例を示す図である。
【図３】本実施の形態に用いるテストデータ生成装置のハードウェアの一構成例を示す図である。
【図４】テスト対象のプログラムの一例を示す図である。
【図５】データ項目表の一例を示す図である。
【図６】表現形式の一例を示す図である。
【図７】テストする処理パスの一例を示す図である。
【図８】参照先となるメモリ領域が重複する複数のデータ項目の存在を考慮せずに生成したテストデータの一例を示す図である。
【図９】図８のテストデータに基づいて実行される処理パスの一例を示す図である。
【図１０】テストデータ生成装置の機能の一例を示す図である。
【図１１】テストデータ生成処理の手順を示すフローチャートである。
【図１２】シンボル初期化の一例を示す図である。
【図１３】シンボル初期化処理の手順の一例を示すフローチャートである。
【図１４】初期化再帰処理の手順の一例を示すフローチャートである。
【図１５】シンボル置換の一例を示す図である。
【図１６】シンボル置換処理の手順の一例を示すフローチャートである。
【図１７】表現形式変換の一例を示す図である。
【図１８】表現形式変換処理の手順の一例を示すフローチャートの前半である。
【図１９】表現形式変換処理の手順の一例を示すフローチャートの後半である。
【図２０】リテラルの１桁８ビット形式変換処理の手順の一例を示すフローチャートである。
【図２１】リテラルの１桁１６ビット形式変換処理の手順の一例を示すフローチャートである。
【図２２】１桁４ビット項目の１桁８ビット形式変換処理の手順の一例を示すフローチャートである。
【図２３】１桁４ビット項目の１桁１６ビット形式変換処理の手順の一例を示すフローチャートである。
【図２４】１桁８ビット項目の１桁１６ビット形式変換処理の手順の一例を示すフローチャートである。
【図２５】１桁８ビットの桁合わせ処理の手順の一例を示すフローチャートである。
【図２６】１桁１６ビットの桁合わせ処理の手順の一例を示すフローチャートである。
【図２７】論理式生成の一例を示す図である。
【図２８】論理式生成処理の手順の一例を示すフローチャートである。
【図２９】シンボル逆置換の一例を示す図である。
【図３０】シンボル逆置換処理の手順の一例を示すフローチャートである。
【図３１】１桁４ビット置換処理の手順の一例を示すフローチャートである。
【図３２】１桁８ビット置換処理の手順の一例を示すフローチャートである。
【図３３】１桁１６ビット置換処理の手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
まず第１の実施の形態について説明する。第１の実施の形態は、参照先の記憶領域が部分的に重複する複数の変数がある場合でも、テスト対象のプログラムを特定の処理パスで実行させるためのテストデータを、正しく生成するものである。
【００１４】
なお、複数の変数に対する制約条件があるとき、その制約条件を充足する各変数の値は、ソルバによって算出することができる。ソルバは、例えば複数の変数の値を変化させながら、制約条件を充足する各変数の値を導き出すものである。ところが、分岐条件中で比較される変数の表現形式が異なる場合、ソルバにより正しい解を算出することができない。表現形式とは、１桁（数字や文字などの１文字）当たりの情報の表現に用いる形式であり、例えば１桁当たりのビット数が異なる複数の表現形式が存在する。分岐条件中で比較される複数の変数の表現形式が一致していないと、正しい条件判断をすることができず、パス条件を満たすテストデータを正しく生成することもできない。そこで、第１の実施の形態では、分岐条件における表現形式を統一した上で、特定の処理パスを実行させるためのテストデータを正しく生成可能とする。
【００１５】
図１は、第１の実施の形態に係るテストデータ生成装置の機能を示すブロック図である。テストデータ生成装置１０は、分割手段１１、変換手段１２、決定手段１３、算出手段１４、逆変換手段１５、および記憶手段１６を有する。
【００１６】
分割手段１１は、テスト対象プログラムに基づいて実行される処理（処理パス）の中の分岐条件に含まれる複数の変数１により参照される記憶領域を、複数のビット列に分割する。ビット列は、共通の変数ごとに１以上のビット数のビット列としたものである。なお分割手段１１は、各ビット列のビット数は、同じであっても、異なっていてもよい。
【００１７】
例えば分割手段１１は、所定ビット数のビット列に、記憶領域を均等に分割することができる。このとき分割手段１１は、複数の変数１それぞれの表現形式における１要素当たりのビット数の最大公約数を、ビット列のビット数とすることができる。この場合、ある表現形式における１要素当たりのビット数が４ビットであり、他の表現形式における１要素当たりのビット数が４の倍数であれば、分割手段１１は、各変数で参照される記憶領域を、４ビットずつのビット列に分割する。このように、ビット列内のビット数を、複数の変数１それぞれの表現形式における１要素当たりのビット数の最大公約数とすることで、同じビット列内の各ビットは、共通の変数から参照されることが保証される。
【００１８】
変換手段１２は、制約条件２における条件式の左辺と右辺とにおける要素の表現形式が同じとなるように、少なくとも一方の辺の表現形式を変換する。例えば変換手段１２は、条件式の両辺の１要素当たりのビット数が同じとなるように変換した上で、一方の辺のビット列と同じビット数ずつに、他方の辺の値を分割する。これにより、表現形式が異なる変数が混在していても、正しい比較を行う制約条件が生成可能となる。なお、条件式の左辺と右辺とにおける要素の表現形式が元から同じであれば、変換手段１２による表現形式の変換処理を省略することができる。変換手段１２は、表現形式変換後の制約条件３を、決定手段１３に送信する。
【００１９】
決定手段１３は、一連の処理を実行させるための複数の変数１に対する制約条件２に基づいて、複数のビット列に対する制約条件４を決定する。例えば、決定手段１３は、分岐条件ごとに、その分岐条件に含まれる変数で参照される記憶領域を分割したビット列を用いて、該ビット列に求められる条件を示す論理式４ａ，４ｂを生成する。制約条件４として、論理式４ａ，４ｂを生成することで、制約条件４を満たす各ビット列の値の算出を、容易にすることができる。
【００２０】
算出手段１４は、複数のビット列に対する制約条件４を満たす、複数のビット列それぞれの値を算出する。例えば算出手段１４は、決定手段１３によって分岐条件ごとに求められた論理式４ａ，４ｂのすべてを充足するような、ビット列の値を算出する。なお算出手段１４の機能は、例えば制約条件４によって制約された変数の値を算出するソルバ（制約ソルバ）を用いて実現できる。
【００２１】
逆変換手段１５は、算出されたビット列ごとの値に基づいて、複数の変数１それぞれの値を算出する。例えば逆変換手段１５は、複数の変数１それぞれで参照する記憶領域を分割して得られたビット列の値を、その変数の表現形式に応じた値に変換する。逆変換手段１５は、複数の変数１それぞれの値を、テストデータ５として出力する。例えば逆変換手段１５は、複数の変数１それぞれの値を、テストデータ５として記憶手段１６に格納する。
【００２２】
記憶手段１６は、変数で参照される記憶領域の値を、テストデータ５として記憶する。例えば記憶手段１６は、逆変換手段１５により表現形式が変換された後の値を、テストデータ５として記憶する。なお、表現形式の変換が行われなければ、算出手段１４によって算出された各ビット列の値を、テストデータ５として記憶手段１６に記憶させてもよい。
【００２３】
このようなテストデータ生成装置１０によれば、分割手段１１により、複数の変数１で参照される記憶領域を複数のビット列に分割される。このとき、分岐条件における条件式の左辺と右辺との表現形式が異なれば、変換手段１２によって、両辺の表現形式が統一される。次に、決定手段１３により、複数のビット列に対する制約条件４が決定される。さらに算出手段１４により、複数のビット列に対する制約条件４を満たす、複数のビット列それぞれの値が算出される。そして、逆変換手段１５により、算出されたビット列ごとの値に基づいて、複数の変数それぞれの値が算出される。算出された値は、テストデータ５として、記憶手段１６に格納される。
【００２４】
このようにして、テストデータ５が生成される。生成されたテストデータ５は、ビット列単位で制約条件４が満たされている。第１の実施の形態では、記憶領域を分割したビット列ごとに、そのビット列を参照する変数の制約条件２に基づいた制約条件４が決定されている。しかもビット列内の各ビットは、参照している変数が共通である。そのため、制約条件４を満たすようなビット列ごとの値を算出することで、変数で参照される記憶領域内の各ビットに対して、制約条件４を満たす１つの値を算出することができる。その結果、変数で重複して参照される記憶領域内の個々のビットに対して、複数の異なる値がテストデータ５として算出されることが抑止され、テストする処理パスを確実に実行させることができるテストデータ５が生成される。
【００２５】
また第１の実施の形態では、分岐条件における条件式の左辺と右辺とにおける要素の表現形式が同じとなるように、少なくとも一方の辺の表現形式を変換している。これにより、表現形式の異なる変数が混在していても、正しくテストデータ５を生成することができる。
【００２６】
さらに、ビット列内のビット数を、複数の変数１それぞれの表現形式における１要素当たりのビット数の最大公約数として、記憶領域を均等に分割すれば、生成されるビット列の数を少なく抑えることができる。その結果、テストデータ生成処理の効率化が図れる。すなわち、記憶領域を均等な長さのビット列に分割する場合、１ビットずつのビット列に分割することも可能である。しかし、この場合、ビット列の数が増加してしまい、制約条件４を満たす各ビット列の値を求める際の演算量が増えてしまう。一方、ビット列のビット数が多すぎると、ビット列に含まれる複数のビットそれぞれを参照する変数が、共通とならなくなる可能性がある。そこで、複数の変数１それぞれの表現形式における１要素当たりのビット数の最大公約数分のビット列に、記憶領域を分割すれば、ビット列に含まれる各ビットを参照する変数が共通となることを保証できる。しかも、１ビット単位に分けてしまう場合に比べ、生成されるビット列の数を減らすことができ、テストデータ５の生成を効率的に行うことができる。
【００２７】
なお、分割手段１１、変換手段１２、決定手段１３、算出手段１４、および逆変換手段１５は、例えばテストデータ生成装置１０が有するプロセッサにより実現することができる。また、記憶手段１６は、例えばテストデータ生成装置１０が有するメモリなどの記憶媒体により実現することができる。
【００２８】
また、図１に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
〔第２の実施の形態〕
次に第２の実施の形態について説明する。第２の実施の形態は、ＣＯＢＯＬ（COmmon Business Oriented Language）で記述されたプログラムのテストデータを生成する例である。
【００２９】
図２は、第２の実施の形態のシステム構成例を示す図である。テストデータ生成装置１００は、テスト装置３０に接続されている。テストデータ生成装置１００は、テスト対象のプログラムのテストに使用するテストデータを生成する。例えばテストデータ生成装置１００では、プログラムで実行可能な特定の処理パスを実行させるためのテストデータを生成する。そして、テストデータ生成装置１００で生成されたテストデータを変数に設定して、テスト装置３０にプログラムを実行させることにより、特定の処理パスのテストを実行することができる。
【００３０】
図３は、本実施の形態に用いるテストデータ生成装置のハードウェアの一構成例を示す図である。テストデータ生成装置１００は、プロセッサ１０１によって装置全体が制御されている。プロセッサ１０１には、バス１０９を介してメモリ１０２と複数の周辺機器が接続されている。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ（Central Processing Unit）、ＭＰＵ（Micro Processing Unit）、またはＤＳＰ（Digital Signal Processor）である。プロセッサ１０１の機能の少なくとも一部を、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現してもよい。
【００３１】
メモリ１０２は、テストデータ生成装置１００の主記憶装置として使用される。メモリ１０２には、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ１０２には、プロセッサ１０１による処理に必要な各種データが格納される。メモリ１０２としては、例えばＲＡＭ（Random Access Memory）などの揮発性の半導体記憶装置が使用される。
【００３２】
バス１０９に接続されている周辺機器としては、ＨＤＤ（Hard Disk Drive）１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、機器接続インタフェース１０７およびネットワークインタフェース１０８がある。
【００３３】
ＨＤＤ１０３は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、テストデータ生成装置１００の補助記憶装置として使用される。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、フラッシュメモリなどの不揮発性の半導体記憶装置を使用することもできる。
【００３４】
グラフィック処理装置１０４には、モニタ２１が接続されている。グラフィック処理装置１０４は、プロセッサ１０１からの命令に従って、画像をモニタ２１の画面に表示させる。モニタ２１としては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００３５】
入力インタフェース１０５には、キーボード２２とマウス２３とが接続されている。入力インタフェース１０５は、キーボード２２やマウス２３から送られてくる信号をプロセッサ１０１に送信する。なお、マウス２３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００３６】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク２４に記録されたデータの読み取りを行う。光ディスク２４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク２４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００３７】
機器接続インタフェース１０７は、テストデータ生成装置１００に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース１０７には、メモリ装置２５やメモリリーダライタ２６を接続することができる。メモリ装置２５は、機器接続インタフェース１０７との通信機能を搭載した記録媒体である。メモリリーダライタ２６は、メモリカード２７へのデータの書き込み、またはメモリカード２７からのデータの読み出しを行う装置である。メモリカード２７は、カード型の記録媒体である。
【００３８】
ネットワークインタフェース１０８は、ネットワーク２０に接続されている。ネットワークインタフェース１０８は、ネットワーク２０を介して、テスト装置３０との間でデータの送受信を行う。
【００３９】
以上のようなハードウェア構成によって、第２の実施の形態の処理機能を実現することができる。なお、第１の実施の形態に示したテストデータ生成装置１０も、図３に示したテストデータ生成装置１００と同様のハードウェアにより実現することができる。
【００４０】
テストデータ生成装置１００は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第２の実施の形態の処理機能を実現する。テストデータ生成装置１００に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、テストデータ生成装置１００に実行させるプログラムをＨＤＤ１０３に格納しておくことができる。プロセッサ１０１は、ＨＤＤ１０３内のプログラムの少なくとも一部をメモリ１０２にロードし、プログラムを実行する。またテストデータ生成装置１００に実行させるプログラムを、光ディスク２４、メモリ装置２５、メモリカード２７などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ１０１からの制御により、ＨＤＤ１０３にインストールされた後、実行可能となる。またプロセッサ１０１が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
【００４１】
次に、ＣＯＢＯＬを例に採り、テストデータ生成における課題について説明する。
図４は、テスト対象のプログラムの一例を示す図である。プログラム３１では、行番号「00070」の行から行番号「00140」の行までに、入力変数のデータ構造が定義されている。また行番号「00180」の行から行番号「00330」の行までに、複数の分岐条件を含む処理手順が示されている。
【００４２】
なお、ＣＯＢＯＬでは、変数がデータ項目と呼ばれる。図４に示したプログラム３１のデータ構造は、データ項目表で表すことができる。
図５は、データ項目表の一例を示す図である。データ項目表３２には、レベル、項目名、型、ＲＥＤＥＦＩＮＥＳ（参照先）、表現形式、およびバイト数の欄が設けられている。
【００４３】
レベルの欄には、データ項目のレベルが設定される。データ項目のレベルは、「１」が最も高い。高いレベルのデータ項目の下に、低いレベルの複数のデータ項目が設定されている場合、高いレベルのデータ項目内に、低いレベルの複数のデータ項目が順番に配置されていることを意味する。
【００４４】
項目名の欄には、データ項目の項目名が設定される。
型の欄には、データ項目の型が設定される。型の「９」は数値、「Ｎ」は日本語であることを示す。型の括弧内の数字は、何個の文字が入るかを示す。
【００４５】
ＲＥＤＥＦＩＮＥＳ（参照先）の欄には、同じレベルの他のデータ項目と同じメモリ領域を参照する場合の、参照先が設定される。例えば図５の例では、項目名「年月日−Ｒ」のデータ項目は、項目名「年月日」のデータ項目と同じメモリ領域を参照している。
【００４６】
表現形式の欄には、データ項目の１桁（数字または文字の１字）を表現するのに用いられるビット数が設定される。なお、第２の実施の形態における１桁は、第１の実施の形態における１要素の一例である。
【００４７】
バイト数の欄には、データ項目のデータ長がバイト数で設定される。なお、バイト数は、型の括弧内に示されている文字数と、表現形式（１文字当たりのビット数）から算出できる。
【００４８】
このようなデータ項目を有する、ＣＯＢＯＬ言語で記述されたプログラム３１には、以下のような特徴がある。
（１）入力変数（データ項目）には集団項目というデータ構造が用いられる。図５の例では「項目Ｇ」の配下には４つのデータ項目（年月日と年月日−Ｒ、時刻、頭文字）がある。
【００４９】
（２）同じメモリ位置に対して別のデータ項目の宣言が可能である。図５の例では、データ項目「年月日−Ｒ」は、データ項目「年月日」と同じメモリ位置を参照している。
（３）メモリ上での表現形式によって１桁当たりのバイト数が異なる。図５の例では、データ項目「年月日」は１桁の値が８ビットで表現される。データ項目「時刻」は、１桁の値が４ビットで表現される。データ項目「頭文字」は、１桁の値が１６ビットで表現される。
【００５０】
図６は、表現形式の一例を示す図である。ＣＯＢＯＬでは、１桁の値が４ビットで表現できるデータ項目（例えばデータ項目の「時刻」）場合、メモリ上の領域４ビットごとに数値が入っている。１桁の値が８ビットで表現できるデータ項目（例えばデータ項目「年−Ｒ」）の場合は、メモリ上の８ビットの領域に文字コードが入る。１桁の値が１６ビットで表現できるデータ項目（例えばデータ項目「頭文字」）の場合は、メモリ上の１６ビットの領域に文字コードが入る。文字コードの形式はプログラムを動作させるホスト（例えばテスト装置３０）により異なるが、以下の説明ではＪＩＳコードを想定する。
【００５１】
このようなデータ項目を有するプログラム３１に対して、所定のパスの処理をテストすることを目的として、テストデータを生成するものとする。
図７は、テストする処理パスの一例を示す図である。図７では、プログラム３１に基づいて、テスト装置３０が実行する処理の手順がフローチャートで示されている。
【００５２】
［ステップＳ１１］テスト装置３０は、データ項目「項目Ｇ」の入力を受け付ける。
［ステップＳ１２］テスト装置３０は、データ項目「項目Ｇ」が入力されると、まず、データ項目「年月日」の値が「２０００１２３１」ではないことの真偽を判定する。データ項目「年月日」の値が「２０００１２３１」でなければ（ステップＳ１２が「真」）処理がステップＳ１３に進められる。データ項目「年月日」の値が「２０００１２３１」であれば（ステップＳ１２が「偽」）処理が終了する。
【００５３】
［ステップＳ１３］テスト装置３０は、データ項目「年月日」の値が「２０００１２３１」でなければ、データ項目「月−Ｒ」の値が「１２」以下であることの真偽を判定する。データ項目「月−Ｒ」の値が「１２」以下であれば（ステップＳ１３が「真」）処理がステップＳ１４に進められる。データ項目「月−Ｒ」の値が「１２」以下でなければ（ステップＳ１３が「偽」）処理が終了する。
【００５４】
［ステップＳ１４］テスト装置３０は、データ項目「月−Ｒ」の値が「１２」以下であれば、データ項目「時刻」の値が「００００」であることの真偽を判定する。データ項目「時刻」の値が「００００」であれば（ステップＳ１４が「真」）処理がステップＳ１５に進められる。データ項目「時刻」の値が「００００」でなければ（ステップＳ１４が「偽」）処理が終了する。
【００５５】
［ステップＳ１５］テスト装置３０は、データ項目「時刻」の値が「００００」であれば、データ項目「年−Ｒ」の値がデータ項目「時刻」の値より大きいことの真偽を判定する。データ項目「年−Ｒ」の値の方が大きければ（ステップＳ１５が「真」）処理がステップＳ１６に進められる。値が同じか、データ項目「年−Ｒ」の値の方が小さければ（ステップＳ１５が「偽」）処理が終了する。
【００５６】
［ステップＳ１６］テスト装置３０は、データ項目「年−Ｒ」の値がデータ項目「時刻」の値より大きければ、データ項目「頭文字」の値が空白ではないことの真偽を判定する。データ項目「頭文字」の値が空白でなければ（ステップＳ１６が「真」）処理がステップＳ１７に進められる。データ項目「頭文字」の値が空白であれば（ステップＳ１６が「偽」）処理が終了する。
【００５７】
［ステップＳ１７］テスト装置３０は、データ項目「頭文字」の値が空白でなければ、「受付処理を実行しました」のメッセージを表示して、処理を終了する。
このような処理のうち、例えばすべての分岐条件において「真」と判定される処理パス３３をテストする場合を想定する。この場合、まずプログラム３１に基づいて、処理パス３３のパス条件が導出される。そして、パス条件を満たすテストデータが生成される。第２の実施の形態では、テストデータの生成に際し、参照先となるメモリ領域が重複する複数のデータ項目を考慮してテストデータが生成される。このような考慮をせずにテストデータを生成すると、テストしたいパス条件を満たさないテストデータが生成される可能性がある。
【００５８】
以下、図８、図９を参照して、参照先となるメモリ領域が重複する複数のデータ項目の存在を考慮しなかった場合に生じる問題について説明する。
図８は、参照先となるメモリ領域が重複する複数のデータ項目の存在を考慮せずに生成したテストデータの一例を示す図である。テスト対象のプログラム３１に基づいて、テストしたい処理パス３３のパス条件３４が導出されている。パス条件３４は、プログラム３１の５つの分岐条件をすべて真とする条件である。
【００５９】
図８の例では、パス条件３４に基づいて、「月−Ｒ」「年月日」という別々のデータ項目から重複して参照されているメモリ位置に対し、異なる複数のテストデータ３５を生成している。テスト実施者が、テストデータ３５を入力してプログラム３１を実行すると、データ項目「年月日」のメモリ領域３６には、「２０００９９３１」と入力するか、あるいは「２０００１２３１」と入力することとなる。この場合、メモリ領域３６にいずれの値が入力されたとしても、テスト実施者がテストしたい処理パス３３とは異なる処理パスが実行されてしまう。
【００６０】
図９は、図８のテストデータに基づいて実行される処理パスの一例を示す図である。例えば、複数のデータ項目で重複して参照されるメモリ領域３６に「２０００１２３１」と設定し、プログラム３１をテストした場合、ステップＳ１２で「偽」と判定される。その結果、テストしたい処理パス３３とは別の処理パス３７が実行される。また、メモリ領域３６に「２０００９９３１」と設定し、プログラム３１をテストした場合、ステップＳ１３で「偽」と判定される。その結果、テストしたい処理パス３３とは別の処理パス３８が実行される。
【００６１】
このように、同じメモリ領域を複数のデータ項目で参照していることを考慮せずに、個々のデータ項目ごとに、パス条件３４を満たすテストデータを生成しても、テストしたい処理パス３３を実行させることができないことがある。そこで、第２の実施の形態におけるテストデータ生成装置１００では、すべてのデータ項目を４ビットずつに分割する。さらにテストデータ生成装置１００は、４ビットずつのビット列をシンボルとし、そのシンボルごとにシンボル名を定義する。そしてテストデータ生成装置１００は、シンボル名ごとに、パス条件３４を満たす値を求める。
【００６２】
なお、シンボルに対応する値と分岐条件とを対比する際には、内部表現を合わせないと、正しく比較することができない。例えば、図６に示した１桁８ビットのデータ項目「年−Ｒ」には、「０１０００００１」という値が設定されている。この値を元の内部表現のまま解釈すれば、「６５」（１０進数表現）という値となる。これは、半角の文字「A」の文字コードである。この８ビットの値を４ビットずつに区切ると、「４」と「１」となる。このような値のまま、文字コードに関する分岐条件と比較しても、所望の分岐をさせるためのテストデータを正しく得ることはできない。そこでテストデータ生成装置１００では、内部表現を合わせた上で、パス条件に合致するシンボル名の値が求める。
【００６３】
以下、第２の実施の形態におけるテストデータ生成装置１００の機能について、具体的に説明する。
図１０は、テストデータ生成装置の機能の一例を示す図である。テストデータ生成装置１００は、入力データ記憶部１１０、シンボル初期化部１２１、シンボル記憶部１２２、シンボル置換部１２３、表現形式変換部１２４、論理式生成部１２５、ソルバ実行部１２６、充足解記憶部１２７、シンボル逆置換部１２８、およびテストデータ記憶部１３０を有する。
【００６４】
入力データ記憶部１１０は、テストデータの生成のために入力されるデータを記憶する。例えば入力データ記憶部１１０には、データ項目表３２とパス条件３４が格納される。入力データ記憶部１１０としては、例えばメモリ１０２やＨＤＤ１０３の記憶領域の一部が用いられる。
【００６５】
シンボル初期化部１２１は、各データ項目の指すメモリ領域に、所定数のビット単位のシンボルを生成し、各シンボルにシンボル名を割り当てる。データ項目によってメモリ１０２上での表現方法が異なるので、１桁当たりに割り当てられるシンボル数は、データ項目の長さに応じて変わる。第２の実施の形態では、シンボル初期化部１２１は、４ビット単位のシンボルにシンボル名を割り当てる。
【００６６】
シンボル記憶部１２２は、シンボル初期化部１２１によって生成されたシンボルを記憶する。例えばシンボル記憶部１２２は、メモリ領域に対応付けて、シンボルを記憶する。シンボル記憶部１２２としては、例えばメモリ１０２またはＨＤＤ１０３の記憶領域の一部が使用される。
【００６７】
シンボル置換部１２３は、パス条件３４に登場するデータ項目に対応するメモリ領域のシンボル列を、シンボル記憶部１２２から取得する。そしてシンボル置換部１２３は、パス条件３４中のデータ項目をすべてシンボル列に書き換える。
【００６８】
表現形式変換部１２４は、条件文の左右両辺でデータ項目の表現形式（１桁当たりのビット数）が異なる場合に、両辺が同等の表現となるように、データ項目の表現形式を変換する。
【００６９】
論理式生成部１２５は、パス条件３４に基づいて、ソルバに入力する論理式を生成する。例えば論理式生成部１２５は、メモリ領域を重複して参照する複数のデータ項目がある場合には、所定ビット数ごとのシンボルごとの値を求める論理式を生成する。また論理式生成部１２５は、メモリ領域を重複して参照する複数のデータ項目がない場合は、入力データ記憶部１１０に設定されているデータ項目ごとの値を求める論理式を生成してもよい。
【００７０】
ソルバ実行部１２６は、論理式生成部１２５で生成された論理式を従属する解を算出する。ソルバ実行部１２６は、算出した解を充足解記憶部１２７に格納する。
充足解記憶部１２７は、論理式を充足する解を記憶する。例えばメモリ１０２やＨＤＤ１０３の記憶領域の一部が、充足解記憶部１２７として使用される。
【００７１】
シンボル逆置換部１２８は、ソルバ実行部１２６により得られた、シンボル列に対する解を、入力変数に対する入力値へと変換する。例えばシンボル逆置換部１２８は、各シンボル列に対応する変数の表現形式に応じて、変換を行う。そしてシンボル逆置換部１２８は、入力変数のデータ項目ごとに得られた入力値を、テストデータとしてテストデータ記憶部１３０に格納する。
【００７２】
テストデータ記憶部１３０は、生成されたテストデータを記憶する。例えばメモリ１０２やＨＤＤ１０３の記憶領域の一部がテストデータ記憶部１３０として使用される。
なお、図１０に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また図１０に示したシンボル初期化部１２１およびシンボル置換部１２３は、図１に示した第１の実施の形態における分割手段１１の一例である。図１０に示した表現形式変換部１２４は、図１に示した第１の実施の形態における変換手段１２の一例である。図１０に示した論理式生成部１２５は、図１に示した第１の実施の形態における決定手段１３の一例である。図１０に示したソルバ実行部１２６は、図１に示した第１の実施の形態における算出手段１４の一例である。図１０に示したシンボル逆置換部１２８は、図１に示した第１の実施の形態における逆変換手段１５の一例である。
【００７３】
このような機能を有するテストデータ生成装置１００により、例えばプログラム３１の処理パス３３のテストを行うためのテストデータを生成することができる。
図１１は、テストデータ生成処理の手順を示すフローチャートである。以下の処理は、例えば入力データ記憶部１１０内のデータ項目表３２とパス条件３４とを指定したテストデータ生成指示が入力された場合に実行される。
【００７４】
［ステップＳ１０１］シンボル初期化部１２１は、入力データ記憶部１１０からデータ項目表３２とパス条件３４を取得する。
［ステップＳ１０２］シンボル初期化部１２１は、データ項目の参照先のメモリ領域を複数のシンボルに分け、そのシンボルを初期化する。シンボル初期化部１２１は、初期化したシンボルをシンボル記憶部１２２に格納する。シンボル初期化部１２１は、シンボル初期化処理が終了すると、例えばシンボル置換部１２３に、シンボル初期化終了を通知する。シンボル初期化処理の詳細は後述する（図１２、図１３、図１４参照）。
【００７５】
［ステップＳ１０３］シンボル置換部１２３は、シンボル初期化部１２１によるシンボル初期化処理が終了すると、シンボル記憶部１２２に記憶されたシンボルに基づいて、パス条件３４中に記載されたデータ項目をシンボルに置換する。シンボル置換部１２３は、データ項目がシンボルに置換されたパス条件を、表現形式変換部１２４に送信する。シンボル置換処理の詳細は後述する（図１５、図１６参照）。
【００７６】
［ステップＳ１０４］表現形式変換部１２４は、パス条件中の各分岐条件について、左辺と右辺との表現形式が同等となるように、左辺または右辺の表現形式を変換する。そして、表現形式変換部１２４は、表現形式変換後のパス条件を、論理式生成部１２５に送信する。表現形式変換処理の詳細は後述する（図１７〜図２６参照）。
【００７７】
［ステップＳ１０５］論理式生成部１２５は、左辺と右辺との表現形式が統一された分岐条件に基づいて、各シンボルに関する制約条件を示す論理式を生成する。論理式生成部１２５は、生成した論理式をソルバ実行部１２６に送信する。論理式生成処理の詳細は、後述する（図２７、図２８参照）。
【００７８】
［ステップＳ１０６］ソルバ実行部１２６は、論理式を解くためのソルバを実行し、論理式の条件を充足する解を算出する。ソルバ実行部１２６は、得られた解を充足解記憶部１２７に格納する。
【００７９】
［ステップＳ１０７］シンボル逆置換部１２８は、充足解記憶部１２７に格納されたシンボルごとの値を、データ項目の値に置き換える。シンボル逆置換処理の詳細は後述する（図２９〜図３３参照）。
【００８０】
［ステップＳ１０８］シンボル逆置換部１２８は、データ項目ごとの解を、テストデータとしてテストデータ記憶部１３０に格納する。
以上のような手順でテストデータが生成される。以下、テストデータ生成処理を、さらに詳細に説明する。
【００８１】
まず、シンボル初期化処理について詳細に説明する。
図１２は、シンボル初期化の一例を示す図である。シンボル初期化処理では、データ項目表３２に基づいてシンボルが生成され、生成されたシンボルがシンボルテーブル４１に設定される。なおデータ項目表３２の内容は、図５に示した通りであるものとする。
【００８２】
シンボルテーブル４１には、メモリ領域、シンボル、及び項目名が関連付けて登録されている。ここで、図５に示したデータ項目表３２におけるレベル「１」のデータ項目「項目Ｇ」を、複数のシンボルに分割する場合を考える。データ項目「項目Ｇ」のバイト数は、１２バイトである。１２バイトが４ビットずつに分けられ、４ビットずつのビット列それぞれがシンボルとなる。そこで、１２バイトのメモリ領域に対応付けて、２４個のシンボルが生成される。図１２に示すシンボルテーブル４１では、２４個のシンボルのシンボル名を「Ｓ１」〜「Ｓ２４」としている。そしてシンボル「Ｓ１」〜「Ｓ２４」の範囲のメモリ領域に対応付けて、データ項目「項目Ｇ」が設定されている。
【００８３】
ここで、データ項目の表現形式が１桁８ビットの項目であった場合、割り当てられた各シンボルには、文字コードの上位４ビットもしくは下位４ビットの値が入力される。データ項目の表現形式が１桁１６ビットの項目であった場合、割り当てられた各シンボルには、文字コードの１６ビットのうちの連続する４ビットの値が入力される。例えば、データ項目に割り当てられた４つのシンボルに、上位４ビット（第１〜第４ビット）、上位から２番目の４ビット（第５〜第８ビット）、上位から３番目の４ビット（第９〜第１２ビット）、下位４ビット（第１３〜第１６ビット）の値が入力される。データ項目の表現形式が１桁４ビットであった場合、割り当てられた各シンボルには、そのデータ項目の数値が直接入力される。
【００８４】
例えばデータ項目「年月日」の表現形式は１桁８ビットであるが、シンボルは４ビットごとに割り当てが行われる。そのためデータ項目「年月日」には、１桁に対して２つのシンボルが割り当てられる。その結果、８桁であるデータ項目「年月日」には、シンボルテーブル上で「Ｓ１」から「Ｓ１６」まで、計１６個のシンボルが割り当てられている。同様に、データ項目「年月日−Ｒ」にも１６個のシンボルを割り当てるが、データ項目「年月日−Ｒ」は「年月日」を再定義している項目であり、「年月日」と同じメモリ領域を参照している。そのためデータ項目「年月日−Ｒ」には、データ項目「年月日」と同じシンボル「Ｓ１」から「Ｓ１６」が割り当てられている。集団項目「年月日−Ｒ」を構成する下位のデータ項目「年−Ｒ」・「月−Ｒ」・「日−Ｒ」は、データ項目「年月日−Ｒ」内のメモリ領域を参照するものである。そのためデータ項目「年−Ｒ」・「月−Ｒ」・「日−Ｒ」それぞれには、データ項目「年月日−Ｒ」に割り当てたシンボルの中から、それぞれの位置と長さに応じてシンボルが割り当てられている。例えば「年−Ｒ」は「年月日−Ｒ」の先頭４桁を指すので、「年月日−Ｒ」先頭４桁に該当する「Ｓ１」から「Ｓ８」が割り当てられている。
【００８５】
データ項目「時刻」の表現形式は、１桁４ビットである。そのためデータ項目「時刻」には、１桁に対して１つのシンボルが割り当てられる。その結果、４桁であるデータ項目「時刻」には、シンボルテーブル上で「Ｓ１７」から「Ｓ２０」まで、計４個のシンボルが割り当てられている。
【００８６】
データ項目「頭文字」の表現形式は、１桁１６ビットである。そのためデータ項目「頭文字」には、１桁に対して４つのシンボルが割り当てられる。その結果、４桁であるデータ項目「頭文字」には、シンボルテーブル上で「Ｓ２１」から「Ｓ２４」まで、計４個のシンボルが割り当てられている。
【００８７】
このようなシンボルテーブル４１が、シンボル記憶部１２２に格納される。以下、シンボル初期化処理の手順について詳細に説明する。
図１３は、シンボル初期化処理の手順の一例を示すフローチャートである。
【００８８】
［ステップＳ１１１］シンボル初期化部１２１は、シンボルテーブル４１を初期化する。例えば、シンボル初期化部１２１は、レベル「１」のデータ項目のデータ量に応じたサイズのシンボルテーブル４１を生成する。
【００８９】
［ステップＳ１１２］シンボル初期化部１２１は、データ項目表３２から、各データ項目のレベルを取得する。
［ステップＳ１１３］シンボル初期化部１２１は、レベル「１」のすべてのデータ項目に対して、ステップＳ１１４の処理を実行する。
【００９０】
［ステップＳ１１４］シンボル初期化部１２１は、レベル「１」のデータ項目（ｄｉ）を引数として、初期化再帰処理を実行する。初期化再帰処理の詳細は後述する（図１４参照）。
【００９１】
［ステップＳ１１５］シンボル初期化部１２１は、レベル「１」のすべてのデータ項目についてステップＳ１１４の処理が終了した場合、シンボル初期化処理を終了する。
図１４は、初期化再帰処理の手順の一例を示すフローチャートである。初期化再帰処理は、図１３のステップＳ１１４で実行されるか、あるいは図１４に示す初期化再帰処理のステップＳ１２８で再帰的に実行される。なお初期化再帰処理は、ステップＳ１１４で実行される場合、レベル「１」のデータ項目が引数に設定されるが、ステップＳ１２８で再帰的に実行される場合、レベルが２以降のデータ項目が引数に設定される。
【００９２】
［ステップＳ１２１］シンボル初期化部１２１は、引数として設定されたデータ項目（ｄｉ）のメモリ上のオフセットｉと長さｌを計算する。
［ステップＳ１２２］シンボル初期化部１２１は、引数として設定されたデータ項目（ｄｉ）が、再定義項目か否かを判断する。再定義項目とは、同じメモリ領域を参照する他のデータ項目が、先に定義されているようなデータ項目である。図５の例では、「ＲＥＤＥＦＩＮＥＳ」の欄に参照先が設定されているデータ項目「年月日−Ｒ」が、再定義項目である。再定義項目であれば、処理がステップＳ１２６に進められる。再定義項目でなければ、処理がステップＳ１２３に進められる。
【００９３】
［ステップＳ１２３］シンボル初期化部１２１は、引数として設定されたデータ項目（ｄｉ）の上位のレベルの項目があるか否かを判断する。例えばデータ項目表３２において、引数として設定されたデータ項目（ｄｉ）より上に、そのデータ項目より上位のレベルのデータ項目があれば、上位のレベルの項目ありと判断される。上位のレベルの項目がある場合、処理がステップＳ１２６に進められる。上位のレベルの項目がなければ、処理がステップＳ１２４に進められる。
【００９４】
［ステップＳ１２４］シンボル初期化部１２１は、引数として設定されたデータ項目（ｄｉ）に対して割り当てられているメモリ領域分のシンボルを生成する。例えば、図５に示すデータ項目「項目Ｇ」が引数として設定された場合、１２バイト分の２４個のシンボルが生成される。
【００９５】
［ステップＳ１２５］シンボル初期化部１２１は、生成したシンボルを、シンボルテーブル４１に追加する。例えばシンボル初期化部１２１は、シンボルテーブル４１内の４ビットずつのメモリ領域に対応付けて、シンボル名を登録する。
【００９６】
［ステップＳ１２６］シンボル初期化部１２１は、引数として設定されたデータ項目（ｄｉ）をシンボルテーブル４１にマッピングする。例えばシンボル初期化部１２１は、レベル「１」のデータ項目「項目Ｇ」中の、データ項目（ｄｉ）の範囲を判断する。例えばデータ項目「項目Ｇ」の先頭からの、データ項目（ｄｉ）の先頭までのオフセットｉと、データ項目（ｄｉ）の長さｌに基づいて、データ項目「項目Ｇ」中のデータ項目（ｄｉ）の範囲を判断する。そしてシンボル初期化部１２１は、その範囲に対応するシンボルに対応付けて、データ項目（ｄｉ）の項目名をシンボルテーブルに設定する。
【００９７】
［ステップＳ１２７］シンボル初期化部１２１は、引数として設定されたデータ項目（ｄｉ）の下位のデータ項目（child）のすべてについて、ステップＳ１２８の処理を実行する。
【００９８】
［ステップＳ１２８］シンボル初期化部１２１は、データ項目（ｄｉ）の下位のデータ項目（child）を引数として、初期化再帰処理を再帰的に実行する。
［ステップＳ１２９］シンボル初期化部１２１は、データ項目（ｄｉ）の下位のデータ項目（child）すべてについて初期化再帰処理が終了したら、データ項目（ｄｉ）について実行している初期化再帰処理を終了する。
【００９９】
以上のようにして、シンボルテーブル４１が作成される。
次に、シンボル置換処理について詳細に説明する。
図１５は、シンボル置換の一例を示す図である。シンボル置換部１２３は、パス条件３４のデータ項目をシンボルに置換することで、データ項目について規定したパス条件３４を、シンボルについて規定したパス条件４２へ変換する。このシンボルの置換は、パス条件３４とシンボルテーブル４１に基づいて行われる。なお図１５に示すパス条件３４は、そのパス条件３４に含まれる個々の分岐条件について、左辺、右辺、および演算子に分けて示されている。個々の分岐条件で「真」となることが、パス条件３４である。またシンボルテーブル４１の内容は、図１２に示した通りであるものとする。
【０１００】
シンボル置換部１２３は、シンボルテーブル４１を参照し、パス条件３４に含まれる各分岐条件の左辺に示されているデータ項目を、シンボルに置き換える。例えばパス条件３４の１行目にはデータ項目「年月日」が登場する。データ項目「年月日」には、シンボルテーブル４１（図１２参照）上で、「Ｓ１」から「Ｓ１６」までのシンボルが割り当てられている。そこで、シンボルに関するパス条件４２では、データ項目「年月日」が、「Ｓ１，Ｓ２，Ｓ３，Ｓ４，Ｓ５，Ｓ６，Ｓ７，Ｓ８，Ｓ９，Ｓ１０，Ｓ１１，Ｓ１２，Ｓ１３，Ｓ１４，Ｓ１５，Ｓ１６」というシンボル名の列に置き換えられている。
【０１０１】
図１６は、シンボル置換処理の手順の一例を示すフローチャートである。この処理は、例えばシンボル置換部１２３が、シンボル初期化部１２１からシンボル初期化処理が終了したことを示す通知を受けたときに実行する。
【０１０２】
［ステップＳ１３１］シンボル置換部１２３は、データ項目に関して規定したパス条件３４のすべてに対して、ステップＳ１３２〜Ｓ１３６の処理を実行する。
［ステップＳ１３２］シンボル置換部１２３は、パス条件３４中のデータ項目を探索する。
【０１０３】
［ステップＳ１３３］シンボル置換部１２３は、パス条件３４中に現れるすべてのデータ項目（ｄｉ）について、ステップＳ１３４〜Ｓ１３５の処理を実行する。
［ステップＳ１３４］シンボル置換部１２３は、シンボルテーブル４１から、データ項目（ｄｉ）に対応するシンボル名の列ｓｌを取得する。
【０１０４】
［ステップＳ１３５］シンボル置換部１２３は、パス条件３４のデータ項目（ｄｉ）のデータ項目名を、ステップＳ１３４で取得したシンボル名の列ｓｌに置換する。
［ステップＳ１３６］シンボル置換部１２３は、処理対象のパス条件３４に現れるすべてのデータ項目についてシンボル名の列への置換が終了した場合、処理をステップＳ１３７に進める。
【０１０５】
［ステップＳ１３７］シンボル置換部１２３は、すべてのパス条件について、データ項目からシンボルへの置換処理が終了した場合、シンボル置換処理を終了する。
このようにして、シンボルについて規定したパス条件４２が生成される。
【０１０６】
次に、表現形式変換処理について説明する。
図１７は、表現形式変換の一例を示す図である。表現形式変換部１２４は、シンボルに関するパス条件４２に含まれる各分岐条件の左辺と右辺を、左右で同じ表現形式となるように、表現形式を変換する。例えば、パス条件４２の１行目では、左辺が１桁８ビットのデータ項目に割り当てられた１６個のシンボル列である。右辺は８ビット単位の８桁の数値リテラルである。なおリテラルとは、プログラム中で使用される値を直接表記したものである。リテラルには、数値、文字列などがある。分岐条件の左右両辺の表現形式が異なると、ソルバにより充足解が求められない。そのためパス条件４２の１行目は、右辺のリテラルが、文字コード列が以下のように変換される。
（５０≫４），（５０＆１５），（４８≫４），（４８＆１５），（４８≫４），（４８＆１５），（４８≫４），（４８＆１５）、（４９≫４），（４９＆１５），（５０≫４），（５０＆１５），（５１≫４），（５１＆１５），（４９≫４），（４９＆１５）
これにより、左右が同等の表現となる。
【０１０７】
なお、「ｘ≫４」は、８ビットのｘの上位４ビットの値を得る式である（ｘは０以上の整数）。演算子「≫」は、ビット単位の右シフトを意味しており、この演算子の左の値がシフト対象であり、右の数値がシフトさせるビット数である。ｘが８ビットのときに「ｘ≫４」の演算を行うことにより、ｘの上位４ビットののみが残される。例えば「５０≫４」は、文字「２」（文字コードの１０進数表記「５０」）を表す８ビットの文字コードの上位４ビットを示す。
【０１０８】
「ｘ＆１５」は、ｘの下４ビットの値を得る式である。演算子「＆」は、左右の値の論理積を意味している。ｘと１５（２進数表記で「１１１１」）との論理積を求めることで、ｘの下位４ビットの値が得られる。「５０＆１５」は、文字「２」を表す８ビットの文字コードの下位４ビットを示す。
【０１０９】
パス条件４２の２行目は、１行目と同様に、右辺が８ビット単位のリテラルである。そのため、右辺の各桁が、上位４ビットと下位４ビットとに分けられる。
パス条件４２の３行目の左辺は１桁４ビットのデータ項目に割り当てられた４個のシンボル列であり、右辺は１桁４ビットの数値リテラルである。この場合、両辺とも４ビットの数値同士となるため、表現形式の変換は行われない。
【０１１０】
パス条件４２の４行目は、左辺が１桁８ビットのデータ項目に割り当てられた８個のシンボル列である。右辺は１桁４ビットのデータ項目（数値）に割り当てられた４個のシンボル列である。この場合、右辺の数値を表すデータ項目を、その数値を示す８ビットの文字コードに変換した上で、４ビットずつの値に分割される。なお文字コードがＪＩＳコードであれば、数値を示す値に「４８」を加算することで、その数値を示す文字コードに変換できる。例えば右辺のシンボル「Ｓ１７」は、「（Ｓ１７＋４８）≫４，（Ｓ１７＋４８）＆１５」に変換される。
【０１１１】
パス条件４２の５行目は、左辺が１桁１６ビットのデータ項目に割り当てられた４個のシンボル列である。右辺は１６ビットの文字リテラルである。そこで、右辺の値が、上位４ビット（第１ビットから第４ビット）、続く４ビット（第５ビットから第８ビット、さらに続く４ビット（第９ビットから第１２ビット）、および下位４ビット（第１３ビットから第１６ビットに分割される。例えば右辺の値は、「（８４８１≫１２），（８４８１＆４０９５≫８），（８４８１＆２５５≫４），（８４８１＆１５）」となる。なお「８４８１＆４０９５≫８」は、１６ビット中の下位１２ビットを取り出し、右に８ビットシフトすることを示している。これにより、元の１６ビットの値から、下位１２ビットの内の上位４ビット（元の１６ビット中の第４ビットから第８ビット）が抽出できる。
【０１１２】
図１８は、表現形式変換処理の手順の一例を示すフローチャートの前半である。
［ステップＳ１４１］表現形式変換部１２４は、パス条件に含まれるすべての分岐条件に対して、ステップＳ１４２〜Ｓ１５４（図１９参照）の処理を実行する。
【０１１３】
［ステップＳ１４２］表現形式変換部１２４は、シンボルテーブル４１から、シンボルに対応するデータ項目を探索する。
［ステップＳ１４３］表現形式変換部１２４は、データ項目表３２から左右両辺のデータ項目の表現形式を探索する。
【０１１４】
［ステップＳ１４４］表現形式変換部１２４は、左辺と右辺の表現形式の組み合わせを判断する。リテラルと１桁８ビットのデータ項目のシンボル列との組み合わせであれば、処理がステップＳ１４５に進められる。リテラルと１桁１６ビットのデータ項目のシンボル列との組み合わせであれば、処理がステップＳ１４６に進められる。１桁４ビットのデータ項目のシンボル列と１桁８ビットのデータ項目のシンボル列との組み合わせであれば、処理がステップＳ１４７に進められる。１桁４ビットのデータ項目のシンボル列と１桁１６ビットのデータ項目のシンボル列との組み合わせであれば、処理がステップＳ１４８に進められる。１桁８ビットのデータ項目のシンボル列と１桁１６ビットのデータ項目のシンボル列との組み合わせであれば、処理がステップＳ１４９に進められる。その他の組み合わせの場合、処理がステップＳ１５０（図１９参照）に進められる。
【０１１５】
［ステップＳ１４５］リテラルと１桁８ビットのデータ項目のシンボル列との組み合わせの場合、表現形式変換部１２４は、リテラルの１桁８ビット形式変換処理を行う。この処理の詳細は後述する（図２０参照）。その後、処理がステップＳ１５０に進められる。
【０１１６】
［ステップＳ１４６］リテラルと１桁１６ビットのデータ項目のシンボル列との組み合わせの場合、リテラルの１桁１６ビット形式変換処理が行われる。この処理の詳細は後述する（図２１参照）。その後、処理がステップＳ１５０に進められる。
【０１１７】
［ステップＳ１４７］１桁４ビットのデータ項目のシンボル列と１桁８ビットのデータ項目のシンボル列との組み合わせの場合、表現形式変換部１２４は、１桁４ビットデータ項目の１桁８ビット形式変換処理を行う。この処理の詳細は後述する（図２２参照）。その後、処理がステップＳ１５０に進められる。
【０１１８】
［ステップＳ１４８］１桁４ビットのデータ項目のシンボル列と１桁１６ビットのデータ項目のシンボル列との組み合わせの場合、表現形式変換部１２４は、１桁４ビットデータ項目の１桁１６ビット形式変換処理を行う。この処理の詳細は後述する（図２３参照）。その後、処理がステップＳ１５０に進められる。
【０１１９】
［ステップＳ１４９］１桁８ビットのデータ項目のシンボル列と１桁１６ビットのデータ項目のシンボル列との組み合わせの場合、表現形式変換部１２４は、１桁８ビットデータ項目の１桁１６ビット形式変換処理を行う。この処理の詳細は後述する（図２４参照）。
【０１２０】
図１９は、表現形式変換処理の手順の一例を示すフローチャートの後半である。
［ステップＳ１５０］表現形式変換部１２４は、パス条件４２における変換を行ったデータ項目（左辺または右辺）を、変換後の内容に更新する。
【０１２１】
［ステップＳ１５１］表現形式変換部１２４は、左辺と右辺との桁数が異なるか否かを判断する。桁数が異なる場合、処理がステップＳ１５２に進められる。桁数が同じであれば、処理がステップＳ１５５に進められる。
【０１２２】
［ステップＳ１５２］表現形式変換部１２４は、左辺か右辺のいずれかが、１桁１６ビッのデータ項目か否かが判断される。何れか一方が１桁１６ビットのデータ項目であれば、処理がステップＳ１５４に進められる。左辺と右辺とが、１桁４ビットまたは８ビットのデータ項目であれば、処理がステップＳ１５３に進められる。
【０１２３】
［ステップＳ１５３］表現形式変換部１２４は、１桁８ビットの桁合わせ処理が行われる。この処理の詳細は後述する（図２５参照）。
［ステップＳ１５４］表現形式変換部１２４は、１桁１６ビットの桁合わせ処理が行われる。この処理の詳細は後述する（図２６参照）。
【０１２４】
［ステップＳ１５５］表現形式変換部１２４は、すべての分岐条件に対する処理が終了したら、表現形式変換処理を終了する。
次に、リテラルの１桁８ビット形式変換処理について詳細に説明する。
【０１２５】
図２０は、リテラルの１桁８ビット形式変換処理の手順の一例を示すフローチャートである。この処理は、リテラルを引数として開始される。
［ステップＳ１６１］表現形式変換部１２４は、配列ａを用意する。
【０１２６】
［ステップＳ１６２］表現形式変換部１２４は、リテラル中の文字Ｃのすべてに対して、ステップＳ１６３〜Ｓ１６７の処理を行う。
［ステップＳ１６３］表現形式変換部１２４は、配列ｂを用意する。
【０１２７】
［ステップＳ１６４］表現形式変換部１２４は、文字Ｃの文字コード値Ｘを求める。
［ステップＳ１６５］表現形式変換部１２４は、文字コード値Ｘの上位４ビット分の値（Ｘ≫４）を、配列ｂ（１）へ代入する。
【０１２８】
［ステップＳ１６６］表現形式変換部１２４は、文字コード値Ｘの下位４ビット分の値（Ｘ＆１５）を、配列ｂ（２）へ代入する。
［ステップＳ１６７］表現形式変換部１２４は、配列ｂのすべての値（ｂ（１）、ｂ（２））を、配列ａの末尾に追加する。
【０１２９】
［ステップＳ１６８］表現形式変換部１２４は、すべての文字に対する処理が終了したら、処理をステップＳ１６９に進める。
［ステップＳ１６９］表現形式変換部１２４は、リテラルを配列ａと置換する。
【０１３０】
このようにして、リテラルが１桁８ビット形式と同じ表現形式に変換される。
次に、リテラルの１桁１６ビット形式変換処理について詳細に説明する。
図２１は、リテラルの１桁１６ビット形式変換処理の手順の一例を示すフローチャートである。この処理は、リテラルを引数として開始される。
【０１３１】
［ステップＳ１７１］表現形式変換部１２４は、配列ａを用意する。
［ステップＳ１７２］表現形式変換部１２４は、リテラル中の文字Ｃのすべてに対して、ステップＳ１７３〜Ｓ１７９の処理を行う。
【０１３２】
［ステップＳ１７３］表現形式変換部１２４は、配列ｂを用意する。
［ステップＳ１７４］表現形式変換部１２４は、文字Ｃの文字コード値Ｘを求める。
［ステップＳ１７５］表現形式変換部１２４は、文字コード値Ｘの上位４ビット分（第１ビットから第４ビット）の値（Ｘ≫１２）を、配列ｂ（１）へ代入する。
【０１３３】
［ステップＳ１７６］表現形式変換部１２４は、文字コード値Ｘの第４ビットから第８ビットの値（Ｘ＆４０９５≫８）を、配列ｂ（２）へ代入する。
［ステップＳ１７７］表現形式変換部１２４は、文字コード値Ｘの第９ビットから第１２ビットの値（Ｘ＆２５５≫４）を、配列ｂ（３）へ代入する。
【０１３４】
［ステップＳ１７８］表現形式変換部１２４は、文字コード値Ｘの下位４ビット分（第１３ビットから第１６ビット）の値（Ｘ＆１５）を、配列ｂ（４）へ代入する。
［ステップＳ１７９］表現形式変換部１２４は、配列ｂのすべての値（ｂ（１）、ｂ（２）、ｂ（３）、ｂ（４））を、配列ａの末尾に追加する。
【０１３５】
［ステップＳ１８０］表現形式変換部１２４は、すべての文字に対する処理が終了したら、処理をステップＳ１８１に進める。
［ステップＳ１８１］表現形式変換部１２４は、リテラルを配列ａと置換する。
【０１３６】
このようにして、リテラルが１桁１６ビット形式と同じ表現形式に変換される。
次に、１桁４ビット項目に対する１桁８ビット形式変換処理について説明する。
図２２は、１桁４ビット項目の１桁８ビット形式変換処理の手順の一例を示すフローチャートである。この処理は、１桁４ビットのデータ項目のシンボル列ｌｓを引数として開始される。
【０１３７】
［ステップＳ１９１］表現形式変換部１２４は、配列ａを用意する。
［ステップＳ１９２］表現形式変換部１２４は、引数に設定されたシンボル列ｌｓのシンボルすべてに対して、ステップＳ１９３〜Ｓ１９７の処理を実行する。
【０１３８】
［ステップＳ１９３］表現形式変換部１２４は、配列ｂを用意する。
［ステップＳ１９４］表現形式変換部１２４は、シンボルの値ｘに対応する文字コード値をｆ（ｘ）とする。例えば文字コードとしてＡＳＣＩＩコードを用いる場合、「ｆ（ｘ）＝ｘ＋４８」となる。
【０１３９】
［ステップＳ１９５］表現形式変換部１２４は、ｆ（ｘ）の上位４ビット分の値（ｆ（ｘ）≫４）を、配列ｂ（１）へ代入する。
［ステップＳ１９６］表現形式変換部１２４は、ｆ（ｘ）の下位４ビット分の値（ｆ（ｘ）＆１５）を、配列ｂ（２）へ代入する。
【０１４０】
［ステップＳ１９７］表現形式変換部１２４は、配列ｂのすべての値（ｂ（１）、ｂ（２））を、配列ａの末尾に追加する。
［ステップＳ１９８］表現形式変換部１２４は、すべての文字に対する処理が終了したら、処理をステップＳ１９９に進める。
【０１４１】
［ステップＳ１９９］表現形式変換部１２４は、シンボル列ｌｓを配列ａと置換する。
このようにして、１桁４ビットのデータ項目のシンボル列が、１桁８ビット形式と同じ表現形式に変換される。
【０１４２】
次に、１桁４ビット項目の１桁１６ビット形式変換処理について説明する。
図２３は、１桁４ビット項目の１桁１６ビット形式変換処理の手順の一例を示すフローチャートである。この処理は、１桁４ビットのデータ項目のシンボル列ｌｓを引数として開始される。
【０１４３】
［ステップＳ２０１］表現形式変換部１２４は、配列ａを用意する。
［ステップＳ２０２］表現形式変換部１２４は、引数に設定されたシンボル列ｌｓのシンボルすべてに対して、ステップＳ２０３〜Ｓ２０９の処理を実行する。
【０１４４】
［ステップＳ２０３］表現形式変換部１２４は、配列ｂを用意する。
［ステップＳ２０４］表現形式変換部１２４は、シンボルの値ｘに対応する文字コード値をｆ（ｘ）とする。
【０１４５】
［ステップＳ２０５］表現形式変換部１２４は、ｆ（ｘ）の上位４ビット分（第１ビットから第４ビット）の値（Ｘ≫１２）を、配列ｂ（１）へ代入する。
［ステップＳ２０６］表現形式変換部１２４は、ｆ（ｘ）の第４ビットから第８ビットの値（Ｘ＆４０９５≫８）を、配列ｂ（２）へ代入する。
【０１４６】
［ステップＳ２０７］表現形式変換部１２４は、ｆ（ｘ）の第９ビットから第１２ビットの値（Ｘ＆２５５≫４）を、配列ｂ（３）へ代入する。
［ステップＳ２０８］表現形式変換部１２４は、ｆ（ｘ）の下位４ビット分（第１３ビットから第１６ビット）の値（Ｘ＆１５）を、配列ｂ（４）へ代入する。
【０１４７】
［ステップＳ２０９］表現形式変換部１２４は、配列ｂのすべての値（ｂ（１）、ｂ（２）、ｂ（３）、ｂ（４））を、配列ａの末尾に追加する。
［ステップＳ２１０］表現形式変換部１２４は、すべての文字に対する処理が終了したら、処理をステップＳ２１１に進める。
【０１４８】
［ステップＳ２１１］表現形式変換部１２４は、シンボル列ｌｓを配列ａと置換する。
このようにして、１桁４ビットのデータ項目のシンボル列が、１桁１６ビット形式と同じ表現形式に変換される。
【０１４９】
次に、１桁８ビット項目の１桁１６ビット形式変換処理について説明する。
図２４は、１桁８ビット項目の１桁１６ビット形式変換処理の手順の一例を示すフローチャートである。この処理は、１桁８ビットのデータ項目のシンボル列ｌｓを引数として開始される。
【０１５０】
［ステップＳ２２１］表現形式変換部１２４は、配列ａを用意する。
［ステップＳ２２２］表現形式変換部１２４は、カウンタｉに、引数として設定されたシンボル列ｌｓの先頭の要素（シンボル）の要素番号を設定する。例えばシンボル列内の各シンボルに対して、先頭から順に昇順のシンボル番号が付与されているものとする。
【０１５１】
［ステップＳ２２３］表現形式変換部１２４は、カウンタｉがシンボル列ｌｓの末尾の桁の要素番号に達するまで、ステップＳ２２４〜Ｓ２３０の処理を繰り返し実行する。カウンタｉの値は、例えばステップＳ２２４〜Ｓ２３０を１回実行するごとに、２ずつカウントアップされる。
【０１５２】
［ステップＳ２２４］表現形式変換部１２４は、配列ｂを用意する。
［ステップＳ２２５］表現形式変換部１２４は、シンボル列ｌｓのｉ番目のシンボルの値を上位ビットｓ１に代入する（ｓ１＝ｌｓ［ｉ］）。また表現形式変換部１２４は、シンボル列ｌｓのｉ＋１番目のシンボルの値を下位ビットｓ２に代入する（ｓ２＝ｌｓ［ｉ＋１］）。
【０１５３】
［ステップＳ２２６］表現形式変換部１２４は、数値の０を、配列ｂ（１）へ代入する。
［ステップＳ２２７］表現形式変換部１２４は、数値の０を、配列ｂ（２）へ代入する。
【０１５４】
［ステップＳ２２８］表現形式変換部１２４は、データ項目の上位４ビット分の値ｓ１を、変数ｂ（３）へ代入する。
［ステップＳ２２９］表現形式変換部１２４は、データ項目の下位４ビット分の値ｓ２を、変数ｂ（４）へ代入する。
【０１５５】
［ステップＳ２３０］表現形式変換部１２４は、配列ｂのすべての値（ｂ（１）、ｂ（２）、ｂ（３）、ｂ（４））を、配列ａの末尾に追加する。
［ステップＳ２３１］表現形式変換部１２４は、カウンタｉで示される要素が、データ項目の末尾の桁（８ビット）に達したときのステップＳ２２４〜Ｓ２３０の処理が終了したら、処理をステップＳ２３２に進める。
【０１５６】
［ステップＳ２３２］表現形式変換部１２４は、シンボル列ｌｓを配列ａと置換する。
このようにして、１桁８ビットのデータ項目のシンボル列が、１桁１６ビット形式と同じ表現形式に変換される。
【０１５７】
次に、１桁８ビットの桁合わせ処理について説明する。
図２５は、１桁８ビットの桁合わせ処理の手順の一例を示すフローチャートである。
［ステップＳ２４１］表現形式変換部１２４は、左辺より右辺の方が長い（桁数が多い）か否かを判断する。右辺の方が長ければ、処理がステップＳ２４２に進められる。左辺の方が長ければ、処理がステップＳ２４３に進められる。
【０１５８】
［ステップＳ２４２］表現形式変換部１２４は、左辺の値を変数ｏ１へ代入し、右辺の値を変数ｏ２へ代入する。その後、処理がステップＳ２４４に進められる。
［ステップＳ２４３］表現形式変換部１２４は、右辺の値を変数ｏ１へ代入し、左辺の値を変数ｏ２へ代入する。
【０１５９】
［ステップＳ２４４］表現形式変換部１２４は、変数ｏ１の桁数と、変数ｏ２の桁数が同じになるまで、ステップＳ２４５〜Ｓ２５１の処理を繰り返し実行する。
［ステップＳ２４５］表現形式変換部１２４は、変数ｏ１と変数ｏ２とは数値か否かを判断する。数値であれば、処理がステップＳ２４６に進められる。数値でなければ、処理がステップＳ２４９に進められる。
【０１６０】
［ステップＳ２４６］表現形式変換部１２４は、変数ｃに、「０」の文字コードを設定する。
［ステップＳ２４７］表現形式変換部１２４は、変数ｃの下位４ビット分の値（ｃ＆１５）を、変数ｏ１の先頭に追加する。
【０１６１】
［ステップＳ２４８］表現形式変換部１２４は、変数ｃの上位４ビット分の値（ｃ≫４）を、変数ｏ１の先頭に追加する。その後、処理がステップＳ２５２に進められる。
［ステップＳ２４９］表現形式変換部１２４は、変数ｃに、半角スペースの文字コードを設定する。
【０１６２】
［ステップＳ２５０］表現形式変換部１２４は、変数ｃの上位４ビット分の値（ｃ≫４）を、変数ｏ１の末尾に追加する。
［ステップＳ２５１］表現形式変換部１２４は、変数ｃの下位４ビット分の値（ｃ＆１５）を、変数ｏ１の末尾に追加する。
【０１６３】
［ステップＳ２５２］表現形式変換部１２４は、変数ｏ１と変数ｏ２との桁数が同じになったら、各変数の値を、元の辺（左辺または右辺）に書き戻し、１桁８ビットの桁合わせ処理を終了する。
【０１６４】
このようにして、１桁８ビットの表現形式による、左辺と右辺との桁合わせが完了する。
次に１桁１６ビットの桁合わせ処理について説明する。
【０１６５】
図２６は、１桁１６ビットの桁合わせ処理の手順の一例を示すフローチャートである。
［ステップＳ２６１］表現形式変換部１２４は、左辺より右辺の方が長い（桁数が多い）か否かを判断する。右辺の方が長ければ、処理がステップＳ２６２に進められる。左辺の方が長ければ、処理がステップＳ２６３に進められる。
【０１６６】
［ステップＳ２６２］表現形式変換部１２４は、左辺の値を変数ｏ１へ代入し、右辺の値を変数ｏ２へ代入する。その後、処理がステップＳ２６４に進められる。
［ステップＳ２６３］表現形式変換部１２４は、右辺の値を変数ｏ１へ代入し、左辺の値を変数ｏ２へ代入する。
【０１６７】
［ステップＳ２６４］表現形式変換部１２４は、変数ｏ１の桁数と、変数ｏ２の桁数が同じになるまで、ステップＳ２６５〜Ｓ２７０の処理を繰り返し実行する。
［ステップＳ２６５］表現形式変換部１２４は、配列ｂを用意する。
【０１６８】
［ステップＳ２６６］表現形式変換部１２４は、変数ｃに、半角スペースの文字コードを設定する。
［ステップＳ２６７］表現形式変換部１２４は、変数ｃの上位４ビット分（第１ビットから第４ビット）の値（ｃ≫１２）を、配列ｂ（１）へ代入する。
【０１６９】
［ステップＳ２６８］表現形式変換部１２４は、変数ｃの第５ビットから第８ビットの値（ｃ＆４０９５≫８）を、配列ｂ（２）へ代入する。
［ステップＳ２６９］表現形式変換部１２４は、変数ｃの第９ビットから第１２ビットの値（ｃ＆２５５≫４）を、配列ｂ（３）へ代入する。
【０１７０】
［ステップＳ２７０］表現形式変換部１２４は、変数ｃの下位４ビット分（第１３ビットから第１６ビット）の値（ｃ＆１５）を、配列ｂ（４）へ代入する。
［ステップＳ２７１］表現形式変換部１２４は、変数ｏ１と変数ｏ２との桁数が同じになったら、各変数の値を、元の辺（左辺または右辺）に書き戻し、１桁１６ビットの桁合わせ処理を終了する。
【０１７１】
このようにして、１桁１６ビットの表現形式による、左辺と右辺との桁合わせが完了する。
次に、論理式の生成処理について説明する。
【０１７２】
図２７は、論理式生成の一例を示す図である。論理式生成部１２５は、表現形式変換後のパス条件４３に基づいて、論理式５１〜５５を生成する。パス条件４３の１行目の分岐条件に基づいて、論理式５１が生成される。パス条件４３の２行目の分岐条件に基づいて、論理式５２が生成される。パス条件４３の３行目の分岐条件に基づいて、論理式５３が生成される。パス条件４３の４行目の分岐条件に基づいて、論理式５４が生成される。パス条件４３の５行目の分岐条件に基づいて、論理式５５が生成される。
【０１７３】
論理式５１〜５５中の「not」は、後に続く括弧内の条件の否定を表す。「and」は、後に続く括弧内の複数の条件の論理積を表す。「or」は、後に続く括弧内の複数の条件の論理和を表す。「=」は、後に続く括弧内の２つの値が等しいことを表す。「<=」は、後に続く括弧内の右の値が左の値以上であることを表す。「<」は、後に続く括弧内の右の値が左の値より大きいことを表す。「>」は、後に続く括弧内の左の値が右の値より大きいことを表す。
【０１７４】
例えばパス条件４３の１行目の右辺の先頭には、「５０≫４」という要素がある。これは「５０」（２進数表記で「００１１００１０」）の上位４ビット「００１１」（１０進数表記で「３」）である。この要素と左辺の先頭のシンボル「Ｓ１」とが一致することが、論理式５１内の「＝（Ｓ１  ３）」という制約で示されている。論理式５１では、左辺と右辺との対応する要素が等しいという複数の制約の論理積を否定している。その結果、対応する要素間で、少なくとも１つでも等しくないものが存在すれば論理積は偽となり、その論理積を否定した論理式５１が充足する。
【０１７５】
次に論理式の生成手順について説明する。
図２８は、論理式生成処理の手順の一例を示すフローチャートである。論理式生成処理は、パス条件４３内の分岐条件ごとに行われる。
【０１７６】
［ステップＳ２８１］論理式生成部１２５は、制約を書き出す領域ｄを用意する。
［ステップＳ２８２］論理式生成部１２５は、演算子の種別を判断する。演算子が等号であれば、処理がステップＳ２８３に進められる。演算子が不等号であれば、処理がステップＳ２８７に進められる。演算子が比較演算子であれば、処理がステップＳ２９２に進められる。
【０１７７】
［ステップＳ２８３］演算子が等号の場合、論理式生成部１２５は、左辺と右辺との対応する要素対すべてに対して、ステップＳ２８４〜Ｓ２８５の処理を行う。なお、対応する要素対とは、左辺と右辺とのそれぞれにおける、先頭からの順番が同じとなる要素である。
【０１７８】
［ステップＳ２８４］論理式生成部１２５は、左辺と右辺とにおける対応する要素対間で等号が成立するという制約ｅを生成する。
［ステップＳ２８５］論理式生成部１２５は、領域ｄに、それまでの領域ｄの内容に制約ｅの論理積を追加した内容を、新たに代入する。
【０１７９】
［ステップＳ２８６］論理式生成部１２５は、対応する要素対のすべてについて、ステップＳ２８４〜Ｓ２８５の処理が終了した場合、処理をステップＳ２９８に進める。
［ステップＳ２８７］演算子が不等号の場合、論理式生成部１２５は、左辺と右辺との対応する要素対すべてに対して、ステップＳ２８８〜Ｓ２８９の処理を行う。
【０１８０】
［ステップＳ２８８］論理式生成部１２５は、左辺と右辺とにおける対応する要素対間で等号が成立するという制約ｅを生成する。
［ステップＳ２８９］論理式生成部１２５は、領域ｄに、それまでの領域ｄの内容に制約ｅの論理積を追加した内容を、新たに代入する。
【０１８１】
［ステップＳ２９０］論理式生成部１２５は、対応する要素対のすべてについて、ステップＳ２８８〜Ｓ２８９の処理が終了した場合、処理をステップＳ２９１に進める。
［ステップＳ２９１］論理式生成部１２５は、領域ｄに設定されている内容全体を否定する制約を、領域ｄに新たに代入する。その後、処理がステップＳ２９８に進められる。
【０１８２】
［ステップＳ２９２］演算子が比較演算子の場合、論理式生成部１２５は、左辺と右辺との対応する要素対すべてに対して、ステップＳ２９３〜Ｓ２９６の処理を行う。
［ステップＳ２９３］論理式生成部１２５は、制約を書き出す領域ｆを用意する。
【０１８３】
［ステップＳ２９４］論理式生成部１２５は、処理対象とする要素対よりも上位の要素対がすべて等しい関係にあるという制約を、領域ｆに追加する。
［ステップＳ２９５］論理式生成部１２５は、処理対象とする要素対で、演算子の関係が成立するという制約を、論理積で領域ｆに追加する。
【０１８４】
［ステップＳ２９６］論理式生成部１２５は、領域ｄの内容に、領域ｆの内容を論理和（ＯＲ）で追加した内容を、新たに領域ｄに代入する。
［ステップＳ２９７］論理式生成部１２５は、対応する要素対のすべてについて、ステップＳ２９３〜Ｓ２９６の処理が終了した場合、処理をステップＳ２９８に進める。
【０１８５】
［ステップＳ２９８］論理式生成部１２５は、領域ｄに格納された内容を、分岐条件に対応する論理式として出力する。
このようにして、論理式５１〜５５が生成される。その後、ソルバ実行部１２６によりソルバが実行され、論理式５１〜５５を充足する解（充足解）が得られる。充足解には、論理式５１〜５５のすべてを充足するシンボルごとの値が示される。充足解は、充足解記憶部１２７に格納される。そしてシンボル逆置換部１２８により、シンボルごとの充足解が、データ項目ごとの充足解に置換される。
【０１８６】
図２９は、シンボル逆置換の一例を示す図である。論理式５１〜５５に基づいて得られる充足解６１は、シンボルごとの値となる。図２９の例では、充足解６１には、各シンボルのシンボル名に対応づけて、値が設定されている。このような充足解６１に対してシンボル逆置換処理を行うことで、パス条件３４を満たす項目名ごとの値を示す充足解６２が得られる。この充足解６２がテストデータとなる。
【０１８７】
例えば、「年月日」にはシンボル「Ｓ１」から「Ｓ１６」が割り当てられているので、シンボル逆置換部１２８は、シンボルのリスト「Ｓ１」「Ｓ２」…「Ｓ１６」を取得する。「年月日」は１桁８ビットであるため、１桁目に対応するのはシンボル「Ｓ１」「Ｓ２」である。１桁目の値を求めるため、シンボル逆置換部１２８は、シンボル「Ｓ１」「Ｓ２」の値を合成して、１桁目の値を得る。すると「年月日」の１桁目は「５０」となる。「ｖ［ｉ］×１６＋ｖ［ｉ＋１］」が、シンボルｖ［ｉ］とシンボルｖ［ｉ＋１］を合成する式である（ｉは１以上の整数、ｖ［ｉ］はｉ番目のシンボルの値）。この式で求まるのは文字コードである。そこでシンボル逆置換部１２８は、文字コードを対応する文字へと変換する（ＪＩＳの場合、文字コード「５０」は文字「２」に対応する）。同様にして、「年月日」のすべての桁の値を求めると、充足解「２０００１１３１」を得ることができる。
【０１８８】
なおシンボル逆置換部１２８による変換処理は、データ項目の表現形式によって変わる。例えば、「時刻」のように１桁４ビットの変数に割り当てられるシンボルのリスト「Ｓ１７」「Ｓ１８」「Ｓ１９」「Ｓ２０」を変換する際には、シンボルの合成や文字コード変換などを行わずにすむ。
【０１８９】
以下シンボル逆置換処理の手順について詳細に説明する。
図３０は、シンボル逆置換処理の手順の一例を示すフローチャートである。
［ステップＳ３０１］シンボル逆置換部１２８は、すべてのデータ項目に対して、ステップＳ３０２〜Ｓ３０９の処理を実行する。
【０１９０】
［ステップＳ３０２］シンボル逆置換部１２８は、シンボルテーブル４１から、処理対象のデータ項目に対応するシンボルのリストｖを取得する。
［ステップＳ３０３］シンボル逆置換部１２８は、リストｖ内のシンボルを、名前順でソートする。
【０１９１】
［ステップＳ３０４］シンボル逆置換部１２８は、配列ｔを用意する。
［ステップＳ３０５］シンボル逆置換部１２８は、データ項目の表現形式を判断する。１桁４ビットの表現形式であれば、処理がステップＳ３０６に進められる。１桁８ビットの表現形式であれば、処理がステップＳ３０７に進められる。１桁１６ビットの表現形式であれば、処理がステップＳ３０８に進められる。
【０１９２】
［ステップＳ３０６］処理対象のデータ項目が１桁４ビットの表現形式の場合、シンボル逆置換部１２８は、配列ｔとリストｖとを引数として、シンボル列の１桁４ビット置換処理を行う。この処理の詳細は後述する（図３１参照）。
【０１９３】
［ステップＳ３０７］処理対象のデータ項目が１桁８ビットの表現形式の場合、シンボル逆置換部１２８は、配列ｔとリストｖとを引数として、シンボル列の１桁８ビット置換処理を行う。この処理の詳細は後述する（図３２参照）。
【０１９４】
［ステップＳ３０８］処理対象のデータ項目が１桁１６ビットの表現形式の場合、シンボル逆置換部１２８は、配列ｔとリストｖとを引数として、シンボル列の１桁１６ビット置換処理を行う。この処理の詳細は後述する（図３３参照）。
【０１９５】
［ステップＳ３０９］シンボル逆置換部１２８は、処理対象のデータ項目に対応付けて、シンボル逆置換後の充足解６２に、配列ｔを書き出す。
［ステップＳ３１０］シンボル逆置換部１２８は、すべてのデータ項目に対するステップＳ３０２〜Ｓ３０９の処理が終了したら、シンボル逆置換処理を終了する。
【０１９６】
次に、１桁４ビット置換処理の手順について説明する。
図３１は、１桁４ビット置換処理の手順の一例を示すフローチャートである。
［ステップＳ３２１］シンボル逆置換部１２８は、カウンタｉに０を設定する。
【０１９７】
［ステップＳ３２２］シンボル逆置換部１２８は、カウンタｉの値がリストｖの末尾に達するまで、ステップＳ３２３〜Ｓ３２４の処理を実行する。
［ステップＳ３２３］シンボル逆置換部１２８は、ｖ［ｉ］（ｉ番目のシンボルの値）を配列ｔの末尾に加える。
【０１９８】
［ステップＳ３２４］シンボル逆置換部１２８は、ｉの値を１だけカウントアップする。
［ステップＳ３２５］シンボル逆置換部１２８は、ｉの値がリストｖ内のシンボル数を超えた場合、ステップＳ３２３〜Ｓ３２４の繰り返しを終了すると共に、１桁４ビット置換処理を終了する。
【０１９９】
次に、１桁８ビット置換処理の手順について説明する。
図３２は、１桁８ビット置換処理の手順の一例を示すフローチャートである。
［ステップＳ３３１］シンボル逆置換部１２８は、カウンタｉに０を設定する。
【０２００】
［ステップＳ３３２］シンボル逆置換部１２８は、カウンタｉの値がリストｖの末尾に達するまで、ステップＳ３３３〜Ｓ３３６の処理を実行する。
［ステップＳ３３３］シンボル逆置換部１２８は、ｉ番目のシンボルの値（ｖ［ｉ］）を用いて、文字コードｗ＝ｖ［ｉ］×１６＋ｖ［ｉ＋１］を計算する。
【０２０１】
［ステップＳ３３４］シンボル逆置換部１２８は、文字コードを、その文字コードで表される文字へと変換する。例えばシンボル逆置換部１２８は、数字の文字コードを、その文字コードで表される数値に変換する。なお、文字コードのままでテストデータとすることができる場合、文字への変換を行わなくてもよい。
【０２０２】
［ステップＳ３３５］シンボル逆置換部１２８は、変換後の文字を、配列ｔの末尾に加える。
［ステップＳ３３６］シンボル逆置換部１２８は、カウンタｉの値を、２だけカウントアップする。
【０２０３】
［ステップＳ３３７］シンボル逆置換部１２８は、ｉの値がリストｖ内のシンボル数を超えた場合、ステップＳ３３３〜Ｓ３３６の繰り返しを終了すると共に、１桁８ビット置換処理を終了する。
【０２０４】
次に、１桁１６ビット置換処理の手順について説明する。
図３３は、１桁１６ビット置換処理の手順の一例を示すフローチャートである。
［ステップＳ３４１］シンボル逆置換部１２８は、カウンタｉに０を設定する。
【０２０５】
［ステップＳ３４２］シンボル逆置換部１２８は、カウンタｉの値がリストｖの末尾に達するまで、ステップＳ３４３〜Ｓ３４６の処理を実行する。
［ステップＳ３４３］シンボル逆置換部１２８は、ｉ番目のシンボルの値（ｖ［ｉ］）を用いて、文字コードｗ＝ｖ［ｉ］×４０９６＋ｖ［ｉ＋１］×２５６＋ｖ［ｉ＋２］×１６＋ｖ［ｉ＋３］を計算する。
【０２０６】
［ステップＳ３４４］シンボル逆置換部１２８は、文字コードを、その文字コードで表される文字へと変換する。なお、文字コードのままでテストデータとすることができる場合、文字への変換を行わなくてもよい。
【０２０７】
［ステップＳ３４５］シンボル逆置換部１２８は、変換後の文字を、配列ｔの末尾に加える。
［ステップＳ３４６］シンボル逆置換部１２８は、カウンタｉの値を、４だけカウントアップする。
【０２０８】
［ステップＳ３４７］シンボル逆置換部１２８は、ｉの値がリストｖ内のシンボル数を超えた場合、ステップＳ３４３〜Ｓ３４６の繰り返しを終了すると共に、１桁１６ビット置換処理を終了する。
【０２０９】
以上説明したように、第２の実施の形態によれば、複数のデータ項目（変数）で重複して参照される記憶領域が４ビットずつのシンボルに分割される。データ項目の表現形式は、最小でも１桁当たり４ビットで表されている。また１桁当たりのビット数が４ビットより多い場合でも、１桁当たりのビット数は４の倍数である。すなわち、各データ項目の表現形式による１桁当たりのビット数の最大公約数が４である。そのため、記憶領域を４ビットずつのシンボルに分割すれば、各シンボルに含まれるビットに関して、それらのビットを参照する１以上のデータ項目が共通となる。そのため制約条件を満たすようなシンボルに対して設定する値を求めることで、記憶領域の各ビットの値を１つに決定することができる。しかもその値を記憶領域に設定すれば、テスト装置３０に対して、テスト対象の処理パスを実行させることができる。すなわち、参照先の記憶領域が部分的に重複する複数のデータ項目がある場合でも、適切なテストデータを生成することができる。
【０２１０】
また、第２の実施の形態では、条件式の左辺と右辺との内部表現を合わせることにより、異なる内部表現のデータ項目が混在していても、正しくテストデータを生成することができる。例えば内部表現における１桁当たりのビット数が異なる場合、表現形式を揃えた上で、１桁当たりのビット数が左辺と右辺とで同じになるように分割される。これにより、内部表現における１桁当たりのビット数が異なる複数の変数が存在しても、適切なテストデータを生成することができる。
【０２１１】
なお第２の実施の形態は、ＣＯＢＯＬで作成されたプログラムをテストする場合の例を用いて説明したが、複数の変数で同じ記憶領域を参照可能な他の言語で作成されたプログラムをテストする場合にも、同様にテストデータを生成できる。例えば、ＰＬ／Ｉ（商標）で作成されたプログラムをテストする場合にも適切なテストデータを生成できる。
【０２１２】
また、第２の実施の形態では、文字コードとしてＡＳＣＩＩやＪＩＳコードの例を示したが、他の文字コードを用いることもできる。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【符号の説明】
【０２１３】
１  変数
２，３，４  制約条件
５  テストデータ
１０  テストデータ生成装置
１１  分割手段
１２  変換手段
１３  決定手段
１４  算出手段
１５  逆変換手段
１６  記憶手段
【図１】
2014199478.tif 000003
【図２】
2014199478.tif 000004
【図３】
2014199478.tif 000005
【図４】
2014199478.tif 000006
【図５】
2014199478.tif 000007
【図６】
2014199478.tif 000008
【図７】
2014199478.tif 000009
【図８】
2014199478.tif 000010
【図９】
2014199478.tif 000011
【図１０】
2014199478.tif 000012
【図１１】
2014199478.tif 000013
【図１２】
2014199478.tif 000014
【図１３】
2014199478.tif 000015
【図１４】
2014199478.tif 000016
【図１５】
2014199478.tif 000017
【図１６】
2014199478.tif 000018
【図１７】
2014199478.tif 000019
【図１８】
2014199478.tif 000020
【図１９】
2014199478.tif 000021
【図２０】
2014199478.tif 000022
【図２１】
2014199478.tif 000023
【図２２】
2014199478.tif 000024
【図２３】
2014199478.tif 000025
【図２４】
2014199478.tif 000026
【図２５】
2014199478.tif 000027
【図２６】
2014199478.tif 000028
【図２７】
2014199478.tif 000029
【図２８】
2014199478.tif 000030
【図２９】
2014199478.tif 000031
【図３０】
2014199478.tif 000032
【図３１】
2014199478.tif 000033
【図３２】
2014199478.tif 000034
【図３３】
2014199478.tif 000035