【文献】
森本 紘史 外1名,「記号実行法による仕様要素の抽出」,電子情報通信学会技術研究報告,社団法人電子情報通信学会,2002年 2月25日,第101巻,第673号,pp.1−5
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0011】
以下、図面を参照しつつ実施形態について説明する。尚、以下の説明において、同一の又は類似する構成について同一の符号を付して重複した説明を省略することがある。
【0012】
[第1実施形態]
図1に第1実施形態として説明するソフトウェア仕様分析装置(以下、仕様分析装置100と称する。)の機能ブロック図を示している。仕様分析装置100は、分析対象となるソフトウェアを実現しているプログラムのソースコード151について記号実行を行うことにより、上記ソフトウェアの仕様に関する情報(以下、ルール情報157とも称する。)を生成する。
【0013】
記号実行では、ソースコードのパラメータに渡される引数をシンボル値で表し、そのシンボル値に対してソースコードの処理を実行する。その際、ソースコードの実行パスごとに、シンボル値がどのような値であればそのパスを実行するかを示す情報(以下、パス条件とも称する。)を取得する。またそのパスを実行した結果、最終的に各変数が保持する値(以下、パス実行結果とも称する。)を取得する。尚、シンボル値はパス実行結果にも現れる可能性がある。パス条件とパス実行結果の組合せは、当該パスが実行される条件と当該パスが実行された場合の結果を示し、IF-THENのルール形式で表すことができる。こ
のようなIF-THEN関係はルールとも称される。ソースコード151の全てのパスを探索し
て生成したルールの集合は、そのソースコードの仕様に相当する。
【0014】
ここでソースコードがループ処理に関する記述(例えば、ソースコードがC言語で記述されている場合、while文、do文、for文等の記述ブロック。以下、ループ処理に関する記述ブロックをループ文と称する。)を含んでいる場合を考える。ソースコードがループ文を含んでいる場合、記号実行では、ループ文を1回も実行しないパス、ループ文を1回だけ実行するパス、ループ文を2回だけ実行するパスというように、ループ文の実行回数ごとにパスを生成することになる。例えば、最大でループ文を4回実行する可能性がある場合、ループ文の実行回数が0回のときのパス、1回のときのパス、2回のときのパス、3回のときのパス、4回のときのパスという、合計5つのパスを生成することになる。ここでさらに、ループ文のループ条件が引数に依存する場合を考える。上述のとおり、記号実行ではパラメータに渡される引数をシンボル値で表すため、ループ条件が引数に依存する場合、ループ条件にシンボル値が現れる。このシンボル値は実際の値を持たず、シンボル値を含むループ条件の成立/不成立を決定することができない可能性があり、ループ文を最大で何回実行する可能性があるかについても決定することができない。
【0015】
このようにループ文の最大実行回数を決定することができないと、探索するパスの数が無限となり、記号実行の処理を終了することができない。この問題を回避する方法としては、例えば、ループ文の上限回数を予め設定しておき、ループ回数が上限回数を超えた時点でループから脱出する方法がある。この方法によれば、探索するパス数を有限に止めることができる。
【0016】
しかし例えば、ループの上限回数がL回に設定されていた場合、L回のループを実行した場合のパスを探索する際は、ループ文に対してL回の記号実行を繰り返し行う必要がある
。そのため、例えば、ループ文のステップ数が大きい場合、記号実行により多くのリソースが消費されてしまい、また仕様を表すルールを取得するまでの時間も長くなる。
【0017】
また上限回数が実際のループの最大実行回数よりも小さい場合、ルールの抽出漏れが生じる。例えば、実際の最大実行回数が5回のループ文に対して上限回数を3回に設定して記号実行を行った場合、ループ文の実行回数4回の場合のルールと、5回の場合についてはルールを抽出することができない。
【0018】
以上の理由から、対象のソースコードがループ文を含む場合、ユーザはルールの抽出漏れの有無を判断する必要がある。そしてルールの抽出漏れがあると判断した場合、ユーザはループの上限回数を増加して再度記号実行を行うことになる。このように、ループ文を含むソースコードからルールを抽出する場合、上限回数を変更して複数回の記号実行を行わねばならず、ユーザは煩雑な作業を強いられる。本実施形態の仕様分析装置100は、ソフトウェアの仕様を記号実行により分析する際に生じるこうした課題を解決するものである。
【0019】
図1に示すように、仕様分析装置100は、情報記憶部110、ループ文特定部111、ループ外記号実行部112、ループ内記号実行部113、ループ内パス特化部114、ルール生成部115、及び入出力処理部116を備える。仕様分析装置100は、これらの機能以外に、例えば、オペレーティングシステム、デバイスドライバ、DBMS(DataBase Management System)等を備えていてもよい。
【0020】
図2に仕様分析装置100の実現に用いるハードウェア(情報処理装置50)の一例を示す。情報処理装置50は、プロセッサ51、主記憶装置52、補助記憶装置53、入力装置54、出力装置55、及び通信装置56の各構成を備える。これらはバス等の通信手段を介して互いに通信可能に接続されている。尚、情報処理装置50の全部又は一部を、例えば、クラウドシステムにおけるクラウドサーバ等の仮想的な資源を用いて実現してもよい。
【0021】
プロセッサ51は、例えば、CPU(Central Processing Unit)、MPU(Micro Processing Unit)、GPU(Graphics Processing Unit)、DSP(Digital Signal Processor)等を用いて構成されている。プロセッサ51が、主記憶装置52に格納されているプログラムを読み出して実行することにより、仕様分析装置100の全部又は一部の機能が実現される。主記憶装置52は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)、不揮発性半導体メモリ(NVRAM(Non Volatile RAM))等であり、プログラムやデータを記憶する。
【0022】
仕様分析装置100が備える上記の各機能は、例えば、プロセッサ51が、主記憶装置52や補助記憶装置53に格納されているプログラムを読み出して実行することにより実現される。またこれらの機能は、例えば、仕様分析装置100が備えるハードウェア(FPGA(Field-Programmable Gate Array)、ASIC(Application Specific Integrated Circuit)等)によって実現される。
【0023】
補助記憶装置53は、例えば、ハードディスクドライブ、SSD(Solid State Drive
)、光学式記憶装置(CD(Compact Disc)、DVD(Digital Versatile Disc)等)、ストレージシステム、ICカード、SDメモリカードや光学式記録媒体等の記録媒体に対するデータの読取/書込装置等である。補助記憶装置53に格納されているプログラムやデータは主記憶装置52に随時ロードされる。補助記憶装置53は、例えば、ネットワークストレージのように仕様分析装置100とは独立した構成としてもよい。
【0024】
入力装置54は、外部からのデータの入力を受け付けるインタフェースであり、例えば、記録媒体(不揮発性メモリ、光学式記録媒体、磁気記録媒体、光磁気記録媒体等)からのデータの読取装置、キーボード、マウス、タッチパネル等である。尚、例えば、仕様分析装置100が、通信装置56を介して他の装置からデータの入力を受け付ける構成としてもよい。
【0025】
出力装置55は、処理経過や処理結果等のデータや情報を外部に提供するユーザインタ
フェースであり、例えば、画面表示装置(液晶ディスプレイ(Liquid Crystal Display)、プロジェクタ、グラフィックカード等)、印字装置、記録媒体へのデータの記録装置等である。尚、例えば、仕様分析装置100が、処理経過や処理結果等のデータを通信装置56を介して他の装置に提供する構成としてもよい。
【0026】
通信装置56は、他の装置や素子との間の通信を実現する、有線方式又は無線方式の通信インタフェースであり、例えば、NIC(Network Interface Card)、無線通信モジュール等である。
【0027】
図1に戻り、前述した機能のうち、情報記憶部110は、ソースコード151、ループ外記号実行情報152、ループ外パス情報153、ループ内記号実行情報154、汎化ループ内パス情報155、特化ループ内パス情報156、及びルール情報157を記憶する。情報記憶部110は、これらの情報を、例えば、ファイルシステムやDBMSによって管理する。
【0028】
ループ文特定部111は、ソースコード151の記述からループ文を特定(抽出)する。仕様分析装置100は、例えば、入力装置54や通信装置56を介して、ユーザや他の情報処理システム等からソースコード151を取得する。
【0029】
ループ外記号実行部112は、ソースコード151の、ループ文特定部111が特定したループ文以外の記述(以下、ループ外記述とも称する。)について記号実行を行うことにより、ループ外パス情報153を生成する。ループ外記号実行部112は、記号実行を行う際に利用する各種の情報をループ外記号実行情報152として管理し、上記記号実行に際してループ外記号実行情報152を適宜参照する。ループ外記号実行情報152及びループ外パス情報153の詳細については後述する。
【0030】
ループ内記号実行部113は、ループ文特定部111が特定したループ文(以下、ループ内記述とも称する。)について記号実行を行うことにより汎化ループ内パス情報155を生成する。ループ内記号実行部113は、記号実行を行う際に利用する各種の情報をループ内記号実行情報154として管理し、上記記号実行に際しループ内記号実行情報154を適宜参照する。ループ内記号実行情報154及び汎化ループ内パス情報155の詳細については後述する。
【0031】
ループ内パス特化部114は、汎化ループ内パス情報155をルール生成部115からの指示に基づきインスタンス化することにより特化ループ内パス情報156を生成する。尚、新たな特化ループ内パス情報156の生成に際し、ループ内パス特化部114が、既に生成済みの特化ループ内パス情報156を利用することがある。特化ループ内パス情報156の詳細については後述する。
【0032】
ルール生成部115は、仕様分析装置100が備える各機能(情報記憶部110、ループ外記号実行部112、ループ内記号実行部113、及びループ内パス特化部114)を統括的に制御する。ルール生成部115は、例えば、入力装置54や通信装置56を介してユーザ等から受け付けた、ループの上限回数(以下、ループ上限回数とも称する。)に基づき、ループ内パス特化部114の実行を制御する。またルール生成部115は、例えば、ループ外パス情報153及び特化ループ内パス情報156に基づきルール情報157を生成する。
【0033】
入出力処理部116は、情報の受け付けや情報の提示を行うユーザインタフェースを提供する。入出力処理部116は、例えば、入力装置54や通信装置56を介してループ上限回数等の情報の指定を受け付ける。また入出力処理部116は、例えば、ルール生成部
115が生成したルール情報157を出力装置55や通信装置56に出力する。尚、入出力処理部116は、例えば、ループ文ごとにループ上限回数の指定を受け付ける。また入出力処理部116は、例えば、ソースコード151に含まれている全てのループ文について一括指定によりループ上限回数の指定を受け付ける。また入出力処理部116は、ユーザからループ上限回数の入力を受け付ける際にソースコード151を取得してこれを出力装置55に表示する。
【0034】
続いて、
図3に示すソースコード151を例として、仕様分析装置100の具体的な動作について説明する。尚、ソースコード151はC言語で記述されており、ループ文301を含むものとする。
【0035】
ループ文特定部111は、ソースコード151からループ文301を特定する。ループ外記号実行部112は、ソースコード151のループ文301以外の記述(ループ外記述)を対象として記号実行を行う。ループ内記号実行部113は、ソースコード151のループ文301の記述(ループ内記述)を対象として記号実行を行う。
【0036】
図4は、ループ外記号実行部112が、ループ外記述の記号実行に際して
図3に示すソースコード151に基づき生成する探索木(以下、ループ外パス探索木400と称する。)である。ループ外記号実行部112は、ループ外パス探索木400を利用してループ外記号実行情報152を生成する。同図に示すように、ループ外パス探索木400は、夫々「N0」〜「N7」の識別子(以下、ノード名と称する。)が付与された8つのノードを有する。
【0037】
上記8つのノードのうち、ノード名が「N0」のノードは
図3のソースコード151の1行目の記述に対応し、ソースコード151の開始点を意味する「START」という手続きを
含む。またノード名が「N1」のノードは、
図3に示すソースコード151の2行目の記述に対応し、「z=0」という手続きを含む。またノード名が「N2」のノードは、
図3に示す
ソースコード151の3〜10行目の記述、即ちループ文301に対応する。このようにループ外記号実行部112は、ループ文301の記述についてはブラックボックスとして取り扱う。
【0038】
ノード名が「N3」のノードは、
図3に示すソースコード151の11行目に対応する。当該行には条件分岐の記述「if (x % 2 == 0) {」が記述されており、ループ外記号実行
部112は、当該行を分岐点として、条件が「True」の場合と「False」の場合の2通り
のパスを探索する。尚、以下の説明において、これら2つのパスの夫々に識別子(以下、パス名と称する。)として「P1」,「P2」を付与する。
【0039】
図5及び
図6は、
図4のループ外パス探索木400に基づきループ外記号実行部112が生成するループ外記号実行情報152である。このうち
図5に示すループ外記号実行情報152は、パス名が「P1」のパスに対応し、一方、
図6に示すループ外記号実行情報152は、パス名が「P2」のパスに対応する。これらの図に示すように、ループ外記号実行情報152は、ノード名1521、行番号1522、パス条件1523、ループ前変数状態1524、及び変数状態1525の各項目を含む一つ以上のレコードで構成されている。ループ外記号実行情報152のレコードの一つはループ外パス探索木のノードの一つに対応している。
【0040】
上記項目のうち、ノード名1521には、ノード名が設定される。行番号1522には、当該ノードに対応する、
図3に示すソースコード151の行番号が設定される。
【0041】
パス条件1523には、当該ノードに到達するための条件(以下、パス条件とも称する
。)が設定される。ここで
図5はソースコード151の11行目で「True」側のパス「P1」を探索することを選択した場合に対応するので、ノード名が「N3」のノードのパス条件1523には11行目の分岐条件が「True」となるための条件「AL_x % 2 == 0」が設定
されている。一方、
図6はソースコード151の11行目で「False」側のパス「P2」を
探索することを選択した場合に対応するので、ノード名が「N3」のノードのパス条件1523には11行目の分岐条件が「False」となるための条件「!(AL_x % 2 == 0)」が設定
されている。
【0042】
ループ前変数状態1524には、ループ文301の実行前の各変数の値(以下、ループ前変数状態とも称する。)が設定される。本例の場合、ノード名が「N2」のノードではループ文301の実行前の変数「x」、「y」、「z」の値を保持している。
図5又は
図6に
示す「BL_x」,「BL_y」,BL_y」は、夫々、ループ文301の実行前の変数「x」,「y
」,「z」の値を表すシンボル値である(「BL」は「Before Loop」の略)。「BL_x==X」は、ループ文301の実行前の変数「x」の値がシンボル値「X」であることを、「BL_y==Y」は、ループ文301の実行前の変数「y」の値がシンボル値「Y」であることを、「BL_z==0」は、ループ文301の実行前の変数「z」の値が「0」であることを示す。
【0043】
変数状態1525には、上記各ノードの夫々における変数の値(以下、変数状態とも称する。)が設定される。例えば、ノード名が「N0」のノードでは、変数「x」、「y」の値はそれぞれ「X」、「Y」である。尚、「X」、「Y」は、それぞれ、パラメータ変数「x」
、「y」に渡される引数を表すシンボル値である。
【0044】
ノード名が「N2」のノードでは、ループ文301を実行した結果として、変数「x」に
「AL_x」を代入している。ここで「AL_x」は、ループ文実行後の変数「x」の値を表すシ
ンボル値である(「AL」は「After Loop」の略)。前述したように、ループ外記号実行部112はループ文301をブラックボックスとして取り扱うため、ループ文301の実行結果として上記のように新たなシンボル値を変数に代入している。
【0045】
図7は、ループ外記号実行部112が生成するループ外パス情報153である。ループ外パス情報153は、パス名1531、パス終端ノード1532、パス条件1533、ループ前変数状態1534、及び変数状態1535の各項目からなる一つ以上のレコードで構成されている。ループ外パス情報153の1つのレコードは一つのパスに対応している。
【0046】
上記項目のうち、パス名1531には、当該パスのパス名が設定される。パス終端ノード1532には、当該パスの終端ノードのノード名が設定される。
図4に示すループ外パス探索木の場合はノード名が「N5」、「N7」のノードが終端ノードとなる。
【0047】
パス条件1533には、終端ノードに到達した時点におけるパス条件が設定される。ループ前変数状態1534には、上記終端ノードに到達した時点におけるループ前変数状態が設定される。変数状態1535には、上記終端ノードに到達した時点における各変数の値(変数状態)が設定される。
【0048】
図8は、ループ内記号実行部113が、ループ文301の記述(以下、ループ内記述とも称する。)について記号実行を行うに際して生成する探索木(以下、ループ内パス探索木800と称する。)である。ループ内記号実行部113は、ループ内パス探索木800を利用してループ外記号実行情報152を生成する。同図に示すように、ループ内パス探索木800は、夫々「M0」〜「M8」のノード名が付与された9つのノードを有する。
【0049】
上記9つのノードのうち、ノード名が「M0」のノードは
図3に示すソースコード151
の3行目の記述に対応し、ソースコード151の開始点を意味する「START」という手続
きを含む。またノード名が「M1」のノードは、
図3に示すソースコード151の3行目の記述に対応し、「while (z < y) {」という条件(以下、ループ条件とも称する。)の記
述を含む。
【0050】
ノード名が「M2」のノードは、ソースコード151の4行目に対応する。またノード名
が「M5」及び「M8」のノードは、ループ文301から脱出した後のノードを表し、ノード名が「M5」のノードは3行目のループ条件「z % 3 == 0」が「True」となる場合のパスの終端ノードに、ノード名が「M8」のノードは3行目のループ条件「z % 3 == 0」が「False」となるパスの終端ノードに、夫々対応する。尚、以下の説明において、これら2つの
パスの夫々にパス名として「Q1」,「Q2」を付与する。
【0051】
図9は、ループ内記号実行部113が行う、ループ内記述の記号実行に関する処理(以下、ループ内記号実行処理S900と称する。)を説明するフローチャートである。以下、同図とともにループ内記号実行処理S900について説明する。以下において、符号の前に付した「S」の文字は処理ステップを意味する。
【0052】
まずループ内記号実行部113は、ループ文特定部111が特定したループ内記述(
図3の例ではループ文301)を取得する(S911)。
【0053】
続いて、ループ内記号実行部113は、ループ内記述の記号実行の開始に先立ち、当該ループの実行前の変数の値(以下、初項とも称する。)を生成(記憶、設定)し、ループ内記号実行情報154の内容(後述する初項1543)を更新する。本例では、ループ内記号実行部113は、変数xに対する初項を「x
0」とし、ループ実行前の変数「x」の値「BL_x」を生成する(S912)。
【0054】
続いて、ループ内記号実行部113は、ループ内記述についてパスの探索を行い、ループ内記号実行情報154の内容(後述するパス条件1544及び変数状態1545)を更新する(S913)。上記パスの探索に際し、ループ内記号実行部113は、n-1回のル
ープの実行後の変数の値を用いてn回のループの実行時の変数の値を生成する。例えば、
図3のループ文301の3行目の記述について記号実行を行う場合、ループ内記号実行部113は、ループ条件「z < y」に基づき、n-1回のループの実行後の変数の値「z
n-1」及び「y
n-1」を用いて「z
n-1 < y
n-1」(但し、n>0。以下省略))というパス条件を生成する。同様に5行目の記述について記号実行を行う場合、ループ内記号実行部113は、n
回のループの実行時の変数「x
n」の値を、ループをn-1回実行後の変数の値を用いて「x
n=x
n-1*2+2」と表す。
【0055】
続いて、ループ内記号実行部113は、ループ内記述についてパスの探索を進めた結果、ループ内記述の末端に到達したか否かを判定する(S914)。例えば、
図3のループ文301の10行目の記述はループ内記述の末端に相当する。ループ内記号実行部113がループ内記述の末端に到達したと判定した場合(S914:YES)、処理はS915に進む。ループ内記号実行部113がループ内記述の末端に到達していないと判定した場合(S914:NO)、処理はS913に戻る。
【0056】
S915では、ループ内記号実行部113は、ループ内記述におけるループ条件の否定に相当する条件をパス条件に追加する。ここでループ条件の否定は、n回のループ実行後
の変数の値を用いて生成する。例えば、
図3のループ文301におけるループ条件「z
n < y
n)」の否定は「!(z
n < y
n)」となる(但しn≧0。以下省略。)。尚、以下の説明に
おいて、S915で追加した条件式のことを汎化脱出条件式と称する。
【0057】
続いて、ループ内記号実行部113は、S913におけるパスの探索の過程で生成したパス条件及び変数状態に基づき汎化ループ内パス情報155を生成する(S916)。具体的には、ループ内記号実行部113は、まずS915の時点におけるノード名、初項、パス条件、及び変数状態を取得する。そしてループ内記号実行部113は、取得した変数状態に基づき、取得したパス条件に現れるn-1回のループ実行後の変数の値を、n回のループ実行後の変数の値を用いた式に置き換える。例えば、
図3のソースコード151のループ文301について生成したパス条件「z
n-1 < y
n-1」は、ノード名が「M5」のノードに
おける変数状態「y
n=y
n-1」及び「z
n=z
n-1+1」に基づき「z
n-1 < y
n」というパス条件に
変換する。ループ内記号実行部113は、こうして生成したパス条件に加え、ループ内記号実行情報154から取得したノード名1541、初項1543、及び変数状態1545を汎化ループ内パス情報155として記憶する。
【0058】
続いて、ループ内記号実行部113は、ループ文に含まれている全てのパスを探索済みか否かを判定する(S917)。ループ内記号実行部113が全てのパスを探索済みであると判定した場合(S917:YES)、ループ内記号実行処理S900は終了する。一方、ループ内記号実行部113が全てのパスを探索済みでない(未探索のパスがある)と判定した場合(S917:NO)、処理はS918に進む。
【0059】
S918では、ループ内記号実行部113は、未探索のパスを探索すべくS913からの処理を開始する。
【0060】
図10に
図3のループ文301に基づくループ内記号実行情報154を示す。同図に示すように、ループ内記号実行情報154は、ノード名1541、行番号1542、初項1543、パス条件1544、及び変数状態1545の各項目を含む1つ以上のレコードで構成されている。ループ内記号実行情報154のレコードの一つはノードの一つに対応している。
【0061】
上記項目のうち、ノード名1541には、ノード名が設定される。行番号1542には、当該ノードに対応するソースコード151の行番号が設定される。初項1543には、前述した初項が設定される。パス条件1544には当該ノードの前述したパス条件が設定される。前述したように、パス条件はループをn-1回実行後の変数の値を用いて表される
。変数状態1545には当該ノードにおける前述した変数状態が設定される。前述したように、ループn回実行時の変数状態はループn-1回実行後の変数状態を用いて表される。
【0062】
図11に
図3のループ文301に基づき生成される汎化ループ内パス情報155を示す。同図に示すように、汎化ループ内パス情報155は、パス名1551、パス終端ノード1552、初項1553、パス条件1554、及び変数状態1555の各項目を有する一つ以上のレコードで構成されている。汎化ループ内パス情報155のレコードの一つはパス(以下、汎化ループ内パスとも称する。)の一つに対応している。
【0063】
上記項目のうち、パス名1551には、当該パスのパス名が設定される。パス終端ノード1552には、パスの終端のノードが設定される。初項1553には、初項が設定される。パス条件1554には、パス条件が設定される。変数状態1555には、変数状態が設定される。
【0064】
図12は、ループ内パス特化部114が行う処理(以下、ループ内パス特化処理S1200と称する。)を説明するフローチャートである。以下、同図とともにループ内パス特化処理S1200について説明する。
【0065】
まずループ内パス特化部114は、汎化ループ内パス情報155を取得する(S121
1)。続いて、ループ内パス特化部114は、特化ループ内パス情報156を参照し、ループ回数が0回の特化ループ内パス情報を生成済みか否かを判定する(S1212)。ル
ープ内パス特化部114がループ回数0回の特化ループ内パス情報を生成済みと判定した
場合(S1212:YES)、処理はS1215に進む。ループ内パス特化部114がループ回数が0回の特化ループ内パス情報が生成済みでない(未生成である)と判定した場
合(S1212:NO)、処理はS1213に進む。
【0066】
ループ内パス特化部114は、S1211で取得した汎化ループ内パス情報155に基づき、ループ回数が0回の特化ループ内パス情報156を生成する(S1213)。
【0067】
図13(a)に、
図11の汎化ループ内パス情報155に基づきループ内パス特化部114が生成する、ループ回数が0回の特化ループ内パス情報156を示す。同図に示すよ
うに、特化ループ内パス情報156は、パス名1561、パス終端ノード1562、初項1563、パス条件1564、及び変数状態1565の各項目を含む一つ以上のレコードで構成されている。特化ループ内パス情報156のレコードの一つは一つのパス(以下、特化ループ内パスとも称する。)に対応している。ループ内パス特化部114は、上記ループ回数が0回の特化ループ内パスを汎化ループ内パスごとに1つ生成する。
【0068】
上記項目のうち、パス終端ノード1562及び初項1563は、汎化ループ内パス情報155におけるパス終端ノード1552及び初項1553を継承する。パス条件1564及び変数状態1565については、以下に示すように、ループ内パス特化部114がパス条件1554及び初項1553に基づき生成する。
【0069】
まずループ内パス特化部114は、汎化ループ内パス情報155のパス条件1554をループ回数0回でインスタンス化する。具体的には、ループ内パス特化部114は、パス
条件1554に現れる、n回のループを実行した後の変数の値に対してn=0を代入する。尚、n=0であるので、ループ内パス特化部114は、パス条件1554を構成する論理式の
うち「n > 0」という条件付きの論理式は使用せず、前述した汎化脱出条件式のみを使用
する。例えば、
図11の汎化ループ内パス情報155のパス名1551が「Q1」のパスの場合、ループ内パス特化部114は、「(z
n -1) < y
n」と「(z
n -1) % 3 == 0」の各式については「n > 0」という条件付きであるのでこれらは使用せず、汎化脱出条件式である
「!(z
n< y
n)」においてn=0とすることにより取得される「!(z
0 < y
0)」というパス条件を使用する。尚、以下の説明において、このように汎化脱出条件式をインスタンス化して得られる条件式のことを特化脱出条件式と称する。
【0070】
続いて、ループ内パス特化部114は、変数状態1565を生成する。ここでループ回数が0回のとき変数状態1565は初項1563と一致し、また初項1563はループ実
行前の変数の値に相当する。そこでループ内パス特化部114は、0回のループを実行し
た後の変数の値を、初項として保持しているループ実行前の変数の値で表す。例えば、
図11に示す汎化ループ内パス情報155のパス名1551が「Q1」のパスの場合、0回の
ループを実行した後の変数の値「x
0」は初項1553の式「x
0=BL_x」より「x
0=BL_x」と表す。
【0071】
図12に戻り、続いて、ループ内パス特化部114は、S1213で生成したパス条件に現れる初項をループ実行前の変数の値を含む式に置換する(S1214)。例えば、
図11に示す汎化ループ内パス情報155の「Q1」の場合、ループ内パス特化部114は、パス条件「!(z
0< y
0)」を、初項1553の式「z
0=BL_z」及び「y
0=BL_y」に基づき「!(BL_z < BL_y)」と表す。
【0072】
図13(b)に、
図13(a)のループ回数が0回の特化ループ内パス情報156につ
いて上記置換を行った後の特化ループ内パス情報156を示す。
【0073】
図12に戻り、続いて、ループ内パス特化部114は、生成済みの特化ループ内パス情報156のうちループ回数が最大のものを取得する(S1215)。尚、以下の説明において、ここのときに取得した特化ループ内パス情報156のループ回数をK-1回とする。
【0074】
続いて、ループ内パス特化部114は、取得した特化ループ内パス情報(ループ回数はK-1回であるものとする。)と、S1211で取得した汎化ループ内パス情報155との
組み合わせに基づき、ループ回数がK回の特化ループ内パス情報156を生成する(S1
216)。尚、例えば、ループ回数がK-1回の特化ループ内パス情報156が2つ、汎化
ループ内パス情報155が2つである場合、ループ内パス特化部114は、ループ回数がK回の特化ループ内パス情報156を4つ生成する。
【0075】
まずループ内パス特化部114は、変数状態1565を生成するため、汎化ループ内パス情報155に含まれるn及びn-1を、K及びK-1にインスタンス化する。さらにループ内パス特化部114は、ループ回数がK-1回の特化ループ内パス情報156の変数状態に基づ
き、ループをK-1回実行後の変数の値を、ループ実行前の変数の値を含む式に置換する。
【0076】
例えば、
図11の汎化ループ内パス情報155のパス名が「Q1」のパスの変数状態「x
n=x
n-1 * 2 + 2」から、ループ回数が1回の特化ループ内パス情報を生成する場合、ループ内パス特化部114は、まず「x
n=x
n-1 * 2 + 2」を「x
1=x
0 * 2 + 2」とインスタンス化する。さらにループ内パス特化部114は、ループ回数が0回の特化ループ内パス情報1
56におけるパス名が「Q1」の変数状態「x
0=BL_x」に基づき、「x
1=BL_x* 2 + 2」を生
成する。またループ内パス特化部114は、以上と同様の方法で「y
1=BL_y」及び「z
1=BL_z
+ 1」を生成する。
【0077】
続いて、パス条件1564を生成するため、ループ内パス特化部114は、S1215で取得した特化ループ内パス情報156のパス条件1564から、前述した特化脱出条件式を除外する。例えば、ループ回数が0回の特化ループ内パス情報156におけるパス名
が「Q1」のパスの場合、ループ内パス特化部114は、特化脱出条件式「!(BL_z < BL_y)」を除外する。尚、以下において、特化脱出条件式を除外した後に残る式を脱出式除外式と称する。
【0078】
続いて、ループ内パス特化部114は、汎化ループ内パスのパス条件をループ回数K回
でインスタンス化する。例えば、汎化ループ内パス情報155の「Q1」のパス条件を、ループ回数1回でインスタンス化する場合、ループ内パス特化部114は、「(z
n -1) < y
n && (z
n -1) % 3 == 0 && !(z
n < y
n)」のnに1を代入することで、「(z
1-1) < y
1 && (z
1 -1) % 3 == 0 && !(z
1< y
1)」を得る。さらにループ内パス特化部114は、特化ループ
内パス情報の変数状態に基づき、ループをK回実行後の変数の値を、ループ実行前の変数
の値を含む式に置換する。上記の例の場合、ループ内パス特化部114は、「y
1=BL_y」
及び「z
1=BL_z+ 1」に基づき、「(z
1 -1) < y
1&& (z
1 -1) % 3 == 0 && !(z
1 < y
1)」か
ら「((BL_z
+ 1) -1) < BL_y
&& ((BL_z+ 1) -1) % 3 == 0 && !((BL_z
+ 1) < BL_y)」
を生成する。そしてループ内パス特化部114は、生成した上記式を、上記脱出式除外式に論理積結合する。
【0079】
図14にループ回数が1回の特化ループ内パス情報156の例を示す。同図において、
パス名1561における「Q1-Q1」は、特化ループ内パス情報156のパス名1561が
「Q1」のパスと、汎化ループ内パス情報155のパス名1551が「Q1」のパスとに基づき生成したパスであることを示す。パス終端ノード1562は、生成元の汎化ループ内パス情報155のパス終端ノード1552を継承する。初項1563は、生成元の特化ルー
プ内パス情報156の初項1563を継承する。変数状態1565は、汎化ループ内パス情報155の変数状態1555と特化ループ内パス情報156の変数状態1565とに基づき、前述した方法で生成する。またパス条件1564は、特化ループ内パス情報156のパス条件1564、汎化ループ内パス情報155のパス条件1554、及び特化ループ内パス情報156の変数状態1565に基づき生成する。
【0080】
図15は、以上に説明した各機能(情報記憶部110、ループ外記号実行部112、ループ内記号実行部113、及びループ内パス特化部114)を利用して、ルール生成部115がルール情報を生成する処理(以下、ルール生成処理S1500と称する。)を説明するフローチャートである。以下、同図とともにルール生成処理S1500について説明する。
【0081】
まずルール生成部115は、入力装置54や通信装置56を介して、ループ上限回数を取得する(S1511)。
【0082】
続いて、ルール生成部115は、ルール情報157を参照し、取得したループ上限回数に対応するルールを生成済みか否かを判定する(S1512)。ルール生成部115が上限回数に対応するルールを生成済みであると判定した場合(S1512:YES)、ルール生成処理S1500は終了する。ルール生成部115が上限回数に対応するルールを未生成であると判定した場合(S1512:NO)、処理はS1513に進む。
【0083】
S1513では、ルール生成部115は、ループ内パス特化部114を制御してループ内パス特化処理S1200を実行することにより、既に生成済みのループ回数がK-1回の
特化ループ内パス情報156に基づき、ループ回数がK回の特化ループ内パス情報156
を生成する。
【0084】
続いて、ルール生成部115は、ループ外パス情報153を取得する(S1514)。続いて、ルール生成部115は、S1513で生成したループ回数がK回の特化ループ内
パス情報156と、S1514で取得したループ外パス情報153との組み合わせに基づき、ループ回数がK回のルールを生成する(S1515)。例えば、ルール生成部115
は、ループ回数がK回の特化ループ内パス情報156の特化ループ内パスが4つ、かつ、
取得したループ外パス情報153のループ外パスが2つである場合、ループ回数がK回の
ルールを8つ生成する。
【0085】
まずルール生成部115は、特化ループ内パス情報156のパス条件1564とループ外パス情報153のパス条件1533とを論理積で結合することにより、ルールのパス条件を生成する。そしてルール生成部115は、生成したルールのパス条件に現れるループを実行した後の変数の値を表すシンボル値を、ループを実行する前の変数の値を表すシンボル値を含む式に置換する。さらにルール生成部115は、ループ外パス情報153のループ前変数状態1534に基づき、ループ実行前の変数の値を表すシンボル値を、当該変数が実際に保持している値に置換する。
【0086】
例えば、
図7に示すループ外パス情報153のパス名1531が「P1」のパスと、
図13(b)に示すループ回数が0回の特化ループ内パス情報156のパス名1561が「Q1
」のパスとからパス条件を生成する場合は次のようになる。まず、ルール生成部115は、パス名1531が「P1」のパスのパス条件1533は「AL_x % 2 == 0」、ループ回数
が0回の特化ループ内パス情報156のパス条件1564は「!(BL_z < BL_y)」であるこ
とから、これらを論理積結合することにより「AL_x % 2 == 0 && !(BL_z < BL_y)」を生
成する。ここで上記式に現れるループ実行後の変数の値「AL_x」は「x
0」に一致することに注目する。また上記「x
0」の値は、上記特化ループ内パス情報156の変数状態156
5から「x
0=BL_x」である。そこでルール生成部115は、「AL_x」を「BL_x」に置換す
ることにより「BL_x % 2 == 0 && !(BL_z < BL_y)」を生成する。またループ外パス情報
153のループ前変数状態1534より「BL_x == X」、「BL_y == Y」、「BL_z == 0」
であるので、これらに基づき、ルール生成部115は、パス条件「X % 2 == 0 && !(0 < Y)」を生成する。
【0087】
続いて、ルール生成部115は、ループ外パス情報153の変数状態1535と、特化ループ内パス情報156の変数状態1565とに基づき、パス実行結果を生成する。具体的には、ルール生成部115は、ループ外パス情報153の変数状態1535に現れるループ実行後の変数の値を表すシンボル値を、ループ実行前の変数の値を表すシンボル値に置換する。即ち、ルール生成部115は、ループ外パス情報153のループ前変数状態1534に基づき、ループを実行する前の変数の値を表すシンボル値を、当該変数が実際に保持している値に置換する。
【0088】
例えば、ルール生成部115が、ループ外パス情報153のパス名1531が「P1」のパスと、ループ回数が0回の特化ループ内パス情報156のパス名1561が「Q1」のパ
スとに基づきパス実行結果を生成する場合は次のようになる。まずループ外パス情報153の変数状態1535は「x=AL_x」、特化ループ内パス情報156の変数状態1565は「x
0=BL_x」である。また前述したように「AL_x」は「x
0」に一致するので「x=BL_x」が
得られる。そしてルール生成部115は、ループ外パス情報153のループ前変数状態1534に基づき「x=X」を得る。同様の方法により、ルール生成部115は、「y=Y」及び「z=X」を得る。ここで例えば、ソースコード151において戻り値として返す変数の値
のみをルールのパス実行結果として採用するものとした場合、ルール生成部115は、
図3に示したソースコード151の16行目の記述に基づき、変数zの値を表す「z=X」をパス実行結果とする。
【0089】
続いて、ルール生成部115は、生成した複数のルールに重複がある場合、重複するルールを削除する。また生成したルールのパス条件の充足可能性を確認し、充足不能と判明した場合はそのルールを削除する(S1516)。尚、論理式の充足可能性を確認する方法として例えば推論規則を用いる方法があるが、充足可能性を確認する方法は必ずしも限定されない。
【0090】
図16は、ループ外パス情報153とループ回数が0回の特化ループ内パス情報156
に基づきルール生成部115が生成する、ループ回数が0回の場合のルール情報157の
例である。同図に示すように、ルール情報157は、パス名1571、パス条件1572、及びパス実行結果1573の3つの項目を有する一つ以上のレコードで構成されている。
【0091】
パス名1571には、生成元を特定する情報が設定される。例えば、「P1-Q1」は、当
該ルールが、ループ外パス情報153の「P1」と、ループ回数0回の特化ループ内パス情
報156の「Q1」に基づき生成されたことを示す。パス条件1572、及びパス実行結果1573には、前述した方法で生成された値が設定される。尚、本例では「P1-Q2」と「P1-Q1」のレコードの内容が重複しており、この場合、ルール生成部115は一方(例えば「P1-Q2」)を前述したS1516にて削除する。同様に「P2-Q2」も「P2-Q1」と重複し
ているため、ルール生成部115は一方をS1516の処理で削除する。
【0092】
図17は、ループ外パス情報153とループ回数1回の特化ループ内パス情報156に
基づきルール生成部115が生成する、ループ回数が1回の場合のルール情報157の例
である。同図に示すように、このルール情報157は、パス名1571、パス条件1572、及びパス実行結果1573の3つの項目を有する一つ以上のレコードで構成されてい
る。
【0093】
パス名1571には、生成元を特定する情報が設定される。例えば、パス名「P1-Q1-Q1」は、当該ルールが、ループ外パス情報153の「P1」と、ループ回数1回の特化ループ
内パス情報156の「Q1-Q1」に基づき生成されたことを示す。パス条件1572及びパ
ス実行結果1573には、前述した方法で生成された値が設定される。尚、本例では、「P1-Q2-Q1」、「P1-Q2-Q2」、「P2-Q2-Q1」、及び「P2-Q2-Q2」のレコードは、夫々「P1-Q1-Q1」、「P1-Q1-Q2」、「P2-Q1-Q1」、及び「P2-Q1-Q2」のレコードと重複するため、ルール生成部115は一方をS1516の処理で削除する。また「P1-Q1-Q2」、「P2-Q1-Q1」、及び「P2-Q1-Q2」についてはパス条件1713が充足不能であるため、ルール生成部115はこれらをS1516の処理で削除する。
【0094】
図18はループの上限回数が1回に指定されている場合のルール情報157の例である
。前述したように入出力処理部116は上限回数の指定をユーザから受け付ける。そして、ルール生成部115を実行することにより、ループ回数が0回、1回、・・・K-1回、K回の夫々の場合についてルール情報157を生成する。入出力処理部116は、ルール情報157からループ回数が0回からK回の場合のルールを取得し、出力装置55に出力(表示)する。同図に示す、ループ上限回数が1回の場合のルール情報157は、パス名157
1、パス条件1572、及びパス実行結果1573の各項目を含む3つのレコードで構成されている。尚、パス名1571に設定されているルール「P1-Q1」、「P2-Q1」、及び「P1-Q1-Q1」は、
図16に示したルール情報157及び
図17に示したルール情報157から、
図15のS1516の処理にて「P1-Q2」、「P2-Q2」、「P1-Q2-Q1」、「P1-Q2-Q2」、「P2-Q2-Q1」、「P2-Q2-Q2」、「P1-Q1-Q2」、「P2-Q1-Q1」、及び「P2-Q1-Q2」を削除し、削除後に残ったルールを集約した結果である。
【0095】
尚、ループ上限回数が1回の場合のルール情報157を得るためにはルール情報157
を生成する必要があるが、既にループ上限回数を1回に設定して記号実行を行う前にルー
プ上限回数を0回に設定して記号実行を行っていた場合等、既にルール情報157が生成
済みである場合には改めてルール情報157を生成する必要がない。そのため、ルール生成部115は、予めループ上限回数0回の場合のルールがルール情報157に格納されて
いるかを確認し、上記ルールが格納されていない場合にのみルール情報157を生成すればよい。
【0096】
以上に説明したように、仕様分析装置100は、ループ文を含むソースコードからルールを再生するにあたり、ループ文に対するパス実行結果を、ループをn-1回実行後の変数
の値とループをn回実行後の変数の値の関係式として記憶する。そのため、例えば、ルー
プ回数がK-1回の場合のルールが再生済みである場合、上記関係式と上記ループ回数がK-1回の場合のルールを生成する過程で生成したパスの情報に基づき、記号実行を行うことなく、簡単な代入処理や論理演算処理によってループ回数がK回の場合のルールを生成する
ことができる。即ち、一度の記号実行で生成した上記関係式を再帰的に用いることで、記号実行を繰り返し行うことなく、簡単な代入処理及び論理演算処理で、任意のループ回数におけるルールを生成することができる。そのため、記号実行にかかる計算機のリソースの消費を抑えることができるとともに、ルールを取得するまでに要する時間を短縮することができる。
【0097】
また仕様分析装置100は、記号実行によって生成したルールを記憶するため、ループ上限回数を変更して複数回の記号実行を行う場合の処理量を削減することができる。例えば、ループ上限回数をL回にして記号実行を行った場合にはループ回数が0回からL回まで
の夫々に対応するルールが生成されて記憶され、例えば、その後にループ上限回数をL+1
回に変更して再度記号実行を行う場合は、ループ回数がL+1回の場合のルールのみを新規
に生成し、ループ回数0回からL回までのルールに追加すればよく、記号実行にかかる計算機のリソースの消費を抑えることができ、ルールを取得するまでに要する時間を短縮することができる。
【0098】
このように本実施形態の仕様分析装置100によれば、任意のループ文を含むソースコードについての記号実行を効率よく行うことができる。
[第2実施形態]
【0099】
図19は第2実施形態として説明する仕様分析装置100の機能ブロック図である。第2実施形態の仕様分析装置100も第1実施形態の仕様分析装置100と同様のハードウェアによって実現される。
【0100】
第2実施形態の仕様分析装置100は、第1実施形態の仕様分析装置100と同等の機能を備え、ループ内パス一般項化部121及び一般項化ルール生成部122の各機能をさらに備える。また第2実施形態の仕様分析装置100の情報記憶部110は、第1実施形態の情報記憶部110と同様の情報を記憶するとともに、さらに一般項化ループ内パス情報161及び一般項化ルール情報162を記憶する。
【0101】
ループ内パス一般項化部121は、汎化ループ内パス情報155を一般項化することにより一般項化ループ内パス情報161を生成する。一般項化ルール生成部122は、ループ外パス情報153及び一般項化ループ内パス情報161に基づき一般項で表現されたルールを生成し、生成したルールを一般項化ルール情報162として記憶する。
【0102】
入出力処理部116は、一般項化ルール情報162を出力装置55に出力(表示)する。また、入出力処理部116は、一般項化ルール情報162を、入力装置54や通信装置56を介して取得したループ上限回数にインスタンス化して出力(表示)する。
【0103】
続いて、
図20に示すソースコード151を例として、第2実施形態の仕様分析装置100の具体的な動作について説明する。同図に示すように、ソースコード151はC言語で記述されており、ループ文302を含む。
【0104】
図21は、ループ外記号実行部112が、ループ外記述の記号実行に際して
図20に示すソースコード151に基づき生成する探索木(以下、ループ外パス探索木2100と称する。)である。ループ外記号実行部112は、ループ外パス探索木2100を利用してループ外記号実行情報152を生成する。同図に示すように、ループ外パス探索木2100は、夫々「N0」〜「N7」のノード名が付与された8つのノードを有する。
【0105】
上記8つのノードのうち、ノード名が「N0」のノードは
図21のソースコード151の1行目の記述に対応し、ソースコード151の開始点を意味する「START」という手続き
を含む。またノード名が「N1」のノードは、
図21に示すソースコード151の2行目の記述に対応し、「z=0」という手続きを含む。またノード名が「N2」のノードは、
図21
に示すソースコード151の3〜6行目の記述、即ちループ文302に対応している。ノード名が「N3」のノードは、
図21に示すソースコード151の7行目に対応している。当該行には「if (x % 2 == 0) {」という条件分岐の記述がされており、ループ外記号実
行部112は、当該行を分岐点として、条件が「True」の場合と「False」の場合の2通
りのパスを探索する。尚、以下の説明において、これら2つのパスの夫々にパス名として「P1」,「P2」を付与する。
【0106】
図22及び
図23は、
図21のループ外パス探索木2100に基づきループ外記号実行部112が生成するループ外記号実行情報152である。このうち
図22に示すループ外
記号実行情報152は、パス名が「P1」のパスに対応し、一方、
図23に示すループ外記号実行情報152は、パス名が「P2」のパスに対応する。
【0107】
図24は、ループ外記号実行部112が生成するループ外パス情報153である。パス終端ノード1532には、当該パスの終端ノードのノード名が設定される。
図4に示すループ外パス探索木の場合はノード名が「N5」、「N7」のノードが終端ノードとなる。
【0108】
図25は、ループ内記号実行部113が、ループ文302について記号実行を行う際に生成する探索木(以下、ループ内パス探索木2500と称する。)である。ループ内記号実行部113は、ループ内パス探索木2500を利用してループ外記号実行情報152を生成する。同図に示すように、ループ内パス探索木2500は、夫々「M0」〜「M4」のノード名が付与された5つのノードを有する。
【0109】
上記5つのノードのうち、ノード名が「M0」のノードは
図20に示すソースコード151の3行目の記述に対応し、ソースコード151の開始点を意味する「START」という手
続きを含む。またノード名が「M1」のノードは、
図20に示すソースコード151の3行目の記述に対応し、「while ( (3 * z) < x ) {」という条件(以下、ループ条件と称す
る。)の記述を含む。またノード名が「M2」のノードは、
図20に示すソースコード151の4行目に対応している。またノード名が「M3」のノードは、
図20に示すソースコード151の5行目に対応している。またノード名が「M4」のノードはパスの終端ノードに対応している。尚、以下の説明において、上記パスのパス名として「Q1」を付与する。
【0110】
図26は、
図20のループ文302に基づき生成されるループ内記号実行情報154である。同図に示すループ内記号実行情報154は、ループ内記号実行部113により第1実施形態と同様の方法で生成される。
【0111】
図27は
図20のループ文302に基づき生成される汎化ループ内パス情報155である。同図に示す汎化ループ内パス情報155は、ループ内記号実行部113により第1実施形態と同様の方法で生成される。
【0112】
図28は、汎化ループ内パス情報155に基づきループ内パス一般項化部121が生成する一般項化ループ内パス情報161である。同図に示すように、一般項化ループ内パス情報161は、パス名1611、パス終端ノード1612、初項1613、パス条件1614、及び一般項1615の各項目を有する一つ以上のレコードで構成されている。ループ内パス一般項化部121は、汎化ループ内パス情報155の変数状態1555を漸化式とみなしてその一般項を求める。尚、漸化式からその一般項を求める方法としては、例えば、非特許文献1の第10章に記載されている方法がある。
【0113】
図29は、ループ外パス情報153及び一般項化ループ内パス情報161に基づき一般項化ルール生成部122が生成する一般項化ルール情報162である。一般項化ルール生成部122は、一般項化ループ内パス情報161とループ外パス情報153とを組合せることにより一般項化ルール情報162を生成する。本例の場合、一般項化ルール生成部122は2つの一般項化ルールを生成する。
【0114】
まず一般項化ルール生成部122は、ループ外パス情報153のパス条件1533に基づき一般項化ルール情報162のパス条件1622を生成する。一般項化ルール生成部122は、ループ外パス情報153のパス条件1533に現れるループ実行後の変数の値を表すシンボル値を、ループ実行前の変数の値を表すシンボル値を含む式に置換する。さらに、一般項化ルール生成部122は、ループ前変数状態1534に基づき、上記ループ実行前の変数の値を表すシンボル値を、当該変数が実際に保持する値に置換する。
【0115】
例えば、ループ外パス情報153のパス名1531が「P1」のパスと、一般項化ループ内パス情報161のパス名1611が「Q1」のパスに基づきパス条件を生成する場合を考える。
図24に示すように、ループ外パス情報153のパス条件1533は「AL_x % 2 == 0」である。ここで、パス条件1533におけるループ実行後の変数の値「AL_x」は図
28の一般項化ループ内パス情報161の一般項1615の「x
n」に一致することに注目する。そして上記「x
n」の値は、一般項1615より「x
n=x
0+2*n」であること、及び初
項1613より「x
0=BL_x」であることから、一般項化ルール生成部122は、上記パス
条件1533を「(BL_x + 2*n) % 2 == 0」に変換する。またループ前変数状態1534
より「BL_x == X」であるため、これに基づき一般項化ルール生成部122は「(X + 2*n)
% 2 == 0」を生成する。
【0116】
続いて、一般項化ルール生成部122は、ループ外パス情報153の変数状態1535と、一般項化ループ内パス情報161の一般項1615から、一般項化ルール情報162のパス実行結果1623を生成する。具体的には、一般項化ルール生成部122は、ループ外パス情報153の変数状態1535に現れるループ実行後の変数の値を表すシンボル値を、ループ実行前の変数の値を表すシンボル値に置換する。さらに一般項化ルール生成部122は、ループ外パス情報153のループ前変数状態1534に基づき、上記ループ実行前の変数の値を表すシンボル値を、当該変数が実際に保持する値に置換する。
【0117】
例えば、ループ外パス情報153のパス名1531が「P1」のパスと、一般項化ループ内パス情報161のパス名1611が「Q1」パスとに基づき一般項化ルール情報162のパス実行結果1623を生成する場合を考える。ここでループ外パス情報153の変数状態1535は「x=AL_x」、一般項化ループ内パス情報161の一般項1615は「x
n=x
0+2*n」である。上述のとおり「AL_x」は「x
n」に一致すること、及び初項1613より「x
0=BL_x」であることから、一般項化ルール生成部122は「x=BL_x + 2*n」を得る。そして、一般項化ルール生成部122は、ループ外パス情報153のループ前変数状態1534に基づき「x=X + 2*n」を得る。同様の方法により「z=X + 2*n」が得られる。ここで
図20に示したソースコード151において戻り値として返す変数の値のみ、ルールのパス実行結果として採用するものとすれば、一般項化ルール生成部122は、ソースコード151の12行目に基づき、変数zの値を表す「z=X + 2*n」をパス実行結果として採用する。
【0118】
続いて、一般項化ルール生成部122は、汎化ループ内パス情報155のパス条件1554に基づき、一般項化ルール情報162におけるループ回数nの制約条件1624を生
成する。まず一般項化ルール生成部122は、パス条件1554に含まれるループの実行回数がn回における変数の値を、一般項化ループ内パス情報161の一般項1615に置
換する。さらに一般項化ルール生成部122は、一般項化ループ内パス情報161の初項1613及びループ外パス情報153のループ前変数状態1534に基づき、シンボル値の置換を行う。
【0119】
例えば、一般項化ルール生成部122が、ループ外パス情報153のパス名1531が「P1」のパスと、一般項化ループ内パス情報161のパス名1611が「Q1」のパスとに基づき、一般項化ルール情報162におけるループ回数nの制約条件1624を生成する
場合を考える。まず一般項化ルール生成部122は、一般項化ループ内パス情報161のパス条件1614の式「3 * (z
n -1) < x
n - 2(但しn>0) && !(3 * z
n < x
n) (但しn≧0)」を、一般項1615に基づき、「3 * ((z
0 + n) -1) < (x
0 + 2*n) - 2 (但しn>0) && !(3 * (z
0 + n) < (x
0 + 2*n)) (但しn≧0)」に変換する。そして一般項化ルール生成部
122は、初項1613に基づき、上記式を3 * ((BL_z + n) -1) < (BL_x + 2*n) - 2 (但しn>0) && !(3 * (BL_z + n) < (BL_x + 2*n)) (但しn≧0)」に変換する。さらに一般
項化ルール生成部122は、ループ前変数状態1534に基づき、上式を「3 * (n -1) <
X + 2*n - 2 (但しn>0) && !(3 * n < X + 2*n) (但しn≧0)」に変換する。
【0120】
図30は、入出力処理部116が、一般項化ルール情報162に基づき出力装置55に出力する、一般項化ルールを表示する画面の例(以下、一般項化ルール表示画面3000と称する。)である。
【0121】
入出力処理部116は、同画面に設けられているループ上限回数の入力受付欄3010を介して、ユーザからループ上限回数の入力を受け付ける。また入出力処理部116は、同画面に設けられているルール展開実行ボタン3012が押下されると、一般項化ルール情報162に含まれるループ回数を表す変数nに0から上記ループ上限回数までの値を順次代入してその結果を取得する。
【0122】
例えば、一般項化ルール情報162に対して、ユーザがループ上限回数の入力受付欄3011に1を入力し、ルール展開実行ボタン3012を押下した場合、入出力処理部11
6は、まず一般項化ルール情報162の「P1-Q1」及び「P2-Q1」のnに0を代入することで、展開後ルール表示欄3013における「P1-Q1-0」及び「P2-Q1-0」の内容(一般項で表現されたルールを具体化した情報)を生成する。次に入出力処理部116は、「P1-Q1」
及び「P2-Q1」のnに1を代入することで、展開後ルール表示欄3013における「P1-Q1-1」及び「P2-Q1-1」の内容(一般項で表現されたルールを具体化した情報)を生成する。
【0123】
一般項化ルール情報162におけるループ回数nの制約条件1624は、展開後ルール
表示欄3013における制約条件3014に基づき生成される。入出力処理部116は、パス条件3015に基づき制約条件3014の論理積について充足可能性を判定し、充足不能の場合には、そのルールを非表示あるいは強調表示(太枠表示、グレーアウト等)などとする。本例では「P1-Q1-1」が太枠表示されている。
【0124】
このように第2実施形態の仕様分析装置100は、汎化ループ内パス情報を表現した漸化式の一般項を求めることにより、ループ文をn回実行した場合における変数の値と上記nを含む式との関係式である一般項化ループ内パス情報161を生成し、一般項化ループ内パス情報161とループ外パス情報153とに基づき、一般項で表現されたルールである一般項化ルール情報を生成するので、ユーザが利用しやすい形でソフトウェアの仕様(ルール)に関する情報を提供することができる。
【0125】
ところで、本発明は上記の実施形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。例えば、上記の実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また上記実施形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
【0126】
例えば、任意のKについて、ループ回数がK-1回の場合のルールとループ回数がK回の場
合のルールとを比較した場合、例えば、係数の値が規則的に増加もしくは減少する等、ルールの間に一定の規則性を見いだせることがある。またその場合、ループの実行回数が実際の(予め想定されている)ループの最大実行回数を超えた場合に上記規則性の逸脱が見られることがある。そこで、例えば、ルール生成部115が、ループ回数0回の場合のル
ール、1回の場合のルール、・・・K-1回の場合のルール、K回の場合のルール、K+1回の場合のルール、・・・と継続的にルールを監視し、上記規則性の逸脱を検知した場合に自動的にユーザに警告等の情報を出力するようにする。これによりユーザは実際のループの最大実行回数を容易かつ精度よく把握することができる。尚、上記規則性を検出する方法としては、例えば、上記ルールを構成している数字や演算子に関する情報を抽出し、それら
の情報を機械学習のアルゴリズムを活用して分類するという方法がある。
【0127】
また例えば、ソースコードに複数のループ文が含まれている場合、仕様分析装置100が、ループ文ごとにループ上限回数の指定を受け付け、ループ文ごとに、情報記憶部110が記憶している特化ループ内パス情報156のうちループ回数が最大のものを取得し、ループ文ごとに、取得した特化ループ内パス情報156に汎化ループ内パス情報155を再帰的に適用することによりループの上限回数までの特化ループ内パス情報156を生成するようにしてもよい。
【0128】
図31は、入出力処理部116が出力装置55に出力(表示)するループ上限回数の指定画面3100の例である。ループ上限回数の指定画面3100は、ソースコード表示欄3111と、ループ上限回数登録欄3112とを含む。ループ上限回数登録欄3112は、ループ文位置特定結果3113、ループ上限回数入力受付部3114、ループ上限回数一括入力受付部3115、ループ上限回数一括設定ボタン3116、ループ文抽出ボタン3117、及びループ上限回数登録ボタン3118を含む。
【0129】
まず入出力処理部116は、ソースコードを取得し、ソースコード表示欄3111に表示する。ユーザがループ文抽出ボタン3117を押下すると、入出力処理部116は、上記ソースコードを参照し、ループ文の位置を特定する。本実施例では、ループ文3151及び3152の夫々の開始行及び終了行を特定する。そして、入出力処理部116は、上記ループ文3151及び3152の開始行及び終了行を、ループ文位置特定結果3113に表示する。
【0130】
ユーザは、ループ文位置特定結果3113に示されている各ループ文のループ上限回数を、夫々に対応するループ上限回数入力受付部3114に入力する。またユーザは、ループ上限回数一括入力受付部3115に全ループ文に適用するループ上限回数を入力し、ループ上限回数一括設定ボタン3116を押下することで、ループ上限回数入力受付部3114に同じ値を(各ループ文に同じ上限回数を)一括設定することもできる。
【0131】
以上のようにしてループ上限回数を入力した後、ユーザがループ上限回数登録ボタン3118を押下すると、入出力処理部116は、各ループ文に対するループ上限回数を取得する。
【0132】
また上記の各構成、機能部、処理部、処理手段等は、それらの一部または全部を、例えば、集積回路で設計する等によりハードウェアで実現してもよい。また上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリやハードディスク、SSD(Solid State Drive)等の記録装置、また
はICカード、SDカード、DVD等の記録媒体に置くことができる。
【0133】
また上記の各図において、制御線や情報線は説明上必要と考えられるものを示しており、必ずしも実装上の全ての制御線や情報線を示しているとは限らない。例えば、実際にはほとんど全ての構成が相互に接続されていると考えてもよい。
【0134】
また以上に説明した仕様分析装置100の各種機能部、各種処理部、各種データベースの配置形態は一例に過ぎない。各種機能部、各種処理部、各種データベースの配置形態は、仕様分析装置100が備えるハードウェアやソフトウェアの性能、処理効率、通信効率等の観点から最適な配置形態に変更し得る。
【0135】
また前述したデータベースの構成(スキーマ(Schema)等)は、リソースの効率的な利
用、処理効率向上、アクセス効率向上、検索効率向上等の観点から柔軟に変更し得る。