JP6790921B2 - プログラム分析装置、プログラム分析方法及びプログラム分析プログラム - Google Patents

プログラム分析装置、プログラム分析方法及びプログラム分析プログラム Download PDF

Info

Publication number
JP6790921B2
JP6790921B2 JP2017039644A JP2017039644A JP6790921B2 JP 6790921 B2 JP6790921 B2 JP 6790921B2 JP 2017039644 A JP2017039644 A JP 2017039644A JP 2017039644 A JP2017039644 A JP 2017039644A JP 6790921 B2 JP6790921 B2 JP 6790921B2
Authority
JP
Japan
Prior art keywords
program
branch
statement
slicing
unit
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2017039644A
Other languages
English (en)
Other versions
JP2018147106A (ja
Inventor
前田 芳晴
芳晴 前田
昭彦 松尾
昭彦 松尾
健一 平井
健一 平井
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2017039644A priority Critical patent/JP6790921B2/ja
Publication of JP2018147106A publication Critical patent/JP2018147106A/ja
Application granted granted Critical
Publication of JP6790921B2 publication Critical patent/JP6790921B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Description

本発明は、プログラム分析装置、プログラム分析方法及びプログラム分析プログラムに関する。
既存の情報システムの保守や再構築の作業では、既存システムの現状を理解し把握するため、既存システムに関するドキュメントや有識者の知識などの情報が必要である。しかし、長期に運用保守された情報システムでは、ドキュメントの不備や有識者の不在などの要因により、保守や再構築の作業に必要な情報が不足することがある。
このような場合、ドキュメントや有識者から得られる情報の代替として、情報システムの実装実体であるプログラムを分析することによって、不足する知識を補うことが行われる。このようなプログラムの分析は、プログラムのロジック抽出と呼ばれる。ここで、プログラムのロジックとは、プログラムに記述された処理の内容であり、具体的には、プログラムの実行結果としての入出力関係である。
プログラムのロジック抽出の方式の1つに、シンボリック実行(Symbolic Execution、記号実行)技術を利用する手法がある。ここで、シンボリック実行は、入力変数にシンボル値(記号値)を設定して、プログラムの実行可能なパスを抽出することによって、プログラムを分析する技術である。
シンボリック実行技術は、プログラムに記述された命令文に従って変数値の参照と更新を行い、条件分岐文やループ文のような制御文ではプログラム記述通りに命令文の実行を制御する。特に、条件分岐では条件式の真偽値に従って分岐が選択されるが、シンボリック実行技術は、条件式を構成する変数値にシンボル値が含まれる場合は条件式の真偽値を算出できない。
このため、シンボリック実行技術は、代わりに条件式の充足可能性(条件式が真となりうること)を判定して条件分岐の分岐選択を制御する。充足可能性の判定には、SMT(Satisfiability Modulo Theories)ソルバやSAT(SATisfiability problem)ソルバが利用される。条件分岐の複数の分岐が充足可能な場合は、これら複数の分岐は共に実行可能なので、シンボリック実行技術は、複数の分岐のうち順に1つを仮定し選択することによって、実行可能パスを抽出する。
シンボリック実行の分析結果は、実行可能なパス毎の、パス条件とパス出力である。これらの結果を整理し、分析対象プログラムから仕様抽出した結果の1つ形式がロジック表、あるいは、決定表である。ロジック表は、入力に関する条件とその条件が満たされた場合の出力を表す。
以下、シンボリック実行を利用したプログラムのロジック抽出の動作例について説明する。図21は、シンボリック実行の説明に用いるプログラム91を示す図である。図21は、COBOLで記述されたプログラム91を示す。図21に示すように、プログラム91には、14行目と19行目にそれぞれIF文#1及びIF文#2で示されるIF文がある。
図22は、図21に示したプログラム91のフロー図である。図22に示すように、フロー図は、プログラム91の条件による分岐構造と各分岐における処理内容を表す。例えば、プログラム91のIF文#1に対応して分岐条件「性別=男性」に基づく2つの分岐の処理内容は、それぞれ「出力=‘M’」と「出力=‘’」である。
図23は、図21に示したプログラム91のシンボリック実行により抽出されたパスを示す図であり、図24は、図21に示したプログラム91のシンボリック実行による分析結果を示すロジック表である。図23に示すように、シンボリック実行によりパス#1〜パス#3で表される3つのパスが抽出され、図24に示すように、各パスに対応するパス条件及びパス出力が抽出される。
ここで、パスは実行された命令文の系列であり、パス条件はパスが終了するまでに経由する条件のうち、条件が充足可能となるシンボル値の条件式である。パスが実行可能とは、パス条件が充足可能である場合に該当する。
パス条件は、プログラムに記述されたIF文等の条件分岐文の条件式から単純に抽出されるものではなく、条件分岐文の間に実行された変数の更新結果も取り込んだものである。4番目のパスは、パス条件が「(性別=男性)∧(性別=女性)」であり、パス条件が充足不能(成立不可能)であるため、実行不可能なパスと判定され抽出されない。パス出力は、パスが実行された結果の出力である。Noは、パスを識別する番号である。
シンボリック実行によるプログラムのロジック抽出では、ロジックを漏れなく抽出するために、プログラムの実行可能なパスを網羅的に抽出する必要がある。シンボリック実行での網羅的なパス抽出には、深さ優先探索や幅優先探索に基づく方法があるが、網羅的パス抽出には、パス爆発という欠点がある。ここで、パス爆発には、以下の2つの場合がある。
(1)対象プログラムの実行可能なパス数が無限である場合。パス数が無限となるのは、プログラムにループ処理があり、かつ、ループ終了条件に記号値が含まれる場合である。この場合、ループを継続する条件が常に充足可能となるためパス数が無限となる。
(2)パス抽出処理において分析時間やメモリが制限を超過する場合。例えば、独立なIF文がN個連続しているプログラムでは、パス数は、2のN乗個となるので、Nが大きくなると、パス数は、無限ではないが、分析可能な時間やメモリが制限を超過する。
そこで、プログラムスライシング技術を用いてパス爆発を防ぐことが考えられる。プログラムスライシング技術とは、複数の処理が混在するプログラムに対して注目する処理だけを抽出する技術である。
図25は、プログラムスライシングの説明に用いるプログラム92を示す図である。図25に示すように、プログラム92にはXとYの2個の変数に関する処理があり、Xに関する処理及びYに関する処理は、それぞれ前処理とメイン処理に分けられ、混在する形式で実装されている。そこで、プログラムスライシング技術は、例えば、Xに関する処理だけを抽出する。
プログラムスライシング技術は、プログラム中のある命令文Sと変数Vをスライシング基点として、スライシング基点に影響する命令文を抽出する。スライシング基点は(S,V)の形式で記述される。プログラムスライシング技術は、プログラム中の命令文に対して制御依存関係とデータ依存関係からプログラム依存グラフを構築し、スライシング基点からこれらの依存関係を辿ることによって影響する命令文を抽出する。
図26は、プログラムスライシングの第1の例を示す図であり、図27は、プログラムスライシングの第2の例を示す図である。図26において、スライス結果#1は、対象プログラム93をスライシング基点(9,X)でスライシングした場合を示し、スライス結果#2は、対象プログラム93をスライシング基点(9,Y)でスライシングした場合を示す。なお、「9」は命令文の行を示す。また、抽出された命令文は、太字で表される。
スライス結果#1に示すように、9行目の「DISPLAY X Y Z」の変数Xに影響する命令文が抽出される。また、スライス結果#2に示すように、9行目の「DISPLAY X Y Z」の変数Yに影響する命令文が抽出される。2行目の「Y=X+1」によりYはXに依存するため、1行目の「X=X+1」も9行目の「DISPLAY X Y Z」の変数Yに影響する命令文として抽出される。
図27は、図25に示したプログラム92の23行目のCOMPUTE文をスライシング基点(23,X)とした場合のスライシング結果を示す。なお、23行目のCOMPUTE文は変数Xだけを参照更新するので、スライシング基点として変数Xを陽に指定しなくてもよい。
図27の右図では、スライシング基点3に関係しない命令文には取り消し線が引かれており、取り消し線がない命令文がスライシング基点(23,X)に影響する命令文である。プログラムスライシングを実行することにより、23行目のCOMPUTE文に影響する命令文だけを抽出できるので、デバッグ作業やテストを効率化することができる。
なお、プログラムの変数の一部に関する属性情報から、変数の依存関係を辿りつつ、他の変数の属性を推論することにより、プログラムのユーザが全ての変数について属性情報を調査する必要をなくす技術がある。この技術によれば、システムの検証モデルをソフトウェアモデルと外部環境モデルから合成する際に、ソフトウェアモデルと外部環境モデルとの入出力を整合させる手間を低減することができる。
また、2変数間の代入依存関係、データ依存関係、制御依存関係から複数ステートメント間に渡る変数依存関係をグラフとして表示することで、ソフトウェアの構成や処理概要に関する情報をユーザに提供する技術がある。
特開2014−48856号公報 特開2013−156786号公報
プログラムスライシング技術は、スライシング基点に影響する命令文を抽出できるので、シンボリック実行技術と組み合わせることによって、パス爆発を防ぐことができる。しかしながら、プログラムスライシングの結果は、実行可能なプログラムではないため、シンボリック実行に使えないという問題がある。
例えば、図27では、10行目のDISPLAY文はスライシング基点に影響しない命令文であり、この命令文には取り消し線が引かれているが、この命令文を「影響なし」として除外してしまうと、9行目のIF文のTHEN分岐の命令文が皆無となる。このため、スライシング結果のプログラムでは記述が不完全となり、スライシング結果のプログラムが「実行不可能」となる。
本発明は、1つの側面では、プログラムスライシングにより得られるプログラムをシンボリック実行することを目的とする。
1つの態様では、プログラム分析装置は、スライシング部と、復元部と、シンボリック実行部とを有する。スライシング部は、プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成する。復元部は、スライシング部により作成された命令文リストを用いてシンボリック実行が可能なプログラムを復元する。シンボリック実行部は、復元部により復元されたプログラムをシンボリック実行してロジック表を出力する。
1つの側面では、本発明は、プログラムスライシングにより得られるプログラムをシンボリック実行することができる。
図1は、実施例に係るプログラム分析装置によるプログラムの復元を説明するための図である。 図2は、実施例に係るプログラム分析装置の機能構成を示す図である。 図3は、プログラム及びスライシング基点の一例を示す図である。 図4は、スライシング部の動作例を示す図である。 図5は、復元部の動作例を示す図である。 図6は、復元されたプログラムのシンボリック実行結果を示す図である。 図7は、分岐設定部の動作例を示す図である。 図8は、分岐制御部の動作例を示す図である。 図9は、プログラム分析装置による処理のフローを示すフローチャートである。 図10は、プログラムスライシング処理のフローを示すフローチャートである。 図11は、プログラムを復元する処理のフローを示すフローチャートである。 図12は、分岐設定を行う処理のフローを示すフローチャートである。 図13は、入れ子構造の条件分岐文を有するプログラム及び制御依存関係を示す図である。 図14は、図13に示したプログラムから作成される固定選択情報の例を示す図である。 図15は、分岐制御を行う処理のフローを示すフローチャートである。 図16は、図3に示したプログラムのシンボリック実行の結果を示す図である。 図17は、図3に示したプログラムのロジック表を示す図である。 図18は、プログラム分析装置によるシンボリック実行の結果を示す第1の図である。 図19は、プログラム分析装置によるシンボリック実行の結果を示す第2の図である。 図20は、実施例に係るプログラム分析プログラムを実行するコンピュータのハードウェア構成を示す図である。 図21は、シンボリック実行の説明に用いるプログラムを示す図である。 図22は、図21に示したプログラムのフロー図である。 図23は、図21に示したプログラムのシンボリック実行により抽出されたパスを示す図である。 図24は、図21に示したプログラムのシンボリック実行による分析結果を示すロジック表である。 図25は、プログラムスライシングの説明に用いるプログラムを示す図である。 図26は、プログラムスライシングの第1の例を示す図である。 図27は、プログラムスライシングの第2の例を示す図である。
以下に、本願の開示するプログラム分析装置、プログラム分析方法及びプログラム分析プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
まず、実施例に係るプログラム分析装置によるプログラムの復元について説明する。図1は、実施例に係るプログラム分析装置によるプログラムの復元を説明するための図である。図1は、図27に示したプログラムスライシング結果から復元された実行可能なプログラムと、復元された実行可能なプログラムのフロー図を示す。
図1に示すように、実施例に係るプログラム分析装置は、プログラムの10行目と25行目にダミーの命令文であるCONTINUE文を挿入することによって、実行可能なプログラムを復元する。図27のプログラムスライシング結果では、9行目のIF文のTHEN分岐に命令文がない。このため、実施例に係るプログラム分析装置は、9行目のIF文のTHEN分岐にCONTINUE文を挿入する。同様に、図27のプログラムスライシング結果では、22行目のIF文のELSE分岐に命令文がない。このため、実施例に係るプログラム分析装置は、22行目のIF文のELSE分岐にCONTINUE文を挿入する。
このように、実施例に係るプログラム分析装置は、プログラムスライシング結果において有効な命令文がない分岐箇所にCONTINUE文を挿入することによって、実行可能なプログラムを復元することができる。
次に、実施例に係るプログラム分析装置の機能構成について説明する。図2は、実施例に係るプログラム分析装置の機能構成を示す図である。図2に示すように、実施例に係るプログラム分析装置1は、スライシング部11と、命令文リスト記憶部12と、復元部13と、復元プログラム記憶部14と、シンボリック実行部15と、分岐設定部16と、分岐制御部17とを有する。
スライシング部11は、プログラム2とスライシング基点3を入力してプログラムスライスを実行し、スライシング基点3に影響する命令文のリストを命令文リスト記憶部12に格納する。命令文リスト記憶部12は、スライシング基点3に影響する命令文のリストを記憶する。スライシング部11は、例えば、プログラム2をファイルから読み込み、ユーザが端末から入力したスライシング基点3を受け取る。命令文リスト記憶部12は、例えば、メインメモリ上の領域である。
図3は、プログラム2及びスライシング基点3の一例を示す図である。図3のプログラム2及びスライシング基点3は、図27に示したプログラム92及びスライシング基点3と同じである。
図4は、スライシング部11の動作例を示す図である。図4に示すように、スライシング部11は、例えば、図3に示したプログラム2を入力する。また、スライシング部11は、例えば、スライシング基点3として、23行目のCOMPUTE文とXの指定を受け取る。そして、スライシング部11は、スライシング基点3に影響する命令文のリストとして、9行目のIF文、13行目のADD文、22行目のIF文、23行目のCOMPUTE文を抽出する。なお、スライシング基点3に影響する命令文のリストは、図27において、取り消し線で消されていない文である。
復元部13は、スライシング基点3に影響する命令文のリストを命令文リスト記憶部12から読み出し、スライシング基点3に影響する命令文のリストを用いて実行可能なプログラムを復元する。そして、復元部13は、復元したプログラムを復元プログラム記憶部14に格納する。復元プログラム記憶部14は、復元部13により復元された実行可能プログラムを記憶する。復元プログラム記憶部14は、例えば、メインメモリ上の領域である。
図5は、復元部13の動作例を示す図である。図5に示すように、復元部13は、スライシング基点3に影響する命令文のリストにおいて命令文がない行番号10と行番号25の分岐箇所にダミー命令文としてCONTINUE文を挿入した中間データを作成し、中間データを用いて実行可能なプログラムを復元する。ここで、ダミー命令文とは、何も実行しない命令文である。図5の復元されたプログラムは、行番号10と行番号25の分岐箇所にCONTINUE文が挿入されることによって、実行可能なプログラムとなっている。
シンボリック実行部15は、復元部13により復元されたプログラムを復元プログラム記憶部14から読み出し、シンボリック実行を行う。そして、シンボリック実行部15は、ロジック表4を出力する。復元部13は、ロジック表4を表示装置に表示してもよいし、ファイルに出力してもよい。
ユーザは、ロジック表4を用いてプログラム2のロジックを簡単に理解することができる。すなわち、ロジック表4は、どのような条件のパスにおいてどのような出力が得られるかをユーザが理解することを支援する。したがって、プログラム分析装置1は、既存の情報システムの保守や再構築の作業を支援することができる。
図6は、復元されたプログラムのシンボリック実行結果を示す図である。図6は、復元されたプログラムのフロー図及び抽出されたパスと、ロジック表4を示す。図6に示すように、シンボリック実行により3つのパスが抽出される。パス#1については、パス条件は(X > 0)であり、パス出力は(X + 1)である。パス#2については、パス条件は(X NOT > 0) AND ((X + 10) > 0)であり、パス出力は((X + 10) + 1)である。パス#3については、パス条件は(X NOT > 0) AND ((X + 10) NOT > 0)であり、パス出力は(X + 10)である。
図6では、スライシング基点(23,X)を通過しないパス#3が含まれている。すなわち、プログラムスライス後に復元部13によって復元されたプログラムをそのままシンボリック実行すると、スライシング基点3を通過しないパスも抽出され、パスの個数削減が不十分となる。その理由は、スライシング基点(23,X)が22行目のIF文に制御依存するためである。すなわち、スライシング基点(23,X)に到達するためには、22行目のIF文において固定的にTHEN分岐が選択されなければならないが、シンボリック実行では、ELSE分岐も選択されてしまう。
そこで、プログラム分析装置1は、スライシング基点3が条件分岐文に制御依存する場合、スライシング基点3に到達する分岐を固定的に選択するための情報を条件分岐文に設定する。そして、プログラム分析装置1は、復元部13によって復元されたプログラムをシンボリック実行して実行可能なパスを抽出する際に、条件分岐文に設定した情報に基づいて分岐の選択を制御する。このように、スライシング基点3を通過するパスだけを限定して抽出することによって、プログラム分析装置1は、抽出するパスの個数を減らすことができる。
分岐設定部16は、スライシング基点3が条件分岐文に制御依存するか否かを制御依存関係に基づいて判定し、制御依存する場合に、スライシング基点3に到達する分岐を固定的に選択するための情報を条件分岐文に設定する。
図7は、分岐設定部16の動作例を示す図である。図7において、固定選択情報は、固定選択の条件分岐文と選択される分岐の情報である。図7に示すように、分岐設定部16は、プログラム2、制御依存関係及びスライシング基点3を入力し、固定選択情報を出力する。図7では、固定選択の条件分岐文として22行目のIF文が出力され、選択される分岐としてTHEN分岐が出力されている。
なお、分岐設定部16は、ELSEがないIF文で、THEN分岐以外の分岐が固定選択となった場合は、分岐としてELSE分岐を出力する。また、分岐設定部16は、COBOLのEVALUATE文の場合は、分岐がどのWHENであるかを特定できる情報を設定する。分岐がどのWHENであるかを特定できる情報としては、例えば、「50行目のWHEN」がある。
分岐制御部17は、プログラムスライシング結果から復元されたプログラムをシンボリック実行部15がシンボリック実行して実行可能なパスを抽出する際に、固定選択情報に基づいて、分岐の選択を制御する。
条件分岐の条件の真偽値が確定であり、その真偽値で選択される分岐が固定選択された分岐と同じ場合には、分岐制御部17は、固定選択された分岐を選択する。また、条件分岐の条件の真偽値が確定であり、その真偽値で選択される分岐が固定選択された分岐と異なる場合は、分岐制御部17は、シンボリック実行中のパスを棄却し、バックトラックをシンボリック実行部15に指示する。ここで、バックトラックとは、1つ前の条件分岐まで戻り、別の分岐を選択することである。また、条件分岐の条件の真偽値が不定であり、複数分岐が選択可能な場合は、分岐制御部17は、固定選択された分岐を選択する。
図8は、分岐制御部17の動作例を示す図である。図8に示すように、分岐制御部17の出力は、出力#1)条件分岐文で選択する分岐、又は、出力#2)バックトラック指示であり、固定選択の分岐はTHEN分岐である。そして、シンボリック実行による22行目のIF文の条件(X>0)の判定結果が真偽値不定であり充足可能な場合には、分岐制御部17は、THEN分岐を選択する。また、シンボリック実行による22行目のIF文の条件!(X>0)の判定結果が真偽値不定であり充足可能な場合にも、分岐制御部17は、THEN分岐を選択する。したがって、この例では、バックトラック指示の場合はない。
次に、プログラム分析装置1による処理のフローについて説明する。図9は、プログラム分析装置1による処理のフローを示すフローチャートである。図9に示すように、プログラム分析装置1は、分析対象のプログラム2とスライシング基点3を入力する(ステップS1)。そして、プログラム分析装置1は、プログラム2に対して、スライシング基点3から、プログラムスライシング処理を実行し(ステップS2)、プログラム復元によって、プログラムスライシングの実行結果から、実行可能なプログラムを復元する(ステップS3)。
そして、プログラム分析装置1は、スライシング基点3が条件分岐文に制御依存するかを判定し、制御依存すると判定した場合に、スライシング基点3を含む分岐を固定的に選択するための固定選択情報を作成する(ステップS4)。そして、プログラム分析装置1は、固定選択情報に基づいて分岐選択とバックトラックを制御しながら復元プログラムをシンボリック実行して実行可能なパスを抽出する(ステップS5)。そして、プログラム分析装置1は、抽出したパスについてロジック表4を出力する(ステップS6)。
このように、プログラム分析装置1は、プログラムスライシングにより得られたプログラムを復元することによって、シンボリック実行を可能とすることができる。また、プログラム分析装置1は、固定選択情報を作成し、固定選択情報に基づいてシンボリック実行を制御することで、スライシング基点3を通過しないパスの抽出を防ぐことができる。
図10は、プログラムスライシング処理のフローを示すフローチャートである。なお、図10の処理は、図9に示したステップS2の処理に対応する。図10に示すように、スライシング部11は、プログラム2をパース(構文解析)し、構造木を構築する(ステップS11)。
そして、スライシング部11は、構造木の命令文の間で、制御依存関係とデータ依存関係を構築し(ステップS12)、スライシング基点3から制御依存関係とデータ依存関係を辿り、途中の命令文を収集する(ステップS13)。そして、スライシング部11は、収集した命令文を命令文リスト記憶部12に格納する(ステップS14)。
このように、スライシング部11がスライシング基点3に基づいてプログラム2をスライシングすることによって、シンボリック実行によるパス爆発を防ぐことができる。
図11は、プログラムを復元する処理のフローを示すフローチャートである。なお、図11の処理は、図9に示したステップS3の処理に対応する。図11に示すように、復元部13は、命令文リスト記憶部12から順に命令文を1つ読み出し(ステップS21)、未処理の命令文があるか否かを判定する(ステップS22)。
そして、復元部13は、未処理の命令文がある場合には、命令文が条件分岐文か否かを判定し(ステップS23)、命令文が条件分岐文でない場合には、ステップS21に戻る。一方、命令文が条件分岐文の場合には、復元部13は、条件分岐文の分岐に有効な命令文がないか否かを判定し(ステップS24)、条件分岐文の分岐に有効な命令文がある場合には、ステップS21に戻る。
一方、条件分岐文の分岐に有効な命令文がない場合には、復元部13は、ダミー命令文を追加リストに追加し(ステップS25)、ステップS21に戻る。また、ステップS22において、未処理の命令文がない場合には、復元部13は、命令文リストと追加リストから実行可能なプログラムを復元する(ステップS26)。
このように、復元部13は、条件分岐文の分岐に有効な命令文がない場合にダミー命令文を追加することによって、実行可能なプログラムを復元することができる。
図12は、分岐設定を行う処理のフローを示すフローチャートである。なお、図12の処理は、図9に示したステップS4の処理に対応する。図12に示すように、分岐設定部16は、プログラム2及びスライシング基点3を入力し、制御依存関係をスライシング部11から受け取る(ステップS31)。
そして、分岐設定部16は、スライシング基点3の命令文を指定命令文として、固定分岐を分析して設定する固定分岐分析処理を行い(ステップS32)、固定選択の条件分岐文と分岐の情報を分岐制御部17に渡す(ステップS33)。
また、分岐設定部16は、固定分岐分析処理において、指定命令文から制御依存関係を辿り、制御依存関係において1つ前の命令文を取得する(ステップS41)。そして、分岐設定部16は、命令文があり、かつ、条件分岐文であるか否かを判定し(ステップS42)、命令文がない場合、又は、条件分岐文でない場合には、固定分岐分析処理を終了する。
一方、命令文があり、かつ、条件分岐文である場合には、分岐設定部16は、条件分岐文Cの分岐Bi(i=1,2,・・・,N:Nは分岐数)を取得して、i=1とする(ステップS43)。そして、分岐設定部16は、iがN以下であるか否かを判定し(ステップS44)、iがN以下でない場合には、固定分岐分析処理を終了する。
一方、iがN以下である場合には、分岐設定部16は、指定命令文が分岐Bi内か否かを判定し(ステップS45)、指定命令文が分岐Bi内の場合には、条件分岐文Cの分岐Biを固定分岐と設定する(ステップS46)。そして、分岐設定部16は、条件分岐文Cを指定命令文として、固定分岐分析処理を行い(ステップS47)、iに1を加え(ステップS48)、ステップS44に戻る。また、ステップS45において指定命令文が分岐Bi内でない場合には、iに1を加え(ステップS48)、ステップS44に戻る。
このように、分岐設定部16は、固定分岐分析処理を再帰的に呼び出すことによって、固定選択情報を作成することができる。なお、固定分岐分析処理を再帰的に呼び出す理由は、条件分岐文の入れ子構造に対応するためである。図13は、入れ子構造の条件分岐文を有するプログラム2及び制御依存関係を示す図であり、図14は、図13に示したプログラム2から作成される固定選択情報の例を示す図である。
図13に示すように、例えば、21行目のCOMPUTE文は20行目のIF文に制御依存し、20行目のIF文は10行目のIF文に制御依存する。このため、21行目のCOMPUTE文と変数Xをスライシング基点3とすると、図14に示すように、固定選択情報には、条件分岐文と分岐の2つの組が含まれる。具体的には、21行目のCOMPUTE文を指定命令文とした場合に20行目のIF文を条件分岐文として分岐をTHEN分岐とする組と、20行目のIF文を指定命令文とした場合に10行目のIF文を条件分岐文として分岐をELSE分岐とする組が含まれる。
この固定選択情報を、分岐設定部16は、以下のような処理手順により作成する。まず、分岐設定部16は、図12のステップS31において、プログラム2及びスライシング基点3を入力し、制御依存関係の情報をスライシング部11から受け取る。そして、分岐設定部16は、ステップS32において、21行目のCOMPUTE文を指定命令文として固定分岐分析処理を呼び出す。
そして、分岐設定部16は、ステップS41において、制御依存を辿り命令文として20行目のIF文を取得し、ステップS42において、20行目のIF文が条件分岐文であるか否かを判定する。そして、20行目のIF文が条件分岐文であるので、分岐設定部16は、ステップS43において、B1を20行目のIF文のTHEN分岐とし、B2を20行目のIF文のELSE分岐とする。
そして、分岐設定部16は、ステップS45において、21行目のCOMPUTE文がB1内か否かを判定し、B1内にあるので、ステップS46において、20行目のIF文のTHEN分岐を固定分岐と設定する。そして、分岐設定部16は、ステップS47において、20行目のIF文を指定命令文として固定分岐分析処理を呼び出す。
そして、分岐設定部16は、ステップS41において、制御依存を辿り命令文として10行目のIF文を取得し、ステップS42において、10行目のIF文が条件分岐文であるか否かを判定する。そして、10行目のIF文が条件分岐文であるので、分岐設定部16は、ステップS43において、B1を10行目のIF文のTHEN分岐とし、B2を10行目のIF文のELSE分岐とする。
そして、分岐設定部16は、ステップS45において、20行目のIF文がB1内か否かを判定し、B1内ではないので、ステップS48において、iに1を加え、ステップS45において、20行目のIF文がB2内か否かを判定する。そして、分岐設定部16は、20行目のIF文はB2内にあるので、ステップS46において、10行目のIF文のELSE分岐を固定分岐と設定する。
その後、分岐設定部16は、ステップS47の固定分岐分析処理を終了し、ステップS32の固定分岐分析処理を終了する。そして、分岐設定部16は、ステップS33において、固定選択情報を分岐制御部17に渡す。
図15は、分岐制御を行う処理のフローを示すフローチャートである。なお、図15の処理は、図9に示したステップS5の処理に含まれる。図15に示すように、分岐制御部17は、固定選択情報に含まれる条件分岐文に関して、シンボリック実行部15によるシンボリック実行の条件判定で複数分岐が選択可能か否かを判定する(ステップS51)。
そして、分岐制御部17は、複数分岐が選択可能である場合には、固定選択情報の分岐を選択し(ステップS52)、複数分岐が選択可能でない場合には、選択される分岐が固定選択情報の分岐と同じか否かを判定する(ステップS53)。そして、分岐制御部17は、選択される分岐が固定選択情報の分岐と同じである場合には、当該分岐を選択し(ステップS54)、固定選択情報の分岐と同じでない場合には、シンボリック実行部15にバックトラックを指示する(ステップS55)。
このように、分岐制御部17は、固定選択情報に基づいてシンボリック実行の分岐を制御することによって、スライシング基点3を通過しないパスの抽出を防ぐことができる。
次に、プログラム分析装置1の効果について図16〜図19を用いて説明する。図16は、図3に示したプログラム2のシンボリック実行の結果を示す図である。図16は、プログラムスライシングを行うことなくプログラム2をシンボリック実行した場合を示す。図16に示すように、プログラムスライシングを行わない場合には、9個のパスがシンボリック実行によって抽出される。
図17は、図3に示したプログラム2のロジック表4を示す図である。図17(a)は、変数Xに関するロジック表4を示し、図17(b)は、変数Yに関するロジック表4を示す。すなわち、変数Xに関してプログラムスライシングが行われ、スライシング基点3が条件分岐文に依存しない場合には、図17(a)に示すロジック表4が得られる。また、変数Yに関してプログラムスライシングが行われ、スライシング基点3が条件分岐文に依存しない場合には、図17(b)に示すロジック表4が得られる。
図18及び図19は、プログラム分析装置1によるシンボリック実行の結果を示す図である。図18は、スライシング基点(23,X)の場合を示し、図19は、スライシング基点(25,X)の場合を示す。図18及び図19に示すように、プログラム分析装置1は、スライシング結果をシンボリック実行することができる。
また、図18を図16と比較すると、抽出されたパスの数が9から2に減っている。また、図18を図6と比較すると、スライシング基点(23,X)を通過しないパス#3が抽出されていないことがわかる。また、図18と図19のロジック表4を合わせると、図6に示すロジック表4と同じとなり、プログラム分析装置1は、固定選択情報を用いない場合と同じロジック表4を作成することがわかる。
上述してきたように、実施例では、スライシング部11が、スライシング基点3に基づいてプログラム2から命令文を抽出し、命令文リストを作成して命令文リスト記憶部12に格納する。そして、復元部13が、命令文リスト記憶部12から命令文リストを読み出して実行可能なプログラムを復元し、復元プログラム記憶部14に格納する。そして、シンボリック実行部15が復元プログラム記憶部14からプログラムを読み出してシンボリック実行する。したがって、プログラム分析装置1は、プログラムスライシングにより得られるプログラムをシンボリック実行することができる。
また、実施例では、分岐設定部16が固定選択情報を作成して分岐制御部17に渡し、シンボリック実行部15がシンボリック実行を行う際に、分岐制御部17が、固有選択情報を用いてシンボリック実行の分岐を制御する。したがって、プログラム分析装置1は、スライシング基点3を通過しないパスがシンボリック実行により抽出されることを防ぐことができる。
また、実施例では、分岐制御部17は、シンボリック実行において、条件分岐文の条件の真偽値が不定であり、複数分岐が選択可能な場合には、固定選択情報に含まれる分岐を選択する。また、分岐制御部17は、シンボリック実行において、条件分岐文の条件の真偽値が確定であり、真偽値に基づいて選択される分岐が固定選択情報に含まれる分岐と同じである場合には、固定選択情報に含まれる分岐を選択する。また、分岐制御部17は、シンボリック実行において、条件分岐文の条件の真偽値が確定であり、真偽値に基づいて選択される分岐が固定選択情報に含まれる分岐と異なる場合には、シンボリック実行部15にバックトラックを指示する。したがって、分岐制御部17は、スライシング基点3を通過しないパスを抽出しないように、シンボリック実行を制御することができる。
また、実施例では、入れ子構造の条件分岐文の内側の条件分岐文のいずれかの分岐にスライシング基点3が含まれる場合に、分岐設定部16は、固定分岐分析処理を再帰的に呼び出して固定選択情報を作成する。したがって、プログラム分析装置1は、条件分岐文が入れ子構造を有するプログラム2に関しても、スライシング基点3を通過しないパスがシンボリック実行により抽出されることを防ぐことができる。
また、実施例では、復元部13は、条件分岐文の分岐に有効な命令文があるか否かを判定し、条件分岐文の分岐に有効な命令文がない場合に、ダミー命令文を挿入するので、シンボリック実行が可能なプログラムを復元することができる。
なお、実施例では、プログラム分析装置1について説明したが、プログラム分析装置1が有する構成をソフトウェアによって実現することで、同様の機能を有するプログラム分析プログラムを得ることができる。そこで、プログラム分析プログラムを実行するコンピュータについて説明する。
図20は、実施例に係るプログラム分析プログラムを実行するコンピュータのハードウェア構成を示す図である。図20に示すように、コンピュータ50は、メインメモリ51と、CPU(Central Processing Unit)52と、LAN(Local Area Network)インタフェース53と、HDD(Hard Disk Drive)54とを有する。また、コンピュータ50は、スーパーIO(Input Output)55と、DVI(Digital Visual Interface)56と、ODD(Optical Disk Drive)57とを有する。
メインメモリ51は、プログラムやプログラムの実行途中結果などを記憶するメモリである。CPU52は、メインメモリ51からプログラムを読み出して実行する中央処理装置である。CPU52は、メモリコントローラを有するチップセットを含む。
LANインタフェース53は、コンピュータ50をLAN経由で他のコンピュータに接続するためのインタフェースである。HDD54は、プログラムやデータを格納するディスク装置であり、スーパーIO55は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。DVI56は、液晶表示装置を接続するインタフェースであり、ODD57は、DVDの読み書きを行う装置である。
LANインタフェース53は、PCIエクスプレス(PCIe)によりCPU52に接続され、HDD54及びODD57は、SATA(Serial Advanced Technology Attachment)によりCPU52に接続される。スーパーIO55は、LPC(Low Pin Count)によりCPU52に接続される。
そして、コンピュータ50において実行されるプログラム分析プログラムは、DVDに記憶され、ODD57によってDVDから読み出されてコンピュータ50にインストールされる。あるいは、プログラム分析プログラムは、LANインタフェース53を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ50にインストールされる。そして、インストールされたプログラム分析プログラムは、HDD54に記憶され、メインメモリ51に読み出されてCPU52によって実行される。
また、実施例では、COBOLで記述されたプログラム2を対象とする場合について説明したが、本発明はこれに限定されるものではなく、他のプログラミング言語で記述されたプログラムを対象とする場合にも同様に適用することができる。
1 プログラム分析装置
2,91,92 プログラム
3 スライシング基点
4 ロジック表
11 スライシング部
12 命令文リスト記憶部
13 復元部
14 復元プログラム記憶部
15 シンボリック実行部
16 分岐設定部
17 分岐制御部
50 コンピュータ
51 メインメモリ
52 CPU
53 LANインタフェース
54 HDD
55 スーパーIO
56 DVI
57 ODD
93 対象プログラム

Claims (7)

  1. プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成するスライシング部と、
    前記スライシング部により作成された命令文リストを用いてシンボリック実行が可能なプログラムを復元する復元部と、
    前記復元部により復元されたプログラムをシンボリック実行してロジック表を出力するシンボリック実行部と
    を有することを特徴とするプログラム分析装置。
  2. 前記スライシング基点が条件分岐文のいずれかの分岐に含まれるか否かを判定し、いずれかの分岐に含まれる場合には、前記条件分岐文と前記分岐に関する情報を含む固定選択情報として作成する固定選択情報作成部と、
    前記復元部により復元されたプログラムが前記シンボリック実行部により実行される際に、前記固定選択情報作成部により作成された固定選択情報に基づいて、シンボリック実行の分岐を制御する分岐制御部と
    をさらに有することを特徴とする請求項1に記載のプログラム分析装置。
  3. 前記分岐制御部は、シンボリック実行において、前記条件分岐文の条件の真偽値が不定であり、複数分岐が選択可能な場合には、前記固定選択情報に含まれる分岐を選択し、前記条件分岐文の条件の真偽値が確定であり、該真偽値に基づいて選択される分岐が前記固定選択情報に含まれる分岐と同じである場合には、前記固定選択情報に含まれる分岐を選択し、前記条件分岐文の条件の真偽値が確定であり、該真偽値に基づいて選択される分岐が前記固定選択情報に含まれる分岐と異なる場合には、前記シンボリック実行部にバックトラックを指示することを特徴とする請求項2に記載のプログラム分析装置。
  4. 前記固定選択情報作成部は、前記スライシング基点で指定される命令文が、入れ子構造の条件分岐文の内側の条件分岐文のいずれかの分岐に含まれる場合には、外側と内側の条件分岐文について分岐に関する情報を含む固定選択情報を作成し、
    前記分岐制御部は、外側と内側の条件分岐文について分岐に関する情報を含む固定選択情報に基づいて、シンボリック実行の分岐を複数制御することを特徴とする請求項2又は3に記載のプログラム分析装置。
  5. 前記復元部は、条件分岐文の分岐に有効な命令文があるか否かを判定し、条件分岐文の分岐に有効な命令文がない場合に、ダミー命令文を挿入することによってシンボリック実行が可能なプログラムを復元することを特徴とする請求項1〜4のいずれか1つに記載のプログラム分析装置。
  6. コンピュータが、
    プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成し、
    作成した命令文リストを用いてシンボリック実行が可能なプログラムを復元し、
    復元したプログラムをシンボリック実行してロジック表を出力する
    処理を実行することを特徴とするプログラム分析方法。
  7. コンピュータに、
    プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成し、
    作成した命令文リストを用いてシンボリック実行が可能なプログラムを復元し、
    復元したプログラムをシンボリック実行してロジック表を出力する
    処理を実行させることを特徴とするプログラム分析プログラム。
JP2017039644A 2017-03-02 2017-03-02 プログラム分析装置、プログラム分析方法及びプログラム分析プログラム Active JP6790921B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2017039644A JP6790921B2 (ja) 2017-03-02 2017-03-02 プログラム分析装置、プログラム分析方法及びプログラム分析プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017039644A JP6790921B2 (ja) 2017-03-02 2017-03-02 プログラム分析装置、プログラム分析方法及びプログラム分析プログラム

Publications (2)

Publication Number Publication Date
JP2018147106A JP2018147106A (ja) 2018-09-20
JP6790921B2 true JP6790921B2 (ja) 2020-11-25

Family

ID=63592136

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017039644A Active JP6790921B2 (ja) 2017-03-02 2017-03-02 プログラム分析装置、プログラム分析方法及びプログラム分析プログラム

Country Status (1)

Country Link
JP (1) JP6790921B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP7077909B2 (ja) * 2018-10-22 2022-05-31 富士通株式会社 デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置
CN111475420B (zh) * 2020-05-08 2023-04-28 中国人民解放军国防科技大学 一种基于数值抽象的程序资源使用量自动分析方法

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006178835A (ja) * 2004-12-24 2006-07-06 Internatl Business Mach Corp <Ibm> プログラム解析装置、その解析方法及びプログラム
JP5775829B2 (ja) * 2012-01-30 2015-09-09 日立オートモティブシステムズ株式会社 ソフトウェアの構造可視化プログラムおよびシステム
JP6032095B2 (ja) * 2013-03-27 2016-11-24 富士通株式会社 テストケース生成方法、テストケース生成装置、およびテストケース生成プログラム
CN103559122B (zh) * 2013-10-14 2016-04-27 西安交通大学 基于程序行为切片的测试案例约减方法
JP6245006B2 (ja) * 2014-03-13 2017-12-13 富士通株式会社 テストケース生成装置、方法、及びプログラム

Also Published As

Publication number Publication date
JP2018147106A (ja) 2018-09-20

Similar Documents

Publication Publication Date Title
US8225288B2 (en) Model-based testing using branches, decisions, and options
JP4395761B2 (ja) プログラムテスト支援装置およびその方法
CN109313547B (zh) 用于cpu利用率和代码重构的查询优化器
KR101623174B1 (ko) 소스 코드 분석 장치, 이를 위한 컴퓨터 프로그램, 그 기록매체
JP5450840B2 (ja) プログラムの実行性能評価のためのテストデータ生成方法
JPWO2009098739A1 (ja) プログラム最適化装置およびプログラム最適化方法
JP7077909B2 (ja) デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置
JP4001286B2 (ja) プログラム保守支援装置、プログラム保守支援方法、およびプログラム
JP6790921B2 (ja) プログラム分析装置、プログラム分析方法及びプログラム分析プログラム
CN112231197A (zh) 一种页面测试的方法、装置和存储介质
JP2016048506A (ja) ログメッセージのフォーマットを推定する方法、並びに、その為のコンピュータ及びコンピュータ・プログラム
US12001325B2 (en) Test data generation apparatus, test data generation method and program
JP5440287B2 (ja) シンボリック実行支援プログラム、方法及び装置
US20220214963A1 (en) Analysis apparatus, analysis method and program
WO2019225366A1 (ja) 画面判別装置、画面判別方法及びプログラム
JP5067317B2 (ja) 検証支援プログラム、検証支援装置、および検証支援方法
US9858113B2 (en) Creating execution flow by associating execution component information with task name
US20220164523A1 (en) Resembling transition identifying apparatus, resembling transition identifying method and program
JP4888663B2 (ja) 検証用プログラム自動生成装置、その方法及びプログラム
JP2018124901A (ja) プログラム分析装置、プログラム分析方法及びプログラム分析プログラム
CN113238967A (zh) 测试案例的生成方法及装置
WO2021205589A1 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム
JP5755861B2 (ja) テストケース生成装置、テストケース生成方法およびテストケース生成プログラム
JP6111150B2 (ja) ソースコード解析装置、ソースコード解析方法、及びプログラム
US9311081B2 (en) Generating and employing operational abstractions of transforms

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20191112

TRDD Decision of grant or rejection written
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20200930

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20201006

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20201019

R150 Certificate of patent or registration of utility model

Ref document number: 6790921

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150