(57)【要約】      （修正有）【課題】プログラムスライシングにより得られるプログラムをシンボリック実行するプログラム分析装置、プログラム分析方法及びプログラム分析プログラムを提供する。【解決手段】スライシング部１１が、スライシング基点３に基づいてプログラム２から命令文を抽出し、命令文リストを作成して命令文リスト記憶部１２に格納する。そして、復元部１３が、命令文リスト記憶部１２から命令文リストを読み出して実行可能なプログラムを復元し、復元プログラム記憶部１４に格納する。そして、シンボリック実行部１５が復元プログラム記憶部１４からプログラムを読み出してシンボリック実行する。【選択図】図２
2018147106.tif 000002
【特許請求の範囲】
【請求項１】
プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成するスライシング部と、
前記スライシング部により作成された命令文リストを用いてシンボリック実行が可能なプログラムを復元する復元部と、
前記復元部により復元されたプログラムをシンボリック実行してロジック表を出力するシンボリック実行部と
を有することを特徴とするプログラム分析装置。
【請求項２】
前記スライシング基点が条件分岐文のいずれかの分岐に含まれるか否かを判定し、いずれかの分岐に含まれる場合には、前記条件分岐文と前記分岐に関する情報を含む固定選択情報として作成する固定選択情報作成部と、
前記復元部により復元されたプログラムが前記シンボリック実行部により実行される際に、前記固定選択情報作成部により作成された固定選択情報に基づいて、シンボリック実行の分岐を制御する分岐制御部と
をさらに有することを特徴とする請求項１に記載のプログラム分析装置。
【請求項３】
前記分岐制御部は、シンボリック実行において、前記条件分岐文の条件の真偽値が不定であり、複数分岐が選択可能な場合には、前記固定選択情報に含まれる分岐を選択し、前記条件分岐文の条件の真偽値が確定であり、該真偽値に基づいて選択される分岐が前記固定選択情報に含まれる分岐と同じである場合には、前記固定選択情報に含まれる分岐を選択し、前記条件分岐文の条件の真偽値が確定であり、該真偽値に基づいて選択される分岐が前記固定選択情報に含まれる分岐と異なる場合には、前記シンボリック実行部にバックトラックを指示することを特徴とする請求項２に記載のプログラム分析装置。
【請求項４】
前記固定選択情報作成部は、前記スライシング基点で指定される命令文が、入れ子構造の条件分岐文の内側の条件分岐文のいずれかの分岐に含まれる場合には、外側と内側の条件分岐文について分岐に関する情報を含む固定選択情報を作成し、
前記分岐制御部は、外側と内側の条件分岐文について分岐に関する情報を含む固定選択情報に基づいて、シンボリック実行の分岐を複数制御することを特徴とする請求項２又は３に記載のプログラム分析装置。
【請求項５】
前記復元部は、条件分岐文の分岐に有効な命令文があるか否かを判定し、条件分岐文の分岐に有効な命令文がない場合に、ダミー命令文を挿入することによってシンボリック実行が可能なプログラムを復元することを特徴とする請求項１〜４のいずれか１つに記載のプログラム分析装置。
【請求項６】
コンピュータが、
プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成し、
作成した命令文リストを用いてシンボリック実行が可能なプログラムを復元し、
復元したプログラムをシンボリック実行してロジック表を出力する
処理を実行することを特徴とするプログラム分析方法。
【請求項７】
コンピュータに、
プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成し、
作成した命令文リストを用いてシンボリック実行が可能なプログラムを復元し、
復元したプログラムをシンボリック実行してロジック表を出力する
処理を実行させることを特徴とするプログラム分析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム分析装置、プログラム分析方法及びプログラム分析プログラムに関する。
【背景技術】
【０００２】
既存の情報システムの保守や再構築の作業では、既存システムの現状を理解し把握するため、既存システムに関するドキュメントや有識者の知識などの情報が必要である。しかし、長期に運用保守された情報システムでは、ドキュメントの不備や有識者の不在などの要因により、保守や再構築の作業に必要な情報が不足することがある。
【０００３】
このような場合、ドキュメントや有識者から得られる情報の代替として、情報システムの実装実体であるプログラムを分析することによって、不足する知識を補うことが行われる。このようなプログラムの分析は、プログラムのロジック抽出と呼ばれる。ここで、プログラムのロジックとは、プログラムに記述された処理の内容であり、具体的には、プログラムの実行結果としての入出力関係である。
【０００４】
プログラムのロジック抽出の方式の１つに、シンボリック実行（Symbolic  Execution、記号実行）技術を利用する手法がある。ここで、シンボリック実行は、入力変数にシンボル値（記号値）を設定して、プログラムの実行可能なパスを抽出することによって、プログラムを分析する技術である。
【０００５】
シンボリック実行技術は、プログラムに記述された命令文に従って変数値の参照と更新を行い、条件分岐文やループ文のような制御文ではプログラム記述通りに命令文の実行を制御する。特に、条件分岐では条件式の真偽値に従って分岐が選択されるが、シンボリック実行技術は、条件式を構成する変数値にシンボル値が含まれる場合は条件式の真偽値を算出できない。
【０００６】
このため、シンボリック実行技術は、代わりに条件式の充足可能性（条件式が真となりうること）を判定して条件分岐の分岐選択を制御する。充足可能性の判定には、ＳＭＴ（Satisfiability  Modulo  Theories）ソルバやＳＡＴ（SATisfiability  problem）ソルバが利用される。条件分岐の複数の分岐が充足可能な場合は、これら複数の分岐は共に実行可能なので、シンボリック実行技術は、複数の分岐のうち順に１つを仮定し選択することによって、実行可能パスを抽出する。
【０００７】
シンボリック実行の分析結果は、実行可能なパス毎の、パス条件とパス出力である。これらの結果を整理し、分析対象プログラムから仕様抽出した結果の１つ形式がロジック表、あるいは、決定表である。ロジック表は、入力に関する条件とその条件が満たされた場合の出力を表す。
【０００８】
以下、シンボリック実行を利用したプログラムのロジック抽出の動作例について説明する。図２１は、シンボリック実行の説明に用いるプログラム９１を示す図である。図２１は、ＣＯＢＯＬで記述されたプログラム９１を示す。図２１に示すように、プログラム９１には、１４行目と１９行目にそれぞれＩＦ文＃１及びＩＦ文＃２で示されるＩＦ文がある。
【０００９】
図２２は、図２１に示したプログラム９１のフロー図である。図２２に示すように、フロー図は、プログラム９１の条件による分岐構造と各分岐における処理内容を表す。例えば、プログラム９１のＩＦ文＃１に対応して分岐条件「性別＝男性」に基づく２つの分岐の処理内容は、それぞれ「出力＝‘Ｍ’」と「出力＝‘’」である。
【００１０】
図２３は、図２１に示したプログラム９１のシンボリック実行により抽出されたパスを示す図であり、図２４は、図２１に示したプログラム９１のシンボリック実行による分析結果を示すロジック表である。図２３に示すように、シンボリック実行によりパス＃１〜パス＃３で表される３つのパスが抽出され、図２４に示すように、各パスに対応するパス条件及びパス出力が抽出される。
【００１１】
ここで、パスは実行された命令文の系列であり、パス条件はパスが終了するまでに経由する条件のうち、条件が充足可能となるシンボル値の条件式である。パスが実行可能とは、パス条件が充足可能である場合に該当する。
【００１２】
パス条件は、プログラムに記述されたＩＦ文等の条件分岐文の条件式から単純に抽出されるものではなく、条件分岐文の間に実行された変数の更新結果も取り込んだものである。４番目のパスは、パス条件が「（性別＝男性）∧（性別＝女性）」であり、パス条件が充足不能（成立不可能）であるため、実行不可能なパスと判定され抽出されない。パス出力は、パスが実行された結果の出力である。Ｎｏは、パスを識別する番号である。
【００１３】
シンボリック実行によるプログラムのロジック抽出では、ロジックを漏れなく抽出するために、プログラムの実行可能なパスを網羅的に抽出する必要がある。シンボリック実行での網羅的なパス抽出には、深さ優先探索や幅優先探索に基づく方法があるが、網羅的パス抽出には、パス爆発という欠点がある。ここで、パス爆発には、以下の２つの場合がある。
【００１４】
（１）対象プログラムの実行可能なパス数が無限である場合。パス数が無限となるのは、プログラムにループ処理があり、かつ、ループ終了条件に記号値が含まれる場合である。この場合、ループを継続する条件が常に充足可能となるためパス数が無限となる。
【００１５】
（２）パス抽出処理において分析時間やメモリが制限を超過する場合。例えば、独立なＩＦ文がＮ個連続しているプログラムでは、パス数は、２のＮ乗個となるので、Ｎが大きくなると、パス数は、無限ではないが、分析可能な時間やメモリが制限を超過する。
【００１６】
そこで、プログラムスライシング技術を用いてパス爆発を防ぐことが考えられる。プログラムスライシング技術とは、複数の処理が混在するプログラムに対して注目する処理だけを抽出する技術である。
【００１７】
図２５は、プログラムスライシングの説明に用いるプログラム９２を示す図である。図２５に示すように、プログラム９２にはＸとＹの２個の変数に関する処理があり、Ｘに関する処理及びＹに関する処理は、それぞれ前処理とメイン処理に分けられ、混在する形式で実装されている。そこで、プログラムスライシング技術は、例えば、Ｘに関する処理だけを抽出する。
【００１８】
プログラムスライシング技術は、プログラム中のある命令文Ｓと変数Ｖをスライシング基点として、スライシング基点に影響する命令文を抽出する。スライシング基点は（Ｓ，Ｖ）の形式で記述される。プログラムスライシング技術は、プログラム中の命令文に対して制御依存関係とデータ依存関係からプログラム依存グラフを構築し、スライシング基点からこれらの依存関係を辿ることによって影響する命令文を抽出する。
【００１９】
図２６は、プログラムスライシングの第１の例を示す図であり、図２７は、プログラムスライシングの第２の例を示す図である。図２６において、スライス結果＃１は、対象プログラム９３をスライシング基点（９，Ｘ）でスライシングした場合を示し、スライス結果＃２は、対象プログラム９３をスライシング基点（９，Ｙ）でスライシングした場合を示す。なお、「９」は命令文の行を示す。また、抽出された命令文は、太字で表される。
【００２０】
スライス結果＃１に示すように、９行目の「ＤＩＳＰＬＡＹ  Ｘ  Ｙ  Ｚ」の変数Ｘに影響する命令文が抽出される。また、スライス結果＃２に示すように、９行目の「ＤＩＳＰＬＡＹ  Ｘ  Ｙ  Ｚ」の変数Ｙに影響する命令文が抽出される。２行目の「Ｙ＝Ｘ＋１」によりＹはＸに依存するため、１行目の「Ｘ＝Ｘ＋１」も９行目の「ＤＩＳＰＬＡＹ  Ｘ  Ｙ  Ｚ」の変数Ｙに影響する命令文として抽出される。
【００２１】
図２７は、図２５に示したプログラム９２の２３行目のＣＯＭＰＵＴＥ文をスライシング基点（２３，Ｘ）とした場合のスライシング結果を示す。なお、２３行目のＣＯＭＰＵＴＥ文は変数Ｘだけを参照更新するので、スライシング基点として変数Ｘを陽に指定しなくてもよい。
【００２２】
図２７の右図では、スライシング基点３に関係しない命令文には取り消し線が引かれており、取り消し線がない命令文がスライシング基点（２３，Ｘ）に影響する命令文である。プログラムスライシングを実行することにより、２３行目のＣＯＭＰＵＴＥ文に影響する命令文だけを抽出できるので、デバッグ作業やテストを効率化することができる。
【００２３】
なお、プログラムの変数の一部に関する属性情報から、変数の依存関係を辿りつつ、他の変数の属性を推論することにより、プログラムのユーザが全ての変数について属性情報を調査する必要をなくす技術がある。この技術によれば、システムの検証モデルをソフトウェアモデルと外部環境モデルから合成する際に、ソフトウェアモデルと外部環境モデルとの入出力を整合させる手間を低減することができる。
【００２４】
また、２変数間の代入依存関係、データ依存関係、制御依存関係から複数ステートメント間に渡る変数依存関係をグラフとして表示することで、ソフトウェアの構成や処理概要に関する情報をユーザに提供する技術がある。
【先行技術文献】
【特許文献】
【００２５】
【特許文献１】特開２０１４−４８８５６号公報
【特許文献２】特開２０１３−１５６７８６号公報
【発明の概要】
【発明が解決しようとする課題】
【００２６】
プログラムスライシング技術は、スライシング基点に影響する命令文を抽出できるので、シンボリック実行技術と組み合わせることによって、パス爆発を防ぐことができる。しかしながら、プログラムスライシングの結果は、実行可能なプログラムではないため、シンボリック実行に使えないという問題がある。
【００２７】
例えば、図２７では、１０行目のＤＩＳＰＬＡＹ文はスライシング基点に影響しない命令文であり、この命令文には取り消し線が引かれているが、この命令文を「影響なし」として除外してしまうと、９行目のＩＦ文のＴＨＥＮ分岐の命令文が皆無となる。このため、スライシング結果のプログラムでは記述が不完全となり、スライシング結果のプログラムが「実行不可能」となる。
【００２８】
本発明は、１つの側面では、プログラムスライシングにより得られるプログラムをシンボリック実行することを目的とする。
【課題を解決するための手段】
【００２９】
１つの態様では、プログラム分析装置は、スライシング部と、復元部と、シンボリック実行部とを有する。スライシング部は、プログラム中の命令文と変数を指定するスライシング基点に影響する命令文を抽出して命令文リストを作成する。復元部は、スライシング部により作成された命令文リストを用いてシンボリック実行が可能なプログラムを復元する。シンボリック実行部は、復元部により復元されたプログラムをシンボリック実行してロジック表を出力する。
【発明の効果】
【００３０】
１つの側面では、本発明は、プログラムスライシングにより得られるプログラムをシンボリック実行することができる。
【図面の簡単な説明】
【００３１】
【図１】図１は、実施例に係るプログラム分析装置によるプログラムの復元を説明するための図である。
【図２】図２は、実施例に係るプログラム分析装置の機能構成を示す図である。
【図３】図３は、プログラム及びスライシング基点の一例を示す図である。
【図４】図４は、スライシング部の動作例を示す図である。
【図５】図５は、復元部の動作例を示す図である。
【図６】図６は、復元されたプログラムのシンボリック実行結果を示す図である。
【図７】図７は、分岐設定部の動作例を示す図である。
【図８】図８は、分岐制御部の動作例を示す図である。
【図９】図９は、プログラム分析装置による処理のフローを示すフローチャートである。
【図１０】図１０は、プログラムスライシング処理のフローを示すフローチャートである。
【図１１】図１１は、プログラムを復元する処理のフローを示すフローチャートである。
【図１２】図１２は、分岐設定を行う処理のフローを示すフローチャートである。
【図１３】図１３は、入れ子構造の条件分岐文を有するプログラム及び制御依存関係を示す図である。
【図１４】図１４は、図１３に示したプログラムから作成される固定選択情報の例を示す図である。
【図１５】図１５は、分岐制御を行う処理のフローを示すフローチャートである。
【図１６】図１６は、図３に示したプログラムのシンボリック実行の結果を示す図である。
【図１７】図１７は、図３に示したプログラムのロジック表を示す図である。
【図１８】図１８は、プログラム分析装置によるシンボリック実行の結果を示す第１の図である。
【図１９】図１９は、プログラム分析装置によるシンボリック実行の結果を示す第２の図である。
【図２０】図２０は、実施例に係るプログラム分析プログラムを実行するコンピュータのハードウェア構成を示す図である。
【図２１】図２１は、シンボリック実行の説明に用いるプログラムを示す図である。
【図２２】図２２は、図２１に示したプログラムのフロー図である。
【図２３】図２３は、図２１に示したプログラムのシンボリック実行により抽出されたパスを示す図である。
【図２４】図２４は、図２１に示したプログラムのシンボリック実行による分析結果を示すロジック表である。
【図２５】図２５は、プログラムスライシングの説明に用いるプログラムを示す図である。
【図２６】図２６は、プログラムスライシングの第１の例を示す図である。
【図２７】図２７は、プログラムスライシングの第２の例を示す図である。
【発明を実施するための形態】
【００３２】
以下に、本願の開示するプログラム分析装置、プログラム分析方法及びプログラム分析プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００３３】
まず、実施例に係るプログラム分析装置によるプログラムの復元について説明する。図１は、実施例に係るプログラム分析装置によるプログラムの復元を説明するための図である。図１は、図２７に示したプログラムスライシング結果から復元された実行可能なプログラムと、復元された実行可能なプログラムのフロー図を示す。
【００３４】
図１に示すように、実施例に係るプログラム分析装置は、プログラムの１０行目と２５行目にダミーの命令文であるＣＯＮＴＩＮＵＥ文を挿入することによって、実行可能なプログラムを復元する。図２７のプログラムスライシング結果では、９行目のＩＦ文のＴＨＥＮ分岐に命令文がない。このため、実施例に係るプログラム分析装置は、９行目のＩＦ文のＴＨＥＮ分岐にＣＯＮＴＩＮＵＥ文を挿入する。同様に、図２７のプログラムスライシング結果では、２２行目のＩＦ文のＥＬＳＥ分岐に命令文がない。このため、実施例に係るプログラム分析装置は、２２行目のＩＦ文のＥＬＳＥ分岐にＣＯＮＴＩＮＵＥ文を挿入する。
【００３５】
このように、実施例に係るプログラム分析装置は、プログラムスライシング結果において有効な命令文がない分岐箇所にＣＯＮＴＩＮＵＥ文を挿入することによって、実行可能なプログラムを復元することができる。
【００３６】
次に、実施例に係るプログラム分析装置の機能構成について説明する。図２は、実施例に係るプログラム分析装置の機能構成を示す図である。図２に示すように、実施例に係るプログラム分析装置１は、スライシング部１１と、命令文リスト記憶部１２と、復元部１３と、復元プログラム記憶部１４と、シンボリック実行部１５と、分岐設定部１６と、分岐制御部１７とを有する。
【００３７】
スライシング部１１は、プログラム２とスライシング基点３を入力してプログラムスライスを実行し、スライシング基点３に影響する命令文のリストを命令文リスト記憶部１２に格納する。命令文リスト記憶部１２は、スライシング基点３に影響する命令文のリストを記憶する。スライシング部１１は、例えば、プログラム２をファイルから読み込み、ユーザが端末から入力したスライシング基点３を受け取る。命令文リスト記憶部１２は、例えば、メインメモリ上の領域である。
【００３８】
図３は、プログラム２及びスライシング基点３の一例を示す図である。図３のプログラム２及びスライシング基点３は、図２７に示したプログラム９２及びスライシング基点３と同じである。
【００３９】
図４は、スライシング部１１の動作例を示す図である。図４に示すように、スライシング部１１は、例えば、図３に示したプログラム２を入力する。また、スライシング部１１は、例えば、スライシング基点３として、２３行目のＣＯＭＰＵＴＥ文とＸの指定を受け取る。そして、スライシング部１１は、スライシング基点３に影響する命令文のリストとして、９行目のＩＦ文、１３行目のＡＤＤ文、２２行目のＩＦ文、２３行目のＣＯＭＰＵＴＥ文を抽出する。なお、スライシング基点３に影響する命令文のリストは、図２７において、取り消し線で消されていない文である。
【００４０】
復元部１３は、スライシング基点３に影響する命令文のリストを命令文リスト記憶部１２から読み出し、スライシング基点３に影響する命令文のリストを用いて実行可能なプログラムを復元する。そして、復元部１３は、復元したプログラムを復元プログラム記憶部１４に格納する。復元プログラム記憶部１４は、復元部１３により復元された実行可能プログラムを記憶する。復元プログラム記憶部１４は、例えば、メインメモリ上の領域である。
【００４１】
図５は、復元部１３の動作例を示す図である。図５に示すように、復元部１３は、スライシング基点３に影響する命令文のリストにおいて命令文がない行番号１０と行番号２５の分岐箇所にダミー命令文としてＣＯＮＴＩＮＵＥ文を挿入した中間データを作成し、中間データを用いて実行可能なプログラムを復元する。ここで、ダミー命令文とは、何も実行しない命令文である。図５の復元されたプログラムは、行番号１０と行番号２５の分岐箇所にＣＯＮＴＩＮＵＥ文が挿入されることによって、実行可能なプログラムとなっている。
【００４２】
シンボリック実行部１５は、復元部１３により復元されたプログラムを復元プログラム記憶部１４から読み出し、シンボリック実行を行う。そして、シンボリック実行部１５は、ロジック表４を出力する。復元部１３は、ロジック表４を表示装置に表示してもよいし、ファイルに出力してもよい。
【００４３】
ユーザは、ロジック表４を用いてプログラム２のロジックを簡単に理解することができる。すなわち、ロジック表４は、どのような条件のパスにおいてどのような出力が得られるかをユーザが理解することを支援する。したがって、プログラム分析装置１は、既存の情報システムの保守や再構築の作業を支援することができる。
【００４４】
図６は、復元されたプログラムのシンボリック実行結果を示す図である。図６は、復元されたプログラムのフロー図及び抽出されたパスと、ロジック表４を示す。図６に示すように、シンボリック実行により３つのパスが抽出される。パス＃１については、パス条件は（Ｘ  ＞  ０）であり、パス出力は（Ｘ  ＋  １）である。パス＃２については、パス条件は（Ｘ  ＮＯＴ  ＞  ０）  ＡＮＤ  （（Ｘ  ＋  １０）  ＞  ０）であり、パス出力は（（Ｘ  ＋  １０）  ＋  １）である。パス＃３については、パス条件は（Ｘ  ＮＯＴ  ＞  ０）  ＡＮＤ  （（Ｘ  ＋  １０）  ＮＯＴ  ＞  ０）であり、パス出力は（Ｘ  ＋  １０）である。
【００４５】
図６では、スライシング基点（２３，Ｘ）を通過しないパス＃３が含まれている。すなわち、プログラムスライス後に復元部１３によって復元されたプログラムをそのままシンボリック実行すると、スライシング基点３を通過しないパスも抽出され、パスの個数削減が不十分となる。その理由は、スライシング基点（２３，Ｘ）が２２行目のＩＦ文に制御依存するためである。すなわち、スライシング基点（２３，Ｘ）に到達するためには、２２行目のＩＦ文において固定的にＴＨＥＮ分岐が選択されなければならないが、シンボリック実行では、ＥＬＳＥ分岐も選択されてしまう。
【００４６】
そこで、プログラム分析装置１は、スライシング基点３が条件分岐文に制御依存する場合、スライシング基点３に到達する分岐を固定的に選択するための情報を条件分岐文に設定する。そして、プログラム分析装置１は、復元部１３によって復元されたプログラムをシンボリック実行して実行可能なパスを抽出する際に、条件分岐文に設定した情報に基づいて分岐の選択を制御する。このように、スライシング基点３を通過するパスだけを限定して抽出することによって、プログラム分析装置１は、抽出するパスの個数を減らすことができる。
【００４７】
分岐設定部１６は、スライシング基点３が条件分岐文に制御依存するか否かを制御依存関係に基づいて判定し、制御依存する場合に、スライシング基点３に到達する分岐を固定的に選択するための情報を条件分岐文に設定する。
【００４８】
図７は、分岐設定部１６の動作例を示す図である。図７において、固定選択情報は、固定選択の条件分岐文と選択される分岐の情報である。図７に示すように、分岐設定部１６は、プログラム２、制御依存関係及びスライシング基点３を入力し、固定選択情報を出力する。図７では、固定選択の条件分岐文として２２行目のＩＦ文が出力され、選択される分岐としてＴＨＥＮ分岐が出力されている。
【００４９】
なお、分岐設定部１６は、ＥＬＳＥがないＩＦ文で、ＴＨＥＮ分岐以外の分岐が固定選択となった場合は、分岐としてＥＬＳＥ分岐を出力する。また、分岐設定部１６は、ＣＯＢＯＬのＥＶＡＬＵＡＴＥ文の場合は、分岐がどのＷＨＥＮであるかを特定できる情報を設定する。分岐がどのＷＨＥＮであるかを特定できる情報としては、例えば、「５０行目のＷＨＥＮ」がある。
【００５０】
分岐制御部１７は、プログラムスライシング結果から復元されたプログラムをシンボリック実行部１５がシンボリック実行して実行可能なパスを抽出する際に、固定選択情報に基づいて、分岐の選択を制御する。
【００５１】
条件分岐の条件の真偽値が確定であり、その真偽値で選択される分岐が固定選択された分岐と同じ場合には、分岐制御部１７は、固定選択された分岐を選択する。また、条件分岐の条件の真偽値が確定であり、その真偽値で選択される分岐が固定選択された分岐と異なる場合は、分岐制御部１７は、シンボリック実行中のパスを棄却し、バックトラックをシンボリック実行部１５に指示する。ここで、バックトラックとは、１つ前の条件分岐まで戻り、別の分岐を選択することである。また、条件分岐の条件の真偽値が不定であり、複数分岐が選択可能な場合は、分岐制御部１７は、固定選択された分岐を選択する。
【００５２】
図８は、分岐制御部１７の動作例を示す図である。図８に示すように、分岐制御部１７の出力は、出力＃１）条件分岐文で選択する分岐、又は、出力＃２）バックトラック指示であり、固定選択の分岐はＴＨＥＮ分岐である。そして、シンボリック実行による２２行目のＩＦ文の条件（Ｘ＞０）の判定結果が真偽値不定であり充足可能な場合には、分岐制御部１７は、ＴＨＥＮ分岐を選択する。また、シンボリック実行による２２行目のＩＦ文の条件！（Ｘ＞０）の判定結果が真偽値不定であり充足可能な場合にも、分岐制御部１７は、ＴＨＥＮ分岐を選択する。したがって、この例では、バックトラック指示の場合はない。
【００５３】
次に、プログラム分析装置１による処理のフローについて説明する。図９は、プログラム分析装置１による処理のフローを示すフローチャートである。図９に示すように、プログラム分析装置１は、分析対象のプログラム２とスライシング基点３を入力する（ステップＳ１）。そして、プログラム分析装置１は、プログラム２に対して、スライシング基点３から、プログラムスライシング処理を実行し（ステップＳ２）、プログラム復元によって、プログラムスライシングの実行結果から、実行可能なプログラムを復元する（ステップＳ３）。
【００５４】
そして、プログラム分析装置１は、スライシング基点３が条件分岐文に制御依存するかを判定し、制御依存すると判定した場合に、スライシング基点３を含む分岐を固定的に選択するための固定選択情報を作成する（ステップＳ４）。そして、プログラム分析装置１は、固定選択情報に基づいて分岐選択とバックトラックを制御しながら復元プログラムをシンボリック実行して実行可能なパスを抽出する（ステップＳ５）。そして、プログラム分析装置１は、抽出したパスについてロジック表４を出力する（ステップＳ６）。
【００５５】
このように、プログラム分析装置１は、プログラムスライシングにより得られたプログラムを復元することによって、シンボリック実行を可能とすることができる。また、プログラム分析装置１は、固定選択情報を作成し、固定選択情報に基づいてシンボリック実行を制御することで、スライシング基点３を通過しないパスの抽出を防ぐことができる。
【００５６】
図１０は、プログラムスライシング処理のフローを示すフローチャートである。なお、図１０の処理は、図９に示したステップＳ２の処理に対応する。図１０に示すように、スライシング部１１は、プログラム２をパース（構文解析）し、構造木を構築する（ステップＳ１１）。
【００５７】
そして、スライシング部１１は、構造木の命令文の間で、制御依存関係とデータ依存関係を構築し（ステップＳ１２）、スライシング基点３から制御依存関係とデータ依存関係を辿り、途中の命令文を収集する（ステップＳ１３）。そして、スライシング部１１は、収集した命令文を命令文リスト記憶部１２に格納する（ステップＳ１４）。
【００５８】
このように、スライシング部１１がスライシング基点３に基づいてプログラム２をスライシングすることによって、シンボリック実行によるパス爆発を防ぐことができる。
【００５９】
図１１は、プログラムを復元する処理のフローを示すフローチャートである。なお、図１１の処理は、図９に示したステップＳ３の処理に対応する。図１１に示すように、復元部１３は、命令文リスト記憶部１２から順に命令文を１つ読み出し（ステップＳ２１）、未処理の命令文があるか否かを判定する（ステップＳ２２）。
【００６０】
そして、復元部１３は、未処理の命令文がある場合には、命令文が条件分岐文か否かを判定し（ステップＳ２３）、命令文が条件分岐文でない場合には、ステップＳ２１に戻る。一方、命令文が条件分岐文の場合には、復元部１３は、条件分岐文の分岐に有効な命令文がないか否かを判定し（ステップＳ２４）、条件分岐文の分岐に有効な命令文がある場合には、ステップＳ２１に戻る。
【００６１】
一方、条件分岐文の分岐に有効な命令文がない場合には、復元部１３は、ダミー命令文を追加リストに追加し（ステップＳ２５）、ステップＳ２１に戻る。また、ステップＳ２２において、未処理の命令文がない場合には、復元部１３は、命令文リストと追加リストから実行可能なプログラムを復元する（ステップＳ２６）。
【００６２】
このように、復元部１３は、条件分岐文の分岐に有効な命令文がない場合にダミー命令文を追加することによって、実行可能なプログラムを復元することができる。
【００６３】
図１２は、分岐設定を行う処理のフローを示すフローチャートである。なお、図１２の処理は、図９に示したステップＳ４の処理に対応する。図１２に示すように、分岐設定部１６は、プログラム２及びスライシング基点３を入力し、制御依存関係をスライシング部１１から受け取る（ステップＳ３１）。
【００６４】
そして、分岐設定部１６は、スライシング基点３の命令文を指定命令文として、固定分岐を分析して設定する固定分岐分析処理を行い（ステップＳ３２）、固定選択の条件分岐文と分岐の情報を分岐制御部１７に渡す（ステップＳ３３）。
【００６５】
また、分岐設定部１６は、固定分岐分析処理において、指定命令文から制御依存関係を辿り、制御依存関係において１つ前の命令文を取得する（ステップＳ４１）。そして、分岐設定部１６は、命令文があり、かつ、条件分岐文であるか否かを判定し（ステップＳ４２）、命令文がない場合、又は、条件分岐文でない場合には、固定分岐分析処理を終了する。
【００６６】
一方、命令文があり、かつ、条件分岐文である場合には、分岐設定部１６は、条件分岐文Ｃの分岐Ｂi（ｉ＝１，２，・・・，Ｎ：Ｎは分岐数）を取得して、ｉ＝１とする（ステップＳ４３）。そして、分岐設定部１６は、ｉがＮ以下であるか否かを判定し（ステップＳ４４）、ｉがＮ以下でない場合には、固定分岐分析処理を終了する。
【００６７】
一方、ｉがＮ以下である場合には、分岐設定部１６は、指定命令文が分岐Ｂi内か否かを判定し（ステップＳ４５）、指定命令文が分岐Ｂi内の場合には、条件分岐文Ｃの分岐Ｂiを固定分岐と設定する（ステップＳ４６）。そして、分岐設定部１６は、条件分岐文Ｃを指定命令文として、固定分岐分析処理を行い（ステップＳ４７）、ｉに１を加え（ステップＳ４８）、ステップＳ４４に戻る。また、ステップＳ４５において指定命令文が分岐Ｂi内でない場合には、ｉに１を加え（ステップＳ４８）、ステップＳ４４に戻る。
【００６８】
このように、分岐設定部１６は、固定分岐分析処理を再帰的に呼び出すことによって、固定選択情報を作成することができる。なお、固定分岐分析処理を再帰的に呼び出す理由は、条件分岐文の入れ子構造に対応するためである。図１３は、入れ子構造の条件分岐文を有するプログラム２及び制御依存関係を示す図であり、図１４は、図１３に示したプログラム２から作成される固定選択情報の例を示す図である。
【００６９】
図１３に示すように、例えば、２１行目のＣＯＭＰＵＴＥ文は２０行目のＩＦ文に制御依存し、２０行目のＩＦ文は１０行目のＩＦ文に制御依存する。このため、２１行目のＣＯＭＰＵＴＥ文と変数Ｘをスライシング基点３とすると、図１４に示すように、固定選択情報には、条件分岐文と分岐の２つの組が含まれる。具体的には、２１行目のＣＯＭＰＵＴＥ文を指定命令文とした場合に２０行目のＩＦ文を条件分岐文として分岐をＴＨＥＮ分岐とする組と、２０行目のＩＦ文を指定命令文とした場合に１０行目のＩＦ文を条件分岐文として分岐をＥＬＳＥ分岐とする組が含まれる。
【００７０】
この固定選択情報を、分岐設定部１６は、以下のような処理手順により作成する。まず、分岐設定部１６は、図１２のステップＳ３１において、プログラム２及びスライシング基点３を入力し、制御依存関係の情報をスライシング部１１から受け取る。そして、分岐設定部１６は、ステップＳ３２において、２１行目のＣＯＭＰＵＴＥ文を指定命令文として固定分岐分析処理を呼び出す。
【００７１】
そして、分岐設定部１６は、ステップＳ４１において、制御依存を辿り命令文として２０行目のＩＦ文を取得し、ステップＳ４２において、２０行目のＩＦ文が条件分岐文であるか否かを判定する。そして、２０行目のＩＦ文が条件分岐文であるので、分岐設定部１６は、ステップＳ４３において、Ｂ1を２０行目のＩＦ文のＴＨＥＮ分岐とし、Ｂ2を２０行目のＩＦ文のＥＬＳＥ分岐とする。
【００７２】
そして、分岐設定部１６は、ステップＳ４５において、２１行目のＣＯＭＰＵＴＥ文がＢ1内か否かを判定し、Ｂ1内にあるので、ステップＳ４６において、２０行目のＩＦ文のＴＨＥＮ分岐を固定分岐と設定する。そして、分岐設定部１６は、ステップＳ４７において、２０行目のＩＦ文を指定命令文として固定分岐分析処理を呼び出す。
【００７３】
そして、分岐設定部１６は、ステップＳ４１において、制御依存を辿り命令文として１０行目のＩＦ文を取得し、ステップＳ４２において、１０行目のＩＦ文が条件分岐文であるか否かを判定する。そして、１０行目のＩＦ文が条件分岐文であるので、分岐設定部１６は、ステップＳ４３において、Ｂ1を１０行目のＩＦ文のＴＨＥＮ分岐とし、Ｂ2を１０行目のＩＦ文のＥＬＳＥ分岐とする。
【００７４】
そして、分岐設定部１６は、ステップＳ４５において、２０行目のＩＦ文がＢ1内か否かを判定し、Ｂ1内ではないので、ステップＳ４８において、ｉに１を加え、ステップＳ４５において、２０行目のＩＦ文がＢ2内か否かを判定する。そして、分岐設定部１６は、２０行目のＩＦ文はＢ2内にあるので、ステップＳ４６において、１０行目のＩＦ文のＥＬＳＥ分岐を固定分岐と設定する。
【００７５】
その後、分岐設定部１６は、ステップＳ４７の固定分岐分析処理を終了し、ステップＳ３２の固定分岐分析処理を終了する。そして、分岐設定部１６は、ステップＳ３３において、固定選択情報を分岐制御部１７に渡す。
【００７６】
図１５は、分岐制御を行う処理のフローを示すフローチャートである。なお、図１５の処理は、図９に示したステップＳ５の処理に含まれる。図１５に示すように、分岐制御部１７は、固定選択情報に含まれる条件分岐文に関して、シンボリック実行部１５によるシンボリック実行の条件判定で複数分岐が選択可能か否かを判定する（ステップＳ５１）。
【００７７】
そして、分岐制御部１７は、複数分岐が選択可能である場合には、固定選択情報の分岐を選択し（ステップＳ５２）、複数分岐が選択可能でない場合には、選択される分岐が固定選択情報の分岐と同じか否かを判定する（ステップＳ５３）。そして、分岐制御部１７は、選択される分岐が固定選択情報の分岐と同じである場合には、当該分岐を選択し（ステップＳ５４）、固定選択情報の分岐と同じでない場合には、シンボリック実行部１５にバックトラックを指示する（ステップＳ５５）。
【００７８】
このように、分岐制御部１７は、固定選択情報に基づいてシンボリック実行の分岐を制御することによって、スライシング基点３を通過しないパスの抽出を防ぐことができる。
【００７９】
次に、プログラム分析装置１の効果について図１６〜図１９を用いて説明する。図１６は、図３に示したプログラム２のシンボリック実行の結果を示す図である。図１６は、プログラムスライシングを行うことなくプログラム２をシンボリック実行した場合を示す。図１６に示すように、プログラムスライシングを行わない場合には、９個のパスがシンボリック実行によって抽出される。
【００８０】
図１７は、図３に示したプログラム２のロジック表４を示す図である。図１７（ａ）は、変数Ｘに関するロジック表４を示し、図１７（ｂ）は、変数Ｙに関するロジック表４を示す。すなわち、変数Ｘに関してプログラムスライシングが行われ、スライシング基点３が条件分岐文に依存しない場合には、図１７（ａ）に示すロジック表４が得られる。また、変数Ｙに関してプログラムスライシングが行われ、スライシング基点３が条件分岐文に依存しない場合には、図１７（ｂ）に示すロジック表４が得られる。
【００８１】
図１８及び図１９は、プログラム分析装置１によるシンボリック実行の結果を示す図である。図１８は、スライシング基点（２３，Ｘ）の場合を示し、図１９は、スライシング基点（２５，Ｘ）の場合を示す。図１８及び図１９に示すように、プログラム分析装置１は、スライシング結果をシンボリック実行することができる。
【００８２】
また、図１８を図１６と比較すると、抽出されたパスの数が９から２に減っている。また、図１８を図６と比較すると、スライシング基点（２３，Ｘ）を通過しないパス＃３が抽出されていないことがわかる。また、図１８と図１９のロジック表４を合わせると、図６に示すロジック表４と同じとなり、プログラム分析装置１は、固定選択情報を用いない場合と同じロジック表４を作成することがわかる。
【００８３】
上述してきたように、実施例では、スライシング部１１が、スライシング基点３に基づいてプログラム２から命令文を抽出し、命令文リストを作成して命令文リスト記憶部１２に格納する。そして、復元部１３が、命令文リスト記憶部１２から命令文リストを読み出して実行可能なプログラムを復元し、復元プログラム記憶部１４に格納する。そして、シンボリック実行部１５が復元プログラム記憶部１４からプログラムを読み出してシンボリック実行する。したがって、プログラム分析装置１は、プログラムスライシングにより得られるプログラムをシンボリック実行することができる。
【００８４】
また、実施例では、分岐設定部１６が固定選択情報を作成して分岐制御部１７に渡し、シンボリック実行部１５がシンボリック実行を行う際に、分岐制御部１７が、固有選択情報を用いてシンボリック実行の分岐を制御する。したがって、プログラム分析装置１は、スライシング基点３を通過しないパスがシンボリック実行により抽出されることを防ぐことができる。
【００８５】
また、実施例では、分岐制御部１７は、シンボリック実行において、条件分岐文の条件の真偽値が不定であり、複数分岐が選択可能な場合には、固定選択情報に含まれる分岐を選択する。また、分岐制御部１７は、シンボリック実行において、条件分岐文の条件の真偽値が確定であり、真偽値に基づいて選択される分岐が固定選択情報に含まれる分岐と同じである場合には、固定選択情報に含まれる分岐を選択する。また、分岐制御部１７は、シンボリック実行において、条件分岐文の条件の真偽値が確定であり、真偽値に基づいて選択される分岐が固定選択情報に含まれる分岐と異なる場合には、シンボリック実行部１５にバックトラックを指示する。したがって、分岐制御部１７は、スライシング基点３を通過しないパスを抽出しないように、シンボリック実行を制御することができる。
【００８６】
また、実施例では、入れ子構造の条件分岐文の内側の条件分岐文のいずれかの分岐にスライシング基点３が含まれる場合に、分岐設定部１６は、固定分岐分析処理を再帰的に呼び出して固定選択情報を作成する。したがって、プログラム分析装置１は、条件分岐文が入れ子構造を有するプログラム２に関しても、スライシング基点３を通過しないパスがシンボリック実行により抽出されることを防ぐことができる。
【００８７】
また、実施例では、復元部１３は、条件分岐文の分岐に有効な命令文があるか否かを判定し、条件分岐文の分岐に有効な命令文がない場合に、ダミー命令文を挿入するので、シンボリック実行が可能なプログラムを復元することができる。
【００８８】
なお、実施例では、プログラム分析装置１について説明したが、プログラム分析装置１が有する構成をソフトウェアによって実現することで、同様の機能を有するプログラム分析プログラムを得ることができる。そこで、プログラム分析プログラムを実行するコンピュータについて説明する。
【００８９】
図２０は、実施例に係るプログラム分析プログラムを実行するコンピュータのハードウェア構成を示す図である。図２０に示すように、コンピュータ５０は、メインメモリ５１と、ＣＰＵ（Central  Processing  Unit）５２と、ＬＡＮ（Local  Area  Network）インタフェース５３と、ＨＤＤ（Hard  Disk  Drive）５４とを有する。また、コンピュータ５０は、スーパーＩＯ（Input  Output）５５と、ＤＶＩ（Digital  Visual  Interface）５６と、ＯＤＤ（Optical  Disk  Drive）５７とを有する。
【００９０】
メインメモリ５１は、プログラムやプログラムの実行途中結果などを記憶するメモリである。ＣＰＵ５２は、メインメモリ５１からプログラムを読み出して実行する中央処理装置である。ＣＰＵ５２は、メモリコントローラを有するチップセットを含む。
【００９１】
ＬＡＮインタフェース５３は、コンピュータ５０をＬＡＮ経由で他のコンピュータに接続するためのインタフェースである。ＨＤＤ５４は、プログラムやデータを格納するディスク装置であり、スーパーＩＯ５５は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。ＤＶＩ５６は、液晶表示装置を接続するインタフェースであり、ＯＤＤ５７は、ＤＶＤの読み書きを行う装置である。
【００９２】
ＬＡＮインタフェース５３は、ＰＣＩエクスプレス（ＰＣＩｅ）によりＣＰＵ５２に接続され、ＨＤＤ５４及びＯＤＤ５７は、ＳＡＴＡ（Serial  Advanced  Technology  Attachment）によりＣＰＵ５２に接続される。スーパーＩＯ５５は、ＬＰＣ（Low  Pin  Count）によりＣＰＵ５２に接続される。
【００９３】
そして、コンピュータ５０において実行されるプログラム分析プログラムは、ＤＶＤに記憶され、ＯＤＤ５７によってＤＶＤから読み出されてコンピュータ５０にインストールされる。あるいは、プログラム分析プログラムは、ＬＡＮインタフェース５３を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ５０にインストールされる。そして、インストールされたプログラム分析プログラムは、ＨＤＤ５４に記憶され、メインメモリ５１に読み出されてＣＰＵ５２によって実行される。
【００９４】
また、実施例では、ＣＯＢＯＬで記述されたプログラム２を対象とする場合について説明したが、本発明はこれに限定されるものではなく、他のプログラミング言語で記述されたプログラムを対象とする場合にも同様に適用することができる。
【符号の説明】
【００９５】
１    プログラム分析装置
２，９１，９２    プログラム
３    スライシング基点
４    ロジック表
１１    スライシング部
１２    命令文リスト記憶部
１３    復元部
１４    復元プログラム記憶部
１５    シンボリック実行部
１６    分岐設定部
１７    分岐制御部
５０    コンピュータ
５１    メインメモリ
５２    ＣＰＵ
５３    ＬＡＮインタフェース
５４    ＨＤＤ
５５    スーパーＩＯ
５６    ＤＶＩ
５７    ＯＤＤ
９３    対象プログラム
【図１】
2018147106.tif 000003
【図２】
2018147106.tif 000004
【図３】
2018147106.tif 000005
【図４】
2018147106.tif 000006
【図５】
2018147106.tif 000007
【図６】
2018147106.tif 000008
【図７】
2018147106.tif 000009
【図８】
2018147106.tif 000010
【図９】
2018147106.tif 000011
【図１０】
2018147106.tif 000012
【図１１】
2018147106.tif 000013
【図１２】
2018147106.tif 000014
【図１３】
2018147106.tif 000015
【図１４】
2018147106.tif 000016
【図１５】
2018147106.tif 000017
【図１６】
2018147106.tif 000018
【図１７】
2018147106.tif 000019
【図１８】
2018147106.tif 000020
【図１９】
2018147106.tif 000021
【図２０】
2018147106.tif 000022
【図２１】
2018147106.tif 000023
【図２２】
2018147106.tif 000024
【図２３】
2018147106.tif 000025
【図２４】
2018147106.tif 000026
【図２５】
2018147106.tif 000027
【図２６】
2018147106.tif 000028
【図２７】
2018147106.tif 000029