(57)【要約】【課題】効率よくデッドコードを検出すること。【解決手段】デッドコード解析装置１は、分岐網羅パス抽出部３と、ブロック到達パス抽出部４と、ロジック依存到達判定部５とを有する。分岐網羅パス抽出部３は、改良分岐網羅パス抽出により分岐網羅パス抽出を行う。ブロック到達パス抽出部４は、分岐網羅パス抽出部３により抽出されたパスが到達しない未到達ブロックを対象として網羅的なパス探索を行う。ロジック依存到達判定部５は、網羅的なパス探索により探索されたパスによっても未到達の基本ブロックの命令文をデッドコードとして検出する。【選択図】図２
2020067697.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
ソースコードを分岐命令の個所で区切って基本ブロックに分割し、
分割した基本ブロックに基づいて前記ソースコードに対して分岐網羅探索を行ってパスを探索し、
前記分岐網羅探索により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出し、
抽出したパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する
処理を実行させることを特徴とするデッドコード解析プログラム。
【請求項２】
前記分岐網羅探索を行う処理は、改良分岐網羅パス抽出により分岐網羅探索を行うことを特徴とする請求項１に記載のデッドコード解析プログラム。
【請求項３】
前記改良分岐網羅パス抽出は、シンボリック実行において所定のパス選択規則にしたがった場合に条件分岐毎に次に選択される分岐先に基づいて重複パスを検出する規則を生成し、該生成した規則に基づいてシンボリック実行によるパス抽出を制御することでパス探索を行うことを特徴とする請求項２に記載のデッドコード解析プログラム。
【請求項４】
前記抽出する処理は、
前記未到達ブロックに含まれる命令文をスライシング基準として前記ソースコードのスライシングを行い、
前記スライシングにより得られたソースコードを対象として網羅的なパス探索を行うことで前記未到達ブロックに到達するパスを抽出することを特徴とする請求項１、２又は３に記載のデッドコード解析プログラム。
【請求項５】
到達が確認されたか否かを示す到達状況を基本ブロック毎に記憶する処理を前記コンピュータにさらに実行させ、
前記分岐網羅探索を行う処理は、探索結果に基づいて前記到達状況を更新し、
前記抽出する処理は、抽出結果に基づいて前記到達状況を更新し、
前記検出する処理は、前記到達状況に基づいてデッドコードを検出することを特徴とする請求項１〜４のいずれか１つに記載のデッドコード解析プログラム。
【請求項６】
前記ソースコードが実行されるときに使用されるデータに基づいて基本ブロック毎に到達条件の真偽値を判定し、全データについて到達条件が偽である基本ブロックをデッドコードとして検出する処理を前記コンピュータにさらに実行させることを特徴とする請求項１〜５のいずれか１つに記載のデッドコード解析プログラム。
【請求項７】
コンピュータが、
ソースコードを分岐命令の個所で区切って基本ブロックに分割し、
分割した基本ブロックに基づいて前記ソースコードに対して分岐網羅探索を行ってパスを探索し、
前記分岐網羅探索により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出し、
抽出したパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する
処理を実行することを特徴とするデッドコード解析方法。
【請求項８】
ソースコードを分岐命令の個所で区切って基本ブロックに分割する分割部と、
前記分割部により前記ソースコードが分割された基本ブロックに基づいて前記ソースコードに対して分岐網羅探索を行ってパスを探索する分岐網羅探索部と、
前記分岐網羅探索部により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出する到達パス抽出部と、
前記到達パス抽出部により抽出されたパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する検出部と
を有することを特徴とするデッドコード解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置に関する。
【背景技術】
【０００２】
業務システムのような情報システムは長期間にわたって運用保守されため、機能追加、機能変更、障害対応等の改修が、長期間に渡って部分的かつ断続的に実施される。部分的な改修のため、情報システムのプログラムは、年を経るごとに複雑となり、いわゆる、スパゲティ化する。
【０００３】
特に、新機能の追加もしくは既存機能の変更では、既存機能に影響を与えないようにするため、既存機能のプログラム部分（ソースコード）を変更せず、追加もしくは変更する機能のソースコードを追加する改修が行われる。変更されなかった既存機能のソースコードは、使われないソースコードや実行されないソースコードとなり、これらのソースコードは、デッドコードと呼ばれる。
【０００４】
デッドコードは、以下のような理由により、情報システムのプログラムの保守に悪影響を与える。
・プログラムのサイズが大きくなるため、保守対象の範囲が広がる。
・不要な条件分岐や命令文が存在するため、プログラムのロジックが複雑になる。この複雑さは見た目であり、真の複雑さでないことがある。
・プログラムのサイズが増えロジックが複雑になると、プログラムの把握が困難になる。
【０００５】
したがって、デッドコードは除去されることが望まれる。しかしながら、デッドコードの検出は容易ではなく手間がかかる。
【０００６】
デッドコードは、以下のように、３種類に分類される。
（１）論理的に到達不能な部分（プログラムで常に実行されない部分）
（ａ）呼び出されない関数やブロック→静的解析で検出が可能
（ｂ）ＧＯＴＯ文又はＳＴＯＰ文の次でジャンプ文の飛び先でない部分→静的解析で検出が可能
（ｃ）先行処理で条件が常に偽又は真の固定値となる分岐部分（ロジック依存の到達不能）
（２）データ依存で到達不能な部分（データ値がないために実行されない部分）
条件を満たすデータがないため未実行の分岐（データ依存の到達不能）
例えば、使われなくなった「コード値」でのみ真又は偽の固定値となる分岐部分
（３）不要コード（実行されるが意味のないコード）
デッドでないが不要なコード→静的解析で検出が可能
例えば、全く参照されない変数の定義文
【０００７】
上記（１）の（ａ）と（ｂ）、及び、（３）は、静的解析で検出が可能である。これらのデッドコードの除去は、デッドコードエリミネーション（ＤＣＥ：Dead  Code  Elimination）と呼ばれる。ＤＣＥ技術は、コンパイラでのプログラム最適化等で使用されている。
【０００８】
上記（１）の（ｃ）のロジック依存の到達不能は、デッドコードである分岐部分（条件分岐配下の基本ブロック）が、分岐条件へ到達する処理パスで経由した先行条件のために、常に選択されない場合である。ここで、「基本ブロック」とは、命令文の列を含むプログラムのコード片であり、入口と出口が共に１つしかなく、内部に分岐を含まないコード片である。ＩＦ文等の分岐命令文は、先行する基本ブロックの最後の文となり、分岐先の命令文は別の基本ブロックとなる。ロジック依存の到達不能は、デッドコードである分岐部分が分岐条件へ到達する処理パスで経由した先行条件のために常に選択されないことを調査する必要があるため、従来の静的解析では検出することができない。また、（２）のデータ依存の到達不能も、情報システムの実際の稼働データに依存するため、従来の静的解析では検出することができない。
【０００９】
上記（１）の（ｃ）のロジック依存の到達不能は、シンボリック実行により検出される。ここで、シンボリック実行とは、プログラムの入力変数にシンボル値（記号値）を設定して、プログラムを模擬的に実行することによって、プログラムの処理パス（以下、単にパスと呼ぶ）を抽出する技術である。シンボリック実行のパス探索において深さ優先探索を採用することによって、プログラムの実行が可能な全てのパスを網羅的に抽出することができる。
【００１０】
実行可能な全てのパスを網羅的に抽出し、全てのパスが通過しない基本ブロックを検出すれば、ロジック依存の到達不能を検出することができる。しかしながら、シンボリック実行を利用したデッドコード検出手法は、実行可能なパスを網羅的に抽出するため、パスの個数が多数となる。パスの個数が多数となると分析時間が長くなる。
【００１１】
さらに、シンボリック実行は、以下の場合に十分に動作しない。
・実行可能なパスの個数が無限である場合
パス数が無限となるのは、プログラムにループ処理があり、かつ、ループ終了条件にシンボル値が含まれる場合である。
・パス抽出処理において分析時間やメモリが制限を超過する場合
パス抽出処理において分析可能な時間やメモリが制限を超過する場合とは、例えば、ＩＦ文が多数連続している場合である。
【００１２】
図２６Ａは、パス数が無限となるプログラムの例を示す図である。図２６Ａにおいて、最も左の欄の数字は、命令文の文番号を示す。図２６Ａにおいて、文番号「００００１０」の「ＰＥＲＦＯＲＭ」は、「カウンタ」の値を「１」から「１」ずつ増加しながら「カウンタ」の値が「閾値」より大きくなるまで、文番号「００００１３」の「ＣＯＭＰＵＴＥ」を実行することを指示する。このＰＥＲＦＯＲＭループでは、「閾値」の値がシンボル値の場合、ループを継続するパスが常に存在するので、パスの個数が無限となる。
【００１３】
図２６Ｂは、パス抽出処理においてメモリが制限を超過するプログラムの例を示す図である。図２６Ｂは、独立なＩＦ文が２０個あるプログラムを示す。このプログラムをシンボリック実行すると、パス数は２20である。シンボリック実行装置が、例えば、メモリサイズを１ギガバイトとしてＩＦ文を１５個まで処理でき、１６個とするとメモリ超過が発生したとする。すると、メモリサイズを６倍の６ギガバイトとしても、シンボリック実行装置は、ＩＦ文を１８個までしか対応できない。ＩＦ文が３個増えると、パス数は８倍となる。ＩＦ文が１８個の場合、パス数は２18＝２６２，１４４である。
【００１４】
このように、シンボリック実行では、パスの爆発が発生する。そこで、実行可能な全てのパスを網羅的に探索するかわりに、分岐を網羅するパスを探索する分岐網羅探索がある。また、分岐網羅探索において、できるだけ少ないパスで分岐網羅度を向上させる技術がある。なお、以下の特開２０１５−１７６２３０号公報に記載された分岐網羅探索を以下では改良分岐網羅パス抽出と呼ぶこととする。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】特開２０１５−１７６２３０号公報
【特許文献２】特開２０１８−１４７１０６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１６】
分岐網羅探索には、探索したパスが通過しない基本ブロックを全てデッドコードとすることができないという問題がある。すなわち、分岐網羅探索により探索されたパスが通過しない基本ブロックを通過する他のパスが存在する場合がある。
【００１７】
本発明は、１つの側面では、効率よくデッドコードを検出することを目的とする。
【課題を解決するための手段】
【００１８】
１つの態様では、デッドコード解析プログラムは、コンピュータに、ソースコードを分岐命令の個所で区切って基本ブロックに分割し、分割した基本ブロックに基づいてソースコードに対して分岐網羅探索を行ってパスを探索する処理を実行させる。そして、デッドコード解析プログラムは、コンピュータに、分岐網羅探索により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出する処理を実行させる。そして、デッドコード解析プログラムは、コンピュータに、抽出したパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する処理を実行させる。
【発明の効果】
【００１９】
１つの側面では、本発明は、効率よくデッドコードを検出することができる。
【図面の簡単な説明】
【００２０】
【図１】図１は、実施例に係るデッドコード解析装置によるデッドコードの検出方法を説明するための図である。
【図２】図２は、実施例に係るデッドコード解析装置の機能構成を示す図である。
【図３】図３は、分岐網羅パス抽出部による処理を説明するための図である。
【図４】図４は、ブロック到達パス抽出部による処理を説明するための図である。
【図５】図５は、ロジック依存到達判定部による処理を説明するための図である。
【図６】図６は、分岐網羅パス抽出部の機能構成を示す図である。
【図７】図７は、分岐網羅パス抽出部の説明に用いる被検査プログラムの一例を示す図である。
【図８】図８は、図７に示した被検査プログラムをフローチャートで示した図である。
【図９】図９は、管理部で実行される管理内容を示す図である。
【図１０】図１０は、ＥＶＡＬＵＡＴＥ文が含まれる被検査プログラムの例を示す図である。
【図１１】図１１は、図７に示した被検査プログラムから探索されたパスの一例を示す図である。
【図１２】図１２は、図７に示した被検査プログラムを例にして、生成部における重複パス検出ルールの生成方法の一例を示す図である。
【図１３】図１３は、図７に示した被検査プログラムに対する検出部の処理を示す第１の図である。
【図１４】図１４は、図７に示した被検査プログラムに対する検出部の処理を示す第２の図である。
【図１５】図１５は、ブロック到達パス抽出部による処理を説明するための図である。
【図１６】図１６は、プログラムスライシングを説明するための図である。
【図１７】図１７は、プログラムスライシングの第１の例を示す図である。
【図１８】図１８は、プログラムスライシングの第２の例を示す図である。
【図１９】図１９は、デッドコード解析装置による処理のフローを示すフローチャートである。
【図２０】図２０は、到達表管理部による処理のフローを示すフローチャートである。
【図２１】図２１は、分岐網羅パス抽出部による処理のフローを示すフローチャートである。
【図２２】図２２は、ブロック到達パス抽出部による処理のフローを示すフローチャートである。
【図２３】図２３は、ロジック依存到達判定部による処理のフローを示すフローチャートである。
【図２４】図２４は、デッドコード解析装置の効果を説明するための図である。
【図２５】図２５は、実施例に係るデッドコード解析プログラムを実行するコンピュータのハードウェア構成を示す図である。
【図２６Ａ】図２６Ａは、パス数が無限となるプログラムの例を示す図である。
【図２６Ｂ】図２６Ｂは、パス抽出処理においてメモリが制限を超過するプログラムの例を示す図である。
【発明を実施するための形態】
【００２１】
以下に、本願の開示するデッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置の実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００２２】
まず、実施例に係るデッドコード解析装置によるデッドコードの検出方法について説明する。図１は、実施例に係るデッドコード解析装置によるデッドコードの検出方法を説明するための図である。図１に示すように、実施例に係るデッドコード解析装置は、到達表管理部２により、被検査プログラム３１から初期状態の到達表２ａを作成する。到達表２ａは、ブロックＮｏ．と、開始行−終了行と、到達状態とが基本ブロック毎に対応付けられた表である。
【００２３】
ブロックＮｏ．は、基本ブロックを識別する番号である。開始行−終了行は、デッドコードが検出される被検査プログラム３１のソースコードにおける基本ブロックの開始行の行番号と終了行の行番号である。到達状態は、基本ブロックに到達するパスが抽出されたか否かを示す。到達状態の「○」は、基本ブロックに到達するパスが抽出されたことを示し、到達状態の「×」は、基本ブロックに到達するパスが抽出されていないことを示す。初期状態では、到達状態は全て「×」である。
【００２４】
そして、実施例に係るデッドコード解析装置は、分岐網羅パス抽出部３により、改良分岐網羅パス抽出を用いてパスを抽出し、抽出したパスが通過する基本ブロックに対応する到達状態を「○」に変更して到達表２ａを更新する。
【００２５】
そして、実施例に係るデッドコード解析装置は、ブロック到達パス抽出部４により、到達状態が「×」である基本ブロックを対象として通過パスを抽出し、通過パスにより基本ブロックに到達可能である場合に到達状態を「○」に変更して到達表２ａを更新する。そして、実施例に係るデッドコード解析装置は、ブロック到達パス抽出部４による更新後も到達状態が「×」である基本ブロックの命令文をデッドコードとして検出する。
【００２６】
このように、実施例に係るデッドコード解析装置は、改良分岐網羅パス抽出により抽出したパスが通過しない基本ブロックを対象として通過パスを探索し、通過パスがない基本ブロックの命令文をデッドコードとして検出する。したがって、実施例に係るデッドコード解析装置は、少ない数の基本ブロックを対象として通過パスを探索するので、効率よくデッドコードを検出することができる。また、実施例に係るデッドコード解析装置は、通過パスを探索する対象の基本ブロックを改良分岐網羅パス抽出を用いて特定するので、効率よく対象の基本ブロックを特定することができる。
【００２７】
次に、実施例に係るデッドコード解析装置の機能構成について説明する。図２は、実施例に係るデッドコード解析装置の機能構成を示す図である。図２に示すように、実施例に係るデッドコード解析装置１は、到達表管理部２と、分岐網羅パス抽出部３と、ブロック到達パス抽出部４と、ロジック依存到達判定部５と、稼働データ入力部６と、データ依存到達判定部７と、デッドコード出力部８とを有する。
【００２８】
到達表管理部２は、被検査プログラム３１を例えばファイルから読み込んで基本ブロックに分割し、基本ブロック毎の到達状況を到達表２ａを用いて管理する。到達表管理部２は、例えば、ユーザがキーボードを用いて行ったデッドコード解析指示を受け付けて、被検査プログラム３１をファイルから読み込む。
【００２９】
到達表管理部２は、初期状態の到達表２ａを作成し、記憶部に記憶する。そして、到達表管理部２は、分岐網羅パス抽出部３及びブロック到達パス抽出部４から通過命令文のリストとして行番号リストを受け取って到達表２ａを更新する。ここで、通過命令文は、分岐網羅パス抽出部３及びブロック到達パス抽出部４が抽出したパスが通過する命令文である。
【００３０】
分岐網羅パス抽出部３は、改良分岐網羅パス抽出により、できるだけ数が少なく分岐網羅度が高いパスを抽出し、通過命令文のリストを作成する。そして、分岐網羅パス抽出部３は、通過命令文のリストを到達表管理部２に渡す。
【００３１】
図３は、分岐網羅パス抽出部３による処理を説明するための図である。図３に示す被検査プログラム３１の例では、改良分岐網羅パス抽出により、＃１〜＃４の４個のパスが抽出される。分岐網羅パス抽出結果４１において、行番号は、命令文の行を識別する番号であり、各パスのカラムの数字は、命令文の通過回数を示し、通過合計は、通過回数の合計である。例えば、行番号が「１９」である「ＭＯＶＥ  １０  ＴＯ  Ｘ５」を、＃１〜＃４のパスは１回通過する。また、「ＭＯＶＥ  １０  ＴＯ  Ｘ５」は、合計４回通過される。
【００３２】
通過回数の「０」は網掛けされている。通過合計が「０」は、改良分岐網羅パス抽出により抽出されたいずれのパスも命令文を通過しないことを意味する、したがって、行番号「３８」〜「４２」は、通過命令文のリストに含まれない。これらの行番号に対応する基本ブロックは「１１」と「１２」であり、分岐網羅パス抽出部３による処理後、到達表２ａの「１１」と「１２」に対応する到達状態は初期状態の「×」のままである。なお、分岐網羅パス抽出部３による改良分岐網羅パス抽出の詳細については後述する。
【００３３】
ブロック到達パス抽出部４は、未到達ブロックのリストから順に未到達ブロクを１つ選び、未到達ブロックを通過するパスを抽出する。ここで、未到達ブロックとは、到達表２ａの到達状態が「×」である基本ブロックである。そして、ブロック到達パス抽出部４は、通過命令文のリストを作成し、通過命令文のリストを到達表管理部２に渡す。
【００３４】
図４は、ブロック到達パス抽出部４による処理を説明するための図である。図４に示すように、分岐網羅パス抽出部３による処理後の未到達ブロック「１１」は、ブロック到達パス抽出部４により抽出されたパスが通過するので、到達状態が「○」に更新される。一方、分岐網羅パス抽出部３による処理後の未到達ブロック「１２」を通過するパスは、ブロック到達パス抽出部４により抽出されないため、到達表２ａの「１２」に対応する到達状態は初期状態の「×」のままである。なお、ブロック到達パス抽出部４による処理の詳細については後述する。
【００３５】
ロジック依存到達判定部５は、ブロック到達パス抽出部４による処理後の未到達ブロックの命令文をデッドコードとして検出し、検出したデッドコードをデッドコード出力部８に渡す。
【００３６】
図５は、ロジック依存到達判定部５による処理を説明するための図である。図５に示すように、ロジック依存到達判定部５は、到達表２ａの基本ブロックを順にチェックして未到達ブロックを収集する。そして、ロジック依存到達判定部５は、未到達ブロックの命令文を特定して、デッドコードを検出する。図５では、ロジック依存到達判定部５は、行番号が「４１」の命令文「ＣＯＭＰＵＴＥ  Ｙ２＝Ｘ４−Ｘ５」をデッドコードとして検出する。
【００３７】
図３〜図５に示した例では、分岐網羅パス抽出部３により分岐網羅パスが４個抽出され、ブロック到達パス抽出部４により未到達ブロックを通過するパスが１個抽出される。デッドコード解析装置１は、５個のパスを調査することによって、デッドコード「ＣＯＭＰＵＴＥ  Ｙ２＝Ｘ４−Ｘ５」を検出することができる。
【００３８】
稼働データ入力部６は、被検査プログラム３１が入力するデータを稼働データ３２として入力し、データ依存到達判定部７に渡す。データ依存到達判定部７は、ブロック到達条件に稼働データ３２を代入し、ブロック到達条件が常に偽の基本ブロックの命令文をデッドコードとして検出し、検出したデッドコードをデッドコード出力部８に渡す。なお、ブロック到達条件は、基本ブロックに到達する条件であり、分岐網羅パス抽出部３及びブロック到達パス抽出部４によりパス抽出時に特定される。
【００３９】
デッドコード出力部８は、ロジック依存到達判定部５により検出されたロジック依存デッドコード３３及びデータ依存到達判定部７により検出された稼働データ依存デッドコード３４を表示装置に表示する。
【００４０】
次に、分岐網羅パス抽出部３による改良分岐網羅パス抽出の詳細について図６〜図１４を用いて説明する。図６は、分岐網羅パス抽出部３の機能構成を示す図である。図６に示すように、分岐網羅パス抽出部３は、入力部１２と、シンボリック実行部１４と、制御部１６と、管理部２０と、選択部２２と、生成部２４と、検出部２６と、出力部２８とを有する。
【００４１】
分岐網羅パス抽出部３は、シンボリック実行技術により被検査プログラム３１を実行して分岐網羅パスを抽出し、抽出した分岐網羅パスが通過する命令文のリストとして行番号リスト３５を出力する。
【００４２】
入力部１２は、被検査プログラム３１を受け付け、被検査プログラム３１を分岐網羅パス抽出部３内部に取り込む。
【００４３】
シンボリック実行部１４は、入力部１２を介して受け付けた被検査プログラム３１に含まれる変数に具体的な値を設定する代わりにシンボル値を設定する。このように、シンボリック実行の際、シンボル値に置き換えられる変数を外部変数という。そして、シンボリック実行部１４は、外部変数をシンボル値としたまま、制御部１６によって探索されたパスを模擬的に実行し、被検査プログラム３１からパスを抽出する。また、シンボリック実行部１４は、実行したパスの基本ブロック毎にブロック到達条件を特定する。そして、シンボリック実行部１４は、抽出したパスが通過する命令文のリストとして行番号のリストを出力部２８に渡す。
【００４４】
出力部２８は、シンボリック実行部１４から渡された行番号のリストを行番号リスト３５として到達表管理部２に出力する。
【００４５】
制御部１６は、シンボリック実行の際に、管理部２０、選択部２２、生成部２４、及び検出部２６の各機能部を制御して、被検査プログラム３１に含まれるパスの探索を実行する。そして、制御部１６は、探索したパスをシンボリック実行部１４に引き渡す。
【００４６】
管理部２０は、制御部１６によって探索されたパスの実行順に基づいて、被検査プログラム３１に含まれる条件分岐毎に、分岐先への分岐実行回数を管理する。以下では、管理部２０の機能について詳細に説明する。
【００４７】
図７は、分岐網羅パス抽出部３の説明に用いる被検査プログラム３１の一例を示す図である。図７に示す被検査プログラム３１には、条件分岐命令であるＩＦ文が１３行目、１９行目、及び２５行目の合計３箇所に存在する。また、１６行目、２０行目、２６行目、及び３１行目に、被検査プログラム３１の終了を意味する「ＥＸＩＴ  ＰＲＯＧＲＡＭ」が存在する。
【００４８】
図８は、図７に示した被検査プログラム３１をフローチャートで示した図である。ステップＳ３０、ステップＳ３４、及びステップＳ３８の各処理が、それぞれ図７の被検査プログラム３１の１３行目、１９行目、及び２５行目の条件分岐に対応する。また、ステップＳ３２、ステップＳ３６、及びステップＳ４０の各処理が、それぞれ図７の被検査プログラム３１の１４行目、２２行目、及び２８行目の処理に対応する。
【００４９】
図９は、管理部２０で実行される管理内容を示す図である。まず、管理部２０は、被検査プログラム３１から条件分岐命令であるＩＦ文を取得する。そして、管理部２０は、制御部１６によって初めて被検査プログラム３１のパス探索が開始される前の状態、すなわち初期状態において、各ＩＦ文の分岐実行回数を、例えば「直接＝（０、０）」のように初期化する。ここで、「直接」とは、対応するＩＦ文がＰＥＲＦＯＲＭ文等で呼び出される外部処理のＩＦ文として実行されるものではないことを意味している。また、（０、０）とは、並び順に、ＩＦ文におけるＴＨＥＮ側の分岐実行回数、ＥＬＳＥ側の分岐実行回数を表している。
【００５０】
例えば、制御部１６によって、図８に示すステップＳ３０→ステップＳ３２→ステップＳ３４→エンドで表されるパスが探索されたとする。この場合、１３行目のＩＦ文ではＴＨＥＮ側の分岐（ＴＨＥＮ分岐）が選択されたため、管理部２０は、ＩＦ文（１３行目）のＴＨＥＮ側の分岐実行回数を１増やして、「直接＝（１、０）」とする。また、１９行目のＩＦ文でもＴＨＥＮ分岐が選択されたため、管理部２０は、ＩＦ文（１９行目）の分岐実行回数を、「直接＝（１、０）」とする。
【００５１】
次に、制御部１６によって、例えば、ステップＳ３０→エンドで表されるパスが探索されたとする。この場合、１３行目のＩＦ文ではＥＬＳＥ側の分岐（ＥＬＳＥ分岐）が選択されたため、管理部２０は、ＩＦ文（１３行目）のＥＬＳＥ側の分岐実行回数を１増やして、「直接＝（１、１）」とする。
【００５２】
引き続き、制御部１６によって、例えば、ステップＳ３０→ステップＳ３２→ステップＳ３４→ステップＳ３６→ステップＳ３８→エンドで表されるパスが探索されたとする。この場合、上記と同様の方法により、管理部２０は、ＩＦ文（１３行目）の分岐実行回数を「直接＝（２、１）」、ＩＦ文（１９行目）の分岐実行回数を「直接＝（１、１）」、ＩＦ文（２５行目）の分岐実行回数を「直接＝（１、０）」とする。
【００５３】
以下、制御部１６によってパスが探索される度に、管理部２０は、上記に説明した方法にしたがって、探索されたパスによって実行されたＩＦ文の分岐実行回数を更新する。
【００５４】
なお、条件分岐命令には、ＩＦ文の他に、複数の異なる処理の中から条件に合った処理を選択するＥＶＡＬＵＡＴＥ文のような多分岐命令も含まれる。図１０は、ＥＶＡＬＵＡＴＥ文が含まれる被検査プログラム３１の例を示す図である。図１０に示す被検査プログラム３１には、１２行目及び２３行目に２つのＥＶＡＬＵＡＴＥ文が含まれている。
【００５５】
管理部２０は初期状態において、１２行目のＥＶＡＬＵＡＴＥ文の分岐実行回数を、例えば「直接＝（０、０、０、０）」のように初期化する。ここで（０、０、０、０）とは、並び順に、変数１が‘Ａ’の場合の分岐実行回数、変数１が‘Ｂ’の場合の分岐実行回数、変数１が‘Ｃ’の場合の分岐実行回数、変数１が‘Ａ’、‘Ｂ’、‘Ｃ’のいずれの場合にも該当しない場合の分岐実行回数を表している。
【００５６】
また、管理部２０は初期化状態において、２３行目のＥＶＡＬＵＡＴＥ文の分岐実行回数を、例えば「直接＝（０、０、０）」のように初期化する。
【００５７】
そして、管理部２０は、ＩＦ文における分岐実行回数の管理と同様に、ＥＶＡＬＵＡＴＥ文の分岐実行回数を管理する。例えば制御部１６によって、１４行目及び２５行目のＤＩＳＰＬＡＹ文を実行するパスが探索された場合、ＥＶＡＬＵＡＴＥ文（１２行目）の分岐実行回数は、「直接＝（１、０、０、０）」となる。また、ＥＶＡＬＵＡＴＥ文（２３行目）の分岐実行回数は、「直接＝（１、０、０）」となる。
【００５８】
選択部２２は、制御部１６が被検査プログラム３１からパスを探索する際に、制御部１６から呼び出される機能部であり、パスが条件分岐に到達する毎に予め定めたパス選択規則にしたがって、分岐先を選択する。ここで、パス選択規則とは、条件分岐における分岐先を選択するための規則である。
【００５９】
パス選択規則の一例として、例えば、選択部２２は、パス上の条件分岐命令が分岐可能である場合に、管理部２０によって管理される条件分岐毎の分岐実行回数に基づいて、分岐実行回数が少ない方の分岐を選択する。なお、条件分岐の分岐実行回数が同数である場合には、選択部２２は、予め定めた選択規則にしたがって、分岐先を選択する。
【００６０】
ここで、予め定めた選択規則とは、例えば条件分岐命令における最初の分岐を選択する等の規則をいう。具体的には、一例として、ＩＦ文の分岐実行回数が同数である場合、選択部２２は、ＴＨＥＮ分岐を選択する。なお、予め定めた選択規則はこれに限定されるものではなく、例えば、選択部２２は、ＥＬＳＥ分岐を選択するようにしてもよい。
【００６１】
また、条件分岐命令が分岐可能とは、条件分岐命令における各々の分岐の分岐条件が、共に充足可能である状態をいう。
【００６２】
例えば、図７に示した被検査プログラム３１の１３行目のＩＦ文は、（項目１＝１）か否かが分岐条件となる。この場合、ＴＨＥＮ分岐は分岐条件：（項目１＝１）がＴＲＵＥの場合に選択される。一方、ＥＬＳＥ分岐は分岐条件：（項目１＝１）がＦＡＬＳＥの場合に選択されるが、これは、分岐条件：！（項目１＝１）がＴＲＵＥの場合に選択されると解釈することができる。
【００６３】
分岐条件に含まれる変数：項目１は外部変数であるため、図７に示した被検査プログラム３１単体でシンボリック実行した場合には、変数：項目１はシンボル値に置き換えられる。したがって、分岐条件：（項目１＝１）の真偽値を確定することができない。
【００６４】
そこで選択部２２は、ＴＨＥＮ分岐の分岐条件：（項目１＝１）、及びＥＬＳＥ分岐の分岐条件：！（項目１＝１）の充足可能性を判断する。この場合、ＴＨＥＮ分岐の分岐条件とＥＬＳＥ分岐の分岐条件は共に充足可能であることから、選択部２２は、図７に示した被検査プログラム３１の１３行目のＩＦ文を分岐可能と判定し、ＴＨＥＮ分岐とＥＬＳＥ分岐の２つの分岐の中から分岐先を選択する。
【００６５】
図１１は、選択部２２において、既に説明したパス選択規則のみにしたがって、図７に示した被検査プログラム３１から探索されたパスの一例を示す図である。
【００６６】
図１１に示すように、１回目のパス探索前では、管理部２０によって管理される条件分岐毎の分岐実行回数は初期状態にある。
【００６７】
したがって、１回目のパス探索では、ＩＦ文（１３行目）は分岐可能であり、且つ、分岐実行回数が（０、０）であることから、ＴＨＥＮ分岐が選択される。そして、ＩＦ文（１９行目）も分岐可能であり、且つ、分岐実行回数が（０、０）であることから、ＴＨＥＮ分岐が選択され、図８におけるステップＳ３０→ステップＳ３２→ステップＳ３４→エンドで表されるパス＃１１が選択される。
【００６８】
次いで、２回目のパス探索では、ＩＦ文（１３行目）の分岐実行回数が管理部２０によって（１、０）に更新されていることから、分岐実行回数がより少ないＥＬＳＥ分岐が選択され、図８におけるステップＳ３０→エンドで表されるパス＃１２が選択される。
【００６９】
次いで、３回目のパス探索では、ＩＦ文（１３行目）の分岐実行回数が管理部２０によって（１、１）に更新されていることから、ＴＨＥＮ分岐が選択される。そして、ＩＦ文（１９行目）の分岐実行回数も管理部２０によって（１、０）に更新されていることから、分岐実行回数がより少ないＥＬＳＥ分岐が選択される。そして、ＩＦ文（２５行目）の分岐実行回数は初期状態のまま（０、０）であることから、ＴＨＥＮ分岐が選択され、図８におけるステップＳ３０→ステップＳ３２→ステップＳ３４→ステップＳ３６→ステップＳ３８→エンドで表されるパス＃１３が選択される。
【００７０】
以降、分岐網羅が実現されるまで、選択部２２において同様のパス選択規則を繰り返すことで、図１１におけるパス＃１１からパス＃１７までの７個のパスが選択される。
【００７１】
生成部２４は、選択部２２によって選択された被検査プログラム３１のパスに対して、既に選択部２２によって選択されたパス（既出パス）であることを示すための、パスの重複を検出するためのルール（重複パス検出ルール）を生成する。
【００７２】
図１２は、図７に示した被検査プログラム３１を例にして、生成部２４における重複パス検出ルールの生成方法の一例を示す図である。
【００７３】
生成部２４は、後述する検出部２６により生成される優先分岐番号と、選択部２２でパス選択規則にしたがって選択されたパスと、に基づいて、重複パス検出ルールを生成する。ここで、優先分岐番号とは、選択部２２がパス選択規則に従った場合に、次に選択される条件分岐毎の分岐先を表す番号である。
【００７４】
図１２に示すように、初期状態では管理部２０によって管理される全ての条件分岐の分岐実行回数は（０、０）となるため、条件分岐の各々では、パス選択規則に基づいてＴＨＥＮ分岐が選択されることになる。したがって、例えばＴＨＥＮ分岐を‘０’、ＥＬＳＥ分岐を‘１’で表した場合、検出部２６では、ＩＦ文（１３行目）、ＩＦ文（１９行目）、ＩＦ文（２５行目）の各々の条件分岐の分岐先を‘０’に設定した優先分岐番号を生成する。
【００７５】
一方、シンボリック実行部１４によって、選択部２２で選択されたパスに沿ってシンボリック実行が行われ、被検査プログラム３１からパスが抽出されると、管理部２０によって管理される条件分岐毎の分岐実行回数が、抽出されたパスの実行に伴い更新される。
【００７６】
生成部２４は、抽出されたパスによって被検査プログラム３１の分岐網羅度が向上した場合に、抽出されたパスによって実行された条件分岐に対応した優先分岐番号を重複パス検出ルールとして生成する。
【００７７】
例えば、生成部２４は、図１２において、１回目のシンボリック実行により図１１に示すパス＃１１が抽出された場合、「優先分岐番号が｛（ＩＦ文（１３行目）＝０）∧（ＩＦ文（１９行目）＝０）｝ならば、パス＃１１と重複する」というルール＃１を生成する。
【００７８】
図１２では、説明を簡略化するため、例えば、被検査プログラム３１に含まれる各々の条件分岐に対応した優先分岐番号のうち、いずれの優先分岐番号が重複パス検出ルールに適用されるのかを示す識別子‘＊’を優先分岐番号に対応した判定欄に付与している。
【００７９】
１回目のシンボリック実行後、検出部２６は、管理部２０によって管理される条件分岐毎の分岐実行回数に基づいて、優先分岐番号を生成する。１回目のシンボリック実行後、ＩＦ文毎の分岐実行回数は図１２に示すように、｛（１、０）、（１、０）、（０、０）｝となる。ここで、１番目の小括弧はＩＦ文（１３行目）の分岐実行回数、２番目の小括弧はＩＦ文（１９行目）の分岐実行回数、３番目の小括弧はＩＦ文（２５行目）の分岐実行回数を表す。
【００８０】
したがって、パス選択規則に基づいて、１回目のシンボリック実行後に生成される優先分岐番号は（１、１、０）となる。ここで、１番目の数値はＩＦ文（１３行目）の優先分岐番号、２番目の数値はＩＦ文（１９行目）の優先分岐番号、３番目の数値はＩＦ文（２５行目）の優先分岐番号を表す。
【００８１】
そして生成部２４は、２回目のシンボリック実行により図１１に示すパス＃１２が抽出された場合、「優先分岐番号が（ＩＦ文（１３行目）＝１）ならば、パス＃１２と重複する」というルール＃２を生成する。
【００８２】
２回目のシンボリック実行後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１２に示すように、｛（１、１）、（１、０）、（０、０）｝となる。したがって、パス選択規則に基づいて、２回目のシンボリック実行後に生成される優先分岐番号は、（０、１、０）となる。そして生成部２４は、３回目のシンボリック実行により図１１に示すパス＃１３が抽出された場合、「優先分岐番号が｛（ＩＦ文（１３行目）＝０）∧（ＩＦ文（１９行目）＝１）∧（ＩＦ文（２５行目）＝０）｝ならば、パス＃１３と重複する」というルール＃３を生成する。
【００８３】
以降、同様の処理にしたがって、生成部２４は、シンボリック実行によるパスの抽出が終了するまで、重複パス検出ルールを生成する。なお、優先分岐番号は、分岐情報の一例である。
【００８４】
既に説明したように、選択部２２でパス選択規則のみにしたがって図７に示した被検査プログラム３１からパスの選択をした場合、例えば、図１１に示したような分岐網羅を実現する７つのパスが選択される場合がある。
【００８５】
しかし、この場合、パス＃１４及びパス＃１６はパス＃１２と重複したパスであり、パス＃１５はパス＃１１と重複したパスである。
【００８６】
したがって、検出部２６は、管理部２０によって管理される条件分岐毎の分岐実行回数に基づき、パス探索前にパス選択規則にしたがって優先分岐番号を生成し、優先分岐番号によって表されるパス候補を取得する。そして、検出部２６は、選択部２２によるパスの選択前に、パス候補に対応した優先分岐番号と、生成部２４で生成された重複パス検出ルールとを比較して、次のシンボリック実行により抽出される予定のパスが、既出パスと一致するか否かを検出する。
【００８７】
図１３及び図１４は、図７に示した被検査プログラム３１に対する検出部２６の処理を示す図である。
【００８８】
検出部２６は、初期状態における条件分岐毎の分岐実行回数に基づいて、パス選択規則に従い、優先分岐番号を生成する。この際に生成される優先分岐番号は（０、０、０）となる。そして、検出部２６は、生成された優先分岐番号と、生成部２４によって生成された重複パス検出ルールとを比較して、重複パス検出ルールの中に、生成された優先分岐番号によって表されるパス候補と重複するルールが存在するか否かを判定する。
【００８９】
そして、検出部２６は、生成された優先分岐番号によって表されるパス候補と重複するルールが存在する場合には、シンボリック実行部１４でのシンボリック実行によるパス抽出処理が行われないようにする。一方、検出部２６は、生成された優先分岐番号によって表されるパス候補と重複するルールが存在しない場合には、シンボリック実行部１４でのシンボリック実行によるパス抽出処理が行われるようにする。
【００９０】
具体的には、初期状態の場合、まだ重複パス検出ルールが存在しないため、選択部２２において図１１のパス＃１１が選択され、生成部２４においてパス＃１１に対応した重複パス検出ルール：ルール＃１が生成される。
【００９１】
１回目の重複パス検出処理後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１３に示すように、｛（１、０）、（１、０）、（０、０）｝となる。したがって、次に検出部２６によって生成される優先分岐番号は、（１、１、０）となる。この場合、重複パス検出ルールにはルール＃１しか存在しないため、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。したがって、選択部２２において図１１のパス＃１２が選択され、生成部２４においてパス＃１２に対応した重複パス検出ルール：ルール＃２が生成される。
【００９２】
２回目の重複パス検出処理後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１３に示すように、｛（１、１）、（１、０）、（０、０）｝となる。したがって、次に検出部２６によって生成される優先分岐番号は、（０、１、０）となる。この場合、重複パス検出ルールにはルール＃１及びルール＃２が存在するが、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。したがって、選択部２２において図１１のパス＃１３が選択され、生成部２４においてパス＃１３に対応した重複パス検出ルール：ルール＃３が生成される。
【００９３】
３回目の重複パス検出処理後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１３に示すように、｛（２、１）、（１、１）、（１、０）｝となる。したがって、次に検出部２６によって生成される優先分岐番号は、（１、０、１）となる。この場合、重複パス検出ルールにはルール＃１、ルール＃２、及びルール＃３が存在し、生成された優先分岐番号によって表されるパス候補とルール＃２が一致する。したがって、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。具体的には、選択部２２におけるパスの選択処理、及び生成部２４における重複パス検出ルールの生成処理が省略される。ただし、生成された優先分岐番号によって表されるパス候補と、重複パス検出ルールとが一致した場合であっても、管理部２０は、パス候補の生成に伴って、条件分岐毎の分岐実行回数を更新する。
【００９４】
４回目の重複パス検出処理後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１４に示すように、｛（２、２）、（１、１）、（１、０）｝となる。したがって、次に検出部２６によって生成される優先分岐番号は、（０、０、１）となる。この場合、重複パス検出ルールにはルール＃１、ルール＃２、及びルール＃３が存在し、生成された優先分岐番号によって表されるパス候補とルール＃１が一致する。したがって、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。
【００９５】
５回目の重複パス検出処理後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１４に示すように、｛（３、２）、（２、１）、（１、０）｝となる。したがって、次に検出部２６によって生成される優先分岐番号は、（１、１、１）となる。この場合、重複パス検出ルールにはルール＃１、ルール＃２、及びルール＃３が存在し、生成された優先分岐番号によって表されるパス候補とルール＃２が一致する。したがって、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。
【００９６】
６回目の重複パス検出処理後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１４に示すように、｛（３、３）、（２、１）、（１、０）｝となる。したがって、次に検出部２６によって生成される優先分岐番号は、（０、１、１）となる。この場合、重複パス検出ルールには、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。したがって、選択部２２において図１１のパス＃１７が選択され、生成部２４においてパス＃１７に対応した重複パス検出ルール：ルール＃４が生成される。なお、ルール＃４は、「優先分岐番号が｛（ＩＦ文（１３行目）＝０）∧（ＩＦ文（１９行目）＝１）∧（ＩＦ文（２５行目）＝１）｝ならば、パス＃１７と重複する」というルールとなる。
【００９７】
７回目の重複パス検出処理後、管理部２０によって管理される条件分岐毎の分岐実行回数は、図１４に示すように、｛（４、３）、（２、２）、（１、１）｝となる。この場合、被検査プログラム３１に含まれる条件分岐毎の分岐実行回数の各々が１以上であることから、パス＃１１、パス＃１２、パス＃１３、及びパス＃１７によって分岐網羅が実現されることになる。したがって、検出部２６は重複パスの検出処理を終了する。
【００９８】
次に、ブロック到達パス抽出部４による処理の詳細について図１５〜図１８を用いて説明する。図１５は、ブロック到達パス抽出部４による処理を説明するための図である。図１５に示すように、ブロック到達パス抽出部４は、分岐網羅パス抽出部３による処理後に、未到達ブロックの命令文をスライシング基準として、前向きにプログラムスライシングする。ここで、プログラムスライシングとは、複数の処理が混在するプログラムに対して注目する処理だけを抽出することである。
【００９９】
図１６は、プログラムスライシングを説明するための図である。図１６に示すように、プログラム４２にはＸとＹの２個の変数に関する処理があり、Ｘに関する処理及びＹに関する処理は、それぞれ前処理とメイン処理に分けられ、混在する形式で実装されている。そこで、プログラムスライシングは、例えば、Ｘに関する処理だけを抽出する。
【０１００】
プログラムスライシングは、プログラム中のある命令文Ｓと変数Ｖをスライシング基準として、スライシング基準に影響する命令文を抽出する。スライシング基準は（Ｓ，Ｖ）の形式で記述される。プログラムスライシングは、プログラム中の命令文に対して制御依存関係とデータ依存関係からプログラム依存グラフを構築し、スライシング基準からこれらの依存関係を辿ることによって影響する命令文を抽出する。
【０１０１】
図１７は、プログラムスライシングの第１の例を示す図であり、図１８は、プログラムスライシングの第２の例を示す図である。図１７において、スライス結果＃１は、対象プログラム４３をスライシング基準（９，Ｘ）でスライシングした場合を示し、スライス結果＃２は、対象プログラム４３をスライシング基準（９，Ｙ）でスライシングした場合を示す。なお、「９」は命令文の行を示す。また、抽出された命令文は、太字で表される。
【０１０２】
スライス結果＃１に示すように、９行目の「ＤＩＳＰＬＡＹ  Ｘ  Ｙ  Ｚ」の変数Ｘに影響する命令文が抽出される。また、スライス結果＃２に示すように、９行目の「ＤＩＳＰＬＡＹ  Ｘ  Ｙ  Ｚ」の変数Ｙに影響する命令文が抽出される。２行目の「Ｙ＝Ｘ＋１」によりＹはＸに依存するため、１行目の「Ｘ＝Ｘ＋１」も９行目の「ＤＩＳＰＬＡＹ  Ｘ  Ｙ  Ｚ」の変数Ｙに影響する命令文として抽出される。
【０１０３】
図１８は、図１６に示したプログラム４２の２３行目のＣＯＭＰＵＴＥ文をスライシング基準（２３，Ｘ）とした場合のスライシング結果を示す。なお、２３行目のＣＯＭＰＵＴＥ文は変数Ｘだけを参照更新するので、スライシング基準として変数Ｘを陽に指定しなくてもよい。また、前向きにプログラムスライシングするとは、スライシング基準より前の命令文を対象としてプログラムスライシングを行うことである。
【０１０４】
図１８の右図では、スライシング基準４４に関係しない命令文には取り消し線が引かれており、取り消し線がない命令文がスライシング基準（２３，Ｘ）に影響する命令文である。プログラムスライシングを実行することにより、２３行目のＣＯＭＰＵＴＥ文に影響する命令文だけを抽出できるので、未到達ブロックへのパス抽出を効率化することができる。
【０１０５】
図１５に戻って、ブロック到達パス抽出部４は、スライス後の被検査プログラム３１に対し、スライシング基準４４を通過するようなパスを抽出する。そして、ブロック到達パス抽出部４は、抽出したパスが通過した命令文を収集し、通過した命令文の行番号のリストを出力する。図１５では、通過した命令文の行番号のリストとして、｛１９，２０，２４，２５，２６，２７，２９，３１，３２，３３，３５，３６，３８，３９，４２，４３，４９，５０，５２｝が出力される。
【０１０６】
次に、デッドコード解析装置１による処理のフローについて説明する。図１９は、デッドコード解析装置１による処理のフローを示すフローチャートである。図１９に示すように、デッドコード解析装置１は、被検査プログラム３１から基本ブロックを抽出し、到達表２ａを作成する（ステップＳ５１）。初期状態では、全ての基本ブロックが「未到達（×）」の状態である。
【０１０７】
そして、デッドコード解析装置１は、分岐網羅パスを探索し、実行される命令文を検出して、実行される命令の基本ブロクを「到達（○）」として到達表２ａを更新する（ステップＳ５２）。そして、デッドコード解析装置１は、未到達ブロックのリストから順に未到達ブロックを１つ選び、選んだ未到達ブロックを通過する網羅的なパスを抽出する（ステップＳ５３）。このとき、デッドコード解析装置１は、プログラムスライシングによりスライシングした被検査プログラム３１を対象としてパスを抽出する。
【０１０８】
そして、デッドコード解析装置１は、抽出したパスによって到達表２ａを更新する（ステップＳ５４）。そして、デッドコード解析装置１は、未処理の未到達ブロックがあるか否かを判定し（ステップＳ５５）、ある場合には、ステップＳ５３に戻る。
【０１０９】
一方、未処理の未到達ブロックがない場合には、デッドコード解析装置１は、到達表２ａの未到達ブロックを検出して、ロジック依存のデッドコードとして出力する（ステップＳ５６）。そして、デッドコード解析装置１は、稼働データ３２を入力し、データ依存のデッドコードを判定して出力する（ステップＳ５７）。
【０１１０】
このように、デッドコード解析装置１は、改良分岐網羅パス抽出により、分岐網羅パスを探索し、分岐網羅パスが到達しない未到達ブロックについて、プログラムスライシングによりスライシングした被検査プログラム３１を対象として、通過するパスを抽出する。したがって、デッドコード解析装置１は、効率よくデッドコードを検出することができる。
【０１１１】
図２０は、到達表管理部２による処理のフローを示すフローチャートである。図２０に示すように、到達表管理部２は、被検査プログラム３１を構文解析して命令文の構文構造を取得する（ステップＳ６１）。そして、到達表管理部２は、構文構造を分析して、被検査プログラム内の基本ブロックのリストを取得し、到達表２ａの初期状態を生成する（ステップＳ６２）。
【０１１２】
そして、到達表管理部２は、分岐網羅パス抽出部３から通過命令文の行番号を受け取って、到達した基本ブロックを判定し、到達表２ａを更新する（ステップＳ６３）。そして、到達表管理部２は、未到達ブロックのリストをブロック到達パス抽出部４に提供する（ステップＳ６４）。そして、到達表管理部２は、ブロック到達パス抽出部４から通過命令文の行番号を受取って、到達した基本ブロックを判定し、到達表２ａを更新する（ステップＳ６５）。
【０１１３】
そして、到達表管理部２は、要求に応じて、最新の到達表２ａを出力する（ステップＳ６６）。要求元には、ロジック依存到達判定部５とデータ依存到達判定部７がある。
【０１１４】
このように、到達表管理部２が到達表２ａを管理することで、デッドコード解析装置１は、未到達ブロックを特定してデッドコードを検出することができる。
【０１１５】
図２１は、分岐網羅パス抽出部３による処理のフローを示すフローチャートである。図２１に示すように、分岐網羅パス抽出部３は、被検査プログラム３１から改良分岐網羅パス抽出によりパスを抽出し、Ｐａｔｈn，ｎ＝１，・・・，Ｎとする（ステップＳ７１）。そして、分岐網羅パス抽出部３は、通過命令文集合ＰＳを初期化し、ｎを１とする（ステップＳ７２）。
【０１１６】
そして、分岐網羅パス抽出部３は、ｎがＮ以下であるか否かを判定し（ステップＳ７３）、ｎがＮ以下である場合には、Ｐａｔｈnが通過する命令文Ｓｔｍｔm，ｍ＝１，・・・，Ｍを順に取得し、ｍを１とする（ステップＳ７４）。そして、分岐網羅パス抽出部３は、ｍがＭ以下であるか否かを判定し（ステップＳ７５）、ｍがＭ以下でない場合には、ｎに１を加え（ステップＳ７６）、ステップＳ７３に戻る。
【０１１７】
一方、ｍがＭ以下である場合には、分岐網羅パス抽出部３は、ＳｔｍｔmがＰＳにあるか否かを判定し（ステップＳ７７）、ある場合には、ｍに１を加え（ステップＳ７８）、ステップＳ７５に戻る。
【０１１８】
一方、ＳｔｍｔmがＰＳにない場合には、分岐網羅パス抽出部３は、ＰＳにＳｔｍｔmを追加し（ステップＳ７９）、ステップＳ７８に移動する。また、ステップＳ７３において、ｎがＮ以下でない場合には、分岐網羅パス抽出部３は、通過した命令文の行番号のリストを到達表管理部２に出力する（ステップＳ８０）。
【０１１９】
このように、分岐網羅パス抽出部３は、改良分岐網羅パス抽出によりパスを抽出し、抽出したパスが通過する命令文を通過命令文集合に加えることで、通過命令文の行番号のリストを到達表管理部２に出力することができる。
【０１２０】
図２２は、ブロック到達パス抽出部４による処理のフローを示すフローチャートである。図２２に示すように、ブロック到達パス抽出部４は、到達表管理部２から未到達ブロックを取得し、未到達ブロックリストＵＢn，ｎ＝１，・・・，Ｎとする（ステップＳ８１）。そして、ブロック到達パス抽出部４は、ｎを１とする（ステップＳ８２）。
【０１２１】
そして、ブロック到達パス抽出部４は、ｎがＮ以下であるか否かを判定し（ステップＳ８３）、ｎがＮ以下である場合には、未到達ブロックリストＵＢnの先頭の命令文を取得する（ステップＳ８４）。そして、ブロック到達パス抽出部４は、取得した命令文をスライシング基準４４として、前向きにプログラムスライシングを実行し、被検査プログラム３１を再構成する（ステップＳ８５）。
【０１２２】
そして、ブロック到達パス抽出部４は、再構成した被検査プログラム３１について深さ優先探索でパス抽出し、抽出したパスが通過した命令文を収集する（ステップＳ８６）。そして、ブロック到達パス抽出部４は、ｎに１を加え（ステップＳ８７）、ステップＳ８３に戻る。
【０１２３】
また、ステップＳ８３において、ｎがＮ以下でない場合には、ブロック到達パス抽出部４は、通過命令文の行番号のリストを到達表管理部２に出力する（ステップＳ８８）。
【０１２４】
このように、ブロック到達パス抽出部４は、未到達ブロックの先頭の命令文をスライシング基準４４として前向きにプログラムスライシングを実行して被検査プログラム３１を再構成するので、パス抽出を効率よく行うことができる。
【０１２５】
図２３は、ロジック依存到達判定部５による処理のフローを示すフローチャートである。図２３に示すように、ロジック依存到達判定部５は、到達表２ａを取得し（ステップＳ９１）、到達表２ａの基本ブロックを順にチェックして、未到達ブロックの集合を作成する（ステップＳ９２）。
【０１２６】
そして、ロジック依存到達判定部５は、未到達ブロックの集合が空か否かを判定し（ステップＳ９３）、空の場合には、デッドコードはないと判定する（ステップＳ９４）。一方、未到達ブロックの集合が空でない場合には、ロジック依存到達判定部５は、デッドコードがあると判定し（ステップＳ９５）、未到達ブロックと構成命令文を出力する（ステップＳ９６）。
【０１２７】
このように、ロジック依存到達判定部５は、到達表２ａを用いて未到達ブロックを特定することで、デッドコードを検出することができる。
【０１２８】
図２４は、デッドコード解析装置１の効果を説明するための図である。図２４に示すように、図３に示した被検査プログラム３１に対してシンボリック実行と深さ優先探索によりパス抽出を行うと＃１〜＃１２のパスが抽出される。一方、デッドコード解析装置１は、図３及び図４に示したように、５個のパスを抽出することでデッドコードを検出する。したがって、デッドコード解析装置１は、効率よくデッドコードを検出することができる。
【０１２９】
上述してきたように、実施例では、分岐網羅パス抽出部３が改良分岐網羅パス抽出を行い、改良分岐網羅パス抽出により抽出されたパスが到達しない未到達ブロックを対象としてブロック到達パス抽出部４が網羅的なパス探索を行う。そして、網羅的なパス探索により探索されたパスによっても未到達の基本ブロックの命令文をロジック依存到達判定部５がデッドコードとして検出する。したがって、デッドコード解析装置１は、効率よくデッドコードを検出することができる。
【０１３０】
また、実施例では、ブロック到達パス抽出部４は、未到達ブロックに含まれる命令文をスライシング基準４４として被検査プログラム３１をプログラムスライシングし、プログラムスライシングにより得られたプログラムを対象として網羅的なパス探索を行う。したがって、ブロック到達パス抽出部４は、網羅的なパス探索を効率よく行うことができる。
【０１３１】
また、実施例では、到達表管理部２が到達表２ａを用いて未到達ブロックを管理するので、ロジック依存到達判定部５は未到達ブロックを確実に特定することができる。
【０１３２】
また、実施例では、データ依存到達判定部７が、稼働データ３２を用いて基本ブロック毎にブロック到達条件の真偽値を判定し、全データについてブロック到達条件が偽である基本ブロックをデッドコードとして検出する。したがって、デッドコード解析装置１は、効率よくデッドコードを検出することができる。
【０１３３】
なお、実施例では、デッドコード解析装置１について説明したが、デッドコード解析装置１が有する構成をソフトウェアによって実現することで、同様の機能を有するデッドコード解析プログラムを得ることができる。そこで、デッドコード解析プログラムを実行するコンピュータについて説明する。
【０１３４】
図２５は、実施例に係るデッドコード解析プログラムを実行するコンピュータのハードウェア構成を示す図である。図２５に示すように、コンピュータ５０は、メインメモリ５１と、ＣＰＵ（Central  Processing  Unit）５２と、ＬＡＮ（Local  Area  Network）インタフェース５３と、ＨＤＤ（Hard  Disk  Drive）５４とを有する。また、コンピュータ５０は、スーパーＩＯ（Input  Output）５５と、ＤＶＩ（Digital  Visual  Interface）５６と、ＯＤＤ（Optical  Disk  Drive）５７とを有する。
【０１３５】
メインメモリ５１は、プログラムやプログラムの実行途中結果等を記憶するメモリである。ＣＰＵ５２は、メインメモリ５１からプログラムを読み出して実行する中央処理装置である。ＣＰＵ５２は、メモリコントローラを有するチップセットを含む。
【０１３６】
ＬＡＮインタフェース５３は、コンピュータ５０をＬＡＮ経由で他のコンピュータに接続するためのインタフェースである。ＨＤＤ５４は、プログラムやデータを格納するディスク装置であり、スーパーＩＯ５５は、マウスやキーボード等の入力装置を接続するためのインタフェースである。ＤＶＩ５６は、液晶表示装置を接続するインタフェースであり、ＯＤＤ５７は、ＤＶＤの読み書きを行う装置である。
【０１３７】
ＬＡＮインタフェース５３は、ＰＣＩエクスプレス（ＰＣＩｅ）によりＣＰＵ５２に接続され、ＨＤＤ５４及びＯＤＤ５７は、ＳＡＴＡ（Serial  Advanced  Technology  Attachment）によりＣＰＵ５２に接続される。スーパーＩＯ５５は、ＬＰＣ（Low  Pin  Count）によりＣＰＵ５２に接続される。
【０１３８】
そして、コンピュータ５０において実行されるデッドコード解析プログラムは、コンピュータ５０により読み出し可能な記録媒体の一例であるＤＶＤに記憶され、ＯＤＤ５７によってＤＶＤから読み出されてコンピュータ５０にインストールされる。あるいは、デッドコード解析プログラムは、ＬＡＮインタフェース５３を介して接続された他のコンピュータシステムのデータベース等に記憶され、これらのデータベースから読み出されてコンピュータ５０にインストールされる。そして、インストールされたデッドコード解析プログラムは、ＨＤＤ５４に記憶され、メインメモリ５１に読み出されてＣＰＵ５２によって実行される。
【０１３９】
また、実施例では、改良分岐網羅パス抽出により分岐網羅パスを抽出する場合について説明したが、本発明はこれに限定されるものではなく、デッドコード解析装置１が他の分岐網羅探索による探索によってパスを抽出する場合にも同様に適用することができる。
【符号の説明】
【０１４０】
１    デッドコード解析装置
２    到達表管理部
２ａ    到達表
３    分岐網羅パス抽出部
４    ブロック到達パス抽出部
５    ロジック依存到達判定部
６    稼働データ入力部
７    データ依存到達判定部
８    デッドコード出力部
１２    入力部
１４    シンボリック実行部
１６    制御部
２０    管理部
２２    選択部
２４    生成部
２６    検出部
２８    出力部
３１    被検査プログラム
３２    稼働データ
３３    ロジック依存デッドコード
３４    稼働データ依存デッドコード
３５    行番号リスト
４１    分岐網羅パス抽出結果
４２    プログラム
４３    プログラム
４４    スライシング基準
５０    コンピュータ
５１    メインメモリ
５２    ＣＰＵ
５３    ＬＡＮインタフェース
５４    ＨＤＤ
５５    スーパーＩＯ
５６    ＤＶＩ
５７    ＯＤＤ
【図１】
2020067697.tif 000003
【図２】
2020067697.tif 000004
【図３】
2020067697.tif 000005
【図４】
2020067697.tif 000006
【図５】
2020067697.tif 000007
【図６】
2020067697.tif 000008
【図７】
2020067697.tif 000009
【図８】
2020067697.tif 000010
【図９】
2020067697.tif 000011
【図１０】
2020067697.tif 000012
【図１１】
2020067697.tif 000013
【図１２】
2020067697.tif 000014
【図１３】
2020067697.tif 000015
【図１４】
2020067697.tif 000016
【図１５】
2020067697.tif 000017
【図１６】
2020067697.tif 000018
【図１７】
2020067697.tif 000019
【図１８】
2020067697.tif 000020
【図１９】
2020067697.tif 000021
【図２０】
2020067697.tif 000022
【図２１】
2020067697.tif 000023
【図２２】
2020067697.tif 000024
【図２３】
2020067697.tif 000025
【図２４】
2020067697.tif 000026
【図２５】
2020067697.tif 000027
【図２６Ａ】
2020067697.tif 000028
【図２６Ｂ】
2020067697.tif 000029