アントレプレナーシップ 5...スケジュール 代表メンター 筑波大学 プログラム【発展編】 事務局(お問い合わせ) 会場アクセス 【プログラムの流れ】集合研修
Javaプログラムの変更を支援する 影響波及解析システム
description
Transcript of Javaプログラムの変更を支援する 影響波及解析システム
23/04/22 修士論文発表会 1
Java プログラムの変更を支援する影響波及解析システム
近藤 和弘井上研究室
23/04/22 修士論文発表会 2
発表内容
Java プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG),
メンバアクセスグラフ (MAG) による影響波及解析
Java 影響波及解析システム まとめと今後の課題
23/04/22 修士論文発表会 3
影響波及解析 プログラムに対する変更において , 変更の影響を
受ける部分を識別するための手法 適用分野
テストケース選択 プログラムの変更によって , 動作が変化し得る部分を抽出す
る
解析の粒度 ( 対象 : オブジェクト指向プログラム ) クラス単位 (Chen) メンバ単位 (Li, Jang) 文単位 (Krishnaswamy, Rothermel)
プログラム理解 , 保守
23/04/22 修士論文発表会 4
Java プログラムに対する影響波及解析
Java Sun Microsystems で開発されたオブジェクト指向言語 マルチプラットフォーム性などにより , 近年多く利用さ
れている Java プログラムでは , 従来の手続き型プログラムに
比べ , 直接の変更箇所以外に影響を及ぼすような変更が数多く考えられる メンバ単位の変更 ( メソッドの追加 , 削除等 ) が行われる
と , メソッドのオーバーライド , フィールドの隠蔽といった Java の特性により様々な影響が引き起こされる [1]
[1] S. Eisenbach and C. Sadler, ‘‘ Changing Java Programs,'' in Proceedings of the International Conference on Software Maintenance (ICSM 2001), pp.479-487, Florence, Italy, November 2001.
上位クラスのメソッドを 下位クラスで再定義すること
上位クラスのフィールドと同名の フィールドを下位クラスで定義すること
23/04/22 修士論文発表会 5
変更による影響波及の例 ( メソッド追加 )
class Human extends Animal { boolean isAlive() { … }
}
class Animal { boolean isAlive() { … } void move(int x) { … }}
class World { void makeMove(Human h, int x){ h.move(x); } void testHuman(){ Human h = new Human(); this.makeMove(h, 10); }}
void move(int x) { ... }
Human::isAlive() は Animal::isAlive() をオーバーライドしている h.move(x) は Animal::move() を呼び出している
Human::move() は Animal::move() をオーバーライドする h.move(x) は Human::move() を呼び出す
h.move(x) は Animal::move() を呼び出している
23/04/22 修士論文発表会 6
変更による影響波及の例 ( メソッド追加 )
class Human extends Animal { boolean isAlive() { … }
}
class Animal { boolean isAlive() { … } void move(int x) { … }}
class World { void makeMove(Human h, int x){ h.move(x); } void testHuman(){ Human h = new Human(); this.makeMove(h, 10); }}
void move(int x) { ... }
これらは全て変更の影響を受けるメンバ ( 被影響メンバ ) であるとみなすことができる
オーバーライド
関係の変化
呼び出し先の変化による実行結果の変化
推移的な 実行結果の変化
23/04/22 修士論文発表会 7
関連研究およびその問題点
関連研究 既存の影響波及解析手法 (Ryder[2] ら ) は , 回帰テス
トにおけるテストケース選択が目的 問題点
[2] B. G. Ryder and F. Tip, ``Change Impact Analysis for Object-oriented Programs,'' in Proceedings of the Workshop on Program Analysis for Software Tools and Engineering (PASTE 2001), pp.46-53, Snowbird, USA, June, 2001.
変更による影響には様々な種類があると考えることができるが , その分類がなされていない
ユーザの目的に応じた被影響メンバを抽出することが難しい 手法の実装が行われていない
プログラム理解 , 保守といった , より広い範囲での利用を考慮
23/04/22 修士論文発表会 8
研究内容
クラスのメンバ間の関係を表現する 2 つのグラフ (MOG, MAG) を利用した影響波及解析手法の提案 Java の特性を考慮し , ユーザの様々な目的に対応
可能な被影響メンバの抽出を行うことができる ソフトウェアの開発 , 保守 , 改良に影響波及
解析を 有効利用できるシステムの構築
Java プログラムの変更を支援する影響波及解析システム
23/04/22 修士論文発表会 9
発表内容
Java プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG),
メンバアクセスグラフ (MAG) による影響波及解析
Java 影響波及解析システム まとめと今後の課題
23/04/22 修士論文発表会 10
方針
様々な影響発生検出と波及のパターンを組み合わせて適用できる枠組みを実現するため , グラフを使用 メンバオーバーライドグラフ (MOG) メンバアクセスグラフ (MAG)
解析手順Phase 1: MOG, MAG の構築Phase 2: MOG, MAG の変化の検出Phase 3: MOG, MAG の探索
23/04/22 修士論文発表会 11
メンバオーバーライドグラフ (MOG) メンバ間のオーバー
ライド関係を表現 メソッドオーバーライ
ド 抽象メソッドの実装 フィールドの隠蔽
class Human extends Animal { doble x; void move(int x){ ... }}
class Animal implements Life { int x; boolean isAlive(){ … } void move(int x){ … } void eat(Animal x){ ... }}
interface Life { boolean isAlive();}
class Human extends Animal { doble x; void move(int x){ ... }}
class Animal implements Life { int x; boolean isAlive(){ … } void move(int x){ … } void eat(Animal x){ ... }}
interface Life { boolean isAlive();}
double x
int x
boolean isAlive()
void move(int)
void eat(Animal)
void move(int)boolean isAlive()
implement
override
hideメソッド節
点
節点
フィールド節点
override 辺
辺
implement辺hide 辺
23/04/22 修士論文発表会 12
メンバアクセスグラフ (MAG) メンバ間のアクセス関
係を表現 メソッド ( コンストラ
クタも含む ) の呼び出し フィールドの参照
class Human extends Animal { doble x; Human(){ … } void move(int x){ this.x = x }}class World { Human makeHuman(){ return new Human(); } void testHuman(){ Human h = this.makeHuman(); h.move(10); }}
class Human extends Animal { doble x; Human(){ … } void move(int x){ this.x = x }}class World { Human makeHuman(){ return new Human(); } void testHuman(){ Human h = this.makeHuman(); h.move(10); }}
double x
Human()
void testHuman()
void move(int)
Human makeHuman()
use
call
call
call
call 辺
use 辺
辺
メソッド節点
節点
フィールド節点
23/04/22 修士論文発表会 13
解析手順
Phase 1: MOG, MAG の構築 変更前 , 変更後の各ソースコードから MOG, MAG を
構築する
Phase 2: MOG, MAG の変化の検出 Phase 1 で構築された変更前後の MOG, MAG をそれぞれ 比較し , 変化を検出する
計算手順Step 1: MOG, MAG それぞれについて , 変更前後の節点間の 対応をとるStep 2: Step 1 を元に , 発生または消失した節点および辺を 検出する
23/04/22 修士論文発表会 14
解析手順
Phase 3: MOG, MAG の探索 ユーザに指定された条件と , Phase 2 で検出された
節点 , 辺に基づいて MOG, MAG の探索を行う 計算手順
Step 1: 指定された抽出するべき被影響メンバの条件を , MOG, MAG 上での条件に置き換える
ex. 「呼び出されなくなったメソッド」 ⇔「MAG において , 消失した call 辺の先にある節点」
Step 2: Step 1 の条件を満たす節点を抽出する Step 3: 抽出された節点と , ソースコード上のメン
バとの対応 付けを行う
23/04/22 修士論文発表会 15
void move(int)boolean isAlive()
void testHuman()void
makeMove(Human,int)
MOG
boolean isAlive()
override
条件に応じた被影響メンバ抽出例
class Human extends Animal { boolean isAlive() { … }
}
class Animal { boolean isAlive() { … } void move(int x) { … }}
class World { void makeMove(Human h,int x){ h.move(x); } void testHuman(){ Human h = new Human(); this.makeMove(h, 10); }}
override
オーバーライド 関係の変化 override 辺の発生
void move(int)
void move(int x) { ... }
void move(int)
23/04/22 修士論文発表会 16
void move(int)boolean isAlive()
void testHuman()void
makeMove(Human,int)
MAG
boolean isAlive()
callcall
void move(int)
class Human extends Animal { boolean isAlive() { … }
}
class Animal { boolean isAlive() { … } void move(int x) { … }}
class World { void makeMove(Human h,int x){ h.move(x); } void testHuman(){ Human h = new Human(); this.makeMove(h, 10); }}
条件に応じた被影響メンバ抽出例
call
call
void makeMove(Human,int)
void move(int x) { ... } call 辺の変化
呼び出し先の変化による実行結果の変化
23/04/22 修士論文発表会 17
void move(int)boolean isAlive()
void testHuman()void
makeMove(Human,int)
MAG
boolean isAlive()
callcall
void move(int)
call
call
class Human extends Animal { boolean isAlive() { … }
}
class Animal { boolean isAlive() { … } void move(int x) { … }}
class World { void makeMove(Human h,int x){ h.move(x); } void testHuman(){ Human h = new Human(); this.makeMove(h, 10); }}
条件に応じた被影響メンバ抽出例
void testHuman()
推移的な 実行結果の変化
void move(int x) { ... } call 辺の変化したメ
ソッド接点から call辺をたどることで到達可能
23/04/22 修士論文発表会 18
発表内容
Java プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG),
メンバアクセスグラフ (MAG) による影響波及解析
Java 影響波及解析システム まとめと今後の課題
23/04/22 修士論文発表会 19
MOG, MAG
操作手順
ソースファイル
Java 影響波及解析システム
ソースファイルを変更する 被影響メンバを表示
する
ソースファイルを解析し MOG, MAG を構築する
ソースファイルを解析し , MOG, MAG を再構築
抽出したい被影響メンバの条件を指定し , 解析の実行を要求する
ユーザの指定に基づいて 被影響メンバを抽出する
変更前のソースコードを チェックインする
23/04/22 修士論文発表会 20
適用実験
適用対象ソフトウェア : Ant Javaベースのビルドツール ( オープンソース ) 開発元 : Jakarta Project 規模 : クラス数 96, ソース 約 20,000 行 (v1.1)
実際に行われた変更に対してシステムを適用 v1.1 → v1.2 において Property::init() が削除さ
れている メソッド Property::init() の削除による被影響メンバを システムを用いて特定し , 実際の修正個所と比較する
23/04/22 修士論文発表会 21
適用実験 メソッド
Property::init() の 削除を行う 解析を行い , 変更による 被影響メンバを抽出する 多くの被影響メンバ
が抽出されたため , 抽出する被影響メンバの種類を限定してみる
23/04/22 修士論文発表会 22
適用実験 オーバーライド関係が
変化したもののみを抽出する Property の親クラス
Task のメソッド init() がオーバーライドされなくなったことを把握できる
23/04/22 修士論文発表会 23
適用実験 オーバーライド関係が
変化したもののみを抽出する Property の親クラス
Task のメソッド init() がオーバーライドされなくなったことを把握できる オーバーライド関係の
変化 により , 呼び出し先が変化 したメソッドを抽出する TaskHandler::init(),
Ant::execute() において , 呼び出し先が変化したこと を把握できる
システムにより被影響メンバとして抽出されたメソッドは , v1.1→ v1.2 において実際に修正が行われていた
23/04/22 修士論文発表会 24
まとめと今後の課題
まとめ Java の特性を考慮した影響波及解析手法の提案を行った
メンバ間の関係を表現するグラフを利用することで , ユーザの様々な目的に対応可能な被影響メンバの抽出が行える
提案手法の実装として , Java 影響波及解析システムの構築を行った
今後の課題 解析精度の向上 (データフロー解析 , エイリアス解析 ,
etc…) 対応可能な変更の種類の拡張 ソフトウェア開発者を被験者としたシステムの評価実験