(57)【特許請求の範囲】
【請求項１】
記憶手段からソースプログラムを読み込んでソースプログラムに含まれる変数がそのソースプログラムのどの部分にどのような影響を与えるかを解析するための変数影響解析装置において、
前記記憶手段から解析の対象となるソースプログラムを読み込み、制御依存関係に関する情報、及び変数が定義されてる行や変数が参照されている行の情報である変数のデータ依存関係に関する情報を抽出する変数情報抽出手段と、
前記ソースプログラムに対して、前記制御依存関係に関する情報及び変数のデータ依存関係に関する情報を用いて、通常の変数影響解析を行う第１の変数影響解析手段と、
変数の二段階以上のポインタを含むソースプログラムに対して、前記制御依存関係に関する情報及び前記変数のデータ依存関係に関する情報を用いて、前記変数の二段階以上のポインタについては一段階のポインタについてだけ変数影響解析を行う第２の変数影響解析手段と、
前記変数情報抽出手段が抽出したデータ依存関係に関する情報に基づいて、変数のポインタが一段階以下のものであるか、二段階以上のものであるかという変数の条件を判断し、変数の二段階以上のポインタを含まない場合には前記第１の変数影響解析手段に変数影響解析を行わせることを決定し、変数の二段階以上のポインタを含む場合には前記第２の変数影響解析手段に変数影響解析を行わせることを決定する影響解析方法決定手段と、を具備し、
前記第２の変数影響解析手段で変数影響解析を行う場合には、その旨を表示手段に表示することを特徴とする変数影響解析装置。
【請求項２】
記憶手段からソースプログラムを読み込んでソースプログラムに含まれる変数がそのソースプログラムのどの部分にどのような影響を与えるかを解析するための変数影響解析方法において、
前記記憶手段から解析の対象となるソースプログラムを読み込み、制御依存関係に関する情報、及び変数が定義されてる行や変数が参照されている行の情報である変数のデータ依存関係に関する情報を抽出する変数情報抽出工程と、
前記ソースプログラムに対して、前記制御依存関係に関する情報及び変数のデータ依存関係に関する情報を用いて、通常の変数影響解析を行う第１の変数影響解析工程と、
変数の二段階以上のポインタを含むソースプログラムに対して、前記制御依存関係に関する情報及び前記変数のデータ依存関係に関する情報を用いて、前記変数の二段階以上のポインタについては一段階のポインタについてだけ変数影響解析を行う第２の変数影響解析工程と、
前記変数情報抽出工程において抽出されたデータ依存関係に関する情報に基づいて、変数のポインタが一段階以下のものであるか、二段階以上のものであるかという変数の条件を判断し、変数の二段階以上のポインタを含まない場合には前記第１の変数影響解析工程において変数影響解析を行うことを決定し、変数の二段階以上のポインタを含む場合には前記第２の変数影響解析工程において変数影響解析を行うことを決定する影響解析方法決定工程と、
前記第２の変数影響解析工程において変数影響解析を行う場合には、その旨を表示手段に表示する工程と、を具備することを特徴とする変数影響解析方法。
【請求項３】
記憶手段からソースプログラムを読み込んでソースプログラムに含まれる変数がそのソースプログラムのどの部分にどのような影響を与えるかを解析するための変数影響解析機能を有するコンピュータプログラムを記録した機械読み取り可能な記録媒体において、
前記記憶手段から解析の対象となるソースプログラムを読み込み、制御依存関係に関する情報、及び変数が定義されてる行や変数が参照されている行の情報である変数のデータ依存関係に関する情報を抽出する変数情報抽出機能と、
前記ソースプログラムに対して、前記制御依存関係に関する情報及び変数のデータ依存関係に関する情報を用いて、通常の変数影響解析を行う第１の変数影響解析機能と、
変数の二段階以上のポインタを含むソースプログラムに対して、前記制御依存関係に関する情報及び前記変数のデータ依存関係に関する情報を用いて、前記変数の二段階以上のポインタについては一段階のポインタについてだけ変数影響解析を行う第２の変数影響解析機能と、
前記変数情報抽出機能において抽出されたデータ依存関係に関する情報に基づいて、変数のポインタが一段階以下のものであるか、二段階以上のものであるかという変数の条件を判断し、変数の二段階以上のポインタを含まない場合には前記第１の変数影響解析機能において変数影響解析を行うことを決定し、変数の二段階以上のポインタを含む場合には前記第２の変数影響解析機能において変数影響解析を行うことを決定する影響解析方法決定機能と、
前記第２の変数影響解析機能において変数影響解析を行う場合には、その旨を表示手段に表示する機能と、を有するコンピュータプログラムを記録した機械読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、一般的なプログラム言語システムのリバースエンジニアリングにおいて、ソースプログラムを解析する際に利用される変数影響解析装置及び変数影響解析方法に関する。
【０００２】
【従来の技術】
既存のソースプログラムを解析し、修正する作業において、ある変数及びこの変数に関係する部分については修正せずに、これら以外の部分だけを修正したいという場合がある。プログラムの内容によっては、その変数がプログラムの他の部分に直接的に、あるいはパラメータ等を介して又は数式の一部として間接的に影響を与えている場合がある。そのような場合には、その変数に変更を加えたときに、そのプログラムのどの部分まで影響が及ぶかが直ちには分からない。したがって、単純にその変数が含まれていない部分だからといって修正を施すと、予測しえない文法的な瑕疵等が発生して、そのプログラムが正常に動作しなくなることがある。
【０００３】
したがって、ソースプログラムの解析・修正作業においては、変数の影響がどの範囲まで及び、どの部分には及ばないかを解析することが、効率的な解析・修正作業を行うために重要となる。このような解析を行うための装置として、変数影響解析装置が知られている。この装置は、変数の影響を解析したいソースプログラムを読み込んで、その変数情報を抽出し、そのプログラムにおいてどの変数がどの部分に影響を及ぼすかを解析する。この依存関係に基づいて、どの変数がプログラムのどの部分に影響を与えるかを知ることができる。かかる情報に基づいて解析・修正作業を行えば、解析・修正作業を効率化することができる。変数情報の抽出には、データ依存関係についての情報の抽出と、制御依存関係についての情報の抽出がある。
【０００４】
【発明が解決しようとする課題】
ところで、従来の変数影響解析装置が行うデータ依存関係と制御依存関係の解析のうち、データ依存関係の解析については、変数の現れ方が少し複雑になると、プログラムを何度も解析しなければならなくなり、膨大な時間及びメモリ容量を要する。例えばＣ言語の場合だと、ポインタが二段階以上になると、解析すべき依存関係は指数関数的に増大し、解析時間が膨大になる可能性があり、また、解析に必要とするメモリが膨大になる可能性がある。このため、従来の変数影響解析装置では、このポインタが二段階以上になるようなデータ依存関係があるプログラムは、実質的に解析不可能となってしまうので、受け付けないようになっている。
【０００５】
しかしながら、実際に解析の対象となるプログラムには二段階以上のポインタが含まれていることも多く、このようなプログラムについても変数影響解析を行いたいという要望があった。
本発明は上記事情に基づいてなされたものであり、二段階以上のポインタを含むソースプログラムであっても、ある程度の変数影響解析を行って、解析・修正作業に役立つ情報が得られる変数影響解析装置及び変数影響解析方法を提供することを目的とする。
【０００６】
【課題を解決するための手段】
上記の課題を解決するために、本発明に係る変数影響解析装置は、記憶手段からソースプログラムを読み込んでソースプログラムに含まれる変数がそのソースプログラムのどの部分にどのような影響を与えるかを解析するための変数影響解析装置において、前記記憶手段から解析の対象となるソースプログラムを読み込み、制御依存関係に関する情報、及び変数が定義されてる行や変数が参照されている行の情報である変数のデータ依存関係に関する情報を抽出する変数情報抽出手段と、前記ソースプログラムに対して、前記制御依存関係に関する情報及び変数のデータ依存関係に関する情報を用いて、通常の変数影響解析を行う第１の変数影響解析手段と、変数の二段階以上のポインタを含むソースプログラムに対して、前記制御依存関係に関する情報及び前記変数のデータ依存関係に関する情報を用いて、前記変数の二段階以上のポインタについては一段階のポインタについてだけ変数影響解析を行う第２の変数影響解析手段と、前記変数情報抽出手段が抽出したデータ依存関係に関する情報に基づいて、変数のポインタが一段階以下のものであるか、二段階以上のものであるかという変数の条件を判断し、変数の二段階以上のポインタを含まない場合には前記第１の変数影響解析手段に変数影響解析を行わせることを決定し、変数の二段階以上のポインタを含む場合には前記第２の変数影響解析手段に変数影響解析を行わせることを決定する影響解析方法決定手段と、を具備し、前記第２の変数影響解析手段で変数影響解析を行う場合には、その旨を表示手段に表示することを特徴とする。
【０００７】
本発明に係る変数影響解析方法は、記憶手段からソースプログラムを読み込んでソースプログラムに含まれる変数がそのソースプログラムのどの部分にどのような影響を与えるかを解析するための変数影響解析方法において、前記記憶手段から解析の対象となるソースプログラムを読み込み、制御依存関係に関する情報、及び変数が定義されてる行や変数が参照されている行の情報である変数のデータ依存関係に関する情報を抽出する変数情報抽出工程と、前記ソースプログラムに対して、前記制御依存関係に関する情報及び変数のデータ依存関係に関する情報を用いて、通常の変数影響解析を行う第１の変数影響解析工程と、変数の二段階以上のポインタを含むソースプログラムに対して、前記制御依存関係に関する情報及び前記変数のデータ依存関係に関する情報を用いて、前記変数の二段階以上のポインタについては一段階のポインタについてだけ変数影響解析を行う第２の変数影響解析工程と、前記変数情報抽出工程において抽出されたデータ依存関係に関する情報に基づいて、変数のポインタが一段階以下のものであるか、二段階以上のものであるかという変数の条件を判断し、変数の二段階以上のポインタを含まない場合には前記第１の変数影響解析工程において変数影響解析を行うことを決定し、変数の二段階以上のポインタを含む場合には前記第２の変数影響解析工程において変数影響解析を行うことを決定する影響解析方法決定工程と、前記第２の変数影響解析工程において変数影響解析を行う場合には、その旨を表示手段に表示する工程と、を具備することを特徴とする。
【０００８】
本発明に係る機械読み取り可能な記録媒体は、記憶手段からソースプログラムを読み込んでソースプログラムに含まれる変数がそのソースプログラムのどの部分にどのような影響を与えるかを解析するための変数影響解析機能を有するコンピュータプログラムを記録した機械読み取り可能な記録媒体において、前記記憶手段から解析の対象となるソースプログラムを読み込み、制御依存関係に関する情報、及び変数が定義されてる行や変数が参照されている行の情報である変数のデータ依存関係に関する情報を抽出する変数情報抽出機能と、前記ソースプログラムに対して、前記制御依存関係に関する情報及び変数のデータ依存関係に関する情報を用いて、通常の変数影響解析を行う第１の変数影響解析機能と、変数の二段階以上のポインタを含むソースプログラムに対して、前記制御依存関係に関する情報及び前記変数のデータ依存関係に関する情報を用いて、前記変数の二段階以上のポインタについては一段階のポインタについてだけ変数影響解析を行う第２の変数影響解析機能と、前記変数情報抽出機能において抽出されたデータ依存関係に関する情報に基づいて、変数のポインタが一段階以下のものであるか、二段階以上のものであるかという変数の条件を判断し、変数の二段階以上のポインタを含まない場合には前記第１の変数影響解析機能において変数影響解析を行うことを決定し、変数の二段階以上のポインタを含む場合には前記第２の変数影響解析機能において変数影響解析を行うことを決定する影響解析方法決定機能と、前記第２の変数影響解析機能において変数影響解析を行う場合には、その旨を表示手段に表示する機能と、を有するコンピュータプログラムが記録されていることを特徴とする。
【０００９】
本発明は、上記より、変数情報抽出手段によって抽出された変数情報に基づいて変数影響解析決定手段が二段階以上先までのポインタを含むと判断した場合でも、前記第２の変数影響解析手段によって一段階までの近似的な解析を行い、解析・修正作業に役立つ情報が得られる。
【００１０】
【発明の実施の形態】
以下に図面を参照して、本発明の一実施形態について説明する。まず、変数影響解析の概略について説明する。変数影響解析には、データ依存関係による解析手段と、制御依存関係による解析手段の二つがあり、それらを組み合わせた結果が変数影響解析の結果である。
【００１１】
一般にプログラムにおいて、変数が定義されるとは、記憶が割り当てられることを言い、変数が参照されるとは、記憶された値が使用されることをいう。また、文Ｓ２が、変数ｖに関して、文Ｓ１にデータ依存するとは、
▲１▼文Ｓ１において変数ｖが定義されること。
▲２▼文Ｓ２において変数ｖが参照されること。
【００１２】
▲３▼文Ｓ１から文Ｓ２への実行可能なパスであって、変数ｖを再定義しないパスが存在すること。
という３つの条件を満足することである。
更に、文Ｓ２が文Ｓ１に制御依存するとは、
▲１▼文Ｓ１は制御の分岐点（Ｃ言語ではｉｆ文、ｗｈｉｌｅ文等をさす）であること。
【００１３】
▲２▼文Ｓ２の実行の有無は、文Ｓ１の実行結果に直接依存すること。
という二つの条件を満足することである。
次に、上記のデータ依存および制御依存関係について、実際のプログラムを例に挙げて説明する。図１は、Ｃ言語によるプログラムの実例である。まず、同図のプログラムは、２行目において、整数ｎが外部から与えられる値であることを示す。４行目及び５行目は、宣言文である。６行目は、変数ｊに０という値を入れる旨の命令であり、９行目は変数ｉに０という値を入れる旨の命令であり、１４行目は変数ｉに−１を入れる旨の命令である。また、８行目及び１０行目にはｉｆ文がある。すなわち、８行目で「ｎ＞０」であれば、９行目を実行し、「ｎ＞０」でなければ１４行目を実行する。「ｎ＞０」であって、更に１０行目で「ｎ＜１０」であれば、１１行目を実行する。ここで、１１行目の「＋＋ｊ」は、現在の変数ｊの値を１だけ繰り上げる旨の命令である。以上の手続きを経たあと、１６行目において、その時の変数ｉの値を返している。
【００１４】
図１のプログラムの１１行目の変数ｊの依存関係を、データ依存及び制御依存に分けて考える。そのために、変数ｊに影響を与える行を遡って探してみると、１０行目、８行目、６行目、２行目が変数ｊに影響を与える行に該当する。このうち、変数ｊは、まず１０行目に制御依存し、この１０行目は８行目に制御依存し、更に、８行目は２行目にデータ依存する。また、１１行目は、６行目にデータ依存していることが分かる。したがって、解析・修正作業の際に、これら以外の行であれば、変数ｊに影響を与えることなくプログラムを修正できることが分かる。
【００１５】
図２は、Ｃ言語によるプログラムの別の例である。このプログラムは、図１のプログラムと類似しているが、２行目、５行目、６行目、１１行目、１６行目の部分が図１のプログラムと異なっている。図２のプログラムにおいて、２行目、５行目、１１行目、１６行目の「＊＊（変数）」は、その変数の二段階先のポインタ、すなわちポインタへのポインタを示している。例えば、１１行目の「＋＋（＊＊ｊ）」という命令は、は、「ｊの先の先、すなわちｊの二段階先の値に１を加え、それをここに入れ直しなさい。」という命令になる。すなわち、まずｊという値がどこを指しているかを調べなければならない。ｊが指している＊ｊが分かったら、次に、その＊ｊの値がどこを指しているかを調べなければならない。＊ｊが指している＊＊ｊが分かったら、最後に＊＊ｊの値を調べて、これに１を足して、得られた値を新しく入れなおすという操作を行うことになる。
【００１６】
図３は、このような状況を模式的に示した図である。すなわち、ｊは＊ｊを指し示し、＊ｊは＊＊ｊを指し示す。しかし、ｊがどこを指しているかについて多数の場合があり、更に＊ｊがどこを指しているかについて多数の場合がある。したがって、ポインタが二段階以上になると、調べるべき可能性のあるところは急速に増大し、解析に要する時間及び使用されるメモリ容量が膨大になる。このため、これまでの変数影響解析装置では、このような二段階以上のポインタを含んだプログラムにおいてデータ依存関係を解析しようとしても、実質的には不可能であった。
【００１７】
これに対して、本実施形態に係る変数影響解析装置では、このような変数の二段階以上のポインタを含んだプログラムについて、直ちにデータ依存関係を解析不可能とするのではなく、完全ではないにしてもある程度の解析を行い、データ依存関係について何らかの見解を導き出そうとする。すなわち、変数の二段階以上先のポインタを含むと判断した場合には、変数の一段分のポインタだけについて解析を行い、結果を出すことにする。
【００１８】
図４は、本実施形態に係る変数影響解析装置のブロック図である。本装置は、ソースプログラムを読み込んで、プログラム中のどの変数がプログラム中のどの部分に影響を及ぼすかを、データ依存関係および制御依存関係両方について解析するものである。それぞれの解析の結果を組み合わせて変数影響解析結果を得ることができる。なお、これら二つの解析のうち、制御依存関係の解析については、従来用いられている手法をそのまま用いることができるのでここでは説明を省き、データ依存関係の解析について説明する。
【００１９】
同図において、まず、変数情報抽出手段１０は、ソースプログラムを読み込んで、変数のデータ依存関係に関する情報を抽出する。つまり、「何行目の文で変数ｖが定義されている」や、「何行目の文で変数ｖが参照されている」という情報を抽出する働きをする。影響解析方法決定手段１１は、変数情報抽出手段１０によって得られた変数情報に基づいて、解析対象のソースプログラムに変数の二段階以上のポインタが存在するかどうかで、後段にある変数影響解析手段１２あるいは特殊変数影響解析手段１３の何れの解析手段を用いて解析するかを決定する働きをする。変数影響解析手段１２は通常のデータ依存解析を行うものであり、特殊変数影響解析手段１３は変数の二段階以上のポインタを含んでいるソースプログラムに対して、変数の一段階のポインタまでの解析を行うものである。
【００２０】
つまり、解析対象のソースプログラムに二段階以上のポインタが存在した場合だけ特殊変数影響解析手段１３で解析を行い、それ以外の場合は、変数影響解析手段１２において通常の解析が行われる。なお、解析結果は、図示しない制御依存解析結果と組み合わせられ、変数影響解析結果として得られる。
このように、本実施形態の変数影響解析装置は、影響解析方法決定手段１１と、特殊変数影響解析手段１３を備えたことで、従来は解析不可能と判断されていた二段階以上のポインタを含んでいるソースプログラムに対しても、簡易的な解析を行うことができるようになった。
【００２１】
図５は、本実施形態に係る変数影響解析装置の動作を示すフローチャートである。ステップＳ１０において、変数影響解析を行いたいプログラムのソースコードを変数影響解析装置に読み込ませる。ステップＳ１１において、このソースプログラムから変数情報を抽出する。ステップＳ１２において、抽出されたこの変数情報から、これに含まれる変数のポインタが一段階以下のものであるか、二段階以上のものであるかという変数の条件を判断する。ここで、変数のポインタが一段階以下である場合には、ステップＳ１３において、通常の変数影響解析を行う。一方、ステップＳ１２において変数のポインタが、例えば図２に示すプログラムのように、二段階以上であると判断された場合には、ステップＳ１４において、そのポインタすべてについて変数影響解析を行うのではなく、一段階だけの近似的な変数影響解析を行って、なんらかの答を出す。この場合、オペレータに一段階だけの近似的な解析を行ったことを知らせるために、必要に応じてその旨をＣＲＴなどに表示する。
【００２２】
このようにして得られた答は、正確な解析結果ではないが、デバッグ作業を行うのに十分役立つものであり、かかる結果に基づいてデバッグ作業を行えば、デバッグ作業の効率化を図ることができる。
尚、本発明は、上記実施形態には限定されず、その要旨の範囲内で種々の変更が可能である。本発明の変数影響解析装置の各手段は、コンピュータ上で動作するソフトウェアで実現できるので、例えばＣＤ−ＲＯＭなどの記録媒体に、上記動作をするようなソフトウェアを記録し、当該ソフトウェアをコンピュータに読み込ませることによって、コンピュータを変数影響解析装置として利用することが可能である。
【００２３】
【発明の効果】
以上説明したように、本発明によれば、変数情報抽出手段によって抽出された変数情報に基づいて変数影響解析決定手段が二段階以上先までのポインタを含むと判断した場合でも、前記第２の変数影響解析手段によって一段階までの近似的な解析を行うので、従来は膨大な解析量によって実質的に解析不可能であった二段階以上先までのポインタを含むソースプログラムについても近似的ながら変数影響解析が行われ、デバッグ作業に役立つ情報が得られる。これによってデバッグ作業の効率化を図ることができる変数影響解析装置及び変数影響解析方法を提供することができる。
【図面の簡単な説明】
【図１】変数影響解析を行おうとするソースプログラムの実例を示す図である。
【図２】変数影響解析を行おうとするソースプログラムの他の実例を示す図である。
【図３】二段階以上のポインタを解析しようとしたときに要する時間が膨大になることを模式的に示した図である。
【図４】本実施形態に係る変数影響解析装置のブロック図である。
【図５】本実施形態に係る変数影響解析装置の動作を示すフローチャートである。
【符号の説明】
１０    変数情報抽出手段
１１    影響解析方法決定手段
１２    影響解析手段
１３    特殊変数影響解析手段
【図１】
0003900223.tif 000002
【図２】
0003900223.tif 000003
【図３】
0003900223.tif 000004
【図４】
0003900223.tif 000005
【図５】
0003900223.tif 000006