エイリアス関係を用いたJava静的依存解析ツールの試作

エイリアス関係を利用した
Javaスライシングツールの実現
山中祐介*,横森励士*,井上克郎**
*大阪大学 大学院基礎工学研究科
**大阪大学 大学院情報科学研究科
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
背景
ソフトウェアの大規模化・複雑化
プログラム言語の高級化
プログラムの理解や保守が困難なものになっている
プログラム解析
プログラムスライス
エイリアス解析
‥
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1
プログラム解析
静的解析
すべての実行系列を考慮した解析
入力データがソースコードのみで十分
動的解析に比べはるかにコストが小さい
動的解析
特定の入力データにおける実行系列に対する解析
あらかじめプログラムを実行しておく必要がある
実行系列が限定されているため解析結果の精度が高い
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
プログラムスライス
プログラムにおける、ある文のある変数(スライス基
準)の値に影響を与える文の集合
特定の機能やエラーに関係ある部分の抽出が可能
1:
2:
3:
4:
5:
6:
a = 3;
if(a > 0)
b = a;
スライス基準<6, b>に
else
対するスライス
c = a;
a = b + 2;
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
スライスの計算過程
1. 依存関係解析
データ依存関係
ある変数に対する定義、参照の関係
制御依存関係
制御文により生じるプログラム文間の関係
2. プログラム依存グラフ(PDG)の
構築
節点:各プログラム文
有向辺:文間の依存関係
3. PDG探索
スライス基準に対応する節点から
有向辺を逆向きに探索
1:
2:
3:
4:
5:
6:
a
a = 3;
a
if(a > 0)
b = a;
a
else
c = a;
a = b + 2; b
1
2
3
5
6
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
オブジェクト指向言語
オブジェクトを基本単位として扱うプログラム言語
オブジェクト
データとそれを操作するコードの組み合わせ
クラスのインスタンス化によりメモリ領域に確保
オブジェクトを指す変数を参照変数と呼ぶ
実行時決定要素が数多くある
実行時決定要素:動的束縛、多態など
近年ソフトウェア開発環境でよく使われる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
オブジェクト指向プログラムの動作例
1: class A {
2: int n;
3: }
1:
2:
3:
4:
5:
a = new A();
b = new A();
b = a;
a.n += 1;
System.out.println(b.n);
クラスA
a
n: 1
0
クラスA
b
n: 0
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
エイリアス関係
同じメモリ空間を指す可能性がある式間の同値関係
エイリアス関係が発生する箇所
引数の参照渡し
参照変数の代入
ポインタを介した間接参照
エイリアス集合
エイリアス関係にある式の集合
1:
2:
3:
4:
5:
a = new A();
b = new A();
b = a;
a.n += 1;
System.out.println(b.n);
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
エイリアス解析
静的解析によりエイリアス集合を求めること
依存関係解析において正確な解析を行うためには必要
不可欠
オブジェクト指向言語における実行時決定要素の特定
がある程度可能
C言語におけるポインタを対象にした依存解析手法は見受けられるが、
オブジェクト指向言語に対する依存解析手法は見受けられない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
エイリアスを考慮しない解析例
変数の定義情報を保持した変数表を用いて、依存関係解
析を行う
クラスA
1: class A {
2: int n;
3: }
a
1:
2:
3:
4:
5:
a = new A();
a
b = new A();
b = a;
b
a.n += 1;
System.out.println(b.n);
n: 1
0
a
クラスA
n: 0
b
変数表
変数
定義行
a
4
1
b
2
3
5行目の出力は4行目の演算に依存しているが
データ依存関係の抽出ができていない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
研究の目的
Javaを対象とするエイリアス関係を考慮した依存関
係解析手法の提案、実装
より正確なデータ依存関係の抽出が期待できる
オブジェクト指向言語特有の実行時決定要素に対
する解析が容易になる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
提案手法の方針
参照式に対する処理を既存の依存関係解析手法に追加
参照式:参照変数、インスタンス化式、参照変数を返すメソッド
前提:エイリアス解析済み
変数表
変数が最後にどこで定義されたか、さらに参照変数であればどのオブジェクト
を指しているかを表現
定義された文の情報と、参照変数であれば指しているオブジェクトを区別す
るための情報(オブジェクトID)を保持
エイリアス表
参照式がどのオブジェクトを指しているかを区別
オブジェクトIDに対する参照式の集合を保持
メンバ変数表
オブジェクト上に存在するメンバ変数を表現
オブジェクトに対するメンバ変数それぞれの変数表を保持
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
提案手法の概要(1/2)
インスタンス化
インスタンス化式が含まれているエイリアス表のオブジェクトIDに対す
るメンバ変数表を用意
インスタンス化によってオブジェクトが生成されるため
変数の定義
変数表の定義情報を変更
参照変数であれば、それ自身が含まれているエイリアス表のオブ
ジェクトIDに変更
定義されることで参照領域が変更されうるため
変数の参照
変数表の定義情報からデータ依存関係を抽出
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
提案手法の概要(2/2)
メンバ変数である場合
参照変数のオブジェクトIDに対応するメンバ変数表を用
いて処理する
メンバ変数が参照変数であれば、それ自身が指している
オブジェクトのメンバ変数表を持つ
a.b
メンバ変数表
変数表
変数
定義行
ID
ID
変数
定義行
a
2
01
01
b
4
02
b
6
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
適用例(1行目)
クラスA
1: class A {
2: int n;
3: }
1:
2:
3:
4:
5:
n: 0
a
a = new A();
b = new A();
b = a;
a.n += 1;
System.out.println(b.n);
エイリアス表
式
ID
01 (1,a)(1,new)(3,b)(3,a)(4,a)(5,b)
02
(2,b)(2,new)
変数表
メンバ変数表
変数
定義行
ID
ID
変数
定義行
a
1
01
01
n
1
b
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
適用例(2行目)
クラスA
1: class A {
2: int n;
3: }
1:
2:
3:
4:
5:
n: 0
a
クラスA
a = new A();
b = new A();
b = a;
a.n += 1;
System.out.println(b.n);
n: 0
b
エイリアス表
式
ID
01 (1,a)(1,new)(3,b)(3,a)(4,a)(5,b)
02
(2,b)(2,new)
変数表
メンバ変数表
変数
定義行
ID
ID
変数
定義行
a
1
01
01
n
1
b
2
02
02
n
2
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
適用例(3行目)
クラスA
1: class A {
2: int n;
3: }
a 1:
2:
3:
4:
5:
n: 0
a
クラスA
a = new A();
b = new A();
b = a;
a.n += 1;
System.out.println(b.n);
n: 0
b
エイリアス表
式
ID
01 (1,a)(1,new)(3,b)(3,a)(4,a)(5,b)
02
(2,b)(2,new)
変数表
メンバ変数表
変数
定義行
ID
ID
変数
定義行
a
1
01
01
n
1
b
2
3
02
01
02
n
2
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
適用例(4行目)
クラスA
1: class A {
2: int n;
3: }
a 1:
2:
3:
a,n4:
5:
n: 1
0
a
クラスA
a = new A();
b = new A();
b = a;
a.n += 1;
System.out.println(b.n);
n: 0
b
エイリアス表
式
ID
01 (1,a)(1,new)(3,b)(3,a)(4,a)(5,b)
02
(2,b)(2,new)
変数表
メンバ変数表
変数
定義行
ID
ID
変数
定義行
a
1
01
01
n
1
4
b
3
01
02
n
2
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
適用例(5行目)
クラスA
1: class A {
2: int n;
3: }
a 1:
2:
3:
a,n4:
5:
n: 1
0
a
クラスA
a = new A();
b = new A();
b
b = a;
n
a.n += 1;
System.out.println(b.n);
n: 0
b
エイリアス表
式
ID
01 (1,a)(1,new)(3,b)(3,a)(4,a)(5,b)
02
(2,b)(2,new)
変数表
メンバ変数表
変数
定義行
ID
ID
変数
定義行
a
1
01
01
n
4
b
3
01
02
n
2
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
スライシングツールの実現
我々の研究グループで開発しているJavaプログラム解析フ
レームワークに機能追加で実現
Javaプログラム解析フレームワーク
解析木構築部
構文解析、意味解析を行い意味解析木を構築
XMLデータベース部
Javaプログラムの構文木情報、意味情報をXML文書として保持
エイリアス解析部*
エイリアス解析、ユーザ要求に応じたエイリアス集合の計算を実行
ユーザインターフェース部
*大畑文明, 近藤和弘, 井上克郎: “エイリアスフローグラフを用いたオブジェクト指向プログラムの
エイリアス解析手法“, 電子情報通信学会論文誌D-1, Vol.J84-D-1, No.5, pp.443-453
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
スライシングツール
スライス計算ライブラリをJavaプログラム解析フレーム
ワークに追加
スライス計算ライブラリ
PDG構築
入力:Javaプログラムの意味解析木とエイリアス集合情報
出力:プログラム依存グラフ
スライス計算
入力:ユーザ要求によるスライス基準
出力:スライス
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
Javaプログラム解析フレームワーク
ソースコード
XML
データベース
エイリアス
フローグラフ
プログラム依存グラフ
Java
構文解析
ライブラリ
XML-意味解析木
変換ライブラリ
エイリアス解析
ライブラリ
スライス計算
ライブラリ
ユーザ
意味解析
ライブラリ
意味解析木
GUI
抽象構文木
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
評価実験
解析対象プログラム
P1:サンプルプログラム(2クラス、24行)
P2:簡易ドローツール(3クラス、323行)
実験環境
CPU:Pentium4 1.5Ghz
メモリ:512MB
OS:FreeBSD 5.0-CURRENT
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
評価(解析コスト)
PDG構築までのコスト
解析対象が参照しているJDKクラスライブラリを含む
P1の総クラス数:272クラス、P2の総クラス数:876クラス
メモリ使用量(MB)
解析時間(秒)
プログラム
総時間
プログラム
合計
P1
17.2
P1
149
P2
67.8
P2
457
P2はP1と比べて遥かにコストが大きい
コスト削減のためには、どのライブラリを
PDG構築の対象に含めるか選択が必要
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
23
評価(スライスサイズ)
解析対象プログラムのみ(JDKクラスライブラリは含まない)
スライスサイズ(行)
プログラム
エイリアス考慮
エイリアス無視
P1
8
6
P2
42
30
エイリアスを考慮した方がスライスサイズが大きい
増加した文はエイリアス関係にある参照変数がもたらす依存関係
エイリアスを無視した場合のスライスは正確な
ものといえないため考慮することが重要
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
24
まとめと今後の課題
オブジェクト指向言語を対象とするエイリアス関係を考慮した
依存関係解析手法の提案、実装
より正確な依存関係の抽出が可能
Javaプログラム解析フレームワークへの追加実装でスライシングツー
ルとして実現
今後の課題
スレッド、例外を含めた複雑な制御構造の解析への対応
大規模システムに対する適用実験
PDG構築対象の選択を可能にすることでのコスト削減
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
25