Javaプログラムの変更を支援する 影響波及解析システム

24
22/07/04 修修修修修修修 1 Java 修修修修修修修修修修修修修 修修修修修修修修修修 修修 修修 修修修修修

description

Javaプログラムの変更を支援する 影響波及解析システム. 近藤 和弘 井上研究室. 発表内容. Java プログラムに対する影響波及解析 メンバオーバーライドグラフ ( MOG), メンバアクセスグラフ (MAG) による影響波及解析 Java 影響波及解析システム まとめと今後の課題. 影響波及解析. プログラムに対する変更において, 変更の影響を受ける部分を識別するための手法 適用分野 テストケース選択 プログラムの変更によって, 動作が変化し得る部分を抽出する 解析の粒度 (対象: オブジェクト指向プログラム) - PowerPoint PPT Presentation

Transcript of Javaプログラムの変更を支援する 影響波及解析システム

Page 1: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 1

Java プログラムの変更を支援する影響波及解析システム

近藤 和弘井上研究室

Page 2: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 2

発表内容

Java プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG),

メンバアクセスグラフ (MAG) による影響波及解析

Java 影響波及解析システム まとめと今後の課題

Page 3: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 3

影響波及解析 プログラムに対する変更において , 変更の影響を

受ける部分を識別するための手法 適用分野

テストケース選択 プログラムの変更によって , 動作が変化し得る部分を抽出す

解析の粒度 ( 対象 : オブジェクト指向プログラム ) クラス単位 (Chen) メンバ単位 (Li, Jang) 文単位 (Krishnaswamy, Rothermel)

プログラム理解 , 保守

Page 4: Javaプログラムの変更を支援する 影響波及解析システム

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.

上位クラスのメソッドを   下位クラスで再定義すること

上位クラスのフィールドと同名の フィールドを下位クラスで定義すること

Page 5: Javaプログラムの変更を支援する 影響波及解析システム

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() を呼び出している

Page 6: Javaプログラムの変更を支援する 影響波及解析システム

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) { ... }

これらは全て変更の影響を受けるメンバ ( 被影響メンバ ) であるとみなすことができる

オーバーライド

関係の変化

呼び出し先の変化による実行結果の変化

推移的な 実行結果の変化

Page 7: Javaプログラムの変更を支援する 影響波及解析システム

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.

変更による影響には様々な種類があると考えることができるが , その分類がなされていない

ユーザの目的に応じた被影響メンバを抽出することが難しい 手法の実装が行われていない

プログラム理解 , 保守といった , より広い範囲での利用を考慮

Page 8: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 8

研究内容

クラスのメンバ間の関係を表現する 2 つのグラフ (MOG, MAG) を利用した影響波及解析手法の提案 Java の特性を考慮し , ユーザの様々な目的に対応

可能な被影響メンバの抽出を行うことができる ソフトウェアの開発 , 保守 , 改良に影響波及

解析を 有効利用できるシステムの構築

Java プログラムの変更を支援する影響波及解析システム

Page 9: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 9

発表内容

Java プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG),

メンバアクセスグラフ (MAG) による影響波及解析

Java 影響波及解析システム まとめと今後の課題

Page 10: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 10

方針

様々な影響発生検出と波及のパターンを組み合わせて適用できる枠組みを実現するため , グラフを使用 メンバオーバーライドグラフ (MOG) メンバアクセスグラフ (MAG)

解析手順Phase 1: MOG, MAG の構築Phase 2: MOG, MAG の変化の検出Phase 3: MOG, MAG の探索

Page 11: Javaプログラムの変更を支援する 影響波及解析システム

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 辺

Page 12: Javaプログラムの変更を支援する 影響波及解析システム

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 辺

メソッド節点

節点

フィールド節点

Page 13: Javaプログラムの変更を支援する 影響波及解析システム

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 を元に , 発生または消失した節点および辺を 検出する

Page 14: Javaプログラムの変更を支援する 影響波及解析システム

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: 抽出された節点と , ソースコード上のメン

バとの対応 付けを行う

Page 15: Javaプログラムの変更を支援する 影響波及解析システム

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)

Page 16: Javaプログラムの変更を支援する 影響波及解析システム

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 辺の変化

呼び出し先の変化による実行結果の変化

Page 17: Javaプログラムの変更を支援する 影響波及解析システム

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辺をたどることで到達可能

Page 18: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 18

発表内容

Java プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG),

メンバアクセスグラフ (MAG) による影響波及解析

Java 影響波及解析システム まとめと今後の課題

Page 19: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 19

MOG, MAG

操作手順

ソースファイル

Java 影響波及解析システム

ソースファイルを変更する 被影響メンバを表示

する

ソースファイルを解析し MOG, MAG を構築する

ソースファイルを解析し , MOG, MAG を再構築

抽出したい被影響メンバの条件を指定し , 解析の実行を要求する

ユーザの指定に基づいて 被影響メンバを抽出する

変更前のソースコードを  チェックインする

Page 20: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 20

適用実験

適用対象ソフトウェア : Ant Javaベースのビルドツール ( オープンソース ) 開発元 : Jakarta Project 規模 : クラス数 96, ソース 約 20,000 行 (v1.1)

実際に行われた変更に対してシステムを適用 v1.1 → v1.2 において Property::init() が削除さ

れている メソッド Property::init() の削除による被影響メンバを    システムを用いて特定し , 実際の修正個所と比較する

Page 21: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 21

適用実験 メソッド

Property::init() の  削除を行う 解析を行い , 変更による   被影響メンバを抽出する 多くの被影響メンバ

が抽出されたため , 抽出する被影響メンバの種類を限定してみる

Page 22: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 22

適用実験 オーバーライド関係が

変化したもののみを抽出する Property の親クラス

Task のメソッド init() がオーバーライドされなくなったことを把握できる

Page 23: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 23

適用実験 オーバーライド関係が

変化したもののみを抽出する Property の親クラス

Task のメソッド init() がオーバーライドされなくなったことを把握できる オーバーライド関係の

変化  により , 呼び出し先が変化  したメソッドを抽出する TaskHandler::init(),

    Ant::execute() において ,   呼び出し先が変化したこと  を把握できる

システムにより被影響メンバとして抽出されたメソッドは , v1.1→ v1.2 において実際に修正が行われていた

Page 24: Javaプログラムの変更を支援する 影響波及解析システム

23/04/22 修士論文発表会 24

まとめと今後の課題

まとめ Java の特性を考慮した影響波及解析手法の提案を行った

メンバ間の関係を表現するグラフを利用することで , ユーザの様々な目的に対応可能な被影響メンバの抽出が行える

提案手法の実装として , Java 影響波及解析システムの構築を行った

今後の課題 解析精度の向上 (データフロー解析 , エイリアス解析 ,

etc…) 対応可能な変更の種類の拡張 ソフトウェア開発者を被験者としたシステムの評価実験