JP2009237762A - プログラム解析装置、プログラム解析方法および解析プログラム - Google Patents

プログラム解析装置、プログラム解析方法および解析プログラム Download PDF

Info

Publication number
JP2009237762A
JP2009237762A JP2008081057A JP2008081057A JP2009237762A JP 2009237762 A JP2009237762 A JP 2009237762A JP 2008081057 A JP2008081057 A JP 2008081057A JP 2008081057 A JP2008081057 A JP 2008081057A JP 2009237762 A JP2009237762 A JP 2009237762A
Authority
JP
Japan
Prior art keywords
address
variable
definition
program
statement
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.)
Pending
Application number
JP2008081057A
Other languages
English (en)
Inventor
Mitsunobu Yoshida
田 充 伸 吉
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.)
Toshiba Corp
Original Assignee
Toshiba Corp
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 Toshiba Corp filed Critical Toshiba Corp
Priority to JP2008081057A priority Critical patent/JP2009237762A/ja
Priority to US12/407,333 priority patent/US20090249307A1/en
Publication of JP2009237762A publication Critical patent/JP2009237762A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

【課題】ターゲットプログラムから互いに依存関係のある文の集合を正しく抽出する。
【解決手段】本発明の一態様としてのプログラム解析装置は、複数の文を含むターゲットプログラムと、複数の変数にアドレスを割り当てたアドレス定義データとの入力を受け付ける手段と、前記文毎に前記定義変数と前記参照変数のアドレスとを対応付けたアドレス間定義−参照データを生成する手段と、前記定義変数のアドレスと、前記定義変数を含む文の行番号と、前記定義変数と同一アドレスの参照変数を含む文の行番号とを対応付けたアドレス依存データを生成する手段と、前記ターゲットプログラムから制御文と前記制御文の実行結果に依存して実行される制御対象文とを検出し、これらの行番号を対応付けた制御依存データを生成する手段と、指定された行番号の文を始点とし、前記制御依存データおよび前記アドレス依存データに基づいて到達する文の集合を抽出するスライス抽出手段と、を備える。
【選択図】図1

Description

本発明は、プログラム解析装置、プログラム解析方法および解析プログラムに関し、たとえばプログラムに含まれる変数間の依存関係を解析する技術に関する。
ターゲットプログラムにおいて注目している文に対し、影響を与えるまたは影響を受ける可能性のある文の集合をスライス(プログラム断片あるいは部分プログラム)として抽出する手法としてプログラムスライシングが従来からある。
従来のプログラムスライシングでは、変数名に注目して、依存関係のある文を特定し、抽出する。このため、ある変数と、別の変数とがあり、これらの変数が同一のアドレスを指す場合、これらの変数を依存関係がないとして扱ってしまう問題がある。また共用体の変数などが含まれたプログラムでは、別々の変数(メンバ変数)が同一のアドレスに定義されており、変数のひとつが変化すると残りの変数が全て変化する。各変数はそれぞれ別個のものとして扱われてしまうため、共用体の変数などが含まれたプログラムでは、スライスを正しく抽出できなかった。その他、配列またはポインタなどを含むプログラムに対しても同様に正しくスライスを抽出できなかった。
WEISER、Program Slicing Ottenstein、The program dependence graph in a software development environment.
本発明は、ターゲットプログラムから互いに依存関係のある文の集合を正しく抽出することを可能としたプログラム解析装置、プログラム解析方法および解析プログラムを提供する。
本発明の一態様としてのプログラム解析装置は、
複数の文を含むターゲットプログラムと、前記ターゲットプログラムで用いられる複数の変数にそれぞれアドレスを割り当てたアドレス定義データと、の入力を受け付ける入力受付手段と、
前記入力受付手段に入力されたターゲットプログラムに含まれる各文の各々から定義変数と参照変数とを検出し、前記文毎に前記文の行番号と前記定義変数のアドレスと前記参照変数のアドレスとを対応付けたアドレス間定義−参照データを生成するアドレス間定義−参照データ生成手段と、
前記アドレス間定義−参照データに基づき、前記定義変数のアドレスと、前記定義変数を含む文の行番号と、前記定義変数と同一アドレスの参照変数を含む文の行番号とを対応付けたアドレス依存データを生成するアドレス依存データ生成手段と、
前記ターゲットプログラムから制御文と、前記制御文の実行結果に依存して実行される制御対象文とを検出し、前記制御文の行番号と、前記制御対象文の行番号とを対応付けた制御依存データを生成する制御依存データ生成手段と、
前記ターゲットプログラムにおける所望の行番号をスライス基準として指定するスライス基準指定手段と、
前記スライス基準として指定された行番号の文を始点とし、前記制御依存データおよび前記アドレス依存データに基づいて到達する文の集合を前記ターゲットプログラムからスライスとして抽出するスライス抽出手段と、
を備える。
本発明の一態様としてのプログラム解析方法は、
複数の文を含むターゲットプログラムと、前記ターゲットプログラムで用いられる複数の変数にそれぞれアドレスを割り当てたアドレス定義データと、の入力を受け付ける入力受付ステップと、
前記入力受付ステップで入力されたターゲットプログラムに含まれる各文の各々から定義変数と参照変数とを検出し、前記文毎に前記文の行番号と前記定義変数のアドレスと前記参照変数のアドレスとを対応付けたアドレス間定義−参照データを生成するアドレス間定義−参照データ生成ステップと、
前記アドレス間定義−参照データに基づき、前記定義変数のアドレスと、前記定義変数を含む文の行番号と、前記定義変数と同一アドレスの参照変数を含む文の行番号とを対応付けたアドレス依存データを生成するアドレス依存データ生成ステップと、
前記ターゲットプログラムから制御文と、前記制御文の実行結果に依存して実行される制御対象文とを検出し、前記制御文の行番号と、前記制御対象文の行番号とを対応付けた制御依存データを生成する制御依存データ生成ステップと、
前記ターゲットプログラムにおける所望の行番号をスライス基準として指定するスライス基準指定ステップと、
前記スライス基準として指定された行番号の文を始点とし、前記制御依存データおよび前記アドレス依存データに基づいて到達する文の集合を前記ターゲットプログラムからスライスとして抽出するスライス抽出ステップと、
を備える。
本発明の一態様としての解析プログラムは、上記プログラム解析方法の各ステップをコンピュータに実行させるための命令コード群を備えたことを特徴とする。
本発明により、ターゲットプログラムから互いに依存関係のある文の集合を正しく抽出することを可能とした
まず、以降の説明において使用する、プログラムの構文に関する用語について定義する。この用語の定義はJIS X3010に準拠している。
“式(expression)”とは演算子及びオペランドの列のことである。
“式文(expression-statement)”とは式(expresstion)にセミコロン(;)を付加したものか、セミコロン(;)のみのことである。
“宣言(declaration)”とは変数などの識別子の属性を指定する構文のことである。
“文(statement)”とは、実行すべき動作を規定する単位のことでありfor文,while文などの繰り返し文、switch文などの選択文、case文などのラベル付き文、式文、複数の文もしくは複数の宣言(declaration)を1つにまとめた複合文、goto文、return文などの分岐文がある。繰り返し文、選択文、ラベル付き文、分岐文をまとめて制御文と称することもある。
以下、本発明者らが本発明を着想する以前から知っていた従来のプログラムスライシングについて説明する。
図20は、従来におけるプログラム解析装置の構成を示す。
構文解析部110は、テキストで記述されたターゲットプログラム100を読み込み、構文解析を行う。構文解析では、与えられた文字列を構文規則にしたがって解析し、対象のプログラム言語(たとえばC言語)として許される構造をもつものかどうかを同定することによって行われる。より詳細には、まずターゲットプログラム100を読み込み”=”や数値などのトークンに分解する字句解析を行い、次にトークンの並びがプログラムの文法に適合しているかを評価する。最後に構文木と呼ばれるラベル付き有向グラフを出力する。構文木の節点には演算子、葉にはオペランドが対応づけられる。
例えばターゲットプログラム100として以下を仮定する。
[0−1]
L1: a = 10;
L2: b = a * 2;
L3: if( b > 10 ){
L4: c = a;
L5: d = b;
}
この場合、構文木のテキスト表記は以下のようになる。また、この構文木の構造は図23のようになる。ここで[0−1]のターゲットプログラムにおいて、L1-L5は行番号とする。なお、構文木の作成プロセスの詳細については後述する。
[0−2]
L01:<stmts>
L02: <stmt num=”1” type=”exp”>
L03: <node op=”=”><l>a</l><r>10</r></node>
L04: </stmt>
L05: <stmt num=”2” type=”exp”>
L06: <node op=”=”><l>b</l><r><node op=”*”><l>a</l><r>2</r></node></r></node>
L07: </stmt>
L08: <stmt num=”3” type=”if”>
L09: <node>
L10: <l><node op=">"><l>b</l><r>10</r></node></l>
L11: <r><stmts>
L12: <stmt num="4" type="exp"><node op="="><l>c</l><r>a</r></node></stmt>
L13: <stmt num="5" type="exp"><node op="="><l>d</l><r>b</r></node></stmt>
L14: </stmts></r>
L15: </stmt>
L16:</stmts>
変数定義−参照関係解析部111は構文木から式を一行ずつ読み込み、代入演算子の左辺にある変数を定義変数(定義部)として抽出し、また代入演算子の右辺にある変数を参照変数(参照部)として抽出し、行番号に関連づけて、定義変数と参照変数との対応関係を表した変数間定義−参照テーブル112を生成する。上記[0−2]の構文木に基づいて生成される変数間定義−参照テーブル112の例を図21に示す。
変数依存関係解析部113は、変数間定義−参照テーブル112に基づき変数依存テーブル114を生成する。まず変数間定義−参照テーブル112で定義されている定義変数を取り出し、取り出した定義変数に対応する行番号を記憶する、次にその定義変数の名に一致する参照変数を検出し、検出した参照変数に対応する行番号を記憶する。そしてこの定義変数の行番号と、この定義変数名と、検出した参照変数の行番号とを1組にして変数依存関係データとし、変数依存テーブル114に保存する。ここでは変数依存関係をDDという接頭語を用いて表記する。例えば変数aが行番号1で定義され、行番号2で参照されていたとすると、変数依存関係は、
DD(1,a,2)
と表記される。
ここでDD(s、w、t)は、あるアドレスwが存在して、行番号sにおけるアドレスwの定義が、アドレスwを参照している行番号tに到達していることを示す。
上記[0−1]のターゲットプログラムに対する変数依存テーブル114は以下のようになる。
[0−3]
DD(1,a,2)
DD(1,a,4)
DD(2,b,3)
DD(2,b,5)
制御依存関係解析部115は、構文解析部110で生成された構文木に基づき、制御依存テーブル116を生成する。構文木が上記[0−2]のようにテキスト表記で与えられたとすると、まずこのテキストを読み込み、stmtタグの属性typeが”if”等の制御文である式を取り出す。ここではL08からL15までがこれに相当する。またこのstmtタグの行番号を記憶する。次にL08〜L15に含まれる行番号を取り出し記憶する。具体的にstmtタグの後にnum属性がある行番号を記憶する。そして、上記制御文に対応するstmtタグの行番号を、L08〜L15から取り出された各行番号とそれぞれ組み合わせて行番号のペアを生成する。ここでは式3と式4のペア、式3と式5のペアが生成される。各ペアの関係は制御依存関係として、接頭語CDをつけて表記される。各ペアについてそれぞれ生成された制御依存関係のデータは、制御依存テーブル116に保存される。
例えば上記[0−1]のターゲットプログラムに対する制御依存テーブル116は以下のようになる。ここで、CD(s、t)は、行番号sが制御文であり、その分岐節が行番号tを含むことを表す。
[0−4]
CD(3,4)
CD(3,5)
スライス処理部118は、以上のように生成された変数依存テーブル114及び制御依存テーブル116と、別途、スライス基準入力手段117から与えられるスライス基準とに基づきプログラムスライシングを行い、スライス基準に依存関係のあるプログラム断片(部分プログラムあるいはスライス)119を抽出し、出力する。スライス基準は、たとえば(1)注目する行番号(すなわち注目する文)、または(2)注目する行番号とその行番号の文に含まれる注目変数との組、によって表される。プログラム断片(スライス)は、スライス基準に対して、変数依存テーブル114と制御依存テーブル116に基づき、依存関係のある全ての文(行番号)を抽出することで求まる。
たとえば、スライス基準としての式5(L5)に対するスライスは、CD(3,5)によって3行目が依存し、次にDD(2,b,3)によって2行目が依存し、DD(1,a,2)によって1行目が依存していることが分かる。よってスライス基準に依存関係のある全ての文(プログラム断片)を抽出すると以下のようになる。
[0−5]
L1: a = 10;
L2: b = a * 2;
L3: if( b > 10 ){
L5: d = b;
}
ここで、式間の全ての依存関係を抽出する方法として可到達行列を求める方法を用いることもできる。例えば[0−1]のターゲットプログラムに対する変数依存テーブル114及び制御依存テーブル116を行列Aとして表記すると、行列Aは
Figure 2009237762
のように表現される。この行列Aの可到達行列Bは単位行列をIとすると
B=(I+A)
のように求まる。式5に対するプログラム断片(スライス)は可到達行列Bの5行目の依存関係を抽出することで得られる。
以上に説明したような従来のプログラムスライシングの技術については非特許文献1及び非特許文献2で詳述されている。
しかしながら、このような従来の方法では、背景技術の欄に述べたように、プログラム断片(スライス)を適正に抽出できないケースがあった。
すなわち、ある変数と、別の変数があり、これらの変数が同一のアドレスを指す場合、従来の方法では、変数名に着目して処理を行うため、これらの変数を依存関係がないとして扱ってしまっていた。また共用体の変数などが含まれたプログラムでは、共用体として宣言された変数(メンバ変数)がそれぞれ別個のものとして扱われてしまうため、プログラム断片を正しく抽出できなかった。その他、配列またはポインタなどを含むプログラムに対しても正しくプログラム断片を抽出できなかった。
本発明の実施の形態は、このような場合においても、プログラム断片を正しく抽出することを可能にするものである。
以下、図面を参照しながら、本発明の実施の形態について詳細に説明する。
図2は、第一の実施例に係るプログラム解析装置の構成を示すハードウェアブロック図である。このプログラム解析装置は、データおよびプログラム(本実施例に係る解析プログラム、および解析対象となるターゲットプログラム)を保存する記憶装置16、データを一時的に記憶するメインメモリ15、記憶装置16から本実施例に係る解析プログラムを読み出しメインメモリ15に展開して実行するCPU11、制御の指示及びデータの入力を行うキーボード12およびマウス13、データの出力を行うディスプレイ14、を備え、これらの各要素がバス17を介して接続されている。本実施例に係る解析プログラムはCD−ROM、CD−R、リムーバブルディスク等のコンピュータ読み取り可能な記録媒体に記録されて、CPU11によって読み出され実行されてもよい。上記本実施例に係る解析プログラムをCPU11が実行することにより得られる各機能をブロックにより表現し、各機能により得られるデータ(テーブル)の入出力関係を各ブロック間で示したのが図1である。すなわち、図1は第一の実施例に係るプログラム解析装置の機能ブロック図である。
図1において、変数−アドレス解析部1001、構文解析部1012、アドレス定義−参照関係解析部1003、アドレス依存関係解析部1005、制御依存関係解析部1066、スライス抽出部1010は、本実施例に係わる解析プログラムをCPUに実行させることにより得られる各機能に相当する。図中のターゲットプログラム1000は、解析対象となるターゲットプログラムであり、たとえばキーボード12およびマウス13から文字列を入力することで作成されることができる。変数−アドレス対応テーブル1002、構文木1013、アドレス間定義−参照テーブル1004、アドレス依存テーブル1007、制御依存テーブル1008、プログラム断片(部分プログラムあるいはスライスとも称される。以降プログラム断片に統一する)1011は、上記各機能により生成されるデータまたはテーブルに相当する。スライス基準入力手段1009は、たとえばキーボード12またはマウス13に相当する。なお、ターゲットプログラム1000はたとえば図3に示されるような、CPU21、RAM22、表示部23、記憶装置24がバス25を介して接続されたコンピュータシステムで実行されることができる。この場合、記憶装置24に保存されたターゲットプログラム1000をCPU21が読み出して実行し、RAM22がプログラム実行中の途中データを一時的に格納する。プログラム実行結果は表示部23において表示される。
図1において、本プログラム解析装置は、ターゲットプログラム1000を記憶装置16(図2参照)から読み出し、変数−アドレス解析部1001と構文解析部1012に入力する。ターゲットプログラム1000はC言語などのプログラム言語の文法に沿って記述されている。
変数−アドレス解析部1001は、入力されたターゲットプログラム1000を用いて、変数名と絶対アドレスとを対応付けた変換−アドレス対応テーブル(マップ)1002を作成する。絶対アドレスとは、ターゲットプログラム1000が実際に実行される時に変数が一時的に格納されるメモリの番地のことである。
本例では、下記のように、絶対アドレスを用いてある変数と別の変数とが同一のアドレスを指すターゲットプログラム1000が入力されるとする。変数aと変数bとがそれぞれ同じアドレスを示す。
[1−1]
L1: #pragma ADDRESS a 0x0001
L2: #pragma ADDRESS b 0x0001
L3: #pragma ADDRESS c 0x0002
L4: #pragma ADDRESS d 0x0003
L5: a = 10;
L6: if( b > 10 ){
L7: c = a;
L8: d = b;
}
変数−アドレス解析部1001ではまずターゲットプログラム1000を1行ずつ読み込み、行の先頭に#pragmaが含まれる行を取り出す。先頭に#pragmaが含まれる行の集合はたとえばアドレス定義データに相当する。
次に取り出したそれぞれの行をスペース文字でトークンに分割し、2番目のトークンがADDRESSである行を検出する。そして、各検出した行について、3番目のトークンを変数名、4番目のトークンを絶対アドレスとして変数−アドレス対応テーブル1002に追加する。上記[1−1]のターゲットプログラムから生成された変数−アドレス対応テーブル1002を以下に示す。
[1−2]
a 0x0001
b 0x0001
c 0x0002
d 0x0003
構文解析部1012は、ターゲットプログラム1000を読み込み、絶対アドレスの指定を行っている行以外について、構文解析を行うことにより、ターゲットプログラム1000の構文を木構造で表した構文木1013を作成する。作成された構文木1013はメインメモリ15に一時的に保存される。ここで構文解析は、文字列を構文規則にしたがって解析し、対象プログラム言語(たとえばC言語)として許される構造をもつものかどうかを同定することによって行われる。
例えば、
01:main(){
02: int a;
03: a = 1;
04:}
のプログラムの構文木は図4のようになる。
より詳細に、構文解析はでまずターゲットプログラム1000を読み込み、“=”や数値などのトークンに分解する字句解析を行い、次にトークンの並びがプログラムの文法に適合しているかを評価する。最後に構文木と呼ばれるラベル付き有向グラフを出力する。構文木は、XML形式(テキスト表記)で表現することもできる。[1−1]のターゲットプログラムから作成される構文木のテキスト表記を以下に示す。またこの構文木の構造を図5に示す。
[1−3]
L01:<stmts>
L02: <stmt num=”5” type=”exp”>
L03: <node op=”=”><l>a</l><r>10</r></node>
L04: </stmt>
L08: <stmt num=”6” type=”if”>
L09: <node>
L10: <l><node op=”>”><l>b</l><r>10</r></node></l>
L11: <r><stmts>
L12: <stmt num=”7” type=”exp”><node op=”=”><l>c</l><r>a</r></node></stmt>
L13: <stmt num=”8” type=”exp”><node op=”=”><l>d</l><r>b</r></node></stmt>
L14: </stmts></r>
L15: </stmt>
L16:</stmts>
上記において、複数の文は<stmts>タグで表記している。またそれぞれの文を<stmt>タグで表記している。また対応する先頭の行番号はnum属性で表記している。また文の種類がif,for,whileなどの繰り返し文、選択文、ラベル付き文、式文、複合文、分岐文の場合はtype属性として文の種類を表記している。文が式文の場合はexp属性をつけている。式の中は2分木として表記され、節を<node>タグで表記し、節が属するトークンをop属性で表記している。また節の左の枝を<l>タグ、節の右の枝を<r>タグで表記している。
アドレス定義−参照関係解析部1003は、構文木1013と変数−アドレス対応テーブル1002とを読み込み、構文木1013に含まれる各文について、行番号と、定義変数のアドレスと、参照変数のアドレスとをそれぞれ対応付けた、アドレス間定義―参照テーブル1004を生成する。上記[1−3]の構文木と、[1−2]の変数−アドレス対応テーブル1002から生成されたアドレス間定義―参照テーブル1004を図7に示す。1列目は行番号を表し、[1−3]の<stmt>タグのnum属性に対応する。2列目は定義変数のアドレス、3行目は参照変数のアドレスを表す。
図6は、第一の実施例に係るアドレス定義−参照関係解析部1003の動作フローを示すフローチャートである。
まず構文木から1文を取り出す(ST100)。構文木において図4に示すように文の先頭の根に式番号をつけ、式番号に一致する根以下の情報を抽出することによって1文を取り出すことができる。
次に上記1文から定義変数を取り出す(ST101)。ここで定義変数とは文中に等号記号(代入演算記号((<node>タグのop属性が”=”))を持ち、その式が実行された後の値を代入する先の変数(通常等号記号の左側にある変数)を指す。例えば[1−1]の式7(L7)では変数cが定義変数となる。
次に上記1文から参照変数を取り出す(ST102)。参照変数は文が実行されるときに値が呼び出される変数である。例えば[1−1]の式7(L7)では変数aが参照変数であり、式8(L8)では変数bが参照変数となる。また<stmt>タグのタイプが”if”である場合は、その下の<node>タグの<l>タグを読み込み、その下の変数名を参照変数とする。たとえば式6(L6)では変数bが参照変数である。
次に定義変数および参照変数をそれぞれアドレスに変換する(ST103)。
次にアドレス間定義−参照テーブル1004に、上記文の行番号と、定義変数のアドレスと、参照変数のアドレスとの対応関係を登録する(ST104)。
次に全ての文が取り出されたか否かを判定する(ST105)。全ての文が取り出されていない場合は(NO)ST100に戻り、全ての文が取り出されている場合は(YES)処理を終了する。
アドレス依存関係解析部1005は、アドレス間定義―参照テーブル1004を用いて、定義変数毎に、定義変数のアドレスと、当該定義変数を含む文の行番号と、当該定義変数と同一のアドレスをもつ参照変数を含む文の行番号とを対応付けたアドレス依存アドレス依存テーブル(アドレス依存データ)1007を作成する。図7のアドレス間定義―参照テーブル1004から作成したアドレス依存テーブル1007は以下のようになる。
[1−4]
DD(5,0x0001,6)
DD(5,0x0001,8)
DD(5,0x0001,7)
ここでDD(s、w、t)は、あるアドレスwが存在して、行番号sにおけるアドレスwの定義が、アドレスwを参照している行番号tに到達していることを示す。
図8は、第一の実施例に係るアドレス依存関係解析部1005の動作フローを示すフローチャートである。
まずアドレス間定義―参照テーブル1004から定義アドレス(定義変数のアドレス)と、その定義アドレスが含まれる行番号とを取得する(ST200)。
次にアドレス間定義―参照テーブル1004から、取得した定義アドレスに一致する参照アドレス(参照変数のアドレス)を検出し、検出した参照アドレスの行番号を取得する(ST201)。
次に、取得した定義アドレスの行番号と、取得した定義アドレスと、検出した参照アドレスの行番号とを1組として、アドレス依存テーブル1007に登録する(ST202)。
次に、ST200で取得した定義アドレスに一致する全ての参照アドレスを検出したか否かを判定する(ST203)。
まだ検出していない参照アドレスがある場合は(ST203のNO)ST200に戻り、すべての参照アドレスを検出した場合は(YES)、また取得していない定義アドレスがあるかどうかを判定する(ST204)。まだ取得していない定義アドレスがある場合は(NO)ST200に戻り、もしすべての定義アドレスを取得した場合は(YES)処理を終了する。
制御依存解析部1006は、構文木1013に基づき、制御文と、当該制御文の実行結果に依存して実行される制御対象文とを検出し、制御文の行番号と、制御対象文の行番号とを対応付けた制御依存テーブル(制御依存データ)1008を作成する。上述した[1−3]の構文木から作成した制御依存テーブル1008は以下のようになる。
CD(6,7)
CD(6,8)
ここで、CD(s、t)は、行番号sが制御文であり、その分岐節が行番号tを含むことを表す。
図9は、第一の実施例に基づく制御依存関係解析部1006の動作フローを示すフローチャートである。
まず構文木1013から制御文を取り出す(ST300)。制御文とは例えばC言語の場合if文、switch文などの条件分岐、for文、while文、do-while文などの繰り返し文を指す。構文木では取り出した式の内部に制御文を示すキーワードが存在すれば、それは制御文であると判断できる。[1−1]のターゲットプログラムの場合は、if( b > 10 )が制御文に相当する。
次に制御文に応じて実行される制御対象の文の行番号を取り出す(ST301)。
次に制御文の行番号と、制御対象の文の行番号とのペアを制御依存テーブル1008に追加する(ST302)。例えば[1−1]のターゲットプログラムの場合は、L6とL7のペア、L6とL8のペアが得られる。
次に制御文を全て取得したかどうかを判定する(ST303)。まだ取得していない制御文がある場合は(NO)ST300に戻り、全ての制御文を取得した場合は(YES)、処理を終了する。
スライス基準入力手段1009は、スライス基準を入力する。スライス基準は、たとえば注目する行番号(すなわち注目する文)である。注目する行番号に加えて、その行番号の文に含まれる注目変数の指定を含んでも良い。スライス基準入力手段1009は例えばキーボードの場合、キー入力により行番号を入力しても良いし、ファイル入力手段として機能する場合、ファイルなどによって行番号を入力しても良い。またマウスの押下げ回数などによってスライス基準を入力することもできる。スライス基準入力手段1009は、このような外部から入力されたスライス基準をスライス抽出部1010に出力する。本実施例に係るプログラム解析装置は、ターゲットプログラムにおける任意の行番号を、スライス基準として指定するスライス基準指定手段を含んでもよい。
スライス抽出部1010は、アドレス依存テーブル1007および制御依存テーブル1008を用いて、入力されたスライス基準に対する全ての依存関係のある文(行)を抽出することでプログラム断片1011を取得する。すなわち、スライス基準に示される行番号の文を始点とし、アドレス依存テーブル1007および制御依存テーブル1008に基づいてスライス基準から到達するすべての文の集合をプログラム断片1011として抽出する。なお、アドレス依存テーブル1007および制御依存テーブル1008の可到達行列を計算し、可到達行列を利用して、スライス抽出を行うこともできる。
本例におけるアドレス依存テーブル1007と制御依存テーブル1008に基づき、スライス基準としての式8(行番号L8)に対するプログラム断片を抽出すると
L5: a = 10;
L6: if( b > 10 ){
L8: d = b;
}
となる。つまりCD(6,8)によって6行目が依存し、次にDD(5,0x0001,6)によって5行目が依存していることが分かる。このようにして、式8(L8)に対する依存関係を正しく抽出することができる。本例では、スライシングとしてバックワードスライシングを示したが、フォワードスライシングを行ってもよく、またはこれらの両方のスライシングを行い、両者の和集合をプログラム断片として抽出してもよい。
ここで、上記ターゲットプログラム[1−1]に対して、前述した従来技術を用いた場合は、本実施例のように依存関係のある文の集合を正しく抽出することができない。以下これを示す。
図20に示した従来技術を用いた場合、変数間定義−参照テーブル112は図22に示すようになる。
また、変数依存テーブル114及び制御依存テーブル116は以下のようになる。
DD(5,a,7)
CD(6,7)
CD(6,8)
以上から式8(L8)に対するプログラム断片を抽出すると
L6: if( b > 10 ){
L8: d = b;
}
となる。よって、従来技術では、上記[1−1]のターゲットプログラムに対して、正しく依存関係を抽出できないことが分かる。
図10は、第一の実施例に係るプログラム解析方法の一例を説明するフローチャートである。
まずターゲットとなるプログラム1000(ファイル)を読み込む(ST400)。
次に読み込んだターゲットプログラム1000において、プラグマ(pragma)文などの絶対アドレスの指定を行っている行の構文を解析することにより変数−アドレス対応テーブル1002を生成する(ST401)。
次にターゲットプログラム1000において絶対アドレスの指定を行っている以外の部分の構文解析を行うことにより構文木1013を作成する(ST402)。
次に、構文木1013と変数−アドレス対応テーブル1002からアドレス間定義−参照テーブル1004を作成する(ST403)。
次に、アドレス間定義−参照テーブル1004からアドレス依存テーブル1007を作成する(ST404)。
次に、構文木1013から制御依存テーブル1008を作成する(ST405)。
次にスライス基準を読み込み(ST406)、スライス抽出を行うことによりプログラム断片を作成する(ST407)。
以上に示した各ステップの順序はあくまで一例であり、本発明はこの順序に限定されない。たとえばST404とST405の順序が逆でもよく、この場合も、本発明の効果は損なわれない。
以上のように、本実施例によれば、アドレスの依存関係に基づきスライシングを行うため、依存関係のある文を正しく抽出できる。また、アドレスの依存関係だけを見て処理をすればいいので処理を単純化でき、よって処理が高速化される。また、複数の構文が組み合わさったときにも対応できる。
本実施例では、第一の実施例のプログラム解析装置を用いて、共用体を持つターゲットプログラムをスライシングする例を示す。以下に共用体をもつターゲットプログラム1000の例を示す。data1が共用体の変数であり、data1.aおよびdata1.b[…]は共用体のメンバ変数に相当する。
[2−1]
L1:#pragma ADDRESS data1 0x0001
L2:#pragma ADDRESS b 0x0002
L3:#pragma ADDRESS c 0x0003
L4:#pragma ADDRESS d 0x0004
L5: union data {
L6: short a, char b[2] } data1;
L7: data1.a = 256;
L8: b = data1.b[1];
L9: if( b > 0 ){
L10: c = data1.b[b];
L11: d = b;
L12: }
まず構文解析部1012において[2−1]のターゲットプログラムから構文木1013を作成する。作成された構文木1013を図11に、またこの構文木のテキスト表記を以下に示す。
[2−2]
L01:<stmts>
L02: <stmt num=”7” type=”exp”>
L03: <node op=”=”><l>data1.a</l><r>10</r></node>
L04: </stmt>
L05: <stmt num=”8” type=”exp”>
L06: <node op=”=”><l>b</l><r><node><l>data1.b</l><r>1</r></node></r></node>
L07: </stmt>
L08: <stmt num=”9” type=”if”>
L09: <node>
L10: <l><node op=”>”><l>b</l><r>10</r></node></l>
L11: <r><stmts>
L12: <stmt num=”10” type=”exp”>
L13: <node op=”=”><l>c</l><r><node><l>data1.b</l><r>b</r></node></r></node></stmt>
L14: <stmt num=”11” type=”exp”><node op=”=”><l>d</l><r>b</r></node></stmt>
L15: </stmts></r>
L16: </stmt>
L17:</stmts>
次に変数−アドレス解析部1001において[2−1]のターゲットプログラムから変数−アドレス対応テーブル1002を作成する。作成した変数−アドレス対応テーブル1002を以下に示す。
[2−3]
data1 0x0001
b 0x0002
c 0x0003
d 0x0004
次に、アドレス定義−参照関係解析部1003において、[2−3]の変数−アドレス対応テーブル1002と、[2−2]の構文木1100から、アドレス間定義−参照テーブル1004を作成する。作成したアドレス間定義−参照テーブル1004を図12に示す。data1.a,data1.b[1]などの共用体のメンバ変数(変数名にdata1(共用体の変数)が含まれる変数)については、全てdata1の先頭アドレス0x0001に変換する。共用体とは無関係の変数については実施例1と同様にして処理を行えばよい。
次にアドレス依存関係解析部1005においてアドレス間定義−参照テーブル1004からアドレス依存テーブル1007を作成し、また、制御依存関係解析部1006において構文木1013から制御依存テーブル1008を作成する。作成したアドレス依存テーブル1007および制御依存テーブル1008をそれぞれ[2−4]および[2−5]として以下に示す。
[2−4]
DD(7,0x0001,8)
DD(7,0x0001,10)
DD(8,0x0002,9)
DD(8,0x0002,11)
[2−5]
CD(9,10)
CD(9,11)
次にスライス抽出部1010において、このアドレス依存テーブル1007と制御依存テーブル1008に基づき、たとえばスライス基準としての式11(L11)に対するプログラム断片1011を抽出すると
L7: data1.a = 256;
L8: b = data1.b[1];
L9: if( b > 0 ){
L11: d = b;
}
となる。よって、共用体の変数を含むターゲットプログラムであっても、依存関係のある文(プログラム断片)を正しく抽出することができる。
図13は、第三の実施例に係るプログラム解析装置の機能ブロック図である。図13のプログラム解析装置は、第一の実施例と同様に、図2に示したようなシステムにおけるCPUに本実施例に係わる解析プログラムを実行させることによって実現される。以下、ポインタを含むターゲットプログラムを例にして、図13のプログラム解析装置の動作について説明する。
図13のプログラム解析装置に、記憶装置16から解析対象となるターゲットプログラム1000が読み込まれる。本実施例ではポインタをもつターゲットプログラムが入力され、その一例を以下に示す。なお各変数の定義文は、表記の簡単のため省略している。なお、変数bはポインタ変数である。
[3−1]
L00:#pragma ADDRESS a 0x0001
L01:#pragma ADDRESS b 0x0002
L02:#pragma ADDRESS c 0x0003
L03:#pragma ADDRESS d 0x0004
L04:#pragma ADDRESS e 0x0005
L05:a = 10;
L06:b = &a;
L07:c =*b * 2;
L08:if( c > 10 ){
L09: d = a;
L10: e = *b;
L11:}
変数−アドレス解析部1001は、入力されたターゲットプログラム1000から、変数−アドレス対応テーブル1002を作成する。より詳細には、変数−アドレス解析部1001は、第一の実施例と同様に、文の先頭が#pragmaではじまる各行について、その行に含まれる変数名とアドレスとのペアを取り出し、変数−アドレス対応テーブル1002に格納する。作成された変数−アドレス対応テーブル1002は記憶装置16に保存するか、一時的にメインメモリ15に記憶される。
構文解析部1012は、入力されたターゲットプログラム1000を読み込み、構文解析を行うことにより構文木1013を作成する。[3−1]のターゲットプログラムから作成される構文木1013の構造を図14に、またこの構文木のテキスト表記を以下に示す。
[3−2]
L01:<stmts>
L02: <stmt num=”5” type=”exp”>
L03: <node op=”=”><l>a</l><r>10</r></node>
L04: </stmt>
L02: <stmt num=”6” type=”exp”>
L03: <node op=”=”><l>b</l><r><node><l>&</l><r>a</r></node></r></node>
L04: </stmt>
L02: <stmt num=”7” type=”exp”>
L03: <node op=”=”><l>c</l><r><node op=”*”><l>b</l><r>2</r></node></r></node>
L04: </stmt>
L08: <stmt num=”8” type=”if”>
L09: <node>
L10: <l><node op=”>”><l>c</l><r>10</r></node></l>
L11: <r><stmts>
L12: <stmt num=”9” type=”exp”><node op=”=”><l>d</l><r>a</r></node></stmt>
L14: <stmt num=”10” type=”exp”><node op=”=”><l>e</l><r>b</r></node></stmt>
L15: </stmts></r>
L16: </stmt>
L17:</stmts>
ポインタ解析部1014は、ターゲットプログラム1000、変数−アドレス対応テーブル1002及び構文木1013を読み込み、ポインタ解析を行うことにより、アドレス間参照関係データ1015を生成する。ポインタ解析についてはたとえばDasの方法(Manuvir Das, Unification-based Pointer Analysis with Directional Assignment)などが知られている。
以下にポインタ解析部1014の動作を示す。
まず構文木1013から、アドレスを用いた演算が行われている文を取り出す。[3−1]の場合、アドレスを用いた演算が行われているのは式6(L06)である。
次にこの文において、呼び出される変数(等号記号の右側にある変数)を取り出し、変数−アドレス対応テーブル1002からこの変数に対応するアドレスを取得する。また、アドレス代入先の変数(等号記号の左側にある変数)を取り出し、変数−アドレス対応テーブル1002からその変数に対応するアドレスを取得する。そして、これらのアドレスの依存関係を、たとえば“(代入先の変数に対応するアドレス)→(呼び出される変数に対応するアドレス)”のように表し、アドレス間参照関係データ1015として保存する。
[3−1]のターゲットプログラムの場合、式6(L06)に対して、アドレス間参照関係データ1015として、
0x0002 -> 0x0001
が得られる。ここで右矢印(→)は0x0002番地が指定された場合は0x0001番地に置き換えるという規則を示す。
アドレス定義−参照関係解析部1003は、構文木1013、変数−アドレス対応テーブル1002およびアドレス間参照関係データ1015を読み込みアドレス間定義―参照テーブル1004を作成する。作成されたアドレス間定義―参照テーブル1004はメインメモリ15に一時的に記憶される。以下、図6を参照して、アドレス定義−参照テーブル1004の作成手順を説明する。
まず構文木1013から1文を取り出す(ST100)。
次に抽出した1文から定義変数を取り出す(ST101)。例えば[3−1]の式7(L07行目)では変数cが定義変数となる。ただし式6(L06行目)のbはアドレスが代入されている(値が代入されているのではない)ため定義変数には該当しない。
次にこの一文から参照変数を取り出す(ST102)。例えば[3−1]の式7(L07行目)では変数bが参照変数であり、式8(L08行目)は式cが参照変数となる。ただし、式6(L06行目)の変数aはアドレスが呼び出されている(値が呼び出されているのではない)ため参照変数ではない。
次に変数−アドレス対応テーブル1002から定義変数および参照変数に対応するアドレスを読み込み(ST103)、アドレス間定義−参照テーブル1004に追加する(ST104)。この際、アドレス間参照関係データ1015に基づき、“代入先の変数に対応するアドレス”があるときは、そのアドレスを“呼び出される変数に対応するアドレス”に変換する。
次に構文木の全ての文が処理されたかを判定し(ST105)、全ての文が処理されたら(YES)、処理を終了する。
以上の処理により作成されたアドレス間定義―参照テーブル1004は以下のようになる
[3−3]
行 定義 参照
L05 0x0001
L07 0x0003 0x0001
L08 0x0003
L09 0x0004 0x0001
L10 0x0005 0x0001
次にアドレス依存関係解析部1005は、アドレス間定義―参照テーブル1004を読み込み、アドレス依存テーブル1007を作成する。本処理は第一の実施例と同様、図8に示したフローに従って行えばよい。作成したアドレス依存テーブル1007はメインメモリ15に一時的に記憶され、または、記憶装置16にファイルとして保存してもよい。
[3−3]のアドレス間定義―参照テーブル1004から作成されたアドレス依存テーブル1007を以下に示す。
[3−4]
s w T
L05 0x0001 L08
L05 0x0001 L09
L05 0x0001 L10
L07 0x0003 L08
次に、制御依存関係解析部1006は、構文木1013に基づき制御依存テーブル1008を生成する。本処理は第一の実施例と同様、図9に示したフローに従って行う。作成した制御依存テーブル1008はメインメモリ15に一時的に記憶され、または、記憶装置16にファイルとして保存してもよい。
[3−1]のターゲットプログラムの場合、L08とL09、L08とL10に制御依存関係が存在するため、以下の制御依存テーブル1008が得られる。
CD(8,9)
CD(8,10)
なお、第一の実施例で述べたように、CD(s、t)は、行番号sが制御文であり、その分岐節が行番号tを含むことを表す。
次にスライス基準入力手段1009がスライス基準を読み込む。スライス基準は例えば行番号である。
次にスライス抽出部1010が、アドレス依存テーブル1007と制御依存テーブル1008とアドレス間参照関係データ1015に基づき、スライス基準に依存関係のある全ての文(行)を取り出すことによりプログラム断片(スライス)1011を作成する。
例えば[3−1]のターゲットプログラムの場合、行番号9に対するプログラム断片1011は
L06: b = &a;
L07: c = *b * 2;
L08: if( c > 10 ){
L09: e = *b;
}
となる。スライス基準における参照変数bのアドレスは0x0001、アドレス間参照関係データ1015は0x0002 -> 0x0001であることから、0x0002 -> 0x0001に対応する式(L06)が、スライス基準に依存関係がある行として抽出されている。
抽出されたプログラム断片1011は表示部14に表示しても良いし、記憶装置16に保存しても良い。
以下、ポインタを含む他のターゲットプログラム例として、[3−5]を示す。変数の定義は表記の簡単のため省略している。変数a、変数bはポインタ変数である。このターゲットプログラム例を元に本実施例における処理例を示す。
[3−5]
L1:#pragma ADDRESS a 0x0001
L2:#pragma ADDRESS b 0x0003
L3:#pragma ADDRESS c 0x0004
L4:#pragma ADDRESS d 0x0005
L5:#pragma ADDRESS e 0x0006
L6: *a = 10;
L7: *(a+1) = 1;
L8: b = a;
L9: c = *(b+1) * 2;
L10: if( c > 10 ){
L11: d = *a;
L12: e = *b;
}
ポインタ解析部1014におけるポインタ解析により式8(L8)に対応して、アドレス間参照関係データ1015として以下が得られる。
[3−6]
0x0003 -> 0x0001
また、アドレス間定義−参照関係解析部1003における処理により、図15に示すアドレス間定義−参照テーブル1004が得られる。
また、アドレス依存関係解析部1005および制御依存関係解析部1006における処理により、アドレス依存テーブル1007および制御依存テーブル1008として以下を得ることができる。
[3−7]
DD(6,0x0001,11)
DD(6,0x0001,12)
DD(7,0x0002,9)
DD(9,0x0004,10)
[3−8]
CD(10,11)
CD(10,12)
この[3−7]のアドレス依存テーブル1007と、[3−8]の制御依存テーブル1008と、[3−6]のアドレス間参照関係データ1015から、スライス基準としての式2(L12)に対するプログラム断片を抽出すると、以下が得られる。
L6: *a = 10;
L7: *(a+1) = 1;
L9: c = *(b+1) * 2;
L10: if( c > 10 ){
L12: e = *b;
}
このように、本実施例によれば、ポインタをもつターゲットプログラムであっても、依存関係のある文を正しく抽出することができる。
図16は、第四の実施例に係るプログラム解析装置の機能ブロック図である。以下では図1に示した第一の実施例に係るプログラム解析装置との差分についてのみ説明し、それ以外については第一の実施例と同様であるため、重複する説明を省略する。
第一の実施例では、ターゲットプログラム内に、変数とアドレスとの対応の定義したデータ(アドレス定義データ)を記述したが、本実施例では、このアドレス定義データを、変数−アドレス定義ファイル1016としてターゲットプログラムとは別個に与え、ターゲットプログラムにはこのアドレス定義データを含めない。変数−アドレス定義ファイル1016の一例を以下に示す。
[4−1]
a 0x0001
b 0x0001
c 0x0002
d 0x0003
マップ構文解析1017では、変数−アドレス定義ファイル1016から、変数名とアドレスとの対応を解析し、変数−アドレス対応テーブル1002を作成する。
例えば[4−1]の変数−アドレス定義ファイル1016がテキストファイルとして与えられた場合、マップ構文解析1017はファイルを一行ずつ読み込み、スペースで2つの文字列に分割し、左側の文字列を変数、右側の文字列をアドレス値とすることによって変数−アドレス対応テーブル1002を得る。
図17は、第五の実施例に係るプログラム解析装置の機能ブロック図である。本実施例に係るプログラム解析装置は、配列のインデックスを変数で指定しているターゲットプログラムを解析することを特徴とする。例えば以下のようなC言語で記述されたターゲットプログラムが、本プログラム解析装置に入力される。式6(L6行目)では、配列変数aが定義されている。また式11(L11行目)では、配列変数aのインデックスを変数cによって指定し、配列変数aの値に応じて、条件分岐を行っている。
[6−1]
L1:#pragma ADDRESS a 0x0000
L2:#pragma ADDRESS b 0x0003
L3:#pragma ADDRESS c 0x0004
L4:#pragma ADDRESS d 0x0005
L5:#pragma ADDRESS e 0x0006
L6:int a[2],*b;
L7: a[0] = 10;
L8: a[1] = 1;
L9: b = &a[0];
L10: c = 0;
L11: if( a[c] > 10 ){
L12: d = a[0];
L13: e = b[0];
}
構文解析部1012は、ターゲットプログラム1000を読み込み、構文解析を行うことにより、構文木1013を作成する。作成した構文木1013のテキスト表記を下記に示す。また構文木1013の構造を図18に示す。下記のテキスト表記において、<decl>タグは宣言を表している。
[6−2]
L01:<stmts>
L02: <decl num=”6”>
L03: <node>
L04: <l>int</l>
L05: <r>
L06: <node><l>a</l><r>2</r></node><node><l>*</l><r>b</r></node>
L07: </r>
L08: </node>
L09: </decl>
L10: <stmt num=”7” type=”exp”>
L11: <node op=”=”><l><node><l>a</l><r>0</r></node></l><r>10</r></node>
L12: </stmt>
L13: <stmt num=”8” type=”exp”>
L14: <node op=”=”><l><node><l>a</l><r>1</r></node></l><r>1</r></node>
L15: </stmt>
L16: <stmt num=”9” type=”exp”>
L17: <node op=”=”>
L18: <l>b</l>
L19: <r><node><l>&</l><r><node><l>a</l><r>0</r></node></r></node></r>
L20: </node>
L21: </stmt>
L22: <stmt num=”10” type=”exp”><node op=”=”><l>c</l><r>0</r></node></stmt>
L23: <stmt num=”11” type=”if”>
L24: <node>
L25: <l><node op=”>”><l><node><l>a</l><r>c</r></node></l><r>10</r></node></l>
L26: <r><stmts>
L27: <stmt num=”12” type=”exp”>
L28: <node op=”=”><l>c</l><r><node><l>a</l><r>0</r></node></node></stmt>
L29: <stmt num=”13” type=”exp”>
L30: <node op=”=”><l>d</l><r><node><l>b</l><r>0</r></node></r></node></stmt>
L31: </stmts></r>
L32: </stmt>
L33:</stmts>
配列サイズ解析部1018は、作成された構文木から宣言された配列変数の配列サイズを取得する。例えば構文木が[6−2]の場合、構文木をL01から順に読み込み、declタグをもつ行を取り出す。ここではL02〜L09が該当する。次にdeclタグの木において、その下の節の右の枝に宣言された変数があるためこれを読み込む。それが節(nodeタグ)であり、さらにその節の下において、右の節が数値、左の節が変数のときは、配列宣言が示されている。よって、右の節の数値2と、左の節の変数aを読み込むことで、変数aは0-2までのインデクスを持つ配列変数であることが分かる。
次に変数−アドレス解析部1001によって変数−アドレス対応テーブル1002を作成する。以下は[6−1]のターゲットプログラムに対して作成された変数−アドレス対応テーブル1001である。
[6−3]
a 0x0000
b 0x0003
c 0x0004
d 0x0005
e 0x0006
次にポインタ解析部1014はポインタ解析を行う。まず[6−2]の構文木を読み込み、<decl>タグをもつ行を読み込む。<node>タグに基づき、配列宣言およびポインタ宣言された変数を検出する。ここではL06において、aが配列、bがポインタであることがわかる。次にその変数が代入されている式(行)を特定する。変数aと変数bが含まれている<stmt>タグはL16〜L21であり、その中における<node>タグの属性が”=”から、式9において、配列とポインタ間の代入演算が行われていることが分かる。代入元である<r>タグを読み込むことで、配列aのインデクスが0であることがわかる。また代入先である<l>タグを読み込むことで、代入先の変数がbであることが分かる。次に[6−3]の変数−アドレス対応テーブル1001に基づき、各変数に対応するアドレスを求める。最終的にアドレス間の依存関係(アドレス間参照関係データ1015)は以下のようにもとまる。代入先の変数は定義変数、代入元(呼び出し元)の変数は参照変数として扱われる。
[6−4]
0x0003 -> 0x0000
次にアドレス定義−参照関係解析部1003によって、図19に示すアドレス間定義−参照テーブル1004を作成する。
[6−1]のターゲットプログラムの11行目の式では、変数aが参照変数であり、そのインデクスは変数cである。具体的に変数aは配列であり、そのインデックスは0-2が宣言されており、インデックスの指定が変数である。そのインデックスの先頭は、[6−3]の変数−アドレス対応テーブル1001によって0x0000である。このように参照変数が配列であり配列のインデクスが変数で指定されている場合は、全ての候補となるアドレスをアドレス間定義−参照テーブル1004に抽出する。ここでは配列変数aのインデクスが0のときの0x0000、インデクスが1のときの0x0001,インデクスが2のときの0x0002が候補となるアドレスである。
本例では、参照変数が配列である場合を示しているが、定義変数が配列であり当該配列のインデックスが変数でしてされている場合も、同様にしてすべての候補となるアドレスを抽出する。
また[6−2]の構文木において、L30から、変数bについてそのインデクスは0であることが分かる。変数bのインデクス0のアドレスは0x0003であり、[6−4]のアドレス間参照関係データ1015から0x0003は0x0000と一致する。よって、図19における行13の参照アドレスは、0x0000となる。
次にアドレス依存関係解析部1005は、図19のアドレス間定義−参照テーブル1004に基づき、第一〜第四の実施例と同様の方法に従って、以下に示すアドレス依存テーブル1007を作成する。
[6−5]
DD(7,0x0000,11)
DD(7,0x0000,12)
DD(7,0x0000,13)
DD(8,0x0002,11)
DD(10,0x0002,11)
次に制御依存関係解析部1006は、第一〜第四の実施例と同様の方法に従って、以下に示す制御依存テーブル1008を作成する。
[6−6]
CD(11,12)
CD(11,13)
次にスライス基準入力手段1009からスライス基準(たとえば行番号)を入力する。
たとえば[6−1]のターゲットプログラムにおいて、式13(L13)を選択した場合、式13(L13)に対するプログラム断片として、以下が抽出される。
L7: a[0] = 10;
L8: a[1] = 1;
L10: c = 0;
L11: if( a[c] > 10 ){
L13: e = b[0];
}
このようにして配列変数を持ち、配列変数のインデクスが変数で指定されたターゲットプログラムについても、プログラム断片を正しく抽出できる。
第一の実施例に係るプログラム解析装置の機能ブロック図。 第一の実施例に係るプログラム解析装置の構成を示すハードウェアブロック図。 ターゲットプログラムの実行環境の一例を示す図。 第一の実施例に係る構文木の例を示す図。 第一の実施例に係る構文木の他の例を示す図。 第一の実施例に係るアドレス定義−参照関係解析部の動作フローを示すフローチャート。 第一の実施例に係るアドレス間定義―参照テーブルの一例を示す図。 第一の実施例に係るアドレス依存関係解析部の動作フローを示すフローチャート。 第一の実施例に基づく制御依存関係解析部の動作フローを示すフローチャート。 第一の実施例に係るプログラム解析方法の一例を説明するフローチャート。 第二の実施例に係る構文木の一例を示す図。 第二の実施例に係るアドレス間定義−参照テーブルの一例を示す図。 第三の実施例に係るプログラム解析装置の機能ブロック図。 第三の実施例に係る構文木の一例を示す図。 第三の実施例に係るアドレス間定義−参照テーブルの一例を示す図。 第四の実施例に係るプログラム解析装置の機能ブロック図。 第五の実施例に係るプログラム解析装置の機能ブロック図。 第五の実施例に係る構文木の一例を示す図。 第五の実施例に係るアドレス間定義−参照テーブルの一例を示す図。 従来におけるプログラム解析装置の構成を示す図。 従来技術に係る変数間定義−参照テーブルの一例を示す図。 従来技術に係る変数間定義−参照テーブルの一例を示す図。 従来技術に係る構文木の一例を示す図。
符号の説明
1000:ターゲットプログラム
1001:変数−アドレス解析部
1002:変数−アドレス対応テーブル
1003:アドレス定義−参照関係解析部
1004:アドレス間定義−参照テーブル
1005:アドレス依存関係解析部
1006:制御依存関係解析部
1007:アドレス依存テーブル
1008:制御依存テーブル
1009:スライス基準入力手段
1010:スライス抽出部
1011:プログラム断片(部分プログラム、スライス)
1012:構文解析部
1013:構文木
1014:ポインタ解析部
1015:アドレス間参照関係データ
1016:変数−アドレス定義ファイル
1017:マップ構文解析部
1018:配列サイズ解析部
11、21:CPU
12:キーボード
13:マウス
14、23:表示部
15:メインメモリ
16、24:記憶装置
17:バス
22:RAM

Claims (11)

  1. 複数の文を含むターゲットプログラムと、前記ターゲットプログラムで用いられる複数の変数にそれぞれアドレスを割り当てたアドレス定義データと、の入力を受け付ける入力受付手段と、
    前記入力受付手段に入力されたターゲットプログラムに含まれる各文の各々から定義変数と参照変数とを検出し、前記文毎に前記文の行番号と前記定義変数のアドレスと前記参照変数のアドレスとを対応付けたアドレス間定義−参照データを生成するアドレス間定義−参照データ生成手段と、
    前記アドレス間定義−参照データに基づき、前記定義変数のアドレスと、前記定義変数を含む文の行番号と、前記定義変数と同一アドレスの参照変数を含む文の行番号とを対応付けたアドレス依存データを生成するアドレス依存データ生成手段と、
    前記ターゲットプログラムから制御文と、前記制御文の実行結果に依存して実行される制御対象文とを検出し、前記制御文の行番号と、前記制御対象文の行番号とを対応付けた制御依存データを生成する制御依存データ生成手段と、
    前記ターゲットプログラムにおける所望の行番号をスライス基準として指定するスライス基準指定手段と、
    前記スライス基準として指定された行番号の文を始点とし、前記制御依存データおよび前記アドレス依存データに基づいて到達する文の集合を前記ターゲットプログラムからスライスとして抽出するスライス抽出手段と、
    を備えたプログラム解析装置。
  2. 前記ターゲットプログラムにおける前記複数の変数は共用体の変数を含み、前記アドレス定義データは前記共用体の変数にアドレスを割り当て、
    前記アドレス間定義−参照データ生成手段は、前記共用体のメンバ変数のアドレスとして、前記共用体の変数のアドレスを用いる
    ことを特徴とする請求項1に記載のプログラム解析装置。
  3. 前記ターゲットプログラムからアドレスを用いた演算を行っている文を検出し、検出した文において、アドレスが呼び出されている呼び出し元変数と、前記アドレスの演算値が代入される代入先変数とを特定し、前記代入先変数のアドレスと前記呼び出し元変数のアドレスとを対応付けたアドレス間参照関係データを作成するポインタ解析手段をさらに備え、
    前記アドレス間定義−参照データ生成手段は、前記代入先変数と同一のアドレスをもつ参照変数のアドレスを前記呼び出し元変数のアドレスへ置換し、
    前記スライス抽出手段は、前記制御依存データおよび前記アドレス依存データに加えて、前記アドレス間参照関係データにさらに基づいて、前記スライスの抽出を行う
    ことを特徴とする請求項1または2に記載のプログラム解析装置。
  4. 前記ターゲットプログラムから配列を宣言した文を検出し、検出した文を解析することにより前記配列のサイズを取得する配列サイズ解析手段をさらに備え、
    前記アドレス間定義−参照データ生成手段は、インデックスが変数により指定された配列である定義変数または参照変数については、前記配列のサイズに応じたすべてのインデックス候補に対応するアドレスを前記定義変数または前記参照変数のアドレスとして用いる
    ことを特徴とする請求項1ないし3のいずれか一項に記載のプログラム解析装置。
  5. 前記アドレス定義データは前記ターゲットプログラム中に記述されたことを特徴とする請求項1ないし4のいずれか一項に記載のプログラム解析方法。
  6. 複数の文を含むターゲットプログラムと、前記ターゲットプログラムで用いられる複数の変数にそれぞれアドレスを割り当てたアドレス定義データと、の入力を受け付ける入力受付ステップと、
    前記入力受付ステップで入力されたターゲットプログラムに含まれる各文の各々から定義変数と参照変数とを検出し、前記文毎に前記文の行番号と前記定義変数のアドレスと前記参照変数のアドレスとを対応付けたアドレス間定義−参照データを生成するアドレス間定義−参照データ生成ステップと、
    前記アドレス間定義−参照データに基づき、前記定義変数のアドレスと、前記定義変数を含む文の行番号と、前記定義変数と同一アドレスの参照変数を含む文の行番号とを対応付けたアドレス依存データを生成するアドレス依存データ生成ステップと、
    前記ターゲットプログラムから制御文と、前記制御文の実行結果に依存して実行される制御対象文とを検出し、前記制御文の行番号と、前記制御対象文の行番号とを対応付けた制御依存データを生成する制御依存データ生成ステップと、
    前記ターゲットプログラムにおける所望の行番号をスライス基準として指定するスライス基準指定ステップと、
    前記スライス基準として指定された行番号の文を始点とし、前記制御依存データおよび前記アドレス依存データに基づいて到達する文の集合を前記ターゲットプログラムからスライスとして抽出するスライス抽出ステップと、
    を備えたプログラム解析方法。
  7. 前記ターゲットプログラムにおける前記複数の変数は共用体の変数を含み、前記アドレス定義データは前記共用体の変数にアドレスを割り当て、
    前記アドレス間定義−参照データ生成ステップは、前記共用体のメンバ変数のアドレスとして、前記共用体の変数のアドレスを用いる
    ことを特徴とする請求項6に記載のプログラム解析方法。
  8. 前記ターゲットプログラムからアドレスを用いた演算を行っている文を検出し、検出した文において、アドレスが呼び出されている呼び出し元変数と、前記アドレスの演算値が代入される代入先変数とを特定し、前記代入先変数のアドレスと前記呼び出し元変数のアドレスとを対応付けたアドレス間参照関係データを作成するポインタ解析ステップをさらに備え、
    前記アドレス間定義−参照データ生成ステップは、前記代入先変数と同一のアドレスをもつ参照変数のアドレスを前記呼び出し元変数のアドレスへ置換し、
    前記スライス抽出手ステップは、前記制御依存データおよび前記アドレス依存データに加えて、前記アドレス間参照関係データにさらに基づいて、前記スライスの抽出を行う
    ことを特徴とする請求項6または7に記載のプログラム解析方法。
  9. 前記ターゲットプログラムから配列を宣言した文を検出し、検出した文を解析することにより前記配列のサイズを取得する配列サイズ解析ステップをさらに備え、
    前記アドレス間定義−参照データ生成ステップは、インデックスが変数により指定された配列である定義変数または参照変数については、前記配列のサイズに応じたすべてのインデックス候補に対応するアドレスを前記定義変数または前記参照変数のアドレスとして用いる
    ことを特徴とする請求項6ないし8のいずれか一項に記載のプログラム解析方法。
  10. 前記アドレス定義データは前記ターゲットプログラム中に記述されたことを特徴とする請求項6ないし9のいずれか一項に記載のプログラム解析方法。
  11. 請求項6ないし10のいずれか一項に記載の各ステップをコンピュータに実行させるための命令コード群を備えた解析プログラム。
JP2008081057A 2008-03-26 2008-03-26 プログラム解析装置、プログラム解析方法および解析プログラム Pending JP2009237762A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2008081057A JP2009237762A (ja) 2008-03-26 2008-03-26 プログラム解析装置、プログラム解析方法および解析プログラム
US12/407,333 US20090249307A1 (en) 2008-03-26 2009-03-19 Program analysis apparatus, program analysis method, and program storage medium

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008081057A JP2009237762A (ja) 2008-03-26 2008-03-26 プログラム解析装置、プログラム解析方法および解析プログラム

Publications (1)

Publication Number Publication Date
JP2009237762A true JP2009237762A (ja) 2009-10-15

Family

ID=41119097

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008081057A Pending JP2009237762A (ja) 2008-03-26 2008-03-26 プログラム解析装置、プログラム解析方法および解析プログラム

Country Status (2)

Country Link
US (1) US20090249307A1 (ja)
JP (1) JP2009237762A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2017107448A (ja) * 2015-12-10 2017-06-15 株式会社デンソー 並列化方法、並列化ツール、車載装置
CN107153610A (zh) * 2017-04-28 2017-09-12 腾讯科技(深圳)有限公司 一种程序语句错误检测方法和装置

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8612954B2 (en) * 2009-08-17 2013-12-17 International Business Machines Corporation Fine slicing: generating an executable bounded slice for program
US8448139B2 (en) * 2009-10-05 2013-05-21 International Business Machines Corporation Automatic correction of application based on runtime behavior
US9164742B2 (en) * 2010-02-18 2015-10-20 Johan Kraft Method and a system for searching for parts of a computer program which affects a given symbol
US9170805B2 (en) * 2010-07-20 2015-10-27 Hitachi, Ltd. Software maintenance supporting device for analyzing relationships between variables
US8583965B2 (en) 2011-06-21 2013-11-12 International Business Machines Corporation System and method for dynamic code analysis in presence of the table processing idiom
JP2013171459A (ja) * 2012-02-21 2013-09-02 Toshiba Corp プログラム解析装置、プログラム解析方法および記録媒体
US9015674B2 (en) * 2012-09-28 2015-04-21 Microsoft Technology Licensing, Llc Identifying execution paths that satisfy reachability queries
CN104252506B (zh) * 2013-06-28 2017-12-19 易保网络技术(上海)有限公司 同步构建业务模型和数据仓库模型及其映射的方法及系统
US9430228B2 (en) 2013-12-16 2016-08-30 International Business Machines Corporation Verification of backward compatibility of software components
CN104063220B (zh) * 2014-06-25 2017-04-12 清华大学 基于文件的Linux基础软件依赖关系分析方法
WO2016060110A1 (ja) * 2014-10-14 2016-04-21 日本電信電話株式会社 解析装置、解析方法、および、解析プログラム
US11593249B2 (en) * 2015-12-23 2023-02-28 Oracle International Corporation Scalable points-to analysis via multiple slicing
JP6880962B2 (ja) * 2017-04-14 2021-06-02 富士通株式会社 プログラム分析装置、プログラム分析方法および分析プログラム
CN107943857A (zh) * 2017-11-07 2018-04-20 中船黄埔文冲船舶有限公司 自动读取AutoCAD表格的方法、装置、终端设备与存储介质
CN109815153B (zh) * 2019-02-19 2024-01-26 北京天诚同创电气有限公司 Plc程序及电机启停控制程序的静态切片方法和装置
US11074167B2 (en) 2019-03-25 2021-07-27 Aurora Labs Ltd. Visualization of code execution through line-of-code behavior and relation models
US20230153109A1 (en) * 2021-11-16 2023-05-18 Massachusetts Institute Of Technology System and method for analyzing and steering use of third-party libraries
CN116702160B (zh) * 2023-08-07 2023-11-10 四川大学 一种基于数据依赖增强程序切片的源代码漏洞检测方法

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5161216A (en) * 1989-03-08 1992-11-03 Wisconsin Alumni Research Foundation Interprocedural slicing of computer programs using dependence graphs
JPH10124325A (ja) * 1996-10-25 1998-05-15 Toshiba Corp 変数の最適配置方法、変数の最適配置装置及び変数の最適配置プログラムを格納したコンピュータ読み取り可能な記録媒体
US6179491B1 (en) * 1997-02-05 2001-01-30 International Business Machines Corporation Method and apparatus for slicing class hierarchies
US7174536B1 (en) * 2001-02-12 2007-02-06 Iowa State University Research Foundation, Inc. Integrated interactive software visualization environment
CA2518498A1 (en) * 2003-03-10 2004-09-23 Catena Corporation Static analysis method for lyee-oriented software
US7620946B2 (en) * 2003-05-05 2009-11-17 Jeffry Thomas Russell Program slicing for codesign of embedded systems
US20050071438A1 (en) * 2003-09-30 2005-03-31 Shih-Wei Liao Methods and apparatuses for compiler-creating helper threads for multi-threading
JP4157016B2 (ja) * 2003-11-05 2008-09-24 株式会社東芝 コンパイラ装置及びコンパイル方法
US7849453B2 (en) * 2005-03-16 2010-12-07 Oracle America, Inc. Method and apparatus for software scouting regions of a program
US7930659B2 (en) * 2005-06-03 2011-04-19 Nec Laboratories America, Inc. Software verification
US20070016894A1 (en) * 2005-07-15 2007-01-18 Sreedhar Vugranam C System and method for static analysis using fault paths
JP4876511B2 (ja) * 2005-09-29 2012-02-15 株式会社日立製作所 ロジック抽出支援装置
US7926039B2 (en) * 2006-03-28 2011-04-12 Nec Laboratories America, Inc. Reachability analysis for program verification
US8006239B2 (en) * 2007-01-16 2011-08-23 Nec Laboratories America, Inc. Program analysis using symbolic ranges
US9087151B2 (en) * 2009-02-18 2015-07-21 Mitsubishi Electric Corporation Program analysis support device
US8612954B2 (en) * 2009-08-17 2013-12-17 International Business Machines Corporation Fine slicing: generating an executable bounded slice for program
US8543974B2 (en) * 2009-08-31 2013-09-24 International Business Machines Corporation Plan-based program slicing
US8443343B2 (en) * 2009-10-28 2013-05-14 Intel Corporation Context-sensitive slicing for dynamically parallelizing binary programs

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2017107448A (ja) * 2015-12-10 2017-06-15 株式会社デンソー 並列化方法、並列化ツール、車載装置
CN107153610A (zh) * 2017-04-28 2017-09-12 腾讯科技(深圳)有限公司 一种程序语句错误检测方法和装置

Also Published As

Publication number Publication date
US20090249307A1 (en) 2009-10-01

Similar Documents

Publication Publication Date Title
JP2009237762A (ja) プログラム解析装置、プログラム解析方法および解析プログラム
US8645350B2 (en) Dictionary compilations
US20070033520A1 (en) System and method for web page localization
US8468494B2 (en) In-line editor
EP1352330A1 (en) Method and system for generating structured data from semi-structured data sources
CN113508385B (zh) 使用子例程图谱进行形式语言处理的方法和系统
JP2008083952A (ja) 辞書作成支援システム、方法及びプログラム
CN108027748A (zh) 指令集模拟器及其模拟器生成方法
CN114625844B (zh) 一种代码搜索方法、装置及设备
CN112379917A (zh) 浏览器兼容性提升方法、装置、设备及存储介质
US20210019476A1 (en) Methods and apparatus to improve disambiguation and interpretation in automated text analysis using transducers applied on a structured language space
CN112199115A (zh) 基于特征相似度匹配的跨Java字节码和源代码行关联方法
US8869109B2 (en) Disassembling an executable binary
US20080141230A1 (en) Scope-Constrained Specification Of Features In A Programming Language
JP2010277440A (ja) プログラム実行時における文字列の処理を最適化する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム
KR102614967B1 (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
US20220004708A1 (en) Methods and apparatus to improve disambiguation and interpretation in automated text analysis using structured language space and transducers applied on automatons
JP4734400B2 (ja) 文書検索装置およびプログラム
CN114444032A (zh) 自定义规则混淆代码的方法及装置
JP5115631B2 (ja) 地名情報抽出装置、制御方法、記録媒体及び地図情報検索装置
CN113031952A (zh) 深度学习模型的执行代码的确定方法、装置及存储介质
JP2016051367A (ja) データ解析装置、データ解析方法、および、プログラム。
JP2014206948A (ja) エントリーポイント抽出装置
CN113609821B (zh) 一种正则表达式转换方法、装置、设备及存储介质
JP2011113298A (ja) 流用ソースコード解析システム及びプログラム並びに記録媒体