以下に、本願の開示するデッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置の実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
まず、実施例に係るデッドコード解析装置によるデッドコードの検出方法について説明する。図1は、実施例に係るデッドコード解析装置によるデッドコードの検出方法を説明するための図である。図1に示すように、実施例に係るデッドコード解析装置は、到達表管理部2により、被検査プログラム31から初期状態の到達表2aを作成する。到達表2aは、ブロックNo.と、開始行-終了行と、到達状態とが基本ブロック毎に対応付けられた表である。
ブロックNo.は、基本ブロックを識別する番号である。開始行-終了行は、デッドコードが検出される被検査プログラム31のソースコードにおける基本ブロックの開始行の行番号と終了行の行番号である。到達状態は、基本ブロックに到達するパスが抽出されたか否かを示す。到達状態の「○」は、基本ブロックに到達するパスが抽出されたことを示し、到達状態の「×」は、基本ブロックに到達するパスが抽出されていないことを示す。初期状態では、到達状態は全て「×」である。
そして、実施例に係るデッドコード解析装置は、分岐網羅パス抽出部3により、改良分岐網羅パス抽出を用いてパスを抽出し、抽出したパスが通過する基本ブロックに対応する到達状態を「○」に変更して到達表2aを更新する。
そして、実施例に係るデッドコード解析装置は、ブロック到達パス抽出部4により、到達状態が「×」である基本ブロックを対象として通過パスを抽出し、通過パスにより基本ブロックに到達可能である場合に到達状態を「○」に変更して到達表2aを更新する。そして、実施例に係るデッドコード解析装置は、ブロック到達パス抽出部4による更新後も到達状態が「×」である基本ブロックの命令文をデッドコードとして検出する。
このように、実施例に係るデッドコード解析装置は、改良分岐網羅パス抽出により抽出したパスが通過しない基本ブロックを対象として通過パスを探索し、通過パスがない基本ブロックの命令文をデッドコードとして検出する。したがって、実施例に係るデッドコード解析装置は、少ない数の基本ブロックを対象として通過パスを探索するので、効率よくデッドコードを検出することができる。また、実施例に係るデッドコード解析装置は、通過パスを探索する対象の基本ブロックを改良分岐網羅パス抽出を用いて特定するので、効率よく対象の基本ブロックを特定することができる。
次に、実施例に係るデッドコード解析装置の機能構成について説明する。図2は、実施例に係るデッドコード解析装置の機能構成を示す図である。図2に示すように、実施例に係るデッドコード解析装置1は、到達表管理部2と、分岐網羅パス抽出部3と、ブロック到達パス抽出部4と、ロジック依存到達判定部5と、稼働データ入力部6と、データ依存到達判定部7と、デッドコード出力部8とを有する。
到達表管理部2は、被検査プログラム31を例えばファイルから読み込んで基本ブロックに分割し、基本ブロック毎の到達状況を到達表2aを用いて管理する。到達表管理部2は、例えば、ユーザがキーボードを用いて行ったデッドコード解析指示を受け付けて、被検査プログラム31をファイルから読み込む。
到達表管理部2は、初期状態の到達表2aを作成し、記憶部に記憶する。そして、到達表管理部2は、分岐網羅パス抽出部3及びブロック到達パス抽出部4から通過命令文のリストとして行番号リストを受け取って到達表2aを更新する。ここで、通過命令文は、分岐網羅パス抽出部3及びブロック到達パス抽出部4が抽出したパスが通過する命令文である。
分岐網羅パス抽出部3は、改良分岐網羅パス抽出により、できるだけ数が少なく分岐網羅度が高いパスを抽出し、通過命令文のリストを作成する。そして、分岐網羅パス抽出部3は、通過命令文のリストを到達表管理部2に渡す。
図3は、分岐網羅パス抽出部3による処理を説明するための図である。図3に示す被検査プログラム31の例では、改良分岐網羅パス抽出により、#1~#4の4個のパスが抽出される。分岐網羅パス抽出結果41において、行番号は、命令文の行を識別する番号であり、各パスのカラムの数字は、命令文の通過回数を示し、通過合計は、通過回数の合計である。例えば、行番号が「19」である「MOVE 10 TO X5」を、#1~#4のパスは1回通過する。また、「MOVE 10 TO X5」は、合計4回通過される。
通過回数の「0」は網掛けされている。通過合計が「0」は、改良分岐網羅パス抽出により抽出されたいずれのパスも命令文を通過しないことを意味する、したがって、行番号「38」~「42」は、通過命令文のリストに含まれない。これらの行番号に対応する基本ブロックは「11」と「12」であり、分岐網羅パス抽出部3による処理後、到達表2aの「11」と「12」に対応する到達状態は初期状態の「×」のままである。なお、分岐網羅パス抽出部3による改良分岐網羅パス抽出の詳細については後述する。
ブロック到達パス抽出部4は、未到達ブロックのリストから順に未到達ブロクを1つ選び、未到達ブロックを通過するパスを抽出する。ここで、未到達ブロックとは、到達表2aの到達状態が「×」である基本ブロックである。そして、ブロック到達パス抽出部4は、通過命令文のリストを作成し、通過命令文のリストを到達表管理部2に渡す。
図4は、ブロック到達パス抽出部4による処理を説明するための図である。図4に示すように、分岐網羅パス抽出部3による処理後の未到達ブロック「11」は、ブロック到達パス抽出部4により抽出されたパスが通過するので、到達状態が「○」に更新される。一方、分岐網羅パス抽出部3による処理後の未到達ブロック「12」を通過するパスは、ブロック到達パス抽出部4により抽出されないため、到達表2aの「12」に対応する到達状態は初期状態の「×」のままである。なお、ブロック到達パス抽出部4による処理の詳細については後述する。
ロジック依存到達判定部5は、ブロック到達パス抽出部4による処理後の未到達ブロックの命令文をデッドコードとして検出し、検出したデッドコードをデッドコード出力部8に渡す。
図5は、ロジック依存到達判定部5による処理を説明するための図である。図5に示すように、ロジック依存到達判定部5は、到達表2aの基本ブロックを順にチェックして未到達ブロックを収集する。そして、ロジック依存到達判定部5は、未到達ブロックの命令文を特定して、デッドコードを検出する。図5では、ロジック依存到達判定部5は、行番号が「41」の命令文「COMPUTE Y2=X4-X5」をデッドコードとして検出する。
図3~図5に示した例では、分岐網羅パス抽出部3により分岐網羅パスが4個抽出され、ブロック到達パス抽出部4により未到達ブロックを通過するパスが1個抽出される。デッドコード解析装置1は、5個のパスを調査することによって、デッドコード「COMPUTE Y2=X4-X5」を検出することができる。
稼働データ入力部6は、被検査プログラム31が入力するデータを稼働データ32として入力し、データ依存到達判定部7に渡す。データ依存到達判定部7は、ブロック到達条件に稼働データ32を代入し、ブロック到達条件が常に偽の基本ブロックの命令文をデッドコードとして検出し、検出したデッドコードをデッドコード出力部8に渡す。なお、ブロック到達条件は、基本ブロックに到達する条件であり、分岐網羅パス抽出部3及びブロック到達パス抽出部4によりパス抽出時に特定される。
デッドコード出力部8は、ロジック依存到達判定部5により検出されたロジック依存デッドコード33及びデータ依存到達判定部7により検出された稼働データ依存デッドコード34を表示装置に表示する。
次に、分岐網羅パス抽出部3による改良分岐網羅パス抽出の詳細について図6~図14を用いて説明する。図6は、分岐網羅パス抽出部3の機能構成を示す図である。図6に示すように、分岐網羅パス抽出部3は、入力部12と、シンボリック実行部14と、制御部16と、管理部20と、選択部22と、生成部24と、検出部26と、出力部28とを有する。
分岐網羅パス抽出部3は、シンボリック実行技術により被検査プログラム31を実行して分岐網羅パスを抽出し、抽出した分岐網羅パスが通過する命令文のリストとして行番号リスト35を出力する。
入力部12は、被検査プログラム31を受け付け、被検査プログラム31を分岐網羅パス抽出部3内部に取り込む。
シンボリック実行部14は、入力部12を介して受け付けた被検査プログラム31に含まれる変数に具体的な値を設定する代わりにシンボル値を設定する。このように、シンボリック実行の際、シンボル値に置き換えられる変数を外部変数という。そして、シンボリック実行部14は、外部変数をシンボル値としたまま、制御部16によって探索されたパスを模擬的に実行し、被検査プログラム31からパスを抽出する。また、シンボリック実行部14は、実行したパスの基本ブロック毎にブロック到達条件を特定する。そして、シンボリック実行部14は、抽出したパスが通過する命令文のリストとして行番号のリストを出力部28に渡す。
出力部28は、シンボリック実行部14から渡された行番号のリストを行番号リスト35として到達表管理部2に出力する。
制御部16は、シンボリック実行の際に、管理部20、選択部22、生成部24、及び検出部26の各機能部を制御して、被検査プログラム31に含まれるパスの探索を実行する。そして、制御部16は、探索したパスをシンボリック実行部14に引き渡す。
管理部20は、制御部16によって探索されたパスの実行順に基づいて、被検査プログラム31に含まれる条件分岐毎に、分岐先への分岐実行回数を管理する。以下では、管理部20の機能について詳細に説明する。
図7は、分岐網羅パス抽出部3の説明に用いる被検査プログラム31の一例を示す図である。図7に示す被検査プログラム31には、条件分岐命令であるIF文が13行目、19行目、及び25行目の合計3箇所に存在する。また、16行目、20行目、26行目、及び31行目に、被検査プログラム31の終了を意味する「EXIT PROGRAM」が存在する。
図8は、図7に示した被検査プログラム31をフローチャートで示した図である。ステップS30、ステップS34、及びステップS38の各処理が、それぞれ図7の被検査プログラム31の13行目、19行目、及び25行目の条件分岐に対応する。また、ステップS32、ステップS36、及びステップS40の各処理が、それぞれ図7の被検査プログラム31の14行目、22行目、及び28行目の処理に対応する。
図9は、管理部20で実行される管理内容を示す図である。まず、管理部20は、被検査プログラム31から条件分岐命令であるIF文を取得する。そして、管理部20は、制御部16によって初めて被検査プログラム31のパス探索が開始される前の状態、すなわち初期状態において、各IF文の分岐実行回数を、例えば「直接=(0、0)」のように初期化する。ここで、「直接」とは、対応するIF文がPERFORM文等で呼び出される外部処理のIF文として実行されるものではないことを意味している。また、(0、0)とは、並び順に、IF文におけるTHEN側の分岐実行回数、ELSE側の分岐実行回数を表している。
例えば、制御部16によって、図8に示すステップS30→ステップS32→ステップS34→エンドで表されるパスが探索されたとする。この場合、13行目のIF文ではTHEN側の分岐(THEN分岐)が選択されたため、管理部20は、IF文(13行目)のTHEN側の分岐実行回数を1増やして、「直接=(1、0)」とする。また、19行目のIF文でもTHEN分岐が選択されたため、管理部20は、IF文(19行目)の分岐実行回数を、「直接=(1、0)」とする。
次に、制御部16によって、例えば、ステップS30→エンドで表されるパスが探索されたとする。この場合、13行目のIF文ではELSE側の分岐(ELSE分岐)が選択されたため、管理部20は、IF文(13行目)のELSE側の分岐実行回数を1増やして、「直接=(1、1)」とする。
引き続き、制御部16によって、例えば、ステップS30→ステップS32→ステップS34→ステップS36→ステップS38→エンドで表されるパスが探索されたとする。この場合、上記と同様の方法により、管理部20は、IF文(13行目)の分岐実行回数を「直接=(2、1)」、IF文(19行目)の分岐実行回数を「直接=(1、1)」、IF文(25行目)の分岐実行回数を「直接=(1、0)」とする。
以下、制御部16によってパスが探索される度に、管理部20は、上記に説明した方法にしたがって、探索されたパスによって実行されたIF文の分岐実行回数を更新する。
なお、条件分岐命令には、IF文の他に、複数の異なる処理の中から条件に合った処理を選択するEVALUATE文のような多分岐命令も含まれる。図10は、EVALUATE文が含まれる被検査プログラム31の例を示す図である。図10に示す被検査プログラム31には、12行目及び23行目に2つのEVALUATE文が含まれている。
管理部20は初期状態において、12行目のEVALUATE文の分岐実行回数を、例えば「直接=(0、0、0、0)」のように初期化する。ここで(0、0、0、0)とは、並び順に、変数1が‘A’の場合の分岐実行回数、変数1が‘B’の場合の分岐実行回数、変数1が‘C’の場合の分岐実行回数、変数1が‘A’、‘B’、‘C’のいずれの場合にも該当しない場合の分岐実行回数を表している。
また、管理部20は初期化状態において、23行目のEVALUATE文の分岐実行回数を、例えば「直接=(0、0、0)」のように初期化する。
そして、管理部20は、IF文における分岐実行回数の管理と同様に、EVALUATE文の分岐実行回数を管理する。例えば制御部16によって、14行目及び25行目のDISPLAY文を実行するパスが探索された場合、EVALUATE文(12行目)の分岐実行回数は、「直接=(1、0、0、0)」となる。また、EVALUATE文(23行目)の分岐実行回数は、「直接=(1、0、0)」となる。
選択部22は、制御部16が被検査プログラム31からパスを探索する際に、制御部16から呼び出される機能部であり、パスが条件分岐に到達する毎に予め定めたパス選択規則にしたがって、分岐先を選択する。ここで、パス選択規則とは、条件分岐における分岐先を選択するための規則である。
パス選択規則の一例として、例えば、選択部22は、パス上の条件分岐命令が分岐可能である場合に、管理部20によって管理される条件分岐毎の分岐実行回数に基づいて、分岐実行回数が少ない方の分岐を選択する。なお、条件分岐の分岐実行回数が同数である場合には、選択部22は、予め定めた選択規則にしたがって、分岐先を選択する。
ここで、予め定めた選択規則とは、例えば条件分岐命令における最初の分岐を選択する等の規則をいう。具体的には、一例として、IF文の分岐実行回数が同数である場合、選択部22は、THEN分岐を選択する。なお、予め定めた選択規則はこれに限定されるものではなく、例えば、選択部22は、ELSE分岐を選択するようにしてもよい。
また、条件分岐命令が分岐可能とは、条件分岐命令における各々の分岐の分岐条件が、共に充足可能である状態をいう。
例えば、図7に示した被検査プログラム31の13行目のIF文は、(項目1=1)か否かが分岐条件となる。この場合、THEN分岐は分岐条件:(項目1=1)がTRUEの場合に選択される。一方、ELSE分岐は分岐条件:(項目1=1)がFALSEの場合に選択されるが、これは、分岐条件:!(項目1=1)がTRUEの場合に選択されると解釈することができる。
分岐条件に含まれる変数:項目1は外部変数であるため、図7に示した被検査プログラム31単体でシンボリック実行した場合には、変数:項目1はシンボル値に置き換えられる。したがって、分岐条件:(項目1=1)の真偽値を確定することができない。
そこで選択部22は、THEN分岐の分岐条件:(項目1=1)、及びELSE分岐の分岐条件:!(項目1=1)の充足可能性を判断する。この場合、THEN分岐の分岐条件とELSE分岐の分岐条件は共に充足可能であることから、選択部22は、図7に示した被検査プログラム31の13行目のIF文を分岐可能と判定し、THEN分岐とELSE分岐の2つの分岐の中から分岐先を選択する。
図11は、選択部22において、既に説明したパス選択規則のみにしたがって、図7に示した被検査プログラム31から探索されたパスの一例を示す図である。
図11に示すように、1回目のパス探索前では、管理部20によって管理される条件分岐毎の分岐実行回数は初期状態にある。
したがって、1回目のパス探索では、IF文(13行目)は分岐可能であり、且つ、分岐実行回数が(0、0)であることから、THEN分岐が選択される。そして、IF文(19行目)も分岐可能であり、且つ、分岐実行回数が(0、0)であることから、THEN分岐が選択され、図8におけるステップS30→ステップS32→ステップS34→エンドで表されるパス#11が選択される。
次いで、2回目のパス探索では、IF文(13行目)の分岐実行回数が管理部20によって(1、0)に更新されていることから、分岐実行回数がより少ないELSE分岐が選択され、図8におけるステップS30→エンドで表されるパス#12が選択される。
次いで、3回目のパス探索では、IF文(13行目)の分岐実行回数が管理部20によって(1、1)に更新されていることから、THEN分岐が選択される。そして、IF文(19行目)の分岐実行回数も管理部20によって(1、0)に更新されていることから、分岐実行回数がより少ないELSE分岐が選択される。そして、IF文(25行目)の分岐実行回数は初期状態のまま(0、0)であることから、THEN分岐が選択され、図8におけるステップS30→ステップS32→ステップS34→ステップS36→ステップS38→エンドで表されるパス#13が選択される。
以降、分岐網羅が実現されるまで、選択部22において同様のパス選択規則を繰り返すことで、図11におけるパス#11からパス#17までの7個のパスが選択される。
生成部24は、選択部22によって選択された被検査プログラム31のパスに対して、既に選択部22によって選択されたパス(既出パス)であることを示すための、パスの重複を検出するためのルール(重複パス検出ルール)を生成する。
図12は、図7に示した被検査プログラム31を例にして、生成部24における重複パス検出ルールの生成方法の一例を示す図である。
生成部24は、後述する検出部26により生成される優先分岐番号と、選択部22でパス選択規則にしたがって選択されたパスと、に基づいて、重複パス検出ルールを生成する。ここで、優先分岐番号とは、選択部22がパス選択規則に従った場合に、次に選択される条件分岐毎の分岐先を表す番号である。
図12に示すように、初期状態では管理部20によって管理される全ての条件分岐の分岐実行回数は(0、0)となるため、条件分岐の各々では、パス選択規則に基づいてTHEN分岐が選択されることになる。したがって、例えばTHEN分岐を‘0’、ELSE分岐を‘1’で表した場合、検出部26では、IF文(13行目)、IF文(19行目)、IF文(25行目)の各々の条件分岐の分岐先を‘0’に設定した優先分岐番号を生成する。
一方、シンボリック実行部14によって、選択部22で選択されたパスに沿ってシンボリック実行が行われ、被検査プログラム31からパスが抽出されると、管理部20によって管理される条件分岐毎の分岐実行回数が、抽出されたパスの実行に伴い更新される。
生成部24は、抽出されたパスによって被検査プログラム31の分岐網羅度が向上した場合に、抽出されたパスによって実行された条件分岐に対応した優先分岐番号を重複パス検出ルールとして生成する。
例えば、生成部24は、図12において、1回目のシンボリック実行により図11に示すパス#11が抽出された場合、「優先分岐番号が{(IF文(13行目)=0)∧(IF文(19行目)=0)}ならば、パス#11と重複する」というルール#1を生成する。
図12では、説明を簡略化するため、例えば、被検査プログラム31に含まれる各々の条件分岐に対応した優先分岐番号のうち、いずれの優先分岐番号が重複パス検出ルールに適用されるのかを示す識別子‘*’を優先分岐番号に対応した判定欄に付与している。
1回目のシンボリック実行後、検出部26は、管理部20によって管理される条件分岐毎の分岐実行回数に基づいて、優先分岐番号を生成する。1回目のシンボリック実行後、IF文毎の分岐実行回数は図12に示すように、{(1、0)、(1、0)、(0、0)}となる。ここで、1番目の小括弧はIF文(13行目)の分岐実行回数、2番目の小括弧はIF文(19行目)の分岐実行回数、3番目の小括弧はIF文(25行目)の分岐実行回数を表す。
したがって、パス選択規則に基づいて、1回目のシンボリック実行後に生成される優先分岐番号は(1、1、0)となる。ここで、1番目の数値はIF文(13行目)の優先分岐番号、2番目の数値はIF文(19行目)の優先分岐番号、3番目の数値はIF文(25行目)の優先分岐番号を表す。
そして生成部24は、2回目のシンボリック実行により図11に示すパス#12が抽出された場合、「優先分岐番号が(IF文(13行目)=1)ならば、パス#12と重複する」というルール#2を生成する。
2回目のシンボリック実行後、管理部20によって管理される条件分岐毎の分岐実行回数は、図12に示すように、{(1、1)、(1、0)、(0、0)}となる。したがって、パス選択規則に基づいて、2回目のシンボリック実行後に生成される優先分岐番号は、(0、1、0)となる。そして生成部24は、3回目のシンボリック実行により図11に示すパス#13が抽出された場合、「優先分岐番号が{(IF文(13行目)=0)∧(IF文(19行目)=1)∧(IF文(25行目)=0)}ならば、パス#13と重複する」というルール#3を生成する。
以降、同様の処理にしたがって、生成部24は、シンボリック実行によるパスの抽出が終了するまで、重複パス検出ルールを生成する。なお、優先分岐番号は、分岐情報の一例である。
既に説明したように、選択部22でパス選択規則のみにしたがって図7に示した被検査プログラム31からパスの選択をした場合、例えば、図11に示したような分岐網羅を実現する7つのパスが選択される場合がある。
しかし、この場合、パス#14及びパス#16はパス#12と重複したパスであり、パス#15はパス#11と重複したパスである。
したがって、検出部26は、管理部20によって管理される条件分岐毎の分岐実行回数に基づき、パス探索前にパス選択規則にしたがって優先分岐番号を生成し、優先分岐番号によって表されるパス候補を取得する。そして、検出部26は、選択部22によるパスの選択前に、パス候補に対応した優先分岐番号と、生成部24で生成された重複パス検出ルールとを比較して、次のシンボリック実行により抽出される予定のパスが、既出パスと一致するか否かを検出する。
図13及び図14は、図7に示した被検査プログラム31に対する検出部26の処理を示す図である。
検出部26は、初期状態における条件分岐毎の分岐実行回数に基づいて、パス選択規則に従い、優先分岐番号を生成する。この際に生成される優先分岐番号は(0、0、0)となる。そして、検出部26は、生成された優先分岐番号と、生成部24によって生成された重複パス検出ルールとを比較して、重複パス検出ルールの中に、生成された優先分岐番号によって表されるパス候補と重複するルールが存在するか否かを判定する。
そして、検出部26は、生成された優先分岐番号によって表されるパス候補と重複するルールが存在する場合には、シンボリック実行部14でのシンボリック実行によるパス抽出処理が行われないようにする。一方、検出部26は、生成された優先分岐番号によって表されるパス候補と重複するルールが存在しない場合には、シンボリック実行部14でのシンボリック実行によるパス抽出処理が行われるようにする。
具体的には、初期状態の場合、まだ重複パス検出ルールが存在しないため、選択部22において図11のパス#11が選択され、生成部24においてパス#11に対応した重複パス検出ルール:ルール#1が生成される。
1回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図13に示すように、{(1、0)、(1、0)、(0、0)}となる。したがって、次に検出部26によって生成される優先分岐番号は、(1、1、0)となる。この場合、重複パス検出ルールにはルール#1しか存在しないため、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。したがって、選択部22において図11のパス#12が選択され、生成部24においてパス#12に対応した重複パス検出ルール:ルール#2が生成される。
2回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図13に示すように、{(1、1)、(1、0)、(0、0)}となる。したがって、次に検出部26によって生成される優先分岐番号は、(0、1、0)となる。この場合、重複パス検出ルールにはルール#1及びルール#2が存在するが、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。したがって、選択部22において図11のパス#13が選択され、生成部24においてパス#13に対応した重複パス検出ルール:ルール#3が生成される。
3回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図13に示すように、{(2、1)、(1、1)、(1、0)}となる。したがって、次に検出部26によって生成される優先分岐番号は、(1、0、1)となる。この場合、重複パス検出ルールにはルール#1、ルール#2、及びルール#3が存在し、生成された優先分岐番号によって表されるパス候補とルール#2が一致する。したがって、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。具体的には、選択部22におけるパスの選択処理、及び生成部24における重複パス検出ルールの生成処理が省略される。ただし、生成された優先分岐番号によって表されるパス候補と、重複パス検出ルールとが一致した場合であっても、管理部20は、パス候補の生成に伴って、条件分岐毎の分岐実行回数を更新する。
4回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図14に示すように、{(2、2)、(1、1)、(1、0)}となる。したがって、次に検出部26によって生成される優先分岐番号は、(0、0、1)となる。この場合、重複パス検出ルールにはルール#1、ルール#2、及びルール#3が存在し、生成された優先分岐番号によって表されるパス候補とルール#1が一致する。したがって、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。
5回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図14に示すように、{(3、2)、(2、1)、(1、0)}となる。したがって、次に検出部26によって生成される優先分岐番号は、(1、1、1)となる。この場合、重複パス検出ルールにはルール#1、ルール#2、及びルール#3が存在し、生成された優先分岐番号によって表されるパス候補とルール#2が一致する。したがって、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。
6回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図14に示すように、{(3、3)、(2、1)、(1、0)}となる。したがって、次に検出部26によって生成される優先分岐番号は、(0、1、1)となる。この場合、重複パス検出ルールには、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。したがって、選択部22において図11のパス#17が選択され、生成部24においてパス#17に対応した重複パス検出ルール:ルール#4が生成される。なお、ルール#4は、「優先分岐番号が{(IF文(13行目)=0)∧(IF文(19行目)=1)∧(IF文(25行目)=1)}ならば、パス#17と重複する」というルールとなる。
7回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図14に示すように、{(4、3)、(2、2)、(1、1)}となる。この場合、被検査プログラム31に含まれる条件分岐毎の分岐実行回数の各々が1以上であることから、パス#11、パス#12、パス#13、及びパス#17によって分岐網羅が実現されることになる。したがって、検出部26は重複パスの検出処理を終了する。
次に、ブロック到達パス抽出部4による処理の詳細について図15~図18を用いて説明する。図15は、ブロック到達パス抽出部4による処理を説明するための図である。図15に示すように、ブロック到達パス抽出部4は、分岐網羅パス抽出部3による処理後に、未到達ブロックの命令文をスライシング基準として、前向きにプログラムスライシングする。ここで、プログラムスライシングとは、複数の処理が混在するプログラムに対して注目する処理だけを抽出することである。
図16は、プログラムスライシングを説明するための図である。図16に示すように、プログラム42にはXとYの2個の変数に関する処理があり、Xに関する処理及びYに関する処理は、それぞれ前処理とメイン処理に分けられ、混在する形式で実装されている。そこで、プログラムスライシングは、例えば、Xに関する処理だけを抽出する。
プログラムスライシングは、プログラム中のある命令文Sと変数Vをスライシング基準として、スライシング基準に影響する命令文を抽出する。スライシング基準は(S,V)の形式で記述される。プログラムスライシングは、プログラム中の命令文に対して制御依存関係とデータ依存関係からプログラム依存グラフを構築し、スライシング基準からこれらの依存関係を辿ることによって影響する命令文を抽出する。
図17は、プログラムスライシングの第1の例を示す図であり、図18は、プログラムスライシングの第2の例を示す図である。図17において、スライス結果#1は、対象プログラム43をスライシング基準(9,X)でスライシングした場合を示し、スライス結果#2は、対象プログラム43をスライシング基準(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に影響する命令文として抽出される。
図18は、図16に示したプログラム42の23行目のCOMPUTE文をスライシング基準(23,X)とした場合のスライシング結果を示す。なお、23行目のCOMPUTE文は変数Xだけを参照更新するので、スライシング基準として変数Xを陽に指定しなくてもよい。また、前向きにプログラムスライシングするとは、スライシング基準より前の命令文を対象としてプログラムスライシングを行うことである。
図18の右図では、スライシング基準44に関係しない命令文には取り消し線が引かれており、取り消し線がない命令文がスライシング基準(23,X)に影響する命令文である。プログラムスライシングを実行することにより、23行目のCOMPUTE文に影響する命令文だけを抽出できるので、未到達ブロックへのパス抽出を効率化することができる。
図15に戻って、ブロック到達パス抽出部4は、スライス後の被検査プログラム31に対し、スライシング基準44を通過するようなパスを抽出する。そして、ブロック到達パス抽出部4は、抽出したパスが通過した命令文を収集し、通過した命令文の行番号のリストを出力する。図15では、通過した命令文の行番号のリストとして、{19,20,24,25,26,27,29,31,32,33,35,36,38,39,42,43,49,50,52}が出力される。
次に、デッドコード解析装置1による処理のフローについて説明する。図19は、デッドコード解析装置1による処理のフローを示すフローチャートである。図19に示すように、デッドコード解析装置1は、被検査プログラム31から基本ブロックを抽出し、到達表2aを作成する(ステップS51)。初期状態では、全ての基本ブロックが「未到達(×)」の状態である。
そして、デッドコード解析装置1は、分岐網羅パスを探索し、実行される命令文を検出して、実行される命令の基本ブロクを「到達(○)」として到達表2aを更新する(ステップS52)。そして、デッドコード解析装置1は、未到達ブロックのリストから順に未到達ブロックを1つ選び、選んだ未到達ブロックを通過する網羅的なパスを抽出する(ステップS53)。このとき、デッドコード解析装置1は、プログラムスライシングによりスライシングした被検査プログラム31を対象としてパスを抽出する。
そして、デッドコード解析装置1は、抽出したパスによって到達表2aを更新する(ステップS54)。そして、デッドコード解析装置1は、未処理の未到達ブロックがあるか否かを判定し(ステップS55)、ある場合には、ステップS53に戻る。
一方、未処理の未到達ブロックがない場合には、デッドコード解析装置1は、到達表2aの未到達ブロックを検出して、ロジック依存のデッドコードとして出力する(ステップS56)。そして、デッドコード解析装置1は、稼働データ32を入力し、データ依存のデッドコードを判定して出力する(ステップS57)。
このように、デッドコード解析装置1は、改良分岐網羅パス抽出により、分岐網羅パスを探索し、分岐網羅パスが到達しない未到達ブロックについて、プログラムスライシングによりスライシングした被検査プログラム31を対象として、通過するパスを抽出する。したがって、デッドコード解析装置1は、効率よくデッドコードを検出することができる。
図20は、到達表管理部2による処理のフローを示すフローチャートである。図20に示すように、到達表管理部2は、被検査プログラム31を構文解析して命令文の構文構造を取得する(ステップS61)。そして、到達表管理部2は、構文構造を分析して、被検査プログラム内の基本ブロックのリストを取得し、到達表2aの初期状態を生成する(ステップS62)。
そして、到達表管理部2は、分岐網羅パス抽出部3から通過命令文の行番号を受け取って、到達した基本ブロックを判定し、到達表2aを更新する(ステップS63)。そして、到達表管理部2は、未到達ブロックのリストをブロック到達パス抽出部4に提供する(ステップS64)。そして、到達表管理部2は、ブロック到達パス抽出部4から通過命令文の行番号を受取って、到達した基本ブロックを判定し、到達表2aを更新する(ステップS65)。
そして、到達表管理部2は、要求に応じて、最新の到達表2aを出力する(ステップS66)。要求元には、ロジック依存到達判定部5とデータ依存到達判定部7がある。
このように、到達表管理部2が到達表2aを管理することで、デッドコード解析装置1は、未到達ブロックを特定してデッドコードを検出することができる。
図21は、分岐網羅パス抽出部3による処理のフローを示すフローチャートである。図21に示すように、分岐網羅パス抽出部3は、被検査プログラム31から改良分岐網羅パス抽出によりパスを抽出し、Pathn,n=1,・・・,Nとする(ステップS71)。そして、分岐網羅パス抽出部3は、通過命令文集合PSを初期化し、nを1とする(ステップS72)。
そして、分岐網羅パス抽出部3は、nがN以下であるか否かを判定し(ステップS73)、nがN以下である場合には、Pathnが通過する命令文Stmtm,m=1,・・・,Mを順に取得し、mを1とする(ステップS74)。そして、分岐網羅パス抽出部3は、mがM以下であるか否かを判定し(ステップS75)、mがM以下でない場合には、nに1を加え(ステップS76)、ステップS73に戻る。
一方、mがM以下である場合には、分岐網羅パス抽出部3は、StmtmがPSにあるか否かを判定し(ステップS77)、ある場合には、mに1を加え(ステップS78)、ステップS75に戻る。
一方、StmtmがPSにない場合には、分岐網羅パス抽出部3は、PSにStmtmを追加し(ステップS79)、ステップS78に移動する。また、ステップS73において、nがN以下でない場合には、分岐網羅パス抽出部3は、通過した命令文の行番号のリストを到達表管理部2に出力する(ステップS80)。
このように、分岐網羅パス抽出部3は、改良分岐網羅パス抽出によりパスを抽出し、抽出したパスが通過する命令文を通過命令文集合に加えることで、通過命令文の行番号のリストを到達表管理部2に出力することができる。
図22は、ブロック到達パス抽出部4による処理のフローを示すフローチャートである。図22に示すように、ブロック到達パス抽出部4は、到達表管理部2から未到達ブロックを取得し、未到達ブロックリストUBn,n=1,・・・,Nとする(ステップS81)。そして、ブロック到達パス抽出部4は、nを1とする(ステップS82)。
そして、ブロック到達パス抽出部4は、nがN以下であるか否かを判定し(ステップS83)、nがN以下である場合には、未到達ブロックリストUBnの先頭の命令文を取得する(ステップS84)。そして、ブロック到達パス抽出部4は、取得した命令文をスライシング基準44として、前向きにプログラムスライシングを実行し、被検査プログラム31を再構成する(ステップS85)。
そして、ブロック到達パス抽出部4は、再構成した被検査プログラム31について深さ優先探索でパス抽出し、抽出したパスが通過した命令文を収集する(ステップS86)。そして、ブロック到達パス抽出部4は、nに1を加え(ステップS87)、ステップS83に戻る。
また、ステップS83において、nがN以下でない場合には、ブロック到達パス抽出部4は、通過命令文の行番号のリストを到達表管理部2に出力する(ステップS88)。
このように、ブロック到達パス抽出部4は、未到達ブロックの先頭の命令文をスライシング基準44として前向きにプログラムスライシングを実行して被検査プログラム31を再構成するので、パス抽出を効率よく行うことができる。
図23は、ロジック依存到達判定部5による処理のフローを示すフローチャートである。図23に示すように、ロジック依存到達判定部5は、到達表2aを取得し(ステップS91)、到達表2aの基本ブロックを順にチェックして、未到達ブロックの集合を作成する(ステップS92)。
そして、ロジック依存到達判定部5は、未到達ブロックの集合が空か否かを判定し(ステップS93)、空の場合には、デッドコードはないと判定する(ステップS94)。一方、未到達ブロックの集合が空でない場合には、ロジック依存到達判定部5は、デッドコードがあると判定し(ステップS95)、未到達ブロックと構成命令文を出力する(ステップS96)。
このように、ロジック依存到達判定部5は、到達表2aを用いて未到達ブロックを特定することで、デッドコードを検出することができる。
図24は、デッドコード解析装置1の効果を説明するための図である。図24に示すように、図3に示した被検査プログラム31に対してシンボリック実行と深さ優先探索によりパス抽出を行うと#1~#12のパスが抽出される。一方、デッドコード解析装置1は、図3及び図4に示したように、5個のパスを抽出することでデッドコードを検出する。したがって、デッドコード解析装置1は、効率よくデッドコードを検出することができる。
上述してきたように、実施例では、分岐網羅パス抽出部3が改良分岐網羅パス抽出を行い、改良分岐網羅パス抽出により抽出されたパスが到達しない未到達ブロックを対象としてブロック到達パス抽出部4が網羅的なパス探索を行う。そして、網羅的なパス探索により探索されたパスによっても未到達の基本ブロックの命令文をロジック依存到達判定部5がデッドコードとして検出する。したがって、デッドコード解析装置1は、効率よくデッドコードを検出することができる。
また、実施例では、ブロック到達パス抽出部4は、未到達ブロックに含まれる命令文をスライシング基準44として被検査プログラム31をプログラムスライシングし、プログラムスライシングにより得られたプログラムを対象として網羅的なパス探索を行う。したがって、ブロック到達パス抽出部4は、網羅的なパス探索を効率よく行うことができる。
また、実施例では、到達表管理部2が到達表2aを用いて未到達ブロックを管理するので、ロジック依存到達判定部5は未到達ブロックを確実に特定することができる。
また、実施例では、データ依存到達判定部7が、稼働データ32を用いて基本ブロック毎にブロック到達条件の真偽値を判定し、全データについてブロック到達条件が偽である基本ブロックをデッドコードとして検出する。したがって、デッドコード解析装置1は、効率よくデッドコードを検出することができる。
なお、実施例では、デッドコード解析装置1について説明したが、デッドコード解析装置1が有する構成をソフトウェアによって実現することで、同様の機能を有するデッドコード解析プログラムを得ることができる。そこで、デッドコード解析プログラムを実行するコンピュータについて説明する。
図25は、実施例に係るデッドコード解析プログラムを実行するコンピュータのハードウェア構成を示す図である。図25に示すように、コンピュータ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において実行されるデッドコード解析プログラムは、コンピュータ50により読み出し可能な記録媒体の一例であるDVDに記憶され、ODD57によってDVDから読み出されてコンピュータ50にインストールされる。あるいは、デッドコード解析プログラムは、LANインタフェース53を介して接続された他のコンピュータシステムのデータベース等に記憶され、これらのデータベースから読み出されてコンピュータ50にインストールされる。そして、インストールされたデッドコード解析プログラムは、HDD54に記憶され、メインメモリ51に読み出されてCPU52によって実行される。
また、実施例では、改良分岐網羅パス抽出により分岐網羅パスを抽出する場合について説明したが、本発明はこれに限定されるものではなく、デッドコード解析装置1が他の分岐網羅探索による探索によってパスを抽出する場合にも同様に適用することができる。