動的データ依存関係解析を用いた Java プログラムスライス手法
廣瀬 航也 y 大畑 文明 y 井上 克郎 yz
y 大阪大学大学院 基礎工学研究科 情報数理系専攻〒 560-8531 大阪府豊中市待兼山町 1-3

Phone: 06-6850-6571 Fax: 06-6850-6574

z 奈良先端科学技術大学院大学 情報科学研究科〒 630-0101 奈良県生駒市高山町 8916-5

E-mail: fk-hirose, oohata, inoueg@ics.es.osaka-u.ac.jp
あらまし プログラムデバッグを効率よく行うための手法として，プログラムスライスがある．プログラ
ムスライスは一般的に，プログラム文間の制御依存関係およびデータ依存関係を解析することで得られる．
また依存関係解析には，低コストではあるが精度の低い静的解析と，精度は高いが多大なコストを要する
動的解析がある．

本発表では，近年，ソフトウェア開発環境で多く利用される， Java を対象としたプログラムスライス手法を提案する． Java は，オブジェクトへの参照・動的束縛など ，実行時に決定される要素を多数含むため，静的解析では限界がある．提案手法では，静的解析と動的解析を組み合わせることにより，スライスの精度を高める．

キーワード プログラムスライス，静的解析，動的解析，Java

Program Slicing Method Using Dynamic Data
Dependence Analysis for Java Programs
Koya Hirosey, Fumiaki Ohatay and Katsuro Inoueyz

yGraduate School of Engineering Science, Osaka University

1-3 Machikaneyama-cho, Toyonaka, Osaka 560-8531, Japan
Phone: +81-6-6850-6571 Fax: +81-6-6850-6574
zGraduate School of Inforamtion Science,Nara Institute of Science and Technology
8916-5 Takayama, Ikoma, Nara 630-0101, Japan
E-mail: fk-hirose, oohata, inoueg@ics.es.osaka-u.ac.jp

Abstract Program slice is proposed as a technique to do the program debugging eciently.

Program slice is obtained by generally analyzing the control dependence and the data dependence between program statements. Moreover, the dependence analysis is divided into a static
analysis which requires a little cost but produces results with low accuracy, and a dynamic
analysis which produces results correctly but requires a large cost.
In this paper, we propose a program slice technique intended for Java programs. Java is popularly used by the software development environment in recent years. There is a limitation in astatic analysis since Java contains a lot of dynamically determined issues such as reference toan object and dynamic binding. Our technique improves accuracy of slice by combining static
analyses with a dynamic analysis.
Key words program slice，static analysis，dynamic analysis，Java

1

2

まえがき

プログラムデバッグを効率よく行うための手法とし て，プ ログ ラムスラ イス(Program Slice )[6]が提案されている．プログラムスライスとは，直観的には，ある文 のある変数 の値に影響を与え得る文の集合である．一般に，プログラムスラ
イスは，プログラム文間の依存関係を解析することで求められる．これまで，手続き型言語を対象とした様々な解析によるプログラムスライス計算
手法の提案がなされてきた．主なものに，静的ス
ライス(Static Slice )[6]，動的スライス(Dynamic
Slice )[1]，Dependence-Cache(DC) ス ラ イ
ス(Dependence-Cache Slice )[2] 等がある．

sv

また，現在のソフトウェア開発環境において，Cなど の手続き型言語だけでなく， Java, C++等いわゆるオブジェクト指向言語の利用が高まっている．オブジェクト指向言語には，従来の手続き型
言語にはないクラス，継承など の新しい概念が導入されており，既存のプログラムスライス計算手法をそのまま用いても正確なスライスが得られない．そこで，オブジェクト指向言語への対応を試みた静的スライス [3]，動的スライス [7] が提案されている．オブジェクト指向言語には，実行時に決定される要素が多く含まれるため，静的スライスでは正確性に限界がある．一方，動的スライス
は実行系列を保存するため，多大な時間，空間コストが必要となる．
本稿では，オブジェクト指向言語である Java を対象に，静的スライスと動的スライスの中間に位置する DC スライスを適用する．DC スライスでは
動的にデータ依存解析を行うことで，実行時に決定されるデータ依存関係を正確に解析できる．提案手法は，DC スライスの手法を Java に適応することで，実行時に決定される要素の解析が行え，静的スライスより正確なスライスの抽出が行える．また，制御依存関係解析を静的に行い，実行系列の保存を行わないため，解析コストが動的スライスより小さくなる．
以降，2 ではプログラムスライスについて述べる．3 では，DC スライスについて述べる．4 では，動的データ依存関係解析を用いた Java スライス手法について述べる．最後に 5 で，まとめと今後の課題について述べる．

プログラムスライスプログラムスライシング (Program Slicing ) 技術とは，プログラム中のある文 におけるある変数(スライス基準 ( ) と呼ぶ) に対して の値に影響を与える全ての文をプログラムから抽出する技術で，その結果取り出された文の集合をプログラ
ムスライスまたは単にスライス(Slice ) と呼ぶ．
スライスは，デバッグ，保守，プログラム理解等に利用される．

v

s

s;v

2.1

v

スライス計算手順

一般に，プログラムスライスは以下の手順で計算される．
Step 1 依存関係解析
プログラム文間の制御依存関係およびデータ依存関係を調べる.
Step 2 プログラム依存グラフ作成
依 存 関 係 解 析 を 元 にプ ロ グ ラ ム 依 存 グ ラ
フ (Program Dependence Graph, PDG ) を作成
する．
Step 3 グラフ探索
スライス基準に対応する節点から PDG の辺を逆向きにたど る．到達された節点がスライスとして抽出される．
2.2

依存関係

s

t

次の条件をすべて満たすとき，文 から文 への制御依存関係(Control Dependence ) があるという．
 文 が条件文である．
 文 が実行されるかど うかは，文 の結果に依存する．
また，以下の 3 つの条件をすべて満たすとき，文から文 へ変数 に関するデータ依存関係(Data
Dependence ) があるという．
 文 で変数 を定義している．
 文 で変数 を参照している．
 文 における変数 の定義が文 に到達する

s
t

s

s

t

s
t
s

2.3

v

v
v

v

PDG

t

PDG の各節点は，プログラムに含まれる代入
文，入出力文，条件判定文，手続き呼出し 文などの各文を表し ，各辺は 2 つの文間の依存関係を表す．制御依存関係を表す辺を制御依存辺，データ依存関係を表す辺をデータ依存辺と呼び ，それぞv
れ
! とあらわす ( はデータ依存関係が生じる
原因となる変数の名前)．
一般にプログラムには複数の手続きが定義され*;v

1: #include <stdio.h>
2: #define SIZE 5
3: int cube(int x) {4:
return x*x*x;
5: }6: void main(void)
7: {8:
int a[SIZE];
9:
int b[SIZE];
10:
int c, d, i;
11:
12:
13:
14:
15:

a[0] = 0;a[1] = -1;a[2] = 2;a[3] = -3;
a[4] = 4;

16:
17:
18:

for (i=0; i<SIZE; i++) {b[i] = a[i];
}

19:
20:
21:
22:
23:
24: }

scanf("%d", &c);
d = cube(b[c]);if (d < 0)
d = -1 * d;printf("%d", d);

図 1: ソースプログラムている．各手続き間には引数や大域変数を通じて
データ依存関係が生じる．また，手続き呼び出し文から呼ばれた手続きには制御の流れが生じ る．そこで，PDG にプログラム中の文とは直接対応しな
い節点を用意し ，その節点が手続き間の中継ぎをすることで手続き間に生じるデータ依存関係，制御依存関係を表す．
図 1 の C のソースプログラムに対応する PDG
は図 2 のようになる．

s d
* *
* *

1: #include <stdio.h>
2: #define SIZE 5

* *
* *
* *

3: int cube(int x) {4:
return x*x*x;
5: }* * 6: void main(void)* * 7: {* * 8:
int a[SIZE];* * 9:
int b[SIZE];* * 10:int c, d, i;
*
11:
*
12:
* * 13:
*
14:
*
15:

a[0] = 0;a[1] = -1;a[2] = 2;a[3] = -3;
a[4] = 4;* * 16:* * 17:* * 18:for (i=0; i<SIZE; i++) {b[i] = a[i];}* * 19:* * 20:* * 21:*22:* * 23:* * 24: }scanf("%d", &c);
d = cube(b[c]);if (d < 0)
d = -1 * d;printf("%d", d);

図 3: 図 1 のプログラムの (23.d) に関するスライス
2.4

静的スライスと動的スライス

静的スライスは，制御依存関係とデータ依存関
係を共に静的解析して得られる．起こりうる全ての入力を考慮するため，不必要な情報を含むことがあり，その結果，スライスサイズが大きくなるという問題がある．
動的スライスは，制御依存関係とデータ依存関
係を共に動的解析して得られる．ある入力データに関する実行系列 (実際に実行された文の並び ) を扱うため，スライスサイズを減らすことができる
が，全ての実行系列を保存し ，そこから依存関係を抽出するために，多大な時間，空間コストを必要とする．

図 1 のプログラムを対象に，スライス基準 (23,d) に関する各スライスを図 3 に示す．なお，動的スライスの抽出においては，入力に 2 を与えた．列s, d の"*"で記された文がそれぞれ静的スライス，
動的スライスに含まれる文を示している．
3

図 2: プログラム依存グラフ

Dependence-Cache スライス配列を含むプログラムを静的に解析する際，配列の添字の値を把握するのは困難で，不要に多くの依存関係を抽出してしまうことがある．また，ポインタを含むプログラムを静的解析する際においても，ポインタによるエイリアスによって，陽には現れないデータ依存関係が発生するため，その依存関係を知るために，各ポインタが何を指しているかを把握しておく必要がある． point-to グラ
フ [5] を使った静的な解析手法が提案されているが，正確性に限界がある．

DC スライスは，動的にデ ータ依存関係を抽出することで，配列の添字，ポインタの参照先を把握する．一方，制御依存関係は静的に解析し ，実行系列を保存することはしないため動的スライス抽出に比べて実行時間の短縮が得られる．
3.1

1
2
3
4
5
6

a[0]:=0;a[1]:=1;
a[2]:=2;
readln(c);b:=a[c]+5;
writeln(b);図 4: 配列を含むプログラム
表 1: 図 4 のプログラムにおける，各実行時点でのキャッシュの推移
実行文
1
2
3
4
5
6

計算手順

静的に PDG を構築する．まず，プログラム中の各文や条件節に対応する節点を用意する．制
御依存関係を解析し 制御依存辺を引く．この段
階ではデータ依存解析は行わず，データ依存辺は引かない．よって PDG は節点と制御依存辺のみからなる．
Step 2 実行時データ依存関係解析
スライス対象プログラムをある入力について実行しながら， 3.2 で述べる方法でデータ依存関係を解析し ，PDG にデータ依存辺を追加する．
Step 3 スライスの抽出
スライス基準に対応する節点から PDG を逆向
きにたど り，到達された節点に対応する文，条件節がスライスとして抽出される．

sv

実行中に，ある文 である変数 が使用された
時， がど の文 ( ) で定義されたかが分かれば ，から への に関するデータ依存関係があることが分かる．逆に言えば ， を定義し てる文さえ分
かればデータ依存関係を知ることができる．

v
s

v

t

2
2
2
2
2

3
3
3
3

5
5

4
4
4

 定義された場合，する．

Step 1 実行前解析

動的データ依存関係解析

1
1
1
1
1
1

C (v) の値を s の文番号に更新

以下に DC スライスの計算手順を示す．

3.2

a[0] a[1] a[2] b ctv

そこで，全ての変数に対して，その値を定義したのはどの文か，という情報を持たせておき，その変数の使用があった場合には，その情報からデー
タ依存関係を把握する．

プログラムに現れる各変数 v に対してキャッシュC (v) を用意する．プログラムの各実行地点において，C (v) には変数 v が最後に定義された文番号が格納されている．文 s が実行された際に変数 v が
 使用された場合，C (v) に対応する節点から s に対応する節点に v に関するデータ依存辺を引く．

3.3

適用例

3.3.1 配列を含むプログラム

図 4 のプログラムに対して，動的データ依存関
係解析を行う．入力に 0 を与えた場合を考える．各
実行時点における各変数 のキャッシュ ( ) の推移を表 1 に表す．
文 1, 2, 3 では ，それぞ れ 変数 [0] [1] [2]が 定義されているので ，文 3 を実行し た時点で
( [0]) = 1 ( [1]) = 2 ([2]) = 3 となる．文
4 では， を定義しているので， ( ) = 4 となる．
文 5 では， [0] を使用している．文 5 の実行直前には ( [0]) = 1 であるので，文 1 から文 5 へ [0]に関するデータ依存辺を引く．同様に を使用しており，文 4 から文 5 へ に関するデータ依存辺を引く．また， を定義し ているので， ( ) = 5
となる．

v

Ca

;C a
c
a
Ca
b

;C

c

Cv
a ;a ;a

Cc

a

c

Cb

3.3.2 ポインタを利用するプログラム

図 5 のプログラムに対して，動的データ依存関係解析を行う．各実行時点における各変数 のキャッシュ ( ) の推移を表 2 に表す．
文 1, 2, 3, 4 では，それぞれ変数が定義されているので，文 4 を実行し た時点で ( ) =1 ( ) = 2 ( ) = 3 ( ) = 4 となる．
文 5 では， を使用し ている．文 5 の実行直前には ( ) = 3 であるので，文 3 から文 5 へ に関するデータ依存辺を引く．また， を定義しているので， ( ) = 5( ( ) = 5) となる．
文 6 では， ， ， を使用しているので，文 2, 4,
3 から文 6 へデータ依存辺を引く．さらに，文 6 では  を定義しているので， (  ) = 6( ( ) = 6)Cvv
a;b;c;dCa;C b ;C c ;C dc
Cccc
C c Cabd d
dC d Ca

1
2
3
4
5
6
7
8

表 3: スライス手法の違い

a=2;
b=1;
c=&a;
d=&c;
*c=5;
**d=b;
printf("%d",a);printf("%d",**d);

制御依存関係解析
データ依存関係解析
PDG 節点表 2: 図 5 のプログラムにおける，各実行時点でのキャッシュの推移
1
2
3
4
5
6
7
8

となる．

2
2
2
2
2
2
2

3
3
3
3
3
3

4
4
4
4
4

a

文 7 では， を使用している．文 7 の実行直前には ( ) = 6 であるので，文 6 から文 7 へ に関するデータ依存辺を引く．

Caad; d; d

文 8 では，    を使用しているので，文4, 3, 6 から文 8 へデータ依存辺を引く．
3.4

他のスライス手法との比較

静的スライス，動的スライス，DC スライスの違いを表 3 に示す．
解析手法の違いにより，一般に以下の様な性質となる．これらの性質は [2] において，実験によって実証されている．
スライスサイズ : 静的  DC  動的
実行前解析時間: 静的 DC
動的実行時間: 動的
DC 静的

>

>
>

>

また，図 3 との比較のため，図 1 のプログラムを対象に，スライス基準 (23, ) に関する DC スライ
スを図 6 に示す．入力には，動的スライスと同じ
く 2 を与えた．

d

4

DC

静的
動的
文

3: int cube(int x) {4:
return x*x*x;
5: }6: void main(void)
7: {8:
int a[SIZE];
9:
int b[SIZE];
10:
int c, d, i;a b c d
1
1
1
1
5
6
6
6

動的
動的
動的
実行系列

1: #include <stdio.h>
2: #define SIZE 5

図 5: ポインタを利用するプログラム

実行文

静的
静的
静的
文

動 的デ ー タ 依 存 関 係 解 析 を 用い たJava スライス手法

現在のソフトウェア開発環境において， C などの手続き型言語だけでなく， Java, C++等いわゆるオブジェクト指向言語の利用が高まっている．特に近年利用が高まっている Java を対象にしたスライス抽出を考える．

11:
12:
13:
14:
15:

a[0] = 0;a[1] = -1;a[2] = 2;a[3] = -3;
a[4] = 4;

16:
17:
18:

for (i=0; i<SIZE; i++) {b[i] = a[i];
}

19:
20:
21:

scanf("%d", &c);
d = cube(b[c]);if (b[c] < 0)

23:
24: }

printf("%d", d);

図 6: ソースプログラム
4.1

オブジェクト 指向言語を対象としたスライス

オブジェクト指向言語には，従来の手続き型言語にはないクラス，継承，ポリモーフィズムなどの新しい概念が導入されており，既存のプログラ
ムスライス計算手法をそのまま用いても正確なスライスが得られない．そこで，オブジェクト指向
言語への対応を試みた静的スライス，動的スライスが提案されている．
静的スライスでは，参照型の指すインスタンスの型推測を行う必要がある．point-to グラフを使った手法などにより，推測の範囲を限定できるが，実行時に参照されるインスタンスを一意に決定することは困難であり，静的な解析には正確性に限界がある．
一方，動的スライスは実行時に決定される参照型の指すインスタンスを容易に調べられるため，正確な解析が行える．また，Java においてオブジェ
クトは全て参照により操作されるため，オブジェ
クトへの参照を正確に解析することは重要である．

正確性の観点から見た場合，動的スライスの方が静的スライスより優れている．しかし ，動的ス
ライスは手続き型言語を対象とした動的スライス
同様に実行系列を保存するため，解析に多大なコストがかかると考えられる．そこで，提案手法では，DC スライスの Java への適用を考える． DC
スライスはデータ依存関係解析を動的に行うために，オブジェクトへの参照等の実行時に決定される要素を多く含む Java の解析に向いていると言える．また，実行系列を保存しないこと，及び制御
依存関係解析を静的に行うことで解析コストを抑えることが期待できる．
4.2

提案手法

DC スライスは配列の添字やポインタの解析を正確に行うためにデータ依存関係解析を動的に，解析コスト削減のために制御依存関係解析を静的に行う．Java では，配列や参照が存在するために，
これらの正確な解析には動的なデータ依存関係解
析が有効である．
また，Java には以下の重要な特徴がある．

 オブジェクトとは，データとそれを操作するコード ( メソッド ) の組み合わせである．
 カプセル化によりデータへのアクセスは メソッ
ド を通して行う．
 Java の動的束縛では，実行中のオブジェクトのクラスに基づいて適切なオーバーライド メソッ
ド を選択する．
これより，実行時に決定されるメソッド 呼び 出しが頻繁に起こりうることがわかる．そこで，従来の DC スライスは，全ての制御依存関係解析を静的に行っているが，本手法では，データ依存関係
解析に加えメソッド 呼び出しに関する制御依存関係解析も動的に行うことで呼び 出されるメソッド
を一意に決定し ，解析の正確性を高める．

4.2.1 アルゴ リズム
図 7 に計算手順を示す．

(1), (2) で静的な制御依存関係解析を行い，PDGを構築する．(3) ではデータ依存関係解析とメソッ
ド 呼び出しに関する制御依存関係の動的な解析を行い，PDG を完成させる．動的データ依存関係解
析の計算手法は 4.2.2 で示す．(4), (5), (6) では，
スライス基準に対応する接点から PDG をたど り，
スライスを抽出する．

入力

P : スライス対象 Java プログラム
I : P への入力
(sc ; vc ): スライス基準
一時記憶
PDGD : P の I についての実行時の PDG
N : 節点の集合
C : 節点出力

OUT : P の I についての実行の出力
S : P の I についての実行時, (sc ;vc ) に関するスライス

アルゴリズム(1)の全ての文または条件節 について，Dの節点 ( ) を作成する(2)の全ての条件文 について，その条件節を，そとすると，制御依存辺 ()の中身の文を()をD に加える(3) についてのの実行が終了するまで以下を繰り返す ( について実行する次の文を とする)
(a) について，動的データ依存関係解析を行う(b) がメソッド 宣言文ならば

P
P

s

V s

stm
PDG
P

PDG

s

cnd
V cnd *

V stm
I
I
s
s
(i) V = Cs

V * V (s) を PDGD に加える
s がメソッド を呼び出すならばC = V (s)(d) I について， s を実行する(4) S = fV (sc )g;N = v(5) N = f 節点 njn ! sc g [f 節点 mjm * sc g(6) N 6=  の間，以下を繰り返す(a) 節点 n 2 N を 1 つ選ぶ(b) S = S [ nw n _ m * n)g(c) N = N [ fmjm 2= S ^ (m !
ただし， w は任意の変数名(ii) 制御依存辺(c)

図 7: Java スライシングアルゴ リズム

4.2.2 動的データ依存関係解析アルゴ リズム
制御依存関係，データ依存関係の動的な解析の計算手順を図 8 に示す．
各変数に対応するキャッシュはその変数が生成されるときに逐次生成する．同じ クラスから生成された複数のインスタンスはそれぞれ独立に イン
スタンス変数を保持する．同様に，各インスタン
ス変数のキャッシュは各インスタンス変数が生成される際に生成され，それらは独立して保持される．つまり，インスタンスごとに独立した解析を
行う．
4.3

適用例

図 9 のプログラムを入力 -1 について実行した場
合の各実行時点におけるキャッシュ の推移を表4 に表す．ただし ，クラス
，クラス
内のローカル変数 については省略した．

i

Base

C

Derived;c) に関するスライスをまた，スライス基準 (13
図 10 に示す．

入力

s: スライス対象 Java プログラム P 中の文
I : P への入力
PDGD : P の I についての実行時の PDG
一時記憶
C (v): 変数 v のキャッシュ

出力

OUT : P の I についての実行の出力
PDGD : P の I についての実行時の PDG
アルゴリズム文 s において，変数 v が(1) 宣言された場合(a) ( ) を作成(b) ( ) = ( )(2) 定義された場合( )= ( )(3) 参照された場合

Cv
Cv

Cv

V s

V s

v

に関するデータ依存辺に加える

v V (s) を PDG
C (v ) !
D

図 8: 動的データ依存関係解析アルゴ リズム

表 4: 図 9 のプログラムにおける，各実行時点でのキャッシュの推移
実行文
1
2
3
4
5
31
21
22
6
7
8
21
22
11
23
24
12
26
27
13
14

4.4

b1 b2 c
2
2
2
2
2
2
2
2
2
8
8
8
8
8
8
8
8
8
8
8

5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5

4
4
4
4
4
4
4
4
4
4
11
11
11
11
11
11
11
11

i b1:a b2:a

6
6
6
6
6
6
6
6
6
6
6
6
6

22
22
22
22
22
22
22
22
22

22
22
22
22
22
22
22
22
22
22
22
27
27
27

実装

提案手法の実装方針としてインタプ リタ方式とプリプロセッサ方式が考えられる．今回は，実現容易性，実行速度で有利なプリプロセッサ方式の実装を選択した．

4.4.1 プリプロセッサ方式
プリプロセッサ方式は，Java のソースプログラ
ムをコンパイルする前に，そのプログラム自身の動的解析を行う命令を付加するプリプロセッサによる実装である．解析命令を付加したプログラム
をコンパイル，実行することで，通常の実行を行いながら解析も自動的に行われる．実行に関しては，通常の実行と同様に行えるため， Just-in-Time コ
ンパイラ等による高速実行が可能である．

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

class Main {Base b1;
void m() {int c;
Base b2 = new Derived();int i = read();if (i < 0)
b1 = new Base();else
b1 = new Derived();c = b1.m(i);b2.set(c)System.out.println(c);System.out.println(b1.a);
}
}

21
22
23
24
25
26
27
28
29

class Base {int a = 10;
int m(int i) {return (a-i);}
void set(int i) {a = i;
}
}

31
32
33
34
35

class Derived extends Base {int m(int i) {return (a+i);}}

図 9: プログラム
4.5

実装概要

現在，Java によるプリプロセッサとユーザイン
タフェースの作成を行っている．
実装概要を図 11 に示す．

4.5.1 キャッシュの実装
各変数のキャッシュを以下のように実装する．
 各クラスに現れるインスタンス変数 に対して
キャッシュ ( ) をそのクラスのインスタンス変数として用意する．
 各クラスに現れる静的変数 に対してキャッシュ( ) をそのクラスの静的変数として用意する．
 各クラスに現れるローカル変数 に対してキャッシュ ( ) を が存在するスコープ 内のローカ
ル変数として用意する．
これにより，あるクラスの複数のインスタンスが生成された際に，それぞれのインスタンスが各イ
ンスタンス変数 を独立して保持するのと同様に，それぞれのインスタンスが各キャッシュ ( ) を独立に保持する．つまり，それぞれのインスタンス
について独立した解析を行うことができる．また，
変数 が継承される場合，同様にキャッシュ ( )

v

Cv

v

Cv

Cv v

v

v

v

Cv

Cv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

class Main {Base b1;
void m() {int c;

21
22
23
24
25
26
27
28
29

class Base {int a = 10;
int m(int i) {return (a-i);}

int i = read();if (i < 0)
b1 = new Base();c = b1.m(i);System.out.println(c);}}図 11: 実装概要

[2] Ashida Y., Ohata F., and Inoue K. :\Slicing Methods Using Static and Dynamic Information", Proceedings of the 6th

Asia Paci c Software Engineering Conference (APSEC'99), pp. 344{350, December

}

1999.

31
32
33
34
35

;c) に

図 10: 図 9 のプログラムのスライス基準 (14関するスライスも継承される．
5

まとめ

本研究では，オブジェクト指向言語である Javaのプログラムに対して，動的・静的解析を用いてスライスを抽出する手法を提案した．提案手法は，動的な解析により実行時に決定される要素の解析を行い，正確性の高いスライスを抽出する．
今後の課題として，以下が挙げられる．
 実装の完成
 他のスライス手法との比較実験による評価
 並列処理への対応
 例外への対応
Java では並列処理や例外も動的に決定される要素を含むため，これらに関する依存関係解析を動的に行うことで，正確な解析が行えると考えている．

参考文献[1] Agrawal, H., and Horgan, J. : \Dynamic Program Slicing", SIGPLAN Notices,Vol.25, No.6, pp. 246{256, 1990.

[3] Larsen L. D. and Harrold M. J. : \Slicing Object-Oriented Software", Proceedingsof the 18th International Conference on
Software Engineering, pp. 495{505, Berlin,

March 1996.

[4] Liang, D., and Harrold, M. J. : \Slicing
Objects Using System Dependence Graphs",

Proceedings of the IEEE International Conference on Software Maintenance, Washing-

ton, D.C., November 1998.

[5] Steensgaard, B. : \Points-to analysis in almost linear time", Technical Report MSRTR-95-08, Microsoft Research, 1995
[6] Weiser, M. : \Program Slicing", Proceedings of the Fifth International Conference on
Software Engineering, pp. 439{449, 1981.

[7] Zhao, J. : \Dynamic Slicing of ObjectOriented Programs", Technical Report SE98-119, Information Processing Society ofJapan (IPSJ), pp. 11{23, May 1998.