(57)【要約】【課題】シンボリック実行結果の解釈の向上を図る。【解決手段】情報処理装置１は、プログラムを、シンボリック実行を用いて分析する場合に、プログラムから順次命令文を抽出し、抽出された命令文が変数を更新する更新文である場合に、更新文に含まれる、変数の変数名及び変数を更新する値の意味を示す定数名の関係を定数管理表２２に記録する。情報処理装置１は、命令文がパスを分岐する分岐文である場合に、分岐文と定数管理表２２とを関連付ける。情報処理装置１は、関連付けられた分岐文と定数管理表２２とに基づいて、分岐文に対するシンボリック実行結果に含まれる定数値を、定数管理表２２に記憶された定数名を含む情報に置換する。【選択図】図１
2019106153.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを、シンボリック実行を用いて分析する情報処理装置であって、
前記プログラムから順次命令文を抽出する抽出部と、
前記抽出部によって抽出された命令文が変数を更新する更新文である場合に、前記更新文に含まれる、前記変数の変数名及び前記変数を更新する値の意味を示す定数名の関係を記憶部に記録する記録部と、
前記命令文がパスを分岐する分岐文である場合に、前記分岐文と前記関係とを関連付ける関連部と、
前記関連部によって関連付けられた前記分岐文と前記関係とに基づいて、前記分岐文に対するシンボリック実行結果に含まれる定数値を、前記関係に記憶された前記定数名を含む情報に置換する置換部と、
を有することを特徴とする情報処理装置。
【請求項２】
前記記録部は、
前記抽出部によって抽出された第１の更新文に含まれる、変数名及び定数名の関係を前記記憶部に記録し、
前記抽出部によって抽出された第２の更新文に含まれる変数名が前記第１の更新文に含まれる変数名と同じである場合には、前記変数名に対応付けられた関係の定数名を前記第２の更新文に含まれる定数名に更新して記録する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記記録部は、
前記抽出部によって抽出された第１の更新文に含まれる、変数名及び定数名の関係を前記記憶部に記録し、
前記抽出部によって抽出された第２の更新文に含まれる定数名が前記関係に変数名として記憶されている場合には、前記関係に記憶された変数名に対応付けられた定数名及び第２の更新文に含まれる変数名を追加して記録する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記関連部は、
バックトラック時の分岐文で、前記分岐文と前記分岐文を実行する際の前記関係を関連付ける
ことを特徴とする請求項１に記載の情報処理装置。
【請求項５】
シンボリック実行対象のプログラムから順次命令文を抽出し、
抽出した命令文が変数を更新する更新文である場合に、前記更新文に含まれる、前記変数の変数名及び前記変数を更新する値の意味を示す定数名の関係を記憶部に記録し、
前記命令文がパスを分岐する分岐文である場合に、前記分岐文と前記関係とを関連付け、
関連付けられた前記分岐文と前記関係とに基づいて、前記分岐文に対するシンボリック実行結果に含まれる定数値を、前記関係に記憶された前記定数名を含む情報に置換する
処理を情報処理装置に実行させる分析プログラム。
【請求項６】
プログラムを、シンボリック実行を用いて分析する情報処理装置が、
前記プログラムから順次命令文を抽出し、
抽出した命令文が変数を更新する更新文である場合に、前記更新文に含まれる、前記変数の変数名及び前記変数を更新する値の意味を示す定数名の関係を記憶部に記録し、
前記命令文がパスを分岐する分岐文である場合に、前記分岐文と前記関係とを関連付け、
関連付けられた前記分岐文と前記関係とに基づいて、前記分岐文に対するシンボリック実行結果に含まれる定数値を、前記関係に記憶された前記定数名を含む情報に置換する
処理を実行することを特徴とする分析方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置などに関する。
【背景技術】
【０００２】
システム管理者が既存のシステムを保守したり、再構築したりする場合には、システムの現状を把握するため、システムに関するドキュメントや有識者の知識などの情報が重要である。しかしながら、例えば、長期に運用されるシステムでは、ドキュメントの不備や有識者の不在により、保守や再構築に作業が必要な情報が不足する事態が発生することがある。
【０００３】
かかる場合に、システム管理者は、ドキュメントや有識者の代わりに、システムの実装実体であるプログラムを分析することによって、不足する情報を補う対処が行われる。このプログラム分析は、プログラムからのロジック抽出と呼ばれる。ここで、プログラムのロジックとは、プログラムに記述された処理内容のことをいい、プログラムの実行結果としての入出力関係を示す。
【０００４】
プログラムからのロジック抽出の技術の一例として、シンボリック実行を利用する手法がある。シンボリック実行は、入力変数に記号値を設定して、条件分岐での実行可能分岐を判定しながら処理パスを抽出するプログラム分析の手法である。シンボリック実行の結果は、実行可能なパスごとの条件と出力である。入力変数で記述された、入力に関する条件と出力のロジック表で実現される。
【０００５】
シンボリック実行の参考例を、図１５〜図１７を参照して説明する。図１５〜図１７は、シンボリック実行の参考例を示す図である。
【０００６】
図１５に示すように、プログラムの例Ａに対してシンボリック実行をした結果、抽出したパスごとの条件（パス条件）と出力（パス出力）とが記述される。また、シンボリック実行の結果を整理した結果が、分析結果のロジック表である。プログラムの例Ａでは、ＩＦ文の条件の比較値は‘男性’や‘女性’のようなリテラルを用いて記述されている。プログラムの例Ａに対してシンボリック実行した結果のパス条件およびパス出力には、比較値がリテラルを用いて記述される。分析結果のロジック表の条件および出力には、比較値がリテラルを用いて記述される。
【０００７】
図１６のプログラムの例Ｂは、プログラムの例Ａと同一のロジックである。プログラムの例Ｂのように、ＩＦ文の条件の比較値は、定数を用いて記述できる。ここでは、入力変数である「性別」の型が２桁の文字列型である。プログラムの例Ｂに対してシンボリック実行をした結果のパス条件およびパス出力には、比較値が２桁の文字列型の定数で定義された文字列を用いて記述される。
【０００８】
図１７のプログラムの例Ｃは、プログラムの例Ａと同一のロジックである。プログラムの例Ｃのように、ＩＦ文の条件の比較値は、定数を用いて記述できる。ここでは、入力変数である「性別」の型が１桁の数字型である。プログラムの例Ｃに対してシンボリック実行をした結果のパス条件およびパス出力には、比較値が１桁の数値型の定数で定義された数値を用いて記述される。
【０００９】
ＩＦ文の条件の比較値として用いられる定数の値は、他の定数と区別するために設定されるので、値自体に意味がない場合がある。例えば、図１７のプログラムの例Ｃでは、ＩＦ文の条件の比較値として用いられる、「男性」を意味する定数の値「１」は、「女性」を意味する定数と区別するために設定されるので、値自体に意味がない。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２０１５−１３３０３１号公報
【特許文献２】特開２０１６−９９７２６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
ところが、定数の値（定数値）と定数名との間に意味的な繋がりが無いプログラムでは、シンボリック実行結果およびロジック表の解釈に手間がかかるという問題がある。例えば、図１７のロジック表では、条件で記述される定数値「１」の意味が不明なため、定数値「１」の解釈に手間がかかる。
【００１２】
そこで、プログラム内の定数の定義に記述される定数名と定数値の関係を利用して、ロジック表の定数値を定数名に置換する方法が考えられる。例えば、図１７のロジック表において、プログラムの例Ｃ内の００００１１文を利用して、条件で記述される定数値「１」を定数名「男性」に置き換える方法が考えられる。これにより、ロジック表の解釈が容易になる。
【００１３】
しかしながら、プログラム内の定数の定義に重複する定数値があると、条件で記述される定数値に対する定数名を一意に特定できないという問題がある。また、定数値を変数に転記した後に、当該変数に関する条件があると、当該変数に転記された定数値に対する定数名を一意に特定できないという問題がある。
【００１４】
ここで、定数値を定数名に置換する場合の問題を、図１８Ａおよび図１８Ｂを参照して説明する。図１８Ａおよび図１８Ｂは、定数値を定数名に置換する場合の問題を説明する図である。
【００１５】
図１８Ａに示すように、プログラムの例Ｄに定数の定義と処理内容が含まれる。定数の定義には、定数値「１」が重複している（００００１３行、００００１５行、００００２４行）。すなわち、定数値を「１」と定義する定数名が、「基準」、「東京」、「地域違い」と複数存在する。すると、図１８Ｂに示すプログラムの例Ｄのシンボリック実行の結果のＮｏ３には、定数値「１」が２箇所あり、それぞれの定数値「１」に対する定数名を一意に特定できない。
【００１６】
また、図１８Ｂに示すプログラムの例Ｄのシンボリック実行の結果のＮｏ３には、条件として（数値＝１）が含まれている。条件中の（数値＝１）に該当するＩＦ条件は、（数値  Ｎｏｔ＝  中継）（図１８Ａの００００３４行）であるが、変数「中継」は定数の定義に存在しないので定数ではない。この条件が評価される時点で、変数「中継」には、定数名「基準」に対応する定数値が転記されている（図１８Ａの００００３３行）。ところが、変数「中継」に転記された定数値に対する定数名を追跡できない。すなわち、定数値を転記された変数に関する条件があると、当該変数に転記された定数値に対する定数名を一意に特定できない。
【００１７】
本発明は、１つの側面では、シンボリック実行結果の解釈の向上を図ることを目的とする。
【課題を解決するための手段】
【００１８】
１つの態様では、情報処理装置は、プログラムを、シンボリック実行を用いて分析する情報処理装置であって、前記プログラムから順次命令文を抽出する抽出部と、前記抽出部によって抽出された命令文が変数を更新する更新文である場合に、前記更新文に含まれる、前記変数の変数名及び前記変数を更新する値の意味を示す定数名の関係を記憶部に記録する記録部と、前記命令文がパスを分岐する分岐文である場合に、前記分岐文と前記関係とを関連付ける関連部と、前記関連部によって関連付けられた前記分岐文と前記関係とに基づいて、前記分岐文に対するシンボリック実行結果に含まれる定数値を、前記関係に記憶された前記定数名を含む情報に置換する置換部と、を有する。
【発明の効果】
【００１９】
１実施態様によれば、シンボリック実行結果の解釈の向上を図ることができる。
【図面の簡単な説明】
【００２０】
【図１】図１は、実施例に係る情報処理装置の機能構成を示す図である。
【図２】図２は、実施例に係る定数判定部の動作の一例を示す図である。
【図３】図３は、実施例に係る定数関係記録部の動作の一例を示す図である。
【図４】図４は、実施例に係る定数関係制御部の動作の一例を示す図である。
【図５Ａ】図５Ａは、実施例に係る定数情報追加部の動作の一例を示す図（１）である。
【図５Ｂ】図５Ｂは、実施例に係る定数情報追加部の動作の一例を示す図（２）である。
【図６】図６は、実施例に係る定数情報解釈部の動作の一例を示す図である。
【図７】図７は、実施例に係るロジック表の一例を示す図である。
【図８】図８は、実施例に係る分析処理のフローチャートの一例を示す図である。
【図９】図９は、実施例に係る定数判定処理のフローチャートの一例を示す図である。
【図１０】図１０は、実施例に係る定数関係記録処理のフローチャートの一例を示す図である。
【図１１】図１１は、実施例に係る定数関係制御処理のフローチャートの一例を示す図である。
【図１２】図１２は、実施例に係る定数情報追加処理のフローチャートの一例を示す図である。
【図１３】図１３は、実施例に係る定数情報解釈処理のフローチャートの一例を示す図である。
【図１４】図１４は、分析プログラムを実行するコンピュータの一例を示す図である。
【図１５】図１５は、シンボリック実行の参考例を示す図（１）である。
【図１６】図１６は、シンボリック実行の参考例を示す図（２）である。
【図１７】図１７は、シンボリック実行の参考例を示す図（３）である。
【図１８Ａ】図１８Ａは、定数値を定数名に置換する場合の問題を説明する図（１）である。
【図１８Ｂ】図１８Ｂは、定数値を定数名に置換する場合の問題を説明する図（２）である。
【発明を実施するための形態】
【００２１】
以下に、本願の開示する情報処理装置、分析プログラムおよび分析方法の実施例を図面に基づいて詳細に説明する。なお、本発明は、実施例により限定されるものではない。
【実施例】
【００２２】
［実施例に係る情報処理装置の機能構成］
図１は、実施例に係る情報処理装置の機能構成を示す図である。図１に示す情報処理装置１は、同一の数値を異なる意味として用いる複数の定数名を有するプログラムを、シンボリック実行を用いて分析する。ここでいうシンボリック実行とは、プログラム内の入力変数に記号値を設定して、条件分岐での実行可能分岐を判定しながら処理パスを抽出するプログラム分析手法のことをいう。このようなシンボリック実行において、情報処理装置１は、実行する命令文が変数を更新する更新文である場合に、更新文に含まれる変数名及び定数名の関係を記憶部に記録する。情報処理装置１は、命令文がパスを分岐する条件分岐文である場合に、条件分岐文と関係とを関連付ける。情報処理装置１は、プログラムの変数名を含む条件分岐文と、記憶部に記憶された変数名及び定数名の関係とに基づいて、プログラムの条件分岐文に対する（シンボリック実行結果の）パス条件の中にある定数値を、関係に記憶された定数名を含む情報に置換する。
【００２３】
情報処理装置１は、制御部１０および記憶部２０を有する。制御部１０は、ＣＰＵ（Central  Processing  Unit）などの電子回路に対応する。そして、制御部１０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。制御部１０は、シンボリック実行部１１、定数判定部１２、定数関係記録部１３、定数関係制御部１４、定数情報追加部１５、パス条件パス出力記録部１６、定数情報解釈部１７および条件簡約化部１８を有する。なお、シンボリック実行部１１は、抽出部の一例である。定数関係記録部１３は、記録部の一例である。定数関係制御部１４は、関連部の一例である。定数情報追加部１５は、置換部の一例である。
【００２４】
記憶部２０は、例えば、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）などの半導体メモリ素子、または、ハードディスク、光ディスクなどの記憶装置である。記憶部２０は、プログラム２１、定数管理表２２、シンボリック実行結果２３およびロジック表２４を有する。
【００２５】
プログラム２１は、シンボリック実行対象のプログラムである。
【００２６】
定数管理表２２は、変数名と定数名との関係を管理する表である。変数名とは、変数を更新する領域の名称のことをいう。定数名とは、定数を設定しておく領域の名称のことをいう。定数名は、プログラム２１の定数の定義に記述される。定数管理表２２は、プログラム２１のシンボリック実行で、命令文が更新文であるとき、更新元の値を意味する定数名と、更新先の変数名（更新変数の変数名）とを対応付けて管理する。更新文とは、更新元の値を更新先の領域へ更新する命令文のことをいう。更新文には、一例として、転記命令、演算命令が挙げられる。転記命令とは、参照変数（更新元）の値を他の変数（更新変数）の領域に転記、あるいは代入する命令文のことをいう。Ｃｏｂｏｌ言語では、ＭＯＶＥが該当する。“ＭＯＶＥ  Ａ  ＴＯ  Ｂ”では、参照変数Ａの値を他の変数Ｂに転記する場合に使われる。また、演算命令とは、加減乗除を演算する命令文のことをいう。
【００２７】
シンボリック実行結果２３は、シンボリック実行の実行結果である。シンボリック実行結果２３は、シンボリック実行によって抽出された処理パスに対してパス条件とパス出力とを記述した実行結果である。
【００２８】
ロジック表２４は、シンボリック実行結果を整理した表であり、入力変数に設定された記号値に関して条件と出力を記述した表である。なお、ロジック表２４は、シンボリック実行結果２３を用いて生成される。
【００２９】
シンボリック実行部１１は、プログラム２１内のそれぞれの命令文に対してシンボリック実行を行う。
【００３０】
定数判定部１２は、シンボリック実行で分析する命令文が更新文である場合に、参照変数が定数であるか否かを判定する。例えば、定数判定部１２は、参照変数の名前がプログラム２１の定数の定義に含まれるか否かを判定する。定数判定部１２は、参照変数の名前が定数の定義に含まれている場合には、参照変数が定数である旨を出力する。定数判定部１２は、参照変数の名前が定数の定義に含まれていない場合であって、参照変数の名前が定数管理表２２に管理されている場合には、参照変数が定数管理表に管理された変数である旨を出力する。なお、参照変数の名前が、定数の定義に含まれていないが、作業変数の定義に含まれている場合がある。作業変数の定義とは、作業中に一時的に用いられる変数のことをいい、例えば図１８ＡのプログラムＤの中の２７行〜３０行に該当する。かかる場合には、定数判定部１２は、参照変数が定数である旨を出力すれば良い。
【００３１】
定数関係記録部１３は、定数判定部１２によって判定された参照変数が定数であると判定された場合には、定数の名前（定数名）と更新変数の変数名との定数関係を定数管理表２２に記録する。
【００３２】
例えば、定数関係記録部１３は、命令文と定数判定部１２からの出力内容とを受け付けると、出力内容が、参照変数が定数である旨を示す場合には、以下の処理を行う。定数関係記録部１３は、命令文中の更新変数の変数名が定数管理表２２に存在しない場合には、更新変数の変数名と、参照変数の定数名（更新元の値を意味する定数名）との定数関係を定数管理表２２に追加する。これにより、定数関係記録部１３は、プログラム内の定数の定義に重複する定数値があっても、命令文中の更新変数と、この更新変数に更新する定数値を意味する定数名とを関係付けることができる。定数関係記録部１３は、命令文中の更新変数の変数名が定数管理表２２に存在する場合には、更新変数の変数名に対する定数名を、命令文中の参照変数の定数名に更新する。これにより、定数関係記録部１３は、命令文中の更新変数と、この更新変数に更新する定数値を意味する定数名とを関係付けることができる。
【００３３】
また、定数関係記録部１３は、出力内容が、参照変数が定数管理表に管理された変数である旨を示す場合には、以下の処理を行う。定数関係記録部１３は、命令文中の参照変数に対応する定数名を定数管理表２２から取得し、取得した定数名と命令文中の更新変数の変数名との定数関係を定数管理表２２に追加する。これにより、定数関係記録部１３は、命令文中の参照変数に、既に更新された更新変数を用いる場合であっても、この更新変数に更新された定数値を意味する定数名を追跡でき、この定数名を命令文中の更新変数の変数名と関係付けることができる。
【００３４】
定数関係制御部１４は、定数関係記録部１３によって記録された定数関係を制御する。例えば、定数関係制御部１４は、パス分岐時点に、パス分岐時点での命令文と、パス分岐時点での定数管理表２２とを関連付けて保存する。また、定数関係制御部１４は、パスの終点であるとき、パスの終点での命令文と、パスの終点での定数管理表２２とを関連付けて保存する。そして、定数関係制御部１４は、定数管理表２２を保存したパス分岐までパスをバックトラックしたとき、このパス分岐時点で保存した定数管理表２２を再生する。
【００３５】
定数情報追加部１５は、パス条件およびパス出力を出力するときに、定数関係制御部１４によって制御された定数関係を利用して、パス条件およびパス出力に記述された定数値に定数情報を追加する。すなわち、定数情報追加部１５は、シンボリック実行結果として出力されるパス条件およびパス出力を、定数値に定数情報を追加したパス条件およびパス出力を含むシンボリック実行結果２３に置換する。
【００３６】
例えば、定数情報追加部１５は、シンボリック実行の処理がパス条件の記録処理である場合に、条件分岐文の条件とパス条件とを取得する。ここでいうパス条件とは、条件分岐文において複数分岐が可能で、分岐の１つを選択した場合に実施される条件のことをいう。一例として、ＩＦ文でＴＨＥＮ分岐を選択した場合には、ＩＦ文の条件がパス条件となる。そして、定数情報追加部１５は、パス条件の変数の変数名が、パス条件の条件分岐文に対応付けられた定数管理表２２の更新変数の変数名にある場合には、更新変数の変数名に対応する定数名（定数情報）をパス条件に記述された定数値に追加する。
【００３７】
また、定数情報追加部１５は、シンボリック実行の処理がパス出力の記録処理である場合に、パス出力を取得する。ここでいうパス出力とは、パスの終点で実施される出力のことをいう。そして、定数情報追加部１５は、パス出力の変数の変数名が、パス出力の命令文に対応付けられた定数管理表２２の更新変数の変数名にある場合には、更新変数の変数名に対応する定数名（定義情報）をパス出力に記述された定数値に追加する。
【００３８】
パス条件パス出力記録部１６は、定数情報追加部１５によって定数情報が追加されたパス条件およびパス出力をシンボリック実行結果２３として記録する。
【００３９】
定数情報解釈部１７は、シンボリック実行結果２３のパス条件を簡約化するために、パス条件に追加された定数情報を解釈する。
【００４０】
例えば、定数情報解釈部１７は、パス条件を簡約化する場合に、シンボリック実行結果２３から、定数情報を追加したパス条件を取得する。定数情報解釈部１７は、パス条件の中の比較条件ごとに、比較条件の変数が定数情報を追加したものであるか否かを判定する。定数情報解釈部１７は、比較条件の変数が定数情報を追加したものである場合には、元のパス条件に戻す。すなわち、定数情報解釈部１７は、パス条件の中の比較条件の変数を、定数情報を除外したものにする。そして、定数情報解釈部１７は、定数情報を追加した変数を持つ比較条件と定数情報が除外された元の比較条件との対応関係を記録する。
【００４１】
また、定数情報解釈部１７は、取得したパス条件の中の比較条件を元の比較条件に戻すと、元のパス条件を簡約化するため、元のパス条件を条件簡約化部１８に引き渡す。
【００４２】
また、定数情報解釈部１７は、条件簡約化部１８によって簡約化された元のパス条件を、定数情報を追加したパス条件にする場合には、対応関係を用いて、簡約化したパス条件の中の比較条件ごとに、比較条件の変数を、定数情報を追加したものに戻す。そして、定数情報解釈部１７は、簡約化された元のパス条件を、定数情報を追加したパス条件にして、簡約化された新たなパス条件を出力する。
【００４３】
条件簡約化部１８は、パス条件を簡約化する。一例として、パス条件が「（数値＝１）  ＡＮＤ  （（場所  ＮＯＴ＝２）  ＡＮＤ  （場所＝１））」である場合には、このパス条件を「（数値＝１）  ＡＮＤ  （場所＝１）」と簡約化する。
【００４４】
［定数判定部の動作の一例］
図２は、実施例に係る定数判定部の動作の一例を示す図である。図２左には、プログラム２１の処理内容が示されている。プログラム２１は、図１８Ａで示すプログラムＤであるとして説明する。プログラム２１の処理内容に含まれる命令文が１文ずつ処理される。
【００４５】
一例として、行番号が３２の命令文「ＭＯＶＥ  無問題  ＴＯ  エラー」が処理される場合について説明する。定数判定部１２は、命令文が更新文であるか否かを判定する。ここでは、命令文は、ＭＯＶＥ命令（転記命令）であるので、更新文であると判定される。
【００４６】
定数判定部１２は、参照変数の名前が定数であるか否かを判定する。ここでは、参照変数の名前は、「無問題」である。「無問題」は、定数の定義の２３行目に含まれている。すなわち、「無問題」は、定数である。したがって、定数判定部１２は、参照変数の名前が定数であるので、参照変数が定数である旨を示す「１」を出力する。
【００４７】
一例として、行番号が３４の命令文「ＩＦ  （数値  ＮＯＴ＝中継）ＴＨＥＮ」が処理される場合について説明する。定数判定部１２は、命令文が更新文であるか否かを判定する。ここでは、命令文は、ＩＦ命令（条件命令）であるので、更新文でないと判定される。したがって、定数判定部１２は、命令文が更新文でない旨を示す「０」を出力する。
【００４８】
一例として、行番号が３６の命令文「ＭＯＶＥ  ＮＧ  ＴＯ  中継Ｂ」が定数判定部１２に入力される場合について説明する。定数判定部１２は、命令文が更新文であるか否かを判定する。ここでは、命令文は、ＭＯＶＥ命令（転記命令）であるので、更新文であると判定される。
【００４９】
定数判定部１２は、参照変数の名前が定数であるか否かを判定する。ここでは、参照変数の名前は、「ＮＧ」である。「ＮＧ」は、定数の定義の２１行目に含まれている。すなわち、「ＮＧ」は、定数である。したがって、定数判定部１２は、参照変数の名前が定数であるので、参照変数が定数である旨を示す「１」を出力する。この後、定数関係記録部１３が、更新変数の変数名「中継Ｂ」と、参照変数の定数名「ＮＧ」との定数関係を定数管理表２２に追加する。
【００５０】
次に、一例として、行番号が３７の命令文「ＭＯＶＥ  中継Ｂ  ＴＯ  結果」が処理される場合について説明する。定数判定部１２は、命令文が更新文であるか否かを判定する。ここでは、命令文は、ＭＯＶＥ命令（転記命令）であるので、更新文であると判定される。
【００５１】
定数判定部１２は、参照変数の名前が定数であるか否かを判定する。ここでは、参照変数の名前は、「中継Ｂ」である。「中継Ｂ」は、定数の定義に含まれていない。すなわち、「中継Ｂ」は、定数でない。
【００５２】
さらに、定数判定部１２は、参照変数の名前が定数管理表２２に管理されているか否かを判定する。ここでは、１行前の３６行目の処理で、今回参照変数の名前である「中継Ｂ」が定数管理表２２に追加されるので、参照変数の名前が定数管理表２２に管理されていると判定される。したがって、定数判定部１２は、「中継Ｂ」は定数管理表に管理された変数であるので、参照変数が定数管理表に管理された変数である旨を示す「３」を出力する。
【００５３】
［定数関係記録部の動作の一例］
図３は、実施例に係る定数関係記録部の動作の一例を示す図である。図３左には、行番号ごとに命令文および定数判定部１２の出力が定数関係記録部１３の入力として示されている。プログラム２１は、図１８Ａで示すプログラムＤであるとして説明する。定数管理表２２は、まだ何も設定されていないこととする。
【００５４】
一例として、行番号が３２の命令文「ＭＯＶＥ  無問題  ＴＯ  エラー」が処理される場合について説明する。図３左には、定数判定部１２の出力として、参照変数が定数である旨の「１」が示されている。参照変数が「１」である場合には、以下の処理を行う。定数関係記録部１３は、命令文中の更新変数の変数名が定数管理表２２に存在しない場合には、更新変数の変数名と参照変数の定数名との定数関係を定数管理表２２に追加する。定数関係記録部１３は、命令文中の更新変数の変数名が定数管理表２２に存在する場合には、更新変数の変数名に対する定数名を、命令文中の参照変数の定数名に更新する。ここでは、定数管理表２２は、まだ何も設定されていない。そこで、定数関係記録部１３は、更新変数の変数名「エラー」と参照変数の定数名「無問題」との定数関係を定数管理表２２に追加する。
【００５５】
一例として、行番号が３３の命令文「ＭＯＶＥ  基準  ＴＯ  中継」が処理される場合について説明する。図３左には、定数判定部１２の出力として、参照変数が定数である旨の「１」が示されている。参照変数が「１」の場合であるので、行番号３２の命令文と同様の処理となる。ここでは、命令文の更新変数の変数名「中継」が定数管理表２２に存在しない。そこで、定数関係記録部１３は、更新変数の変数名「中継」と参照変数の定数名「基準」との定数関係を定数管理表２２に追加する。これにより、定数関係記録部１３は、命令文中の更新変数と、この更新変数に更新する定数値を意味する定数名とを関係付けることができる。
【００５６】
一例として、行番号が３４の命令文「ＩＦ  （数値  ＮＯＴ＝中継）」が処理される場合について説明する。図３左には、定数判定部１２の出力として、命令文が更新文でない旨の「０」が示されている。そこで、定数関係記録部１３は、何も処理しない。
【００５７】
一例として、行番号が３５の命令文「ＭＯＶＥ  基準違い  ＴＯ  エラー」が処理される場合について説明する。図３左には、定数判定部１２の出力として、参照変数が定数である旨の「１」が示されている。参照変数が「１」の場合であるので、行番号３２の命令文と同様の処理となる。ここでは、命令文の更新変数の変数名「エラー」が定数管理表２２に存在する。そこで、定数関係記録部１３は、更新変数の変数名「エラー」に対する定数名「無問題」を、命令文中の参照変数の定数名「基準違い」に更新する。これにより、定数関係記録部１３は、命令文中の更新変数と、この更新変数に更新する定数値を意味する定数名とを関係付けることができる。
【００５８】
一例として、行番号が３６の命令文「ＭＯＶＥ  ＮＧ  ＴＯ  中継Ｂ」が処理される場合について説明する。図３左には、定数判定部１２の出力として、参照変数が定数である旨の「１」が示されている。参照変数が「１」の場合であるので、行番号３２の命令文と同様の処理となる。ここでは、命令文の更新変数の変数名「中継Ｂ」が定数管理表２２に存在しない。そこで、定数関係記録部１３は、更新変数の変数名「中継Ｂ」と参照変数の定数名「ＮＧ」との定数関係を定数管理表２２に追加する。
【００５９】
一例として、行番号が３７の命令文「ＭＯＶＥ  中継Ｂ  ＴＯ  結果」が処理される場合について説明する。図３左には、定数判定部１２の出力として、参照変数が定数管理表２２に管理された変数である旨の「３」が示されている。参照変数が「３」である場合には、以下の処理を行う。定数関係記録部１３は、命令文中の参照変数に対応する定数名を定数管理表２２から取得し、取得した定数名と命令文中の更新変数の変数名との定数関係を定数管理表２２に追加する。ここでは、定数関係記録部１３は、定数管理表２２から、命令文中の参照変数「中継Ｂ」に対応する定数名「ＮＧ」を取得する。定数関係記録部１３は、取得した定数名「ＮＧ」と命令文中の更新変数の変数名「結果」との定数関係を定数管理表２２に追加する。これにより、定数関係記録部１３は、命令文中の参照変数「中継Ｂ」に、既に更新された更新変数を用いる場合であっても、この更新変数に更新された定数値を意味する定数名「ＮＧ」を追跡できる。そして、定数関係記録部１３は、この定数名「ＮＧ」を命令文中の更新変数の変数名「出力」と関係付けることができる。
【００６０】
［定数関係制御部の動作の一例］
図４は、実施例に係る定数関係制御部の動作の一例を示す図である。なお、図４で示すフローチャートは、図１８Ａで示したプログラムＤの処理の流れを示す。また、破線は、シンボリック実行の処理の順番を示す。
【００６１】
図４に示すように、定数関係制御部１４は、処理中の命令文がパス分岐文であり、且つ複数の分岐が実行可能である場合には、当該命令文と関連付けて定数管理表２２を保存する。定数関係制御部１４は、処理中の命令文がパスの終点である場合には、当該命令文と関連付けて定数管理表２２を保存する。そして、定数関係制御部１４は、定数管理表２２を保存したパス分岐までパスをバックトラックすると、このパス分岐文で保存した定数管理表２２を復元する。なお、複数の分岐が実行可能とは、Ｙｅｓの分岐条件とＮｏの分岐条件とが共に充足可能であることをいう。充足可能性は、例えば、ＳＭＴ（ＳＡＴ  Modulo  Theory）ソルバを用いて判定される。
【００６２】
シンボリック実行の処理の順番で、定数関係制御部１４は、上記処理を行う。
【００６３】
処理中の命令文が「ＩＦ  （数値  ＮＯＴ＝中継）？」（図１８Ａが示すプログラムＤの３４行目）であるときの上記処理を説明する。定数関係制御部１４は、処理中の命令文がパス分岐文（ＩＦ文）であり、且つ複数の分岐が実行可能であるので、当該命令文（ＩＦ文）と関連付けて定数管理表２２を保存する（＜１＞）。
【００６４】
処理中の命令文が「ＥＸＩＴ  ＰＲＯＧＲＡＭ」（図１８Ａが示すプログラムＤの３８行目）であるときの上記処理を説明する。定数関係制御部１４は、処理中の命令文がパスの終点であるので、当該命令文（ＥＸＩＴ文）と関連付けて定数管理表２２を保存する（＜２＞）。
【００６５】
そして、定数関係制御部１４は、定数管理表２２を保存したパス分岐までパスをバックトラックすると（図１８Ａが示すプログラムＤの３４行目）、このパス分岐文（ＩＦ文）で保存した定数管理表２２を復元する（＜３＞）。
【００６６】
処理中の命令文が「ＩＦ  （場所＝大阪  ＯＲ  名古屋  ＯＲ  福岡）？」（図１８Ａが示すプログラムＤの４０行目）であるときの上記処理を説明する。定数関係制御部１４は、処理中の命令文がパス分岐文（ＩＦ文）であり、且つ複数の分岐が実行可能であるので、当該命令文（ＩＦ文）と関連付けて定数管理表２２を保存する（＜４＞）。
【００６７】
処理中の命令文が「ＥＸＩＴ  ＰＲＯＧＲＡＭ」（図１８Ａが示すプログラムＤの５１行目）であるときの上記処理を説明する。定数関係制御部１４は、処理中の命令文がパスの終点であるので、当該命令文（ＥＸＩＴ文）と関連付けて定数管理表２２を保存する（＜５＞）。
【００６８】
そして、定数関係制御部１４は、定数管理表２２を保存したパス分岐までパスをバックトラックすると（図１８Ａが示すプログラムＤの３８行目）、このパス分岐文（ＩＦ文）で保存した定数管理表２２を復元する（＜６＞）。
【００６９】
［定数情報追加部の動作の一例］
図５Ａおよび図５Ｂは、実施例に係る定数情報追加部の動作の一例を示す図である。なお、図５Ａで示すフローチャートは、図１８Ａで示したプログラムＤの処理の流れを示す。また、破線は、シンボリック実行の処理の順番を示す。
【００７０】
図５Ａに示すように、定数情報追加部１５は、シンボリック実行の処理がパス条件の記録処理である場合には、以下の処理を行う。
【００７１】
一例として、処理中の命令文が「ＩＦ  （数値  ＮＯＴ＝中継）？」（図１８Ａが示すプログラムＤの３４行目）であるときに行われる。定数情報追加部１５は、パス条件と、パス条件に該当する条件分岐文の条件式とを取得する。ここでは、パス条件として「（数値  ＮＯＴ＝１）」が取得される。パス条件に該当する条件分岐文の条件式として「（数値  ＮＯＴ＝中継）」が取得される。
【００７２】
そして、定数情報追加部１５は、パス条件の変数の変数名が、このパス条件に該当する条件分岐文に対応付けられた定数管理表２２の更新変数の変数名にある場合には、この更新変数の変数名に対応する定数名（定数情報）をパス条件の定数値に追加する。ここでは、定数管理表２２には、更新変数の変数名が「エラー」である場合に、参照変数の定数名として「無問題」が設定されている。更新変数の変数名が「中継」である場合に、参照変数の定数名として「基準」が設定されている。すると、定数情報追加部１５は、パス条件の変数の変数名「中継」が定数管理表２２の更新変数の変数名にあるので、更新変数の変数名「中継」に対応する定数名「基準」を取得する。そして、定数情報追加部１５は、更新変数の変数名「中継」に対応する定数名「基準」をパス条件の定数値「１」に追加する。すなわち、新たなパス条件は、「（数値  ＮＯＴ＝基準＃１３ｃ＿１）」となる。なお、「＃」の後の数は、プログラム２１上に定数名「基準」の定義が記述された行数を示す。すなわち、定数名「基準」は、１３行目に記述されている。
【００７３】
また、定数情報追加部１５は、シンボリック実行の処理がパス出力の記録処理である場合には、以下の処理を行う。
【００７４】
一例として、処理中の命令文が「ＥＸＩＴ  ＰＲＯＧＲＡＭ」（図１８Ａが示すプログラムＤの３６行目）であるときに行われる。定数情報追加部１５は、パス出力を取得する。ここでは、パス出力として「結果＝１；エラー＝３」が取得される。
【００７５】
そして、定数情報追加部１５は、パス出力の左辺の変数の変数名が、パス出力の命令文に対応付けられた定数管理表２２の更新変数の変数名にある場合には、更新変数の変数名に対応する定数名（定義情報）をパス出力の定数値に追加する。ここでは、定数管理表２２には、更新変数の変数名が「エラー」である場合に、参照変数の定数名として「基準違い」が設定されている。更新変数の変数名が「中継」である場合に、参照変数の定数名として「基準」が設定されている。更新変数の変数名が「中継Ｂ」である場合に、参照変数の定数名として「ＮＧ」が設定されている。更新変数の変数名が「結果」である場合に、参照変数の定数名として「ＮＧ」が設定されている。すると、定数情報追加部１５は、パス出力の左辺の変数「結果」が定数管理表２２の更新変数の変数名にあるので、更新変数の変数名「結果」に対応する定数名「ＮＧ」を取得する。そして、定数情報追加部１５は、更新変数の変数名「結果」に対応する定数名「ＮＧ」をパス出力の定数値「１」に追加する。同様に、定数情報追加部１５は、パス出力の左辺の変数「エラー」が定数管理表２２の更新変数の変数名にあるので、更新変数の変数名「エラー」に対応する定数名「基準違い」を取得する。そして、定数情報追加部１５は、更新変数の変数名「エラー」に対応する定数名「基準違い」をパス出力の定数値「３」に追加する。すなわち、新たなパス出力は、「（結果＝ＮＧｃ＿１；エラー＝基準違い＃２６ｃ＿３）」となる。なお、「＃」の後の数は、プログラム２１上に定数名「基準違い」の定義が記述された行数を示す。すなわち、定数名「基準違い」は、２６行目に記述されている。
【００７６】
そして、定数情報追加部１５は、新たに置換したパス条件およびパス出力を出力する。
【００７７】
つまり、図５Ｂに示すように、定数情報追加部１５は、パスごとのパス条件及びパス出力を含むシンボリック実行結果２３´と、パスごとの定数管理表２２とを用いて、定数名（定数情報）を定数値に追加したシンボリック実行結果２３を生成する。そして、定数情報追加部１５は、符号２３´を符号２３に置換したパス条件およびパス出力を出力する。これにより、定数情報追加部１５は、シンボリック実行結果２３の可読性の向上を図ることができる。
【００７８】
［定数情報解釈部の動作の一例］
図６は、実施例に係る定数情報解釈部の動作の一例を示す図である。なお、図６では、図５Ｂで示したシンボリック実行結果２３のＮｏ３のパス条件について、定数情報解釈部１７の動作を説明する。
【００７９】
図６に示すように、定数情報解釈部１７は、入力として、シンボリック実行結果２３からＮｏ３の、定数情報を追加したパス条件を取得する。ここでは、Ｎｏ３の、定数情報を追加したパス条件は、「（（数値＃７＝‘基準＃１３ｃ＿１’）ＡＮＤ（場所＃６ＮＯＴ＝‘大阪＃１６ｃ＿２’）ＡＮＤ（場所＃６ＮＯＴ＝‘名古屋＃１７ｃ＿３’）ＡＮＤ（場所＃６ＮＯＴ＝‘福岡＃１８ｃ＿４’）ＡＮＤ（場所＃６＝‘東京＃１５ｃ＿１’））」である。
【００８０】
すると、定数情報解釈部１７は、パス条件の比較条件ごとに、比較条件の変数が定数情報を追加したものであるか否かを判定する。そして、定数情報解釈部１７は、比較条件の変数が定数情報を追加したものである場合には、元の比較条件に戻し、対応関係を記録する。ここでは、比較条件が「数値＃７＝‘基準＃１３ｃ＿１’」である場合には、比較条件の変数「１」が定数情報「基準」を追加したものであるので、定数情報解釈部１７は、この比較条件を元の比較条件「数値＃７＝１」に戻す。そして、定数情報解釈部１７は、置換前「数値＃７＝‘基準＃１３ｃ＿１’」と置換後「数値＃７＝１」とを対応関係に記録する。置換前が、定数情報を追加した変数を持つ比較条件である。置換後が、定数情報が除外された元の比較条件である。
【００８１】
同様に、比較条件が「場所＃６ＮＯＴ＝‘大阪＃１６ｃ＿２’」である場合には、比較条件の変数「２」が定数情報「大阪」を追加したものであるので、定数情報解釈部１７は、この比較条件を元の比較条件「場所＃６ＮＯＴ＝２」に戻す。そして、定数情報解釈部１７は、置換前と置換後とを対応関係に記録する。
【００８２】
同様に、定数情報解釈部１７は、定数情報を追加したパス条件に比較条件がなくなるまで、処理を繰り返す。この結果、定数情報解釈部１７は、対応関係の置換後の比較条件を用いて、元のパス条件を取得する。ここでは、Ｎｏ３の元のパス条件は、「（（数値＃７＝１）ＡＮＤ（場所＃６ＮＯＴ＝２）ＡＮＤ（場所＃６ＮＯＴ＝３）ＡＮＤ（場所＃６ＮＯＴ＝４）ＡＮＤ（場所＃６＝１））」となる。
【００８３】
そして、条件簡約化部１８は、取得したパス条件を簡約化する。ここでは、Ｎｏ３の元のパス条件は、「（（数値＃７＝１）ＡＮＤ（場所＃６＝１））」と簡約化される。すなわち、数値＃７が１であるとき、場所＃６が２でなく３でなく４でなく１であるパス条件は、「数値＃７が１であり、且つ、場所＃６が１である」と簡約化される。
【００８４】
そして、定数情報解釈部１７は、対応関係を用いて、条件簡約化部１８によって簡約化されたパス条件の中の比較条件ごとに、比較条件の変数を、定数情報を追加したものに戻す。ここでは、定数情報解釈部１７は、対応関係を用いて、簡約化されたパス条件の中の比較条件「（数値＃７＝１）」を「（数値＃７＝‘基準＃１３ｃ＿１’）」に戻す。定数情報解釈部１７は、対応関係を用いて、簡約化されたパス条件の中の比較条件「（場所＃６＝１）」を「（場所＃６＝‘東京＃１５ｃ＿１’）」に戻す。
【００８５】
そして、定数情報解釈部１７は、定数情報を追加した新たなパス条件を出力する。ここでは、Ｎｏ３の、定数情報を追加した新たなパス条件は、「（（数値＃７＝‘基準＃１３ｃ＿１’）ＡＮＤ（場所＃６＝‘東京＃１５ｃ＿１’））」となる。
【００８６】
このようにして、定数情報解釈部１７は、図５Ｂで示したシンボリック実行結果２３のそれぞれのパス条件を簡約化すれば良い。
【００８７】
なお、パス条件を簡約化したシンボリック実行結果２３が整理されたロジック表２４が、図７である。図７は、実施例に係るロジック表の一例を示す図である。図７に示すように、ロジック表２４は、定数値が適切に定数名（定数情報）を追加したものに置き換えられている。したがって、ロジック表２４は、参考例で示したロジック表（図１８Ｂ参照）と比較すると、可読性を向上させることができる。
【００８８】
［分析処理のフローチャート］
次に、実施例に係る分析処理のフローチャートの一例を、図８〜図１３を参照して説明する。
【００８９】
図８は、実施例に係る分析処理のフローチャートの一例を示す図である。図８に示すように、分析処理は、シンボリック実行で分析するプログラム２１を読み込んだものとする。
【００９０】
図８に示すように、分析処理は、プログラム２１から、シンボリック実行で分析する命令文を抽出する（ステップＳ１１）。
【００９１】
分析処理は、抽出した命令文について、定数判定部１２によって処理される定数判定処理を実行する（ステップＳ１２）。なお、定数判定処理のフローチャートは、後述する。分析処理は、定数関係記録部１３によって処理される定数関係記録処理を実行する（ステップＳ１３）。なお、定数関係記録処理のフローチャートは、後述する。分析処理は、定数関係制御部１４によって処理される定数関係制御処理を実行する（ステップＳ１４）。なお、定数関係制御処理のフローチャートは、後述する。分析処理は、定数情報追加部１５によって処理される定数情報追加処理を実行する（ステップＳ１５）。なお、定数情報追加処理のフローチャートは、後述する。分析処理は、定数情報解釈部１７によって処理される定数情報解釈処理を実行する（ステップＳ１６）。なお、定数情報解釈処理のフローチャートは、後述する。
【００９２】
分析処理は、命令文は最終であるか否かを判定する（ステップＳ１７）。命令文が最終でないと判定した場合には（ステップＳ１７；Ｎｏ）、分析処理は、次の命令文を抽出すべく、ステップＳ１１に移行する。一方、命令文が最終であると判定した場合には（ステップＳ１７；Ｙｅｓ）、分析処理は、プロセスを終了する。
【００９３】
［定数判定処理のフローチャート］
図９は、実施例に係る定数判定処理のフローチャートの一例を示す図である。なお、図９では、更新文を転記命令として記載する。
【００９４】
図９に示すように、定数判定部１２は、シンボリック実行で分析中の命令文を受け取る（ステップＳ２１）。定数判定部１２は、命令文が変数の転記命令であるか否かを判定する（ステップＳ２２）。命令文が変数の転記命令であると判定した場合には（ステップＳ２２；Ｙｅｓ）、定数判定部１２は、命令文の参照変数を取得する（ステップＳ２３）。一例として、命令文が「ＭＯＶＥ  無問題  ＴＯ  エラー」である場合には、命令文は転記命令である。命令文の参照変数として「無問題」が取得される。
【００９５】
そして、定数判定部１２は、参照変数が定数であるか否かを判定する（ステップＳ２４）。参照変数が定数であると判定した場合には（ステップＳ２４；Ｙｅｓ）、定数判定部１２は、参照変数が定数である旨を示す「１」を出力する（ステップＳ２５）。例えば、定数判定部１２は、参照変数の名前がプログラム２１の定数の定義に含まれている場合には、参照変数が定数であると判断し、「１」を出力する。そして、定数判定部１２は、定数判定処理を終了する。
【００９６】
一方、参照変数が定数でないと判定した場合には（ステップＳ２４；Ｎｏ）、定数判定部１２は、参照変数に初期値があるか否かを判定する（ステップＳ２６）。参照変数に初期値がある場合とは、例えば、参照変数がプログラム２１上の作業変数の定義に含まれ、且つ、作業変数の定義に初期値がある場合のことをいう。参照変数に初期値があると判定した場合には（ステップＳ２６；Ｙｅｓ）、定数判定部１２は、参照変数に初期値がある旨を示す「２」を出力する（ステップＳ２７）。そして、定数判定部１２は、定数判定処理を終了する。
【００９７】
一方、参照変数に初期値がないと判定した場合には（ステップＳ２６；Ｎｏ）、定数判定部１２は、参照変数が定数管理表２２に管理された変数であるか否かを判定する（ステップＳ２８）。参照変数が定数管理表２２に管理された変数であると判定した場合には（ステップＳ２８；Ｙｅｓ）、定数判定部１２は、参照変数が定数管理表に管理された変数である旨を示す「３」を出力する（ステップＳ２９）。そして、定数判定部１２は、定数判定処理を終了する。
【００９８】
一方、参照変数が定数管理表２２に管理された変数でないと判定した場合には（ステップＳ２８；Ｎｏ）、定数判定部１２は、ステップＳ３０に移行する。また、命令文が変数の転記命令でないと判定した場合には（ステップＳ２２；Ｎｏ）、定数判定部１２は、ステップＳ３０に移行する。ステップＳ３０において、定数判定部１２は、「０」を出力する（ステップＳ３０）。そして、定数判定部１２は、定数判定処理を終了する。
【００９９】
［定数関係記録処理のフローチャート］
図１０は、実施例に係る定数関係記録処理のフローチャートの一例を示す図である。
【０１００】
図１０に示すように、定数関係記録部１３は、定数判定部１２から、転記命令の命令文および定数判定処理の出力を受け取る（ステップＳ４１）。定数関係記録部１３は、出力が「０」であるか否かを判定する（ステップＳ４２）。出力が「０」であると判定した場合には（ステップＳ４２；Ｙｅｓ）、定数関係記録部１３は、定数関係記録処理を終了する。
【０１０１】
出力が「０」でないと判定した場合には（ステップＳ４２；Ｎｏ）、定数関係記録部１３は、出力が「１」または「２」であるか否かを判定する（ステップＳ４３）。出力が「１」または「２」であると判定した場合には（ステップＳ４３；Ｙｅｓ）、定数関係記録部１３は、更新変数をＫｅｙとし、定数管理表２２にＫｅｙが既存ならば、更新変数に対する定数値を更新する。定数関係記録部１３は、更新変数をＫｅｙとし、定数管理表２２にＫｅｙが既存でないなら、更新変数をＫｅｙとし、定数名を参照変数の定数名とする定数関係を定数管理表２２に追加する（ステップＳ４４）。一例として、図３で示した行番号３２の転記命令の命令文の場合には、定数関係記録部１３は、更新変数を「エラー」とし、定数名を「無問題」とする定数関係を定数管理表２２に追加する。一例として、図３で示した行番号３５の転記命令の命令文の場合には、定数関係記録部１３は、定数管理表２２に更新変数「エラー」が既存であるので、更新変数「エラー」に対する定数値を「基準違い」に更新する。そして、定数関係記録部１３は、定数関係記録処理を終了する。
【０１０２】
一方、出力が「１」および「２」でないと判定した場合には（ステップＳ４３；Ｎｏ）、定数関係記録部１３は、出力が「３」であるか否かを判定する（ステップＳ４５）。出力が「３」であると判定した場合には（ステップＳ４５；Ｙｅｓ）、定数関係記録部１３は、参照変数をＫｅｙとし、定数管理表２２からＫｅｙに対する定数値を取得する。定数関係記録部１３は、更新変数および取得した定数値を定数管理表２２に追加する（ステップＳ４６）。一例として、図３で示した行番号３７の転記命令の命令文の場合には、定数関係記録部１３は、参照変数を「中継２」として、定数管理表２２から「中継２」に対する定数値「ＮＧ」を取得する。定数関係季肋部１３は、更新変数を「出力」とし、定数名を「ＮＧ」とする定数関係を定数管理表２２に追加する。そして、定数関係記録部１３は、定数関係記録処理を終了する。
【０１０３】
一方、出力が「３」でないと判定した場合には（ステップＳ４５；Ｎｏ）、定数関係記録部１３は、定数関係記録処理を終了する。
【０１０４】
［定数関係制御処理のフローチャート］
図１１は、実施例に係る定数関係制御処理のフローチャートの一例を示す図である。
【０１０５】
図１１に示すように、定数関係制御部１４は、シンボリック実行で分析中の命令を受け取る（ステップＳ５１）。定数関係制御部１４は、命令文があるか否かを判定する（ステップＳ５２）。命令文がないと判定した場合には（ステップＳ５２；Ｎｏ）、定数関係制御部１４は、定数関係制御処理を終了する。
【０１０６】
一方、命令文があると判定した場合には（ステップＳ５２；Ｙｅｓ）、定数関係制御部１４は、命令文が条件分岐文、且つ、複数の分岐が実行可能であるか否かを判定する（ステップＳ５３）。なお、複数の分岐が実行可能とは、Ｙｅｓの分岐条件とＮｏの分岐条件とが共に充足可能であることをいう。充足可能性は、例えば、ＳＭＴソルバを用いて判定される。
【０１０７】
命令文が条件分岐文、且つ、複数の分岐が実行可能であると判定した場合には（ステップＳ５３；Ｙｅｓ）、定数関係制御部１４は、定数管理表２２を、受け取った命令文と関連付けて保存する（ステップＳ５４）。一例として、図４で示した＜１＞や＜４＞に対応する。そして、定数関係制御部１４は、次の命令文を受け取るべく、ステップＳ５１に移行する。
【０１０８】
一方、命令文が条件分岐文、且つ、複数の分岐が実行可能でないと判定した場合には（ステップＳ５３；Ｎｏ）、定数関係制御部１４は、命令文がパスの最後であるか否かを判定する（ステップＳ５５）。命令文がパスの最後であると判定した場合には（ステップＳ５５；Ｙｅｓ）、定数関係制御部１４は、定数管理表２２を保存した分岐命令文までパスをバックトラックする。定数関係制御部１４は、定数管理表２２を保存してあったものに置き換える（ステップＳ５６）。一例として、図４で示した＜２＞および＜３＞や＜５＞および＜６＞に対応する。そして、定数関係制御部１４は、次の命令文を受け取るべく、ステップＳ５１に移行する。
【０１０９】
一方、命令文がパスの最後でないと判定した場合には（ステップＳ５５；Ｎｏ）、定数関係制御部１４は、次の命令文を受け取るべく、ステップＳ５１に移行する。
【０１１０】
［定数情報追加処理のフローチャート］
図１２は、実施例に係る定数情報追加処理のフローチャートの一例を示す図である。
【０１１１】
図１２に示すように、定数情報追加部１５は、プログラム２１から定数の定義情報を取得する（ステップＳ６１）。定数情報追加部１５は、シンボリック実行の処理を取得する（ステップＳ６２）。定数情報追加部１５は、処理がパス条件の記録処理であるか否かを判定する(ステップＳ６３)。
【０１１２】
処理がパス条件の記録処理であると判定した場合には（ステップＳ６３；Ｙｅｓ）、定数情報追加部１５は、条件分岐文の条件とパス条件とを取得する（ステップＳ６４）。例えば、条件分岐文の条件は、命令文から取得すれば良い。パス条件は、シンボリック実行の処理結果（図５Ｂで示したシンボリック実行結果２３´のパス条件）を取得すれば良い。
【０１１３】
そして、定数情報追加部１５は、パス条件の変数が定数管理表２２のＫｅｙにあるか否かを判定する（ステップＳ６５）。例えば、定数情報追加部１５は、パス条件の変数の変数名が、このパス条件に該当する条件分岐文に対応付けられた定数管理表２２の更新変数の変数名（Ｋｅｙ）にあるか否かを判定する。
【０１１４】
パス条件の変数が定数管理表２２のＫｅｙにあると判定した場合には（ステップＳ６５；Ｙｅｓ）、定数情報追加部１５は、変数に該当するパス条件の定数値に定数情報および定数情報が記述された行数を追加する（ステップＳ６６）、行数は、定数の定義情報から取得されれば良い。例えば、定数情報追加部１５は、パス条件の変数の変数名が、このパス条件に該当する条件分岐文に対応付けられた定数管理表２２の更新変数の変数名にある場合には、この更新変数の変数名に対応する定数名（定数情報）をパス条件の定数値に追加する。一例として、図５Ａで示した＜１＞に対応する。そして、定数情報追加部１５は、次のシンボリック実行の処理を取得すべく、ステップＳ６２に移行する。
【０１１５】
一方、パス条件の変数が定数管理表２２のＫｅｙにないと判定した場合には（ステップＳ６５；Ｎｏ）、定数情報追加部１５は、次のシンボリック実行の処理を取得すべく、ステップＳ６２に移行する。
【０１１６】
ステップＳ６３において、処理がパス条件の記録処理でないと判定した場合には（ステップＳ６３；Ｎｏ）、定数情報追加部１５は、処理がパス出力の記録処理であるか否かを判定する（ステップＳ６７）。
【０１１７】
処理がパス出力の記録処理であると判定した場合には（ステップＳ６７；Ｙｅｓ）、定数情報追加部１５は、パス出力を取得する（ステップＳ６８）。例えば、パス出力は、シンボリック実行の処理結果（図５Ｂで示したシンボリック実行結果２３´のパス出力）を取得すれば良い。
【０１１８】
そして、定数情報追加部１５は、パス出力の左辺の変数が定数管理表２２のＫｅｙにあるか否かを判定する（ステップＳ６９）。例えば、定数情報追加部１５は、パス出力の左辺の変数の変数名が、パス出力の命令文に対応付けられた定数管理表２２の更新変数の変数名にあるか否かを判定する。
【０１１９】
パス出力の左辺の変数が定数管理表２２のＫｅｙにあると判定した場合には（ステップＳ６９；Ｙｅｓ）、定数情報追加部１５は、左辺の変数に該当するパス出力の右辺の定数値に定数情報および定数情報が記述された行数を追加する（ステップＳ７０）。行数は、定数の定義情報から取得されれば良い。一例として、図５Ａで示した＜２＞に対応する。そして、定数情報追加部１５は、次のシンボリック実行の処理を取得すべく、ステップＳ６２に移行する。
【０１２０】
一方、パス出力の左辺の変数が定数管理表２２のＫｅｙにないと判定した場合には（ステップＳ６９；Ｎｏ）、定数情報追加部１５は、次のシンボリック実行の処理を取得すべく、ステップＳ６２に移行する。
【０１２１】
ステップＳ６７において、処理がパス出力の記録処理でないと判定した場合には（ステップＳ６７；Ｎｏ）、定数情報追加部１５は、処理が終了処理であるか否かを判定する（ステップＳ７１）。処理が終了処理でないと判定した場合には（ステップＳ７１；Ｎｏ）、定数情報追加部１５は、次のシンボリック実行の処理を取得すべく、ステップＳ６２に移行する。
【０１２２】
一方、処理が終了処理であると判定した場合には（ステップＳ７１；Ｙｅｓ）、定数情報追加部１５は、定数情報追加処理を終了する。
【０１２３】
［定数情報解釈処理のフローチャート］
図１３は、実施例に係る定数情報解釈処理のフローチャートの一例を示す図である。
【０１２４】
図１３に示すように、定数情報解釈部１７は、定数情報を追加したパス条件を受け取る（ステップＳ８１）。定数情報解釈部１７は、パス条件内の比較条件ｉ（ｉは、１〜Ｎの整数）を取得する（ステップＳ８２）。なお、Ｎは、パス条件内の比較条件の最大数を示す。定数情報解釈部１７は、ｉを１に設定する（ステップＳ８３）。
【０１２５】
定数情報解釈部１７は、ｉがＮ以下であるか否かを判定する（ステップＳ８４）。ｉがＮ以下であると判定した場合には（ステップＳ８４；Ｙｅｓ）、定数情報解釈部１７は、比較条件ｉの変数が定数情報を追加した変数であるか否かを判定する（ステップＳ８５）。比較条件ｉの変数が定数情報を追加した変数でないと判定した場合には（ステップＳ８５；Ｎｏ）、定数情報解釈部１７は、ステップＳ８７に移行する。
【０１２６】
一方、比較条件ｉの変数が定数情報を追加した変数であると判定した場合には（ステップＳ８５；Ｙｅｓ）、定数情報解釈部１７は、元の比較条件に戻し、定数情報を追加した変数を持つ比較条件と元の比較条件との対応関係を記録する（ステップＳ８６）。そして、定数情報解釈部１７は、ステップＳ８７に移行する。
【０１２７】
ステップＳ８７において、定数情報解釈部１７は、ｉをインクリメントし（ステップＳ８７）、次の比較条件の処理に遷移すべく、ステップＳ８４に移行する。ステップＳ８４において、定数情報解釈部１７は、ｉがＮより大きいと判定した場合には（ステップＳ８４；Ｎｏ）、元のパス条件を復元する（ステップＳ８８）。
【０１２８】
そして、条件簡約化部１８は、元のパス条件を簡約化する（ステップＳ８９）。
【０１２９】
そして、定数情報解釈部１７は、簡約化したパス条件内の比較条件ｊ（ｊは、１〜Ｍの整数）を取得する（ステップＳ９０）。なお、Ｍは、パス条件内の比較条件の最大数を示す。定数情報解釈部１７は、ｊを１に設定する（ステップＳ９１）。
【０１３０】
定数情報解釈部１７は、ｊがＭ以下であるか否かを判定する（ステップＳ９２）。ｊがＭ以下であると判定した場合には（ステップＳ９２；Ｙｅｓ）、定数情報解釈部１７は、比較条件ｊが対応関係にあるか否かを判定する（ステップＳ９３）。比較条件ｊが対応関係にないと判定した場合には（ステップＳ９３；Ｎｏ）、定数情報解釈部１７は、ステップＳ９５に移行する。
【０１３１】
一方、比較条件ｊが対応関係にあると判定した場合には（ステップＳ９３；Ｙｅｓ）、定数情報解釈部１７は、対応関係によって定数情報を追加した比較条件に戻す（ステップＳ９４）。そして、定数情報解釈部１７は、ステップＳ９５に移行する。
【０１３２】
ステップＳ９５において、定数情報解釈部１７は、ｊをインクリメントし（ステップＳ９５）、次の比較条件の処理に遷移すべく、ステップＳ９２に移行する。ステップＳ９２において、定数情報解釈部１７は、ｊがＭより大きいと判定した場合には（ステップＳ９２；Ｎｏ）、定数情報解釈処理を終了する。
【０１３３】
［実施例の効果］
上記実施例によれば、情報処理装置１は、プログラム２１を、シンボリック実行を用いて分析する。情報処理装置１は、プログラム２１から順次命令文を抽出する。情報処理装置１は、抽出された命令文が変数を更新する更新文である場合に、更新文に含まれる、変数の変数名及び変数を更新する値の意味を示す定数名の関係を定数管理表２２に記録する。情報処理装置１は、命令文がパスを分岐する分岐文である場合に、分岐文と定数管理表２２とを関連付ける。情報処理装置１は、関連付けられた分岐文と定数管理表２２とに基づいて、分岐文に対するシンボリック実行結果２３´に含まれる定数値を、定数管理表２２に記憶された定数名を含む情報に置換する。かかる構成によれば、情報処理装置１は、同一の値を異なる意味を持つ定数名を有するプログラムであっても、更新文の実行の際に記憶された変数名及び定数名の関係を用いて、シンボリック実行結果２３´に含まれる定数値を、定数名を含む情報に置換することで、シンボリック実行結果２３の可読性を向上できる。加えて、情報処理装置１は、シンボリック実行結果２３を整理したロジック表の可読性を向上できる。この結果、情報処理装置１は、プログラムの理解や使用抽出のための可読性を向上できる。
【０１３４】
また、上記実施例によれば、情報処理装置１は、抽出された第１の更新文に含まれる、変数名及び定数名の関係を定数管理表２２に記録する。情報処理装置１は、抽出された第２の更新文に含まれる変数名が第１の更新文に含まれる変数名と同じである場合には、変数名に対応付けられた関係の定数名を第２の更新文に含まれる定数名に更新して記録する。かかる構成によれば、情報処理装置１は、命令文に含まれる変数名及び定数名の関係を随時更新することで、命令文を実行している際の当該関係を最新の状態に保持できる。この結果、情報処理装置１は、この関係を用いて、シンボリック実行結果に含まれる定数値を、定数名を含む情報に置換することで、シンボリック実行結果の可読性を向上できる。
【０１３５】
また、上記実施例によれば、情報処理装置１は、抽出された第１の更新文に含まれる、変数名及び定数名の関係を定数管理表２２に記録する。情報処理装置１は、抽出された第２の更新文に含まれる定数名が定数管理表２２に変数名として記憶されている場合には、定数管理表２２に記憶された変数名に対応付けられた定数名及び第２の更新文に含まれる変数名を追加して記録する。かかる構成によれば、情報処理装置１は、命令文中の参照変数に既に更新された更新変数が使われている場合であっても、更新変数に更新された定数値を示す定数名を追跡でき、この定数名を命令文中の更新変数の変数名と対応付けることができる。
【０１３６】
また、上記実施例によれば、情報処理装置１は、バックトラック時の分岐文で、分岐文と分岐文を実行する際の定数管理表２２を関連付ける。かかる構成によれば、情報処理装置１は、バックトラック時に、分岐文と分岐文を実行する際の関係を関連付けることで、この分岐文から派生する次の条件のパスに関する関係を正確に記録できる。
【０１３７】
［その他］
なお、上記実施例では、シンボリック実行対象のプログラム２１をＣｏｂｏｌ言語として説明した。しかしながら、シンボリック実行対象のプログラム２１は、Ｃｏｂｏｌ言語に限定されず、Ｃ言語やＪａｖａ（登録商標）Ｓｃｒｉｐｔであっても良いし、定数値を定数名や変数名で表現するプログラムであれば、いかなる言語であっても良い。
【０１３８】
また、図示した情報処理装置１の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、情報処理装置１の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、定数情報解釈部１７および条件簡約化部１８を１つの部として統合しても良い。また、定数情報追加部１５を、パス条件に対して定数情報を追加する追加部と、パス出力に対して定数情報を追加する追加部とに分散しても良い。また、記憶部２０を情報処理装置１の外部装置としてネットワーク経由で接続するようにしても良い。
【０１３９】
また、上記実施例で説明した各種の処理は、予め用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図１に示した情報処理装置１と同様の機能を実現する分析プログラムを実行するコンピュータの一例を説明する。図１４は、分析プログラムを実行するコンピュータの一例を示す図である。
【０１４０】
図１４に示すように、コンピュータ２００は、各種演算処理を実行するＣＰＵ２０３と、ユーザからのデータの入力を受け付ける入力装置２１５と、表示装置２０９を制御する表示制御部２０７とを有する。また、コンピュータ２００は、記憶媒体からプログラムなどを読取るドライブ装置２１３と、ネットワークを介して他のコンピュータとの間でデータの授受を行う通信制御部２１７とを有する。また、コンピュータ２００は、各種情報を一時記憶するメモリ２０１と、ＨＤＤ２０５を有する。そして、メモリ２０１、ＣＰＵ２０３、ＨＤＤ２０５、表示制御部２０７、ドライブ装置２１３、入力装置２１５、通信制御部２１７は、バス２１９で接続されている。
【０１４１】
ドライブ装置２１３は、例えばリムーバブルディスク２１１用の装置である。ＨＤＤ２０５は、分析プログラム２０５ａおよび分析関連情報２０５ｂを記憶する。
【０１４２】
ＣＰＵ２０３は、分析プログラム２０５ａを読み出して、メモリ２０１に展開し、プロセスとして実行する。かかるプロセスは、情報処理装置１の各機能部に対応する。分析関連情報２０５ｂは、プログラム２１、定数管理表２２、シンボリック実行結果２３およびロジック表２４に対応する。そして、例えばリムーバブルディスク２１１が、分析プログラム２０５ａなどの各情報を記憶する。
【０１４３】
なお、分析プログラム２０５ａについては、必ずしも最初からＨＤＤ２０５に記憶させておかなくても良い。例えば、コンピュータ２００に挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」に当該プログラムを記憶させておく。そして、コンピュータ２００がこれらから分析プログラム２０５ａを読み出して実行するようにしても良い。
【符号の説明】
【０１４４】
１  情報処理装置
１０  制御部
１１  シンボリック実行部
１２  定数判定部
１３  定数関係記録部
１４  定数関係制御部
１５  定数情報追加部
１６  パス条件パス出力記録部
１７  定数情報解釈部
１８  条件簡約部
２０  記憶部
２１  プログラム
２２  定数管理表
２３  シンボリック実行結果
２４  ロジック表
【図１】
2019106153.tif 000003
【図２】
2019106153.tif 000004
【図３】
2019106153.tif 000005
【図４】
2019106153.tif 000006
【図５Ａ】
2019106153.tif 000007
【図５Ｂ】
2019106153.tif 000008
【図６】
2019106153.tif 000009
【図７】
2019106153.tif 000010
【図８】
2019106153.tif 000011
【図９】
2019106153.tif 000012
【図１０】
2019106153.tif 000013
【図１１】
2019106153.tif 000014
【図１２】
2019106153.tif 000015
【図１３】
2019106153.tif 000016
【図１４】
2019106153.tif 000017
【図１５】
2019106153.tif 000018
【図１６】
2019106153.tif 000019
【図１７】
2019106153.tif 000020
【図１８Ａ】
2019106153.tif 000021
【図１８Ｂ】
2019106153.tif 000022