JP7077909B2 - デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置 - Google Patents

デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置 Download PDF

Info

Publication number
JP7077909B2
JP7077909B2 JP2018198382A JP2018198382A JP7077909B2 JP 7077909 B2 JP7077909 B2 JP 7077909B2 JP 2018198382 A JP2018198382 A JP 2018198382A JP 2018198382 A JP2018198382 A JP 2018198382A JP 7077909 B2 JP7077909 B2 JP 7077909B2
Authority
JP
Japan
Prior art keywords
path
branch
arrival
block
dead code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2018198382A
Other languages
English (en)
Other versions
JP2020067697A (ja
Inventor
芳晴 前田
昭彦 松尾
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2018198382A priority Critical patent/JP7077909B2/ja
Publication of JP2020067697A publication Critical patent/JP2020067697A/ja
Application granted granted Critical
Publication of JP7077909B2 publication Critical patent/JP7077909B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Description

本発明は、デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置に関する。
業務システムのような情報システムは長期間にわたって運用保守されため、機能追加、機能変更、障害対応等の改修が、長期間に渡って部分的かつ断続的に実施される。部分的な改修のため、情報システムのプログラムは、年を経るごとに複雑となり、いわゆる、スパゲティ化する。
特に、新機能の追加もしくは既存機能の変更では、既存機能に影響を与えないようにするため、既存機能のプログラム部分(ソースコード)を変更せず、追加もしくは変更する機能のソースコードを追加する改修が行われる。変更されなかった既存機能のソースコードは、使われないソースコードや実行されないソースコードとなり、これらのソースコードは、デッドコードと呼ばれる。
デッドコードは、以下のような理由により、情報システムのプログラムの保守に悪影響を与える。
・プログラムのサイズが大きくなるため、保守対象の範囲が広がる。
・不要な条件分岐や命令文が存在するため、プログラムのロジックが複雑になる。この複雑さは見た目であり、真の複雑さでないことがある。
・プログラムのサイズが増えロジックが複雑になると、プログラムの把握が困難になる。
したがって、デッドコードは除去されることが望まれる。しかしながら、デッドコードの検出は容易ではなく手間がかかる。
デッドコードは、以下のように、3種類に分類される。
(1)論理的に到達不能な部分(プログラムで常に実行されない部分)
(a)呼び出されない関数やブロック→静的解析で検出が可能
(b)GOTO文又はSTOP文の次でジャンプ文の飛び先でない部分→静的解析で検出が可能
(c)先行処理で条件が常に偽又は真の固定値となる分岐部分(ロジック依存の到達不能)
(2)データ依存で到達不能な部分(データ値がないために実行されない部分)
条件を満たすデータがないため未実行の分岐(データ依存の到達不能)
例えば、使われなくなった「コード値」でのみ真又は偽の固定値となる分岐部分
(3)不要コード(実行されるが意味のないコード)
デッドでないが不要なコード→静的解析で検出が可能
例えば、全く参照されない変数の定義文
上記(1)の(a)と(b)、及び、(3)は、静的解析で検出が可能である。これらのデッドコードの除去は、デッドコードエリミネーション(DCE:Dead Code Elimination)と呼ばれる。DCE技術は、コンパイラでのプログラム最適化等で使用されている。
上記(1)の(c)のロジック依存の到達不能は、デッドコードである分岐部分(条件分岐配下の基本ブロック)が、分岐条件へ到達する処理パスで経由した先行条件のために、常に選択されない場合である。ここで、「基本ブロック」とは、命令文の列を含むプログラムのコード片であり、入口と出口が共に1つしかなく、内部に分岐を含まないコード片である。IF文等の分岐命令文は、先行する基本ブロックの最後の文となり、分岐先の命令文は別の基本ブロックとなる。ロジック依存の到達不能は、デッドコードである分岐部分が分岐条件へ到達する処理パスで経由した先行条件のために常に選択されないことを調査する必要があるため、従来の静的解析では検出することができない。また、(2)のデータ依存の到達不能も、情報システムの実際の稼働データに依存するため、従来の静的解析では検出することができない。
上記(1)の(c)のロジック依存の到達不能は、シンボリック実行により検出される。ここで、シンボリック実行とは、プログラムの入力変数にシンボル値(記号値)を設定して、プログラムを模擬的に実行することによって、プログラムの処理パス(以下、単にパスと呼ぶ)を抽出する技術である。シンボリック実行のパス探索において深さ優先探索を採用することによって、プログラムの実行が可能な全てのパスを網羅的に抽出することができる。
実行可能な全てのパスを網羅的に抽出し、全てのパスが通過しない基本ブロックを検出すれば、ロジック依存の到達不能を検出することができる。しかしながら、シンボリック実行を利用したデッドコード検出手法は、実行可能なパスを網羅的に抽出するため、パスの個数が多数となる。パスの個数が多数となると分析時間が長くなる。
さらに、シンボリック実行は、以下の場合に十分に動作しない。
・実行可能なパスの個数が無限である場合
パス数が無限となるのは、プログラムにループ処理があり、かつ、ループ終了条件にシンボル値が含まれる場合である。
・パス抽出処理において分析時間やメモリが制限を超過する場合
パス抽出処理において分析可能な時間やメモリが制限を超過する場合とは、例えば、IF文が多数連続している場合である。
図26Aは、パス数が無限となるプログラムの例を示す図である。図26Aにおいて、最も左の欄の数字は、命令文の文番号を示す。図26Aにおいて、文番号「000010」の「PERFORM」は、「カウンタ」の値を「1」から「1」ずつ増加しながら「カウンタ」の値が「閾値」より大きくなるまで、文番号「000013」の「COMPUTE」を実行することを指示する。このPERFORMループでは、「閾値」の値がシンボル値の場合、ループを継続するパスが常に存在するので、パスの個数が無限となる。
図26Bは、パス抽出処理においてメモリが制限を超過するプログラムの例を示す図である。図26Bは、独立なIF文が20個あるプログラムを示す。このプログラムをシンボリック実行すると、パス数は220である。シンボリック実行装置が、例えば、メモリサイズを1ギガバイトとしてIF文を15個まで処理でき、16個とするとメモリ超過が発生したとする。すると、メモリサイズを6倍の6ギガバイトとしても、シンボリック実行装置は、IF文を18個までしか対応できない。IF文が3個増えると、パス数は8倍となる。IF文が18個の場合、パス数は218=262,144である。
このように、シンボリック実行では、パスの爆発が発生する。そこで、実行可能な全てのパスを網羅的に探索するかわりに、分岐を網羅するパスを探索する分岐網羅探索がある。また、分岐網羅探索において、できるだけ少ないパスで分岐網羅度を向上させる技術がある。なお、以下の特開2015-176230号公報に記載された分岐網羅探索を以下では改良分岐網羅パス抽出と呼ぶこととする。
特開2015-176230号公報 特開2018-147106号公報
分岐網羅探索には、探索したパスが通過しない基本ブロックを全てデッドコードとすることができないという問題がある。すなわち、分岐網羅探索により探索されたパスが通過しない基本ブロックを通過する他のパスが存在する場合がある。
本発明は、1つの側面では、効率よくデッドコードを検出することを目的とする。
1つの態様では、デッドコード解析プログラムは、コンピュータに、ソースコードを分岐命令の個所で区切って基本ブロックに分割し、分割した基本ブロックに基づいてソースコードに対して分岐網羅探索を行ってパスを探索する処理を実行させる。そして、デッドコード解析プログラムは、コンピュータに、分岐網羅探索により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出する処理を実行させる。そして、デッドコード解析プログラムは、コンピュータに、抽出したパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する処理を実行させる。
1つの側面では、本発明は、効率よくデッドコードを検出することができる。
図1は、実施例に係るデッドコード解析装置によるデッドコードの検出方法を説明するための図である。 図2は、実施例に係るデッドコード解析装置の機能構成を示す図である。 図3は、分岐網羅パス抽出部による処理を説明するための図である。 図4は、ブロック到達パス抽出部による処理を説明するための図である。 図5は、ロジック依存到達判定部による処理を説明するための図である。 図6は、分岐網羅パス抽出部の機能構成を示す図である。 図7は、分岐網羅パス抽出部の説明に用いる被検査プログラムの一例を示す図である。 図8は、図7に示した被検査プログラムをフローチャートで示した図である。 図9は、管理部で実行される管理内容を示す図である。 図10は、EVALUATE文が含まれる被検査プログラムの例を示す図である。 図11は、図7に示した被検査プログラムから探索されたパスの一例を示す図である。 図12は、図7に示した被検査プログラムを例にして、生成部における重複パス検出ルールの生成方法の一例を示す図である。 図13は、図7に示した被検査プログラムに対する検出部の処理を示す第1の図である。 図14は、図7に示した被検査プログラムに対する検出部の処理を示す第2の図である。 図15は、ブロック到達パス抽出部による処理を説明するための図である。 図16は、プログラムスライシングを説明するための図である。 図17は、プログラムスライシングの第1の例を示す図である。 図18は、プログラムスライシングの第2の例を示す図である。 図19は、デッドコード解析装置による処理のフローを示すフローチャートである。 図20は、到達表管理部による処理のフローを示すフローチャートである。 図21は、分岐網羅パス抽出部による処理のフローを示すフローチャートである。 図22は、ブロック到達パス抽出部による処理のフローを示すフローチャートである。 図23は、ロジック依存到達判定部による処理のフローを示すフローチャートである。 図24は、デッドコード解析装置の効果を説明するための図である。 図25は、実施例に係るデッドコード解析プログラムを実行するコンピュータのハードウェア構成を示す図である。 図26Aは、パス数が無限となるプログラムの例を示す図である。 図26Bは、パス抽出処理においてメモリが制限を超過するプログラムの例を示す図である。
以下に、本願の開示するデッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置の実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
まず、実施例に係るデッドコード解析装置によるデッドコードの検出方法について説明する。図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が他の分岐網羅探索による探索によってパスを抽出する場合にも同様に適用することができる。
1 デッドコード解析装置
2 到達表管理部
2a 到達表
3 分岐網羅パス抽出部
4 ブロック到達パス抽出部
5 ロジック依存到達判定部
6 稼働データ入力部
7 データ依存到達判定部
8 デッドコード出力部
12 入力部
14 シンボリック実行部
16 制御部
20 管理部
22 選択部
24 生成部
26 検出部
28 出力部
31 被検査プログラム
32 稼働データ
33 ロジック依存デッドコード
34 稼働データ依存デッドコード
35 行番号リスト
41 分岐網羅パス抽出結果
42 プログラム
43 プログラム
44 スライシング基準
50 コンピュータ
51 メインメモリ
52 CPU
53 LANインタフェース
54 HDD
55 スーパーIO
56 DVI
57 ODD

Claims (8)

  1. コンピュータに、
    ソースコードを分岐命令の個所で区切って基本ブロックに分割し、
    分割した基本ブロックに基づいて前記ソースコードに対して分岐網羅探索を行ってパスを探索し、
    前記分岐網羅探索により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出し、
    抽出したパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する
    処理を実行させることを特徴とするデッドコード解析プログラム。
  2. 前記分岐網羅探索を行う処理は、改良分岐網羅パス抽出により分岐網羅探索を行うことを特徴とする請求項1に記載のデッドコード解析プログラム。
  3. 前記改良分岐網羅パス抽出は、シンボリック実行において所定のパス選択規則にしたがった場合に条件分岐毎に次に選択される分岐先に基づいて重複パスを検出する規則を生成し、該生成した規則に基づいてシンボリック実行によるパス抽出を制御することでパス探索を行うことを特徴とする請求項2に記載のデッドコード解析プログラム。
  4. 前記抽出する処理は、
    前記未到達ブロックに含まれる命令文をスライシング基準として前記ソースコードのスライシングを行い、
    前記スライシングにより得られたソースコードを対象として網羅的なパス探索を行うことで前記未到達ブロックに到達するパスを抽出することを特徴とする請求項1、2又は3に記載のデッドコード解析プログラム。
  5. 到達が確認されたか否かを示す到達状況を基本ブロック毎に記憶する処理を前記コンピュータにさらに実行させ、
    前記分岐網羅探索を行う処理は、探索結果に基づいて前記到達状況を更新し、
    前記抽出する処理は、抽出結果に基づいて前記到達状況を更新し、
    前記検出する処理は、前記到達状況に基づいてデッドコードを検出することを特徴とする請求項1~4のいずれか1つに記載のデッドコード解析プログラム。
  6. 前記ソースコードが実行されるときに使用されるデータに基づいて基本ブロック毎に到達条件の真偽値を判定し、全データについて到達条件が偽である基本ブロックをデッドコードとして検出する処理を前記コンピュータにさらに実行させることを特徴とする請求項1~5のいずれか1つに記載のデッドコード解析プログラム。
  7. コンピュータが、
    ソースコードを分岐命令の個所で区切って基本ブロックに分割し、
    分割した基本ブロックに基づいて前記ソースコードに対して分岐網羅探索を行ってパスを探索し、
    前記分岐網羅探索により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出し、
    抽出したパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する
    処理を実行することを特徴とするデッドコード解析方法。
  8. ソースコードを分岐命令の個所で区切って基本ブロックに分割する分割部と、
    前記分割部により前記ソースコードが分割された基本ブロックに基づいて前記ソースコードに対して分岐網羅探索を行ってパスを探索する分岐網羅探索部と、
    前記分岐網羅探索部により探索されたパスで到達が確認されなかった未到達ブロックに到達するパスを抽出する到達パス抽出部と、
    前記到達パス抽出部により抽出されたパスが到達する未到達ブロック以外の未到達ブロックの命令文をデッドコードとして検出する検出部と
    を有することを特徴とするデッドコード解析装置。
JP2018198382A 2018-10-22 2018-10-22 デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置 Active JP7077909B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2018198382A JP7077909B2 (ja) 2018-10-22 2018-10-22 デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2018198382A JP7077909B2 (ja) 2018-10-22 2018-10-22 デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置

Publications (2)

Publication Number Publication Date
JP2020067697A JP2020067697A (ja) 2020-04-30
JP7077909B2 true JP7077909B2 (ja) 2022-05-31

Family

ID=70390332

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018198382A Active JP7077909B2 (ja) 2018-10-22 2018-10-22 デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置

Country Status (1)

Country Link
JP (1) JP7077909B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP7480082B2 (ja) 2021-03-08 2024-05-09 株式会社東芝 ソフトウェア開発支援装置、方法及びプログラム
US11593080B1 (en) 2021-12-17 2023-02-28 International Business Machines Corporation Eliminating dead stores
KR102630168B1 (ko) * 2023-06-01 2024-01-29 쿠팡 주식회사 코드를 관리하는 전자 장치 및 방법

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010072883A (ja) 2008-09-17 2010-04-02 Nec Corp プログラム検証装置、プログラム検証方法、及びプログラム
JP2015176230A (ja) 2014-03-13 2015-10-05 富士通株式会社 テストケース生成装置、方法、及びプログラム
JP2018147106A (ja) 2017-03-02 2018-09-20 富士通株式会社 プログラム分析装置、プログラム分析方法及びプログラム分析プログラム

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4190610B2 (ja) * 1998-02-18 2008-12-03 富士通株式会社 ロードモジュールの試験ルート決定装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010072883A (ja) 2008-09-17 2010-04-02 Nec Corp プログラム検証装置、プログラム検証方法、及びプログラム
JP2015176230A (ja) 2014-03-13 2015-10-05 富士通株式会社 テストケース生成装置、方法、及びプログラム
JP2018147106A (ja) 2017-03-02 2018-09-20 富士通株式会社 プログラム分析装置、プログラム分析方法及びプログラム分析プログラム

Also Published As

Publication number Publication date
JP2020067697A (ja) 2020-04-30

Similar Documents

Publication Publication Date Title
US8621441B2 (en) System and method for software immunization based on static and dynamic analysis
JP7077909B2 (ja) デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置
JP5874891B2 (ja) プログラムテスト装置、プログラムテスト方法、およびプログラム
US8732676B1 (en) System and method for generating unit test based on recorded execution paths
JP6904043B2 (ja) 未知のプログラムバイナリのための入力発見
JP6911059B2 (ja) Cpu利用およびコードリファクタリングのためのクエリオプティマイザー
JP2006185211A (ja) プログラム解析装置、テスト実行装置、その解析方法及びプログラム
JP6245006B2 (ja) テストケース生成装置、方法、及びプログラム
JP5450840B2 (ja) プログラムの実行性能評価のためのテストデータ生成方法
JP6409577B2 (ja) テスト選択プログラム、テスト選択方法、及びテスト選択装置
JP2018032082A (ja) プログラム生成プログラム、プログラム生成方法、プログラム生成装置及びコンパイルプログラム
KR102110735B1 (ko) 취약점 탐색을 위한 바이너리 재생성 방법 및 시스템
KR102271857B1 (ko) 테스트 자동화 시스템
JP2009211424A (ja) 最適化箇所判定装置及び最適化箇所判定システム及びコンピュータプログラム及び最適化箇所判定方法
JP6878707B2 (ja) 試験装置、試験方法および試験プログラム
US10528691B1 (en) Method and system for automated selection of a subset of plurality of validation tests
US10579761B1 (en) Method and system for reconstructing a graph presentation of a previously executed verification test
JP6790921B2 (ja) プログラム分析装置、プログラム分析方法及びプログラム分析プログラム
WO2023067665A1 (ja) 解析機能付与方法、解析機能付与装置及び解析機能付与プログラム
WO2023067668A1 (ja) 解析機能付与方法、解析機能付与装置及び解析機能付与プログラム
US5956511A (en) Program development support apparatus, program development support method, and storage medium therefor
JP2008282174A (ja) 情報処理装置、情報処理方法、および情報処理プログラム
JP2009134360A (ja) モデル検査システム、モデル検査方法およびモデル検査用プログラム
JP2008305019A (ja) シミュレーション装置及びシミュレーション方法及びプログラム
WO2021205589A1 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20210709

TRDD Decision of grant or rejection written
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20220413

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

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20220419

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20220502

R150 Certificate of patent or registration of utility model

Ref document number: 7077909

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150