(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024130691
(43)【公開日】2024-09-30
(54)【発明の名称】プログラム検証支援システム、及びプログラム検証支援方法
(51)【国際特許分類】
G06F 11/36 20060101AFI20240920BHJP
G06F 8/30 20180101ALI20240920BHJP
【FI】
G06F11/36 196
G06F8/30
G06F11/36 188
【審査請求】未請求
【請求項の数】10
【出願形態】OL
(21)【出願番号】P 2023040552
(22)【出願日】2023-03-15
(71)【出願人】
【識別番号】000005108
【氏名又は名称】株式会社日立製作所
(74)【代理人】
【識別番号】110000176
【氏名又は名称】弁理士法人一色国際特許事務所
(72)【発明者】
【氏名】山本 一道
(72)【発明者】
【氏名】鹿糠 秀行
(72)【発明者】
【氏名】曾我 遼
(72)【発明者】
【氏名】松本 潤
(72)【発明者】
【氏名】稲垣 光雄
(72)【発明者】
【氏名】菅生 浩央
【テーマコード(参考)】
5B042
5B376
【Fターム(参考)】
5B042HH13
5B042HH49
5B376BC64
(57)【要約】
【課題】プログラムの検証に必要な限度でかつ効率良くスタブを生成する。
【解決手段】1又は複数の呼出命令を含む呼出部と、呼出命令により呼び出される被呼出部とを含むソースコードの呼出部から、条件分岐命令、条件分岐命令の条件節変数、及び条件分岐命令より前に存在する呼出命令をそれぞれ特定し、特定した条件節変数に所定の値を設定する命令又は、特定した呼出命令を除いた場合に上記特定した条件節変数の値を決定づける変数に、所定の値を設定する命令である非変数設定命令を、上記特定した呼出命令より前の命令から検索し、非変数設定命令を検索できた場合に、上記特定した条件節変数と、上記特定した呼出命令により呼び出される被呼出部とを対応付けたデータを生成するスタブ生成処理とを実行するプログラム検証支援システム1。
【選択図】
図5
【特許請求の範囲】
【請求項1】
1又は複数の呼出命令を含む呼出部と、前記呼出命令により呼び出される被呼出部とを含むソースコードを記憶する記憶装置、及び、
前記ソースコードの呼出部から、条件分岐命令、前記条件分岐命令における条件を構成する変数である条件節変数、及び前記条件分岐命令より前に存在する呼出命令をそれぞれ特定する命令文抽出処理と、
前記特定した条件節変数に所定の値を設定する命令又は、前記特定した呼出命令を除いた場合に前記特定した条件節変数の値を決定づける変数に、所定の値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する設定命令検索処理と、
前記非変数設定命令を検索できた場合に、前記特定した条件節変数と、前記特定した呼出命令により呼び出される被呼出部とを対応付けたデータを生成するスタブ生成処理とを実行する制御装置を備える、
プログラム検証支援システム。
【請求項2】
前記制御装置は、
前記設定命令検索処理において、定数値を前記特定した条件節変数に設定する命令又は、前記呼出命令を除いた場合に前記特定した条件節変数の値を決定づける変数に定数値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する、
請求項1に記載のプログラム検証支援システム。
【請求項3】
前記制御装置は、
前記設定命令検索処理において、前記ソースコードの呼出部に対する初期入力変数の値に依存しない変数の値を前記特定した条件節変数に設定する命令又は、前記呼出命令を除いた場合に前記特定した条件節変数の値を決定づける変数に、前記ソースコードの呼出部に対する初期入力変数の値に依存しない変数の値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する、
請求項1に記載のプログラム検証支援システム。
【請求項4】
前記記憶装置は、前記ソースコードの全ての変数を設定又は変更可能な被呼出部を呼び出す第1呼出命令と、引数として指定された変数のみを設定又変更可能な被呼出部を呼び出す第2呼出命令とを前記呼出部に含むソースコードを記憶し、
前記制御装置は、
前記命令文抽出処理において前記ソースコードの呼出部から前記第1呼出命令を特定した場合には、前記設定命令検索処理において、前記特定した条件節変数の各変数に所定の値を設定する命令又は、前記第1呼出命令を除いた場合に前記条件節変数の各変数の値を決定づける変数に所定の値を設定する命令を非変数設定命令として、前記特定した呼出命令より前の命令から検索し、
前記命令文抽出処理において前記ソースコードの呼出部から前記第2呼出命令を特定した場合には、前記設定命令検索処理において、前記特定した条件節変数のうち前記特定した第2呼出命令に係る前記変数に所定の値を設定する命令又は、前記第2呼出命令を除いた場合に前記条件節変数のうち前記特定した第2呼出命令に係る前記変数の値を決定づける変数に所定の値を設定する命令を非変数設定命令として、前記特定した呼出命令より前の命令から検索する、
請求項1に記載のプログラム検証支援システム。
【請求項5】
前記制御装置は、
前記命令文抽出処理において、
前記ソースコードの呼出部において、各前記第1呼出命令を開始位置に設定した第1領域と、前記第1領域の各第2呼出命令をそれぞれ開始位置に設定した第2領域とを設定し、設定した第2領域ごとに、当該第2領域の各条件分岐命令の条件節変数のうち前記第1領域に係る第1呼出命令又は当該第2領域の第2呼出命令より前の各第2呼出命令の実行により値が変更される可能性がある変数であるダーティー変数を特定し、
前記ソースコードの呼出部の選択された第2領域から、条件分岐命令、前記条件分岐命令における条件を構成する条件節変数、及び前記条件分岐命令より前に存在する呼出命令をそれぞれ特定し、
前記設定命令検索処理において、前記特定した条件節変数が前記ダーティー変数である場合に、前記特定した条件節変数に所定の値を設定する命令又は、前記特定した呼出命令を除いた場合に前記条件節変数の値を決定づける変数に所定の値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する、
請求項4に記載のプログラム検証支援システム。
【請求項6】
情報処理装置が、
1又は複数の呼出命令を含む呼出部と、前記呼出命令により呼び出される被呼出部とを含むソースコードを記憶し、
前記ソースコードの呼出部から、条件分岐命令、前記条件分岐命令における条件を構成する変数である条件節変数、及び前記条件分岐命令より前に存在する呼出命令をそれぞれ特定する命令文抽出処理と、
前記特定した条件節変数に所定の値を設定する命令又は、前記特定した呼出命令を除いた場合に前記特定した条件節変数の値を決定づける変数に、所定の値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する設定命令検索処理と、
前記非変数設定命令を検索できた場合に、前記特定した条件節変数と、前記特定した呼出命令により呼び出される被呼出部とを対応付けたデータを生成するスタブ生成処理とを実行する、
プログラム検証支援方法。
【請求項7】
前記情報処理装置が、
前記設定命令検索処理において、定数値を前記特定した条件節変数に設定する命令又は、前記呼出命令を除いた場合に前記特定した条件節変数の値を決定づける変数に定数値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する、
請求項6に記載のプログラム検証支援方法。
【請求項8】
前記情報処理装置が、
前記設定命令検索処理において、前記ソースコードの呼出部に対する初期入力変数の値に依存しない変数の値を前記特定した条件節変数に設定する命令又は、前記呼出命令を除いた場合に前記特定した条件節変数の値を決定づける変数に、前記ソースコードの呼出部に対する初期入力変数の値に依存しない変数の値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する、
請求項6に記載のプログラム検証支援方法。
【請求項9】
前記情報処理装置が、
前記ソースコードの全ての変数を設定又は変更可能な被呼出部を呼び出す第1呼出命令と、引数として指定された変数のみを設定又変更可能な被呼出部を呼び出す第2呼出命令とを前記呼出部に含むソースコードを記憶し、
前記命令文抽出処理において前記ソースコードの呼出部から前記第1呼出命令を特定した場合には、前記設定命令検索処理において、前記特定した条件節変数の各変数に所定の
値を設定する命令又は、前記第1呼出命令を除いた場合に前記条件節変数の各変数の値を決定づける変数に所定の値を設定する命令を非変数設定命令として、前記特定した呼出命令より前の命令から検索し、
前記命令文抽出処理において前記ソースコードの呼出部から前記第2呼出命令を特定した場合には、前記設定命令検索処理において、前記特定した条件節変数のうち前記特定した第2呼出命令に係る前記変数に所定の値を設定する命令又は、前記第2呼出命令を除いた場合に前記条件節変数のうち前記特定した第2呼出命令に係る前記変数の値を決定づける変数に所定の値を設定する命令を非変数設定命令として、前記特定した呼出命令より前の命令から検索する、
請求項6に記載のプログラム検証支援方法。
【請求項10】
前記情報処理装置が、
前記命令文抽出処理において、
前記ソースコードの呼出部において、各前記第1呼出命令を開始位置に設定した第1領域と、前記第1領域の各第2呼出命令をそれぞれ開始位置に設定した第2領域とを設定し、設定した第2領域ごとに、当該第2領域の各条件分岐命令の条件節変数のうち前記第1領域に係る第1呼出命令又は当該第2領域の第2呼出命令より前の各第2呼出命令の実行により値が変更される可能性がある変数であるダーティー変数を特定し、
前記ソースコードの呼出部の選択された第2領域から、条件分岐命令、前記条件分岐命令における条件を構成する条件節変数、及び前記条件分岐命令より前に存在する呼出命令をそれぞれ特定し、
前記設定命令検索処理において、前記特定した条件節変数が前記ダーティー変数である場合に、前記特定した条件節変数に所定の値を設定する命令又は、前記特定した呼出命令を除いた場合に前記条件節変数の値を決定づける変数に所定の値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する、
請求項9に記載のプログラム検証支援方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラム検証支援システム、及びプログラム検証支援方法に関する。
【背景技術】
【0002】
時代の変化や実行環境の変化などにより、ある言語で記述されたプログラムのソースコードを他の言語に変更する(変換する)必要がある場合がある。そして変換後は、変換後のプログラムが変換前のプログラムと同様に動作するかをテストする必要がある(現新一致の確認)。
【0003】
このようなテストの手法としては、プログラム内の各条件分岐命令の条件分岐先の命令を全て実行する(C0網羅)方法がある。この場合、プログラムの初期値を設定したテストデータを作成すると共に、プログラムの関数(メインルーチン内の呼出命令等)によって呼び出される呼び出し先のサブルーチンに対応したスタブ(サブルーチンの戻り値のデータ)を作成する。
【0004】
ここで、特許文献1には、呼出先サブルーチンのコードを解析し、呼出先サブルーチンの戻り値となる全変数を特定することで、呼出先サブルーチンごとに値を設定すべき変数を抽出した呼出関数毎設定変数表を作成するスタブ化プログラムが開示されている。
【先行技術文献】
【特許文献】
【0005】
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかし、特許文献1では、C0網羅する上で解析する必要のないサブルーチンを解析するため、生成コストが高くなってしまう。また、サブルーチンの戻り値の一部は条件分岐先に無関係でC0網羅には不要である。さらに、特許文献1は、メインルーチンに設定されている変数の値を書き換えるサブルーチンがある場合に対応できておらず、書き換えられた値に対して行われる条件分岐を検証することができない場合がある。
【0007】
本発明は、このような事情に鑑みてなされたものであり、その目的は、プログラムの検証に必要な限度でかつ効率良くスタブを生成することが可能なプログラム検証支援システム、及びプログラム検証支援方法を提供することにある。
【課題を解決するための手段】
【0008】
上記課題を解決するための本発明の一つは、1又は複数の呼出命令を含む呼出部と、前記呼出命令により呼び出される被呼出部とを含むソースコードを記憶する記憶装置、及び、前記ソースコードの呼出部から、条件分岐命令、前記条件分岐命令における条件を構成する変数である条件節変数、及び前記条件分岐命令より前に存在する呼出命令をそれぞれ特定する命令文抽出処理と、前記特定した条件節変数に所定の値を設定する命令又は、前記特定した呼出命令を除いた場合に前記特定した条件節変数の値を決定づける変数に、所定の値を設定する命令である非変数設定命令を、前記特定した呼出命令より前の命令から検索する設定命令検索処理と、前記非変数設定命令を検索できた場合に、前記特定した条件節変数と、前記特定した呼出命令により呼び出される被呼出部とを対応付けたデータを生成するスタブ生成処理とを実行する制御装置を備える、プログラム検証支援システムである。
【発明の効果】
【0009】
本発明によれば、プログラムの検証に必要な限度でかつ効率良くスタブを生成することができる。
上記した以外の構成及び効果等は、以下の実施形態の説明により明らかにされる。
【図面の簡単な説明】
【0010】
【
図1】本実施形態に係るプログラム検証支援システムの構成の一例を示す図である。
【
図2】本実施形態を説明するための第1プログラムのソースコードの一例を示す図である。
【
図3】言語変換支援装置が備える主な機能の一例を説明する図である。
【
図4】プログラム検証支援システムにおける各情報処理装置が備えるハードウェア構成の一例を示す図である。
【
図5】スタブ作成処理の一例を説明するフロー図である。
【
図6】命令文抽出処理の詳細を説明するフロー図である。
【
図11】条件節内変数毎チェーン表の一例を示す図である。
【
図13】条件節内変数毎依存関係解析処理の詳細を説明するフロー図である。
【
図14】呼出命令毎影響分岐命令表の一例を示す図である。
【
図15】条件節内変数毎トレース処理の一例を説明する図である。
【
図16】サブルーチン毎設定変数抽出処理の詳細を説明するフロー図である。
【
図17】単純呼出命令(PERFORM)のみが含まれる第1プログラムのメインルーチン及びこれにより作成されるスタブ項目表の一例を示す図である。
【
図18】引数指定呼出命令(CALL)のみが含まれる第1プログラムのメインルーチンと、作成される呼出命令毎影響分岐命令表及びスタブ項目表との例を示す図である。
【
図19】単純呼出命令(PERFORM)間に挟まれた引数指定呼出命令(CALL)が存在する第1プログラムのメインルーチンと作成される呼出命令毎影響分岐命令表及びスタブ項目表との例を示す図である。
【
図20】単純呼出命令(PERFORM)間に挟まれた引数指定呼出命令(CALL)が存在する第1プログラムのメインルーチンと作成される呼出命令毎影響分岐命令表及びスタブ項目表との例を示す図である。
【
図21】単純呼出命令(PERFORM)の前に引数指定呼出命令(CALL)がある第1プログラムのメインルーチン及び作成される呼出命令毎影響分岐命令表の一例を示す図である。
【
図22】複数の引数指定呼出命令(CALL)の呼び出し先が共通する第1プログラムのメインルーチンと作成される条件節内変数毎チェーン表及びスタブ項目表との例を示す図である。
【発明を実施するための形態】
【0011】
図面を参照して、本発明の実施形態について詳細に説明する。
図1は、本実施形態に係るプログラム検証支援システム1の構成の一例を示す図である。プログラム検証支援システム1は、第1の言語で記述されたプログラム(第1プログラム100)を記憶するユーザ端末10と、第1プログラム100を、第2の言語で記述されたプログラム(第2プログラム200)に変換すると共にテストケースデータ300を生成する言語変換装置20と、第1プログラム100に基づきスタブ項目表400を生成
する言語変換支援装置40と、テストケースデータ300及びスタブ項目表400に基づき、第2プログラム200に対するテストの内容を定義したテストコード500を生成するテストコード生成装置30と、第2プログラム200及びテストコード500に基づき、言語変換装置20が実行した第1プログラム100から第2プログラム200への変換が正しく行われた否かを検証する検証装置50とを含んで構成される。
【0012】
ユーザ端末10、言語変換装置20、言語変換支援装置40、テストコード生成装置30、及び検証装置50の間は、例えば、インターネット、LAN(Local Area Network)、WAN(Wide Area Network)、又は専用線等の有線又は無線の通信ネットワークによ
り接続されてもよいし、直接通信線で接続されてもよい。
【0013】
第1の言語及び第2の言語は、例えば、COBOL、Java(登録商標)、又はC++等、少なくとも代入命令、条件分岐命令、及び呼出命令をサポートする言語であれば特に限定されない。本実施形態では、第1の言語はCOBOLであり、第2の言語はJava(登録商標)であるもとする。
【0014】
(ソースコード)
図2は、本実施形態を説明するための第1プログラム100のソースコードの一例を示す図である。第1プログラムのソースコードは、プログラムの実行時に最初に実行されるメインルーチン110(呼出部)と、メインルーチン110から第1呼出命令111及び第2呼出命令112によってそれぞれ呼び出され実行される被呼出部である第1サブルーチン130及び第2サブルーチン140とを含む。
【0015】
メインルーチン110は、定数値(ソース定数値114)を被代入変数115に代入(設定)する第1代入命令文116、変数(ソース変数117)の値を被代入変数118に代入(設定)する第2代入命令文119、及び、条件分岐命令120を含む。
【0016】
第1呼出命令111(以下、単純呼出命令又はPERFORMともいう)は、第1サブルーチ
ン130に引き渡す引数を有しない。したがって、第1サブルーチン130では、ソースコードにおける全ての変数が設定又は変更され得る。その結果、第1呼出命令111の後、少なくとも次の第1呼出命令が出現するまでの範囲の各命令における全ての変数は、第1呼出命令111の実行によりその値が変更される可能性がある(以下、このような変数をダーティー変数という。また、ダーティー変数でない変数を非ダーティー変数という。)。
【0017】
一方、第2呼出命令112(以下、引数指定呼出命令又はCALLともいう)は、第2サブルーチン140に引き渡す1又は複数の引数121を有する。したがって、第2サブルーチンでは、引き渡された引数121のみが参照又は変更される。その結果、第2呼出命令112の後、同じ変数を引数とする次の第2呼出命令(又は次の第1呼出命令)が出現するまでの範囲の各命令における変数のうち第2呼出命令112の引数121に係る変数のみが、第2呼出命令112の実行によりその値が設定又は変更される可能性がある(ダーティー変数)。
【0018】
条件分岐命令120は、条件節122と、条件節122が示す条件を満たす場合及び満たさない場合にそれぞれ実行される各実行節124とを含む。ここで、条件節122は、条件を構成する変数(条件節変数125)の値が関係演算子126及び判定対象パラメータ127(変数又は定数)が示す条件を満たしているか否か(真又は偽)を判定する部分である。また、実行節124は、1つのみ存在する場合もある(条件節122が示す条件を満たす場合(又は満たさない場合)に実行される実行部のみが存在する)。
【0019】
第2プログラム200のソースコードも、言語及び詳細な文法等は異なるものの、第1プログラム100のソースコードと同様にメインルーチン、サブルーチン、及び各種類の命令を含んで構成される。
【0020】
第2プログラム200に対して、メインルーチンにおける条件分岐命令内の全ての命令を実行(C0網羅)するテストを実施する際には、メインルーチンに対応したテストケースデータ300の他、サブルーチンに対応したスタブ項目表400を作成することが有用である。
【0021】
具体的には、言語変換装置20が出力するテストケースデータ300は、第2プログラム200への初期入力データのパターンを定義したデータである。すなわち、テストケースデータ300は、第2プログラム200のメインルーチンの初期値のパターンを定義したデータである。
【0022】
一方、スタブ項目表400は、変数に関するサブルーチンの処理結果(又は戻り値)をその変数のリストと共に記憶したデータである。すなわち、スタブ項目表400は、第2プログラム200のサブルーチンの実行結果のパターンを定義したデータである。
【0023】
従来、このようなスタブを生成する際には、サブルーチンを解析する必要があったり、不要なスタブを生成してしまうことがあった。そこで、本実施形態の言語変換支援装置40は、サブルーチンの処理内容を参照することなく、メインルーチンのみを解析することのみで、第2プログラム200のC0網羅に必要な限度でのデータのみを有するスタブ(スタブ項目表400)を作成することができる。
【0024】
図3は、言語変換支援装置40が備える主な機能の一例を説明する図である。言語変換支援装置40は、命令文抽出部41、設定命令検索部42、及びスタブ生成部43を備える。
【0025】
命令文抽出部41は、ソースコードの呼出部(メインルーチン)から、呼出命令に後続する条件分岐命令と、その条件分岐命令における条件を構成する変数である条件節変数とを特定する。
【0026】
設定命令検索部42は、所定の値(以下、本明細書ではリテラルという)を、命令文抽出部41で特定した条件節変数又はその条件節変数を決定づける変数に設定する代入命令である非変数設定命令を、命令文抽出部41が特定した呼出命令より前の命令から検索する。
【0027】
具体的には、設定命令検索部42は、定数値をリテラルとし、非変数設定命令を上記特定した呼出命令より前の命令から検索する。
【0028】
また、設定命令検索部42は、ソースコードに対する初期入力変数(メインルーチンに対する入力変数)に依存しない変数の値をリテラルとし、非変数設定命令を上記呼出命令より前の命令から検索する。
【0029】
スタブ生成部43は、非変数設定命令を検索できた場合に、命令文抽出部41で特定した条件節変数と上記呼出命令に対応する被呼出部とを対応付けたデータ(スタブ項目表400)を生成する。
【0030】
次に、
図4は、プログラム検証支援システム1における各情報処理装置(言語変換装置20、言語変換支援装置40、テストコード生成装置30、及び検証装置50)が備える
ハードウェア構成の一例を示す図である。各情報処理装置は、CPU(Central Processing Unit)等の制御装置91と、RAM(Random Access Memory)、又はROM(Read Only Memory)等の主記憶装置92と、HDD(Hard Disk Drive)、又はSSD(Solid State Drive)等の補助記憶装置93と、キーボード、マウス、又はタッチパネル等の入力
装置94と、ディスプレイ又はタッチパネル等の出力装置95と、NIC(Network Interface Card)、無線通信モジュール、USB(Universal Serial Interface)モジュール、
又はシリアル通信モジュール等で構成される通信装置96とを備える。
【0031】
以上に説明した、プログラム検証支援システム1における各情報処理装置の機能部の機能は、制御装置91が、主記憶装置92又は補助記憶装置93からプログラムを読み出すことにより実現される。また各プログラムは、例えば、可搬性の又は固定された記録媒体に記録して配布することができる。なお、これらのプログラムは、その全部または一部が、例えば、クラウドシステムによって提供される仮想サーバのように、仮想化技術やプロセス空間分離技術等を用いて提供される仮想的な情報処理資源を用いて実現されるものであってもよい。また、これらのプログラムの全部または一部は、例えば、クラウドシステムがAPI (Application Programming Interface)等を介して提供するサービスによって実現してもよい。
次に、プログラム検証支援システム1で行われる処理について説明する。
【0032】
<スタブ作成処理>
図5は、言語変換支援装置40によるスタブの作成処理(スタブ作成処理)の一例を説明する図である。スタブ作成処理は、例えば、言語変換支援装置40が、ユーザ端末10から、第1プログラム100を受信したことを契機に開始される。
【0033】
まず、命令文抽出部41は、第1プログラム100のメインルーチンを取得し、取得したメインルーチンから命令文(代入命令文、呼出命令文、分岐命令文)を抽出すると共にメインルーチンを各領域に区切る命令文抽出処理s11を実行する。
【0034】
図6は、命令文抽出処理s11の詳細を説明するフロー図である。
まず、命令文抽出部41は、代入命令文に関する情報を集約した代入命令文表600、呼出命令文に関する情報を集約した呼出命令文表700、及び分岐命令文に関する情報を集約した分岐命令文表800の各テーブルを生成する(s111)。
【0035】
そして、命令文抽出部41は、s111で生成した各テーブルに基づき、領域区分表1300を生成する(s112-s113)。
【0036】
領域区分表1300は、ソースコードの呼出部(メインルーチン)において、各第1呼出命令を開始位置とした各領域(以下、大領域という)と、各大領域において、各第2呼出命令を開始位置とした各領域(以下、小領域という)とを設定したテーブルである。
【0037】
具体的には、命令文抽出部41は、単純呼出命令(PERFORM)に基づき大領域を設定す
る(s112)。具体的には、命令文抽出部41は、呼出命令文表700の各レコードのうち種別703が単純呼出命令(PERFORM)のレコードの行番号リスト702の最初の行
を全て抽出する。そして、命令文抽出部41は、各単純呼出命令について、呼出部における、当該単純呼出命令が存在する行からその次の単純呼出命令が存在する行の直前の行までの各行に対して大領域の名称(例えば、0、1、2、3、・・・)を設定する。
【0038】
命令文抽出部41は、s112で設定した各大領域において、引数指定呼出命令(CALL)に基づき小領域を設定する(s113)。具体的には、まず、命令文抽出部41は、s1311で特定した各大領域の行番号の範囲を特定する。そして、命令文抽出部41は、
特定した行番号の範囲において、呼出命令文表700の各レコードのうち種別703が引数指定呼出命令(CALL)のレコードの行番号リスト702の最初の行を全て抽出する。そして、命令文抽出部41は、各引数指定呼出命令について、呼出部における、当該引数指定呼出命令が存在する行からその次の引数指定呼出命令が存在する行の直前の行までの各行に対して小領域の名称(例えば、0、1、2、3、・・・)を設定する。
【0039】
(代入命令文表)
図7は、代入命令文表600の一例を示す図である。同図に示すように、代入命令文表600は、命令文の通し番号が設定されるレコード番号601、代入命令文が記述されているソースプログラムの行番号のリストが設定される行番号リスト602、代入させる変数(ソース変数)が設定されるS変数603、代入させる定数値(ソース定数値)が設定される固定値604、及び、ソース変数の値又はソース定数値が代入される被代入変数のリストが設定されるD変数リスト605の各データ項目を有する。なお、代入命令文表600の各レコードは、ソースプログラムの行番号の昇順に(すなわちソースプログラムの冒頭行から末尾行に向かって)ソートされる。
【0040】
固定値604が示す定数値又は、S変数603が示す変数のうちテストケースデータ300で設定されていない変数がそれぞれリテラルとなりうる。本実施形態では、説明の便宜上、リテラルが定数値のみである場合を説明する。
【0041】
(呼出命令文表)
図8は、呼出命令文表700の一例を示す図である。同図に示すように、呼出命令文表700は、呼出命令文の番号が設定されるレコード番号701、呼出命令文が記述されているソースプログラムの行番号のリストが設定される行番号リスト702、呼出命令文の種類が設定される種別703、並びに、呼出命令文による呼び出し先である被呼出部(サブルーチン)の情報(被呼出部の名称及び引数等)のリストが設定される呼出先引数リスト704の各データ項目を有する。なお、呼出命令文表700の各レコードは、ソースプログラムの行番号の昇順に(すなわちソースプログラムの冒頭行から末尾行に向かって)ソートされる。
【0042】
(分岐命令文表)
図9は、分岐命令文表800の一例を示す図である。同図に示すように、分岐命令文表800は、分岐命令文の番号が設定されるレコード番号801、分岐命令文が記述されているソースプログラムの行番号のリストが設定される行番号リスト802、分岐命令文の種類が設定される種別803並びに、分岐命令文における条件節における条件節変数及び条件に応じて実行される各実行節のソースプログラム上の行番号のリストが設定される条件節変数実行節行番号リスト804の各データ項目を有する。なお、分岐命令文表800の各レコードは、ソースプログラムの行番号の昇順に(すなわちソースプログラムの冒頭行から末尾行に向かって)ソートされる。
【0043】
(領域区分表)
図10は、領域区分表1300の一例を示す図である。領域区分表1300は、ソースコードの呼出部(メインルーチン)の行番号が設定される行番号1301、その行番号の行における命令文が設定される命令文1302、その行番号の行に対応づけられた大領域の名称が設定されるPERFORM領域分け1303、その行番号の行に対応づけられた小領域
の名称が設定されるCALL領域分け1304、及び、大領域及び小領域を組み合わせてなる区分領域の名称が設定される領域名1305の各データ項目を有する。
【0044】
次に、
図5に示すように、設定命令検索部42は、命令文抽出処理s11で生成した各表に基づき条件節内変数毎チェーン表900を生成する条件節内変数毎依存関係解析処理
s13を実行する。
【0045】
条件節内変数毎チェーン表900は、メインルーチン(呼出部)のある分岐命令文を先頭として、その前に存在する呼出命令をまたぎつつ、メインルーチンの先頭に向かって、上記呼出命令を除いた場合に上記分岐命令文の条件節変数の値を決定づけている(条件節変数の値を連動させている)変数を、リテラルを変数に代入する非変数設定命令)が出現するまでトレースした場合の、そのトレース内容の情報である。条件節内変数毎チェーン表900は、各分岐命令文の条件節変数ごとに生成される。
【0046】
(条件節内変数毎チェーン表)
図11は、条件節内変数毎チェーン表900の一例を示す図である。
【0047】
条件節内変数毎チェーン表900は、レコード番号901、トレースされた各命令文の開始行番号が設定される開始行番号902、その命令文の種別(例えば、条件分岐命令(条件節)、代入命令、第1呼出命令、第2呼出命令)が設定される種別903、及び、その命令文の処理対象(例えば、ソース定数値、ソース変数、被代入変数、条件節変数、被非呼出部)のリストが設定される属性リスト904の各データ項目を有する。
【0048】
条件節内変数毎チェーン表900は、種別903が条件分岐命令(条件節)であるレコードを先頭として、ソースコードのメインルーチンの行番号の逆順に各レコードが存在する。条件節内変数毎チェーン表900の最終レコードは、非変数設定命令に係るレコード(種別903に代入命令が設定され、属性リスト904にリテラル(ソース定数値等)が設定されているレコード)、又は、メインルーチンの先頭行に係るレコード(メインルーチンの先頭までトレースしても、非変数設定命令が検索されなかった場合)である。
【0049】
次に、
図5に示すように、スタブ生成部43は、設定命令検索部42で生成した、各条件節変数についての条件節内変数毎チェーン表900を参照し、非変数設定命令を検索できた場合に、その条件節変数の名称と、対応する呼出命令が示す被呼出部(サブルーチン)の名称とを対応付けたデータであるスタブ項目表400(スタブ項目表)を生成するサブルーチン毎設定変数抽出処理s15を実行する。
【0050】
(スタブ項目表)
図12は、スタブ項目表400の一例を示す図である。スタブ項目表400は、レコード番号401、非変数設定命令に対応する条件節変数の名称のリストが設定される変数リスト403、対応する被呼出部(サブルーチン)の名称が設定されるスタブ名402、及び、条件節変数に係る条件分岐命令の行番号が設定される行番号リスト404の各データ項目を有する。なお、非変数設定命令が発見できなかった場合は、変数リスト403には、空のデータが設定される。
【0051】
その後、テストコード生成装置30は、スタブ項目表400及びテストケースデータ300に基づき、テストコード500を作成する。例えば、スタブ項目表400に関して、テストコード生成装置30は、スタブ項目表400の各被呼出部について、条件節変数の名称と1又は複数の値(例えば、対応する条件分岐命令においていずれの実行部を実行するかを決定づけるような閾値)とを対応付けたデータを作成する。テストコード生成装置30は、作成したデータとテストケースデータとを統合し、テストコード500を作成する。
以下、条件節内変数毎依存関係解析処理s13の詳細を説明する。
【0052】
<条件節内変数毎依存関係解析処理>
図13は、条件節内変数毎依存関係解析処理s13の詳細を説明する図である。設定命
令検索部42は、メインルーチン(呼出部)を参照することで命令文抽出処理s11で生成した、分岐命令文表800、呼出命令文表700、及び領域区分表1300に基づき呼出命令毎影響分岐命令表1400を生成する呼出命令毎影響分岐命令抽出処理s131を実行する。なお、呼出命令毎影響分岐命令表1400は、領域区分表1300における各大領域の各小領域について、その小領域に存在する各変数が、当該小領域に属する大領域の第1呼出命令の実行に関してダーティー変数であるか否かを記憶したテーブルである。
【0053】
具体的には、設定命令検索部42は、領域区分表1300を参照し、ある大領域の最初の小領域(すなわち、単純呼出命令(PERFORM)の行番号から最初の引数指定呼出命令(CALL)の直前の行番号までの領域)を特定し、特定した小領域に対して、全変数がダーテ
ィー変数であることを示す情報を対応づけて記憶する。
【0054】
以下、設定命令検索部42は、領域区分表1300を参照し、上記大領域におけるi(i=2、3、・・・)番目の小領域(すなわち、i番目の引数指定呼出命令(CALL)の行番号からi+1番目の引数指定呼出命令(CALL)の直前の行番号までの領域)を特定し、特定した小領域に関して、i番目の小領域に係る引数指定呼出命令(CALL)の引数(変数)を特定する。そして、設定命令検索部42は、特定した引数に係る引数指定呼出命令(CALL)の被呼出部が上記大領域に係る単純呼出命令(PERFORM)の被呼出部と異なる場合
には、上記引数はi番目の小領域における非ダーティー変数であるとし、その他の変数はダーティー変数であるとする。なお、設定命令検索部42は、i-1番目の小領域で非ダーティー変数とした引数(変数)については、i番目の小領域においてもその変数は非ダーティー変数と記憶する。
【0055】
すなわち、PERFORM文の後では、その大領域に現れる全ての変数がダーティー変数であ
り、次のPERFORM文(次の大領域)で、改めて全ての変数がダーティー変数になる。一方
、CALL文の後は、その引数として指定されている全ての変数がダーティー変数である。すなわち、CALL文はPERFORM文の後に存在するので、PERFORM文でダーティ変数になった変数のうちCALL文の引数に係る変数を、CALL文が上書きする可能性がある。したがって、CALL文に係る引数がダーティー変数となる。以後、CALL文が登場するたびにダーティー変数が異なる。
【0056】
(呼出命令毎影響分岐命令表)
図14は、呼出命令毎影響分岐命令表1400の一例を示す図である。呼出命令毎影響分岐命令表1400は、各小領域1401の命令文に設定されている各命令文が処理する変数1402について、その変数が各小領域においてダーティー変数であるかを示すダーティー変数情報1403を記憶している。同図の例では、ダーティー変数情報1403には、対象の変数がダーティー変数である場合には「〇」、対象の変数が非ダーティー変数である場合には「×」が設定される。
【0057】
次に、
図13に示すように、設定命令検索部42は、命令文抽出処理s11で生成した代入命令文表600と、呼出命令毎影響分岐命令抽出処理s131で生成した呼出命令毎影響分岐命令表1400とに基づき条件節内変数毎チェーン表900を生成する条件節内変数毎トレース処理s133を実行する。
【0058】
<条件節内変数毎トレース処理>
図15は、条件節内変数毎トレース処理s133の一例を説明する図である。
まず、設定命令検索部42は、分岐命令文表800を参照し、メインルーチンにおける分岐命令文を特定し、特定した分岐命令文に関する条件節内変数毎チェーン表900のレコード1501を作成する(s1331)。
【0059】
具体的には、設定命令検索部42は、特定した分岐命令文の条件節の、ソースコードにおける最初の行番号(分岐命令文表800の行番号リスト802)を条件節内変数毎チェーン表900の開始行番号902に設定し、種別903に「条件節」(分岐命令文表800の種別803)を設定し、属性リスト904に条件節変数(分岐命令文表800の条件節変数実行節行番号リスト804の条件節変数)を設定する。
【0060】
次に、設定命令検索部42は、代入命令文表600を参照し、上記で特定した条件節変数と依存関係のある変数を、当該条件節変数に係る命令より前の各命令を遡って検索し、検索した各変数及び当該変数に係る命令に関する条件節内変数毎チェーン表900のレコード1502、1503を作成する(s1333)。
【0061】
具体的には、設定命令検索部42は、上記で生成した条件節内変数毎チェーン表900のレコードの属性リストの変数を取得する。そして、設定命令検索部42は、代入命令文表600を最後のレコードから最初のレコードに向かって(すなわちソースコードの行番号を逆に遡って)参照する。そして、設定命令検索部42は、上記取得した変数がD変数リストに設定されているレコード1505を発見し、発見したレコード1505の当該D変数リストの内容(被代入変数)、及び、当該レコード1505のS変数(代入変数)の内容を、条件節内変数毎チェーン表900に新たに生成したレコード1502の属性リストに設定し、「代入」を種別に設定し、開始行番号に、上記発見したレコード1504の行番号リストの最小の行番号を設定する。
【0062】
さらに、設定命令検索部42は、代入命令文表600の上記参照を引き続き行い、上記新たに生成した条件節内変数毎チェーン表900のレコード1502の属性リストの被代入変数がD変数リストの代入変数に設定されているレコード1504を発見する。設定命令検索部42は、発見したレコード1504の当該D変数リストの内容(被代入変数)、及び、当該レコード1504のS変数(代入変数)又は固定値(定数値)の内容を、条件節内変数毎チェーン表900にさらに新たに生成したレコード1504の属性リストに設定し、「代入」を種別に設定し、開始行番号に、上記発見したレコード1504の行番号リストの最小の行番号を設定する。設定命令検索部42は、上記さらに生成した条件節内変数毎チェーン表900のレコード1504の属性リストに定数値(リテラル)を設定するまで、このような代入命令文表600の参照を繰り返す。
【0063】
このようにして、設定命令検索部42は、ある条件分岐命令文について、その前に存在する呼出命令文を除いた(無視した)場合における、当該条件分岐命令文の条件分岐先を判定する条件節変数の値(定数値)を特定する。
【0064】
次に、設定命令検索部42は、呼出命令文表700を参照し、以上のようにして生成した条件節内変数毎チェーン表900に、呼び出し命令文に関するレコード1506、1507を挿入する(s1335)。
【0065】
具体的には、設定命令検索部42は、呼出命令文表700から一つレコード1508を選択し、選択したレコード1508の行番号リストが示す最初の行番号を特定する。そして、設定命令検索部42は、特定した行番号が、条件節内変数毎チェーン表900の連続するレコード1502、1503の開始行番号が示す各行番号の間にある当該連続するレコード1502、1503を特定し、特定した連続するレコード1502、1503の間に新たなレコード1506を生成する。設定命令検索部42は、生成した新たなレコード1506の開始行番号に、上記特定した行番号を設定し、種別に上記選択した呼出命令文表700のレコード1508の種別の内容を設定し、属性リストに上記選択した呼出命令文表700のレコード1508の呼出先引数リストの内容を設定する。設定命令検索部42は、このような処理を、呼出命令文表700の各レコードについて繰り返す。
【0066】
設定命令検索部42は、以上の処理を、分岐命令文表800における全ての分岐命令文について繰り返す。
【0067】
<サブルーチン毎設定変数抽出処理>
次に、
図16は、サブルーチン毎設定変数抽出処理s15の詳細を説明するフロー図である。
スタブ生成部43は、ソースコードの先頭からたどって条件節変数を一つ選択し、これを処理対象変数とする(s151)。具体的には、スタブ生成部43は、呼出命令毎影響分岐命令表1400を参照し、引数がダーティー変数(「〇」)となっている条件節変数が存在する小領域を一つ選択し、その引数に係る条件節変数を一つ選択する。
【0068】
そして、スタブ生成部43は、処理対象変数に係る条件節内変数毎チェーン表900を参照し、処理対象変数又はその処理対象変数の元となっている変数にリテラルを設定している非変数設定命令が存在するか否かを判定する(s153)。
【0069】
具体的には、スタブ生成部43は、条件節内変数毎チェーン表900の最後のレコードの属性リスト904において、代入変数としてリテラル(定数値)が設定されているか否かを判定する。
【0070】
なお、スタブ生成部43は、リテラル(定数値)が設定されている小領域とs151で選択した条件節変数に係る小領域との間に他の小領域が介在している場合は(同図の例では、「領域1-0」と「領域1-1」の間にCALL文から始まる小領域がさらに存在する場合)、呼出命令毎影響分岐命令表1400を参照し、s151で選択した条件節変数が上記介在している他の小領域において非ダーティー変数である(「×」)ことを確認してもよい。これにより、呼出命令(CALL文)が上記他の小領域において介在している場合でも、s151で選択した条件節変数が上記リテラル(定数値)を決定づけている(直接連動している)ことを確認することができる。
【0071】
非変数設定命令が存在する場合は(s153:YES)、スタブ生成部43はs155を実行し、非変数設定命令が存在しない場合は(s153:NO)、スタブ生成部43はs159を実行する。
【0072】
s159においてスタブ生成部43は、スタブ項目表400に、処理対象変数に関する空情報を追加する。例えば、スタブ生成部43は、スタブ項目表400に新たなレコードを生成し、生成したレコードのスタブ名402に空情報を設定し、変数リスト403に、処理対象変数(条件節変数)を設定する。その後はs161の処理が実行される。
【0073】
一方、S155においてスタブ生成部43は、処理対象変数に対応する、処理対象変数に係る条件分岐命令に最も近い位置にあるサブルーチン(被呼出部)を特定する。具体的には、スタブ生成部43は、条件節内変数毎チェーン表900のうち、種別903に呼出命令が出現した最初のレコードの属性リスト904を取得する。
【0074】
そして、スタブ生成部43は、スタブ項目表400に、s155で特定したサブルーチン(被呼出部)に関するスタブの情報を追加する(s157)。例えば、スタブ生成部43は、スタブ項目表400に新たなレコードを生成し、生成したレコードのスタブ名402に、s155で取得した属性リスト904の被呼出部の名称を設定し、変数リスト403に、処理対象変数(条件節変数)を設定する。その後はs161の処理が行われる。
【0075】
s161においてスタブ生成部43は、s151で未だ選択していない条件節変数があ
るか否かを判定する。s151で未だ選択していない条件節変数がある場合は(s161:YES)、スタブ生成部43は、未だ選択していない(さらに下の行番号にある)条件節変数を一つ選択してs151以降の処理を繰り返す。s151で未だ選択していない条件節変数がない場合は(s161:NO)、スタブ生成部43は、サブルーチン毎設定変数抽出処理s15を終了する。
【0076】
<メインルーチンのパターンごとの処理の具体例>
以上のように、本実施形態の言語変換支援装置40は、呼出命令によって区分されたメインルーチンの領域ごとに、サブルーチン毎設定変数抽出処理s15を実行する。そこで、メインルーチンに存在する呼出命令のパターンごとに、スタブ作成処理の具体例を説明する。
【0077】
(メインルーチンに単純呼出命令(PERFORM)のみが含まれる場合)
図17は、単純呼出命令(PERFORM)のみが含まれる第1プログラムのメインルーチン
1700及びこれにより作成されるスタブ項目表1750の一例を示す図である。
【0078】
言語変換支援装置40は、F0を呼び出す000030行のPERFORM文1701から、F1を呼び
出す001000行のPERFORM文1702の直前までの第1領域1703と、PERFORM文1702からの第2領域1704とに関して以下の処理を行う。
【0079】
ここで、PERFORM文1701、1702により呼び出されるサブルーチンでは、第1プ
ログラムにおける全変数を設定又は変更する可能性がある(全変数を大域変数として共有している)。したがって、PERFORM文1701、1702の実行によりそれ以降の全変数
がダーティー変数となる。
【0080】
まず、言語変換支援装置40は、第1領域1703において、全ての条件分岐命令の条件節に現れる条件節変数のリストを作成する(命令文抽出処理s11)。具体的には、000100行のIF文については変数{A}、000400行のIF文については変数{B}である。
【0081】
そこで、言語変換支援装置40は、まず変数{A}について、000100行のIF文1705か
らメインルーチンの上方に向かって変数Aをトレースする(条件節内変数毎チェーン表9
00)。言語変換支援装置40は、上記000030行のPERFORM文1701をまたぎ、000010
行において、Aに固定値(リテラル)を設定しているMOVE文1706(非変数設定命令)
を発見する。
【0082】
ここで、000030行のPERFORM文1701で呼び出されるF0は、F0においてAを変更しない限り、000100行のIF文に係る全実行節が実行されない。したがって、言語変換支援装置40は、F0に対応するスタブ項目として変数Aを設定する(スタブ項目表1750を作成す
る)。このスタブ項目表1750において、変数Aに係る条件節の条件分岐命令は、000100行のIF文である。
【0083】
また、変数{B}について、言語変換支援装置40は、000400行のIF文1707からメイ
ンルーチンの上方に向かって変数Bをトレースする(条件節内変数毎チェーン表900)
。しかし、言語変換支援装置40は、上記000030行のPERFORM文1701をまたぐことな
く、000300行において、Bに固定値を設定しているMOVE文1708を発見する。したがっ
て、言語変換支援装置40は、このMOVE文1708をリテラルの非変数設定命令としては検出しない。なお、000400行のIF文1707はデッドコードを含む可能性があるので、言語変換支援装置40は所定の警告を出力してもよい(スタブは作成されない)。
【0084】
次に、言語変換支援装置40は、第2領域1704において、条件分岐命令の条件節に
現れる条件節変数のリストを作成する(命令文抽出処理s11)。具体的には、001100行のIF文については変数{C}である。
【0085】
そこで、言語変換支援装置40は、001100行のIF文1709からメインルーチンの上方に向かって変数Cをトレースする(条件節内変数毎チェーン表900)。しかし、言語変
換支援装置40は、Cに固定値(リテラル)を設定しているMOVE文は発見できない。した
がって、スタブは作成されない(変数Cはテストケースにて設定されるべきである)。
【0086】
(メインルーチンに引数指定呼出命令(CALL)のみが含まれる場合)
図18は、引数指定呼出命令(CALL)のみが含まれる第1プログラムのメインルーチン1800と、これにより作成される呼出命令毎影響分岐命令表1830及びスタブ項目表1850との例を示す図である。
【0087】
まず、言語変換支援装置40は、メインルーチン1800にCALL文を包含するPERFORM
が存在するものと仮定して呼出命令毎影響分岐命令表1830を作成する。
【0088】
具体的には、まず、言語変換支援装置40は、000100行のF0を呼び出すCALL文1801の直前までの第1小領域1802を設定する。また、言語変換支援装置40は、000100行のF0を呼び出すCALL文1801から始まる第2小領域1803において、条件分岐命令の条件節における条件節変数の全リストを作成する(変数A,B)。また、言語変換支援装置
40は、000300行のF1を呼び出すCALL文1804から始まる第3小領域1805において、条件分岐命令の条件節における条件節変数の全リストを作成する(変数A,B)。また、
言語変換支援装置40は、000400行のF2を呼び出すCALL文1806から始まる第4小領域1807において、条件分岐命令の条件節における条件節変数の全リストを作成する(変数B,C)。
【0089】
そして、言語変換支援装置40は、上記各変数のうちダーティー変数を特定した各小領域に関する呼出命令毎影響分岐命令表1400を作成する。具体的には、言語変換支援装置40は、第2小領域1803に関して変数B、第3小領域1805に関して変数A,B、第4小領域1807に関して変数B,Cをそれぞれダーティー変数とする。
【0090】
第2小領域1803の変数Bについて、言語変換支援装置40は、変数Bに係る000200行のIF文1808からメインルーチン1800の上方に向かって変数Bをトレースする(条
件節内変数毎チェーン表900)。言語変換支援装置40は、第2小領域1803の最初の000100行のBに係るCALL文1801をまたぎ、000050行において、Bに固定値(リテラル)を設定しているMOVE文1809(非変数設定命令)を発見する。
【0091】
ここで、000100行のCALL文1801で呼び出されるF0は、F0においてBを変更しない限
り、000200行のIF文1808に係る全実行節が実行されない。したがって、言語変換支援装置40は、F0に対応するスタブ項目として変数Bを設定する(スタブ項目表1850を
作成する)。このスタブ項目表1850の変数Bに係る条件節の条件分岐命令は、000200
行のIF文である。
【0092】
次に、第3小領域1805の変数A,Bについて、まず言語変換支援装置40は、変数Aに係る000350行のIF文1810からメインルーチン1800の上方に向かって変数Aをトレ
ースする(条件節内変数毎チェーン表900)。言語変換支援装置40は、第3小領域1805の最初の000300行のCALL文1804をまたぎ、000010行において、Aに固定値(リ
テラル)を設定しているMOVE文1811(非変数設定命令)を発見する。
【0093】
ここで、000300行のCALL文1804で呼び出されるF1は、F1においてAを変更しない限
り、000350行のIF文1810に係る全実行節が実行されない。したがって、言語変換支援装置40は、F1に対応するスタブ項目として変数Aを設定する(スタブ項目表1850を
作成する)。このスタブ項目表1850の変数Aに係る条件節の条件分岐命令は、000350
行のIF文である。
【0094】
また、変数Bについて、言語変換支援装置40は、変数Bに係る000350行のIF文1810からメインルーチン1800の上方に向かって変数Bをトレースする(条件節内変数毎チ
ェーン表900)。言語変換支援装置40は、第2小領域1803(Bに係る000100行のCALL文1801)をまたぎ、第1小領域1802の000050行において、Bに固定値(リテラル)を設定しているMOVE文1811(非変数設定命令)を発見する。また、言語変換支援装置40は、呼出命令毎影響分岐命令表1830により、第2小領域1803において変数Bは非ダーティー変数である(「×」)ことを確認する(なお、言語変換支援装置40
は、呼出命令毎影響分岐命令表1830のダーティー変数情報を反転させた反転表1840を確認に用いてもよい(以下同様))。
【0095】
ここで、000100行のCALL文1801で呼び出されるF0は、F0においてBを変更しない限
り、000350行のIF文1810に係る全実行節が実行されない。したがって、言語変換支援装置40は、F0に対応するスタブ項目として変数Bを設定する(スタブ項目表1850を
作成する)。このスタブ項目表1850の変数Bに係る条件節の条件分岐命令は、000350
行のIF文である。
【0096】
次に、第4小領域1807の変数B,Cについて、まず言語変換支援装置40は、変数Bに係る000450行のIF文1812からメインルーチン1800の上方に向かって変数Bをトレ
ースする(条件節内変数毎チェーン表900)。言語変換支援装置40は、第3領域1805(000350行のBに係るCALL文1804)及び第2領域1803(000100行のBに係るCALL文1801)をまたぎ、000050行において、Bに固定値(リテラル)を設定しているMOVE文1809(非変数設定命令)を発見する。また、言語変換支援装置40は、呼出命令
毎影響分岐命令表1830により、第3小領域1805、第2小領域1803において変数Bは非ダーティー変数である(「×」)ことを確認する。
【0097】
なお、言語変換支援装置40は、メインルーチン1800において初出の変数XをBに設定しているMOVE文(非変数設定命令)を発見した場合には、その変数Xの値を条件節内変
数毎チェーン表900に基づいてメインルーチンの冒頭に向かってトレースし、変数Xが
固定値以外の変数に設定されている場合はその変数Xをテストケースデータ300に設定
するようにしてもよい(変数Xが固定値の場合はデッドコードの可能性があり、所定の警
告を出力してもよい)。このように、自動的にテストケースデータ300を更新することで、第2プログラムの検証をより確実に行えるようにすることができる。
【0098】
ここで、000450行のIF文1812に最も近い000400行のCALL文1806で呼び出されるF2は、F2においてBを変更しない限り、000450行のIF文1812に係る全実行節が実行さ
れない。したがって、言語変換支援装置40は、F2に対応するスタブ項目として変数Bを
設定する(スタブ項目表1850を作成する)。このスタブ項目表1850の変数Bに係
る条件節の条件分岐命令は、000450行のIF文である。
【0099】
次に、言語変換支援装置40は、変数Cに係る000450行のIF文1812からメインルー
チン1800の上方に向かって変数Cをトレースする(条件節内変数毎チェーン表900
)。言語変換支援装置40は、第3小領域1805(000300行のBに係るCALL文1804
)をまたぎ、000100行において、Cに固定値(リテラル)を設定しているMOVE文1813
(非変数設定命令)を発見する。また、言語変換支援装置40は、呼出命令毎影響分岐命令表1400により、第3小領域1805において変数Cは非ダーティー変数である(「
×」)ことを確認する。
【0100】
ここで、000300行のCALL文1804で呼び出されるF1は、F1においてCを変更しない限
り、000450行のIF文1812に係る全実行節が実行されない。したがって、言語変換支援装置40は、F1に対応するスタブ項目として変数Cを設定する(スタブ項目表1850を
作成する)。このスタブ項目表1850の変数Cに係る条件節の条件分岐命令は、000450
行のIF文である。
【0101】
(メインルーチンに、単純呼出命令(PERFORM)間に挟まれた引数指定呼出命令(CALL)
が存在する場合-その1)
【0102】
図19は、単純呼出命令(PERFORM)間に挟まれた引数指定呼出命令(CALL)が存在す
る第1プログラムのメインルーチン1900とこれにより作成される呼出命令毎影響分岐命令表1930及びスタブ項目表1950との例を示す図である。
【0103】
言語変換支援装置40は、F0を呼び出す000030行のPERFORM文1901からF3を呼び出
す001000行のPERFORM文1902の直前までの領域内の各小領域に関して以下の処理を行
う。すなわち、言語変換支援装置40は、F0を呼び出す000030行のPERFORM文1901の
直前までの第0小領域1903と、F0を呼び出す000030行のPERFORM文1901から始ま
る第1小領域1904と、F1を呼び出す000310行のCALL文1905から始まる第2小領域1906と、F2を呼び出す000850行のCALL文1907から始まる第3小領域1908とを設定する。
【0104】
そして、言語変換支援装置40は、第1小領域1904において、条件分岐命令の条件節における条件節変数の全リストを作成する(変数B)。また、言語変換支援装置40は
、第2小領域1906において、条件分岐命令の条件節における条件節変数の全リストを作成する(変数A,B)。また、言語変換支援装置40は、第3小領域1908において、
条件分岐命令の条件節における条件節変数の全リストを作成する(変数C)。
【0105】
そして、言語変換支援装置40は、上記各変数のうちダーティー変数を特定した各小領域に関する呼出命令毎影響分岐命令表1930を作成する。具体的には、言語変換支援装置40は、第1小領域1904に関して変数B、第2小領域1906に関して変数Bをそれぞれダーティー変数とする(第3区分領域に関してはダーティー変数は存在しない)。
【0106】
第1小領域の変数Bについて、言語変換支援装置40は、変数Bに係る000100行のIF文1909からメインルーチン1900の上方に向かって変数Bをトレースする(条件節内変
数毎チェーン表900)。言語変換支援装置40は、第1小領域1904の最初の000030行のBに係るPERFORM文1901をまたぎ、000020行において、Bに固定値(リテラル)を
設定しているMOVE文1910(非変数設定命令)を発見する。
【0107】
ここで、000030行のPERFORM文1901で呼び出されるF0は、F0においてBを変更しない限り、000100行のIF文1909に係る全実行節が実行されない。したがって、言語変換支援装置40は、F0に対応するスタブ項目として変数Bを設定する(スタブ項目表1950
を作成する)。このスタブ項目表1950の変数Bに係る条件節の条件分岐命令は、000100行のIF文である。
【0108】
第2小領域1906の変数Bについて、言語変換支援装置40は、変数Bに係る000600行のIF文1911からメインルーチン1900の上方に向かって変数Bをトレースする(条
件節内変数毎チェーン表900)。言語変換支援装置40は、第1小領域1904の最初の000030行のBに係るPERFORM文1901をまたぎ、第1小領域1904の000020行におい
て、Bに固定値(リテラル)を設定しているMOVE文1910(非変数設定命令)を発見す
る。
【0109】
ここで、000030行のPERFORM文1901で呼び出されるF0は、F0においてBを変更しない限り、000600行のIF文1911に係る全実行節が実行されない。したがって、言語変換支援装置40は、F0に対応するスタブ項目として変数Bを設定する(スタブ項目表1950
を作成する)。このスタブ項目表1950の変数Bに係る条件節の条件分岐命令は、000600行のIF文である。
【0110】
なお、第2小領域1906の条件分岐命令の実行節1912内の所定行に、変数XをBに代入する代入命令1913が存在する場合、言語変換支援装置40は、変数Xをメインル
ーチンの上方にトレースし(条件節内変数毎チェーン表900)、上記所定行において変数Xが初出であれば、変数Xをテストケースデータ300に設定してもよい。一方、変数X
が第1小領域1904の000030行のPERFORM文1901より上で固定値に設定されている
場合、変数Xはリテラルであり、言語変換支援装置40は、変数Xについてスタブ項目表を作成する(変数Xが000030行のPERFORM文1901より下で固定値に設定されている場合は、上記所定行はデッドコードの可能性があり、所定の警告を出力してもよい)。なお、上記所定行において、固定値をBに代入する代入命令1914が存在する場合、これはデッ
ドコードの可能性があり、所定の警告を出力してもよい。
【0111】
(メインルーチンに、単純呼出命令(PERFORM)間に挟まれた引数指定呼出命令(CALL)
が存在する場合-その2)
【0112】
図20は、単純呼出命令(PERFORM)間に挟まれた引数指定呼出命令(CALL)が存在す
る第1プログラムのメインルーチン2000とこれにより作成される呼出命令毎影響分岐命令表2030及びスタブ項目表2050との例を示す図である。
【0113】
言語変換支援装置40は、F0を呼び出す000030行のPERFORM文2001からF3を呼び出
す001000行のPERFORM文2002の直前までの領域内の各小領域に関して以下の処理を行
う。すなわち、言語変換支援装置40は、F0を呼び出す000030行のPERFORM文2001の
直前までの第0小領域2003と、F0を呼び出す000030行のPERFORM文2001から始ま
る第1小領域2004と、F1を呼び出す000310行のCALL文2005から始まる第2小領域2006と、F2を呼び出す000850行のCALL文2007から始まる第3小領域2008とを設定する。
【0114】
そして、言語変換支援装置40は、第1小領域2004において、条件分岐命令の条件節における条件節変数の全リストを作成する(変数B)。また、言語変換支援装置40は
、第2小領域2006において、条件分岐命令の条件節における条件節変数の全リストを作成する(変数A,B)。また、言語変換支援装置40は、第3小領域2008において、
条件分岐命令の条件節における条件節変数の全リストを作成する(変数C)。
【0115】
そして、言語変換支援装置40は、上記各変数のうちダーティー変数を特定した各小領域に関する呼出命令毎影響分岐命令表2030(及び反転表2040)を作成する。具体的には、言語変換支援装置40は、第1小領域2004に関して変数B、第2小領域20
06に関して変数A、第3小領域2008に関して変数Cをそれぞれダーティー変数とする。
【0116】
次に、第1小領域2004についての処理は省略する。
第2小領域2006の変数Aについて、言語変換支援装置40は、変数Aに係る000400行のIF文2009からメインルーチン2000の上方に向かって変数Aをトレースする(条
件節内変数毎チェーン表900)。言語変換支援装置40は、第2小領域2006の最初の000310行のAに係るCALL文2005をまたぎ、第1小領域2004の000300行において
、Aに固定値(リテラル)を設定しているMOVE文2010(非変数設定命令)を発見する
(なお、呼出命令毎影響分岐命令表2030により変数Aが非ダーティー変数であること
を確認する)。
【0117】
ここで、000310行のCALL文2005で呼び出されるF1は、F1においてAを変更しない限
り、000400行のIF文2009に係る全実行節が実行されない。したがって、言語変換支援装置40は、F1に対応するスタブ項目として変数Aを設定する(スタブ項目表2050を
作成する)。このスタブ項目表2050の変数Aに係る条件節の条件分岐命令は、000400
行のIF文である。
【0118】
第3小領域2008の変数Cについて、言語変換支援装置40は、変数Cに係る000900行のIF文2011からメインルーチン2000の上方に向かって変数Cをトレースする(条
件節内変数毎チェーン表900)。言語変換支援装置40は、第3小領域2008の最初の000850行のCに係るCALL文2007をまたぎ、第2小領域2006の000800行において
、Cに固定値(リテラル)を設定しているMOVE文2012(非変数設定命令)を発見する
。
【0119】
ここで、000850行のCALL文2007で呼び出されるF2は、F2においてCを変更しない限
り、000900行のIF文2011に係る全実行節が実行されない。したがって、言語変換支援装置40は、F2に対応するスタブ項目として変数Cを設定する(スタブ項目表2050を
作成する)。このスタブ項目表2050変数Cに係る条件節の条件分岐命令は、000900行
のIF文である。
【0120】
なお、000800行のMOVE文2012がないとした場合、非変数設定命令としては第0小領域2003の0000025行のMOVE文2012が発見される。すると、000030行のPERFORM文2001及び000850行のCALL文2007が、変数Cに係る000900行のIF文2011と0000025行のMOVE文2012とをまたぐ呼出命令として検出されるが、IF文のパスを網羅する上では直近の呼出命令がスタブデータとして好ましいので、000900行のIF文2011に最も近い000850行のCALL文2007がスタブの対象となる。
【0121】
(メインルーチンにおいて単純呼出命令(PERFORM)の前に引数指定呼出命令(CALL)が
ある場合)
図21は、単純呼出命令(PERFORM)の前に引数指定呼出命令(CALL)がある第1プロ
グラムのメインルーチン2100及びこれにより作成される呼出命令毎影響分岐命令表2130の一例を示す図である。
【0122】
まず、言語変換支援装置40は、メインルーチン2000にCALL文を包含するPERFORM
が存在するものと仮定して呼出命令毎影響分岐命令表2130を作成する。
【0123】
具体的には、言語変換支援装置40は、000100行のF0を呼び出すCALL文2101の直前までの第1小領域2102を設定する。また、言語変換支援装置40は、000100行のF0を呼び出すCALL文2101から始まる第2小領域2103において、ダーティー変数(C)
を設定する。また、言語変換支援装置40は、000300行のF1を呼び出すCALL文2104から始まる第3小領域2105において、ダーティー変数(A,C)を設定する。また、言語
変換支援装置40は、000400行のF2を呼び出すCALL文2106から始まる第4小領域2107においては、ダーティー変数(A,B,C)を設定する。
【0124】
この場合、言語変換支援装置40は、第2小領域2103における全ての条件分岐命令
の条件節の変数にCがあれば、F0に係るスタブ項目表を生成する。
【0125】
また、言語変換支援装置40は、第3小領域2105における全ての条件分岐命令の条件節の変数にA,Cがあれば、F1に係るスタブ項目表を生成する。
【0126】
また、言語変換支援装置40は、第4小領域2107における全ての条件分岐命令の条件節の変数にA,B,Cがあれば、F2に係るスタブ項目表を生成する。
【0127】
すなわち、言語変換支援装置40は、メインルーチンに第2呼出命令(CALL)のみが含まれる場合(
図18)と同様の処理を行う。
【0128】
(複数の引数指定呼出命令(CALL)の呼び出し先が共通する場合)
図22は、複数の引数指定呼出命令(CALL)の呼び出し先が共通する第1プログラムのメインルーチン2200とこれにより作成される条件節内変数毎チェーン表2230、2240及びスタブ項目表2250との例を示す図である。
【0129】
同図に示すように、言語変換支援装置40は、メインルーチン2200に基づき、異なる小領域の各引数指定呼出命令2201、2202(CALL)について、同じ引数(変数)Aに関する条件節内変数毎チェーン表2230、2240をそれぞれ作成し、変数Aに係るスタブ項目表2250をさらに作成する。
【0130】
そして、スタブ項目表2250に基づき変数の値をテストコード500に設定する場合のその変数の値の範囲については、上記各引数指定呼出命令2201、2202に対応する条件分岐命令2203、2204に基づいて実行される実行節2205、2206、2207、2208を決定づけるような閾値を基準とした値を設定する。
【0131】
例えば、一方の引数指定呼出命令2201に対応する条件分岐命令2203の条件節が「a>10」であり、他方の引数指定呼出命令2202に対応する条件分岐命令2204の条件節が「a<0」である場合は、0未満のいずれかの値2209と、10を超えるいずれかの値2210とを、テストコード500に設定するスタブの値とする。
【0132】
このように、言語変換支援装置40は、引数指定呼出命令(CALL)の呼び出し先が共通する場合でも、スタブ項目表を作成することができる。
【0133】
以上説明したように、本実施形態のプログラム検証支援システム1は、ソースコードの呼出部(メインルーチン)から、条件分岐命令とその条件節変数、及びその条件分岐命令よりも前に存在する呼出命令をそれぞれ特定し、特定した条件節変数にリテラルを設定する代入命令又は、上記呼出命令を除いた場合に条件節変数の値を決定づける変数にリテラルを設定する代入命令である非変数設定命令を、呼出命令より前の命令から検索し、非変数設定命令を検索できた場合に、上記条件節変数と、上記呼出命令により呼び出される被呼出部(サブルーチン)とを対応付けたスタブ項目表400を生成する。
【0134】
すなわち、本実施形態のプログラム検証支援システム1は、条件分岐命令の前に呼出命令が存在し、その呼出命令を跨いでさらにその前に、上記条件分岐命令の条件節変数に所定値を設定する代入命令又はその条件節変数を決定づける変数に所定値を設定する代入命令(非変数命令)を検索できた場合に(すなわち、ある変数に関して条件分岐命令と非変数設定命令が呼出命令を挟んでいる場合に)、その条件節変数と上記呼出命令により呼び出されるサブルーチンとを対応付けたスタブ項目表400を生成する。
【0135】
このように、非変数設定命令の後に呼出命令があり、さらにその後に条件分岐命令があ
る場合には、呼出命令によって呼び出されるサブルーチンは、非変数設定命令に係る変数の値を書き換え、その結果、条件分岐命令に基づき実行される実行節を決定づけている可能性が高い。したがって、このようなサブルーチンについてのスタブを生成しておけば、サブルーチンの具体的内容を確認することなく、メインルーチンの検証に必要なスタブを生成することができる。
【0136】
以上のように、本実施形態のプログラム検証支援システム1によれば、プログラムの検証に必要な限度でかつ効率良くスタブを生成することができる。
【0137】
また、本実施形態のプログラム検証支援システム1は、非変数設定命令として、定数値(固定値)を条件節変数に設定する命令又は、呼出命令を除いた場合に条件節変数の値を決定づける変数に定数値(固定値)を設定する命令を検索する。
【0138】
このように、非変数設定命令が固定値を変数に設定する場合は、呼出命令によって呼び出されるサブルーチンは、後続の条件節変数の値を書き換え、条件分岐命令で実行される実行節を決定づけている可能性が極めて高い。これにより、プログラムの検証に必要な限度でかつ効率良くスタブを生成することができる。
【0139】
また、本実施形態のプログラム検証支援システム1は、非変数設定命令として、ソースコードのメインルーチンに対する初期入力変数の値に依存しない変数(例えば、テストケースデータ300でメインルーチン対して初期値が設定されていない変数)の値を条件節変数に設定する命令又は、呼出命令を除いた場合に条件節変数の値を決定づける変数に上記初期入力変数の値に依存しない変数の値を設定する命令を検索する。
【0140】
テストケースデータ300で初期値が設定されていない変数についても、上記固定値と同様に、呼出命令によって呼び出されるサブルーチンは、後続の条件節変数を書き換え、条件分岐命令で実行される実行節を決定づけている可能性が極めて高い。これにより、プログラムの検証に必要な限度でかつ効率良くスタブを生成することができる。
【0141】
また、本実施形態のプログラム検証支援システム1は、ソースコードの呼出部(メインルーチン)から単純呼出命令(PERFORM文)を特定した場合には、条件節変数の各変数に
所定の値を設定する命令又は、単純呼出命令を除いた場合に条件節変数の値を決定づける変数に所定の値を設定する命令を非変数設定命令として検索を行い、一方、ソースコードの呼出部(メインルーチン)から引数指定呼出命令(CALL文)を特定した場合には、条件節変数のうちCALL文に係る引数に所定の値を設定する命令又は、CALL文を除いた場合に条件節変数のうちCALL文に係る変数(引数)の値を決定づける変数に所定の値を設定する命令を非変数設定命令として検索を行う。
【0142】
このように、プログラム検証支援システム1は、呼出命令がPERFORM文の場合は、条件
節変数の各変数に関して非変数設定命令の検索を行い、呼出命令がCALL文の場合は、条件節変数の変数(引数)に関して非変数設定命令の検索を行う。これにより、呼出命令の種類に応じて(具体的には、呼出命令により呼び出される被呼出部が書き換える可能性がある変数の種類に応じて)、非変数設定命令の検索を行うことになるので、プログラムの検証に必要な限度でかつ効率良くスタブを生成することができる。
【0143】
また、本実施形態のプログラム検証支援システム1は、各単純呼出命令(PERFORM文)
を開始位置に設定した第1領域(大領域)と、各引数指定呼出命令(CALL文)を開始位置に設定した第2領域(小領域)とをそれぞれ設定し、小領域ごとに、各条件分岐命令の条件節変数のうち大領域に係るPERFORM文又は小領域のCALL文より前の各CALL文の実行によ
り値が変更される可能性があるダーティー変数を特定し、メインルーチンから特定した条
件分岐命令の条件節変数がダーティー変数である場合に、非変数設定命令を検索する。
【0144】
すなわち、PERFORM文によるサブルーチンの呼び出しがあった場合は、その後のメイン
ルーチンの全変数がサブルーチンによる影響を受ける(値が変更される)可能性がある。一方、CALL文による被呼出部の呼び出しがあった場合は、その後の各命令内のうちCALL文の引数のみがサブルーチンによる影響を受ける可能性がある。したがって、上記のようにPERFORM文とCALL文をそれぞれ開始位置とした大領域及び小領域を設定してこれらの領域
の単位でダーティー変数を特定することで、非変数設定命令を検索する必要があるダーティー変数を的確に抽出し、プログラムの検証に必要な限度でかつ効率良くスタブを生成することができる。
【0145】
本発明は、上記実施形態に限定されるものではなく、その要旨を逸脱しない範囲内で、任意の構成要素を用いて実施可能である。以上説明した実施形態や変形例はあくまで一例であり、発明の特徴が損なわれない限り、本発明はこれらの内容に限定されるものではない。また、上記では種々の実施形態や変形例を説明したが、本発明はこれらの内容に限定されるものではない。本発明の技術的思想の範囲内で考えられるその他の態様も本発明の範囲内に含まれる。
【0146】
例えば、本実施形態の各装置が備えるハードウェアの一部は、他の装置に設けてもよい。
【0147】
また、各装置の各プログラムは他の装置に設けてもよいし、あるプログラムを複数のプログラムからなるものとしてもよいし、複数のプログラムを一つのプログラムに統合してもよい。
【符号の説明】
【0148】
1 プログラム検証支援システム、40 言語変換支援装置、41 命令文抽出部、42
設定命令検索部、43 スタブ生成部