Javaプログラムの変更を支援する 影響波及解析システム 近藤 和弘 井上研究室 2019/2/22 修士論文発表会
発表内容 Javaプログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG), メンバアクセスグラフ(MAG) による影響波及解析 Java影響波及解析システム まとめと今後の課題 2019/2/22 修士論文発表会
影響波及解析 プログラムに対する変更において, 変更の影響を受ける部分を識別するための手法 適用分野 テストケース選択 プログラムの変更によって, 動作が変化し得る部分を抽出する 解析の粒度 (対象: オブジェクト指向プログラム) クラス単位 (Chen) メンバ単位 (Li, Jang) 文単位 (Krishnaswamy, Rothermel) プログラム理解, 保守 2019/2/22 修士論文発表会
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. 2019/2/22 修士論文発表会
変更による影響波及の例(メソッド追加) Human::isAlive() は Animal::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); class Human extends Animal { boolean isAlive() { … } } void move(int x) { ... } Human::isAlive() は Animal::isAlive() をオーバーライドしている h.move(x) は Human::move() を呼び出す h.move(x) は Animal::move() を呼び出している h.move(x) は Animal::move() を呼び出している Human::move() は Animal::move() をオーバーライドする 2019/2/22 修士論文発表会
変更による影響波及の例(メソッド追加) オーバーライド 関係の変化 呼び出し先の変化による実行結果の変化 推移的な 実行結果の変化 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); オーバーライド 関係の変化 呼び出し先の変化による実行結果の変化 class Human extends Animal { boolean isAlive() { … } } void move(int x) { ... } 推移的な 実行結果の変化 これらは全て変更の影響を受けるメンバ(被影響メンバ)であるとみなすことができる 2019/2/22 修士論文発表会
関連研究およびその問題点 関連研究 問題点 既存の影響波及解析手法(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. 2019/2/22 修士論文発表会
Javaプログラムの変更を支援する影響波及解析システム 研究内容 クラスのメンバ間の関係を表現する2つのグラフ(MOG, MAG)を利用した影響波及解析手法の提案 Javaの特性を考慮し, ユーザの様々な目的に対応可能な被影響メンバの抽出を行うことができる ソフトウェアの開発, 保守, 改良に影響波及解析を 有効利用できるシステムの構築 Javaプログラムの変更を支援する影響波及解析システム 2019/2/22 修士論文発表会
発表内容 Javaプログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG), メンバアクセスグラフ(MAG) による影響波及解析 Java影響波及解析システム まとめと今後の課題 2019/2/22 修士論文発表会
方針 様々な影響発生検出と波及のパターンを組み合わせて適用できる枠組みを実現するため, グラフを使用 解析手順 メンバオーバーライドグラフ(MOG) メンバアクセスグラフ(MAG) 解析手順 Phase 1: MOG, MAG の構築 Phase 2: MOG, MAG の変化の検出 Phase 3: MOG, MAG の探索 2019/2/22 修士論文発表会
メンバオーバーライドグラフ(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(); boolean isAlive() void move(int) void eat(Animal) implement double x int x hide メソッド節点 節点 フィールド節点 override辺 辺 implement辺 hide辺 override 2019/2/22 修士論文発表会
メンバアクセスグラフ(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 use Human() void testHuman() void move(int) Human makeHuman() call メソッド節点 節点 フィールド節点 call辺 use辺 辺 2019/2/22 修士論文発表会
解析手順 Phase 1: MOG, MAG の構築 Phase 2: MOG, MAG の変化の検出 計算手順 Step 1: MOG, MAG それぞれについて, 変更前後の節点間の 対応をとる Step 2: Step 1 を元に, 発生または消失した節点および辺を 検出する 2019/2/22 修士論文発表会
解析手順 Phase 3: MOG, MAG の探索 ユーザに指定された条件と, Phase 2 で検出された節点, 辺に基づいて MOG, MAG の探索を行う 計算手順 Step 1: 指定された抽出するべき被影響メンバの条件を, MOG, MAG上での条件に置き換える ex. 「呼び出されなくなったメソッド」 ⇔「MAGにおいて, 消失したcall辺の先にある節点」 Step 2: Step 1 の条件を満たす節点を抽出する Step 3: 抽出された節点と, ソースコード上のメンバとの対応 付けを行う 2019/2/22 修士論文発表会
void makeMove(Human,int) 条件に応じた被影響メンバ抽出例 class Human extends Animal { boolean isAlive() { … } } class Animal { 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辺の発生 void move(int x) { ... } void move(int) boolean isAlive() void testHuman() void makeMove(Human,int) MOG override void move(int) override void move(int) 2019/2/22 修士論文発表会
条件に応じた被影響メンバ抽出例 呼び出し先の変化による実行結果の変化 call辺の変化 MAG class Human extends Animal { boolean isAlive() { … } } class Animal { 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辺の変化 void move(int x) { ... } void move(int) boolean isAlive() void testHuman() void makeMove(Human,int) MAG call call void makeMove(Human,int) void move(int) 2019/2/22 修士論文発表会
void makeMove(Human,int) 条件に応じた被影響メンバ抽出例 class Human extends Animal { boolean isAlive() { … } } class Animal { 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 move(int x) { ... } void move(int) boolean isAlive() void testHuman() void makeMove(Human,int) MAG call call void testHuman() void move(int) 2019/2/22 修士論文発表会
発表内容 Javaプログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG), メンバアクセスグラフ(MAG) による影響波及解析 Java影響波及解析システム まとめと今後の課題 2019/2/22 修士論文発表会
操作手順 ソースファイルを解析し MOG, MAG を構築する ソースファイルを解析し, MOG, MAGを再構築 Java影響波及解析システム ソースファイルを解析し MOG, MAG を構築する ソースファイル ソースファイルを解析し, MOG, MAGを再構築 ユーザの指定に基づいて 被影響メンバを抽出する ソースファイルを変更する MOG, MAG 被影響メンバを表示する 抽出したい被影響メンバの条件を指定し, 解析の実行を要求する 変更前のソースコードを チェックインする 2019/2/22 修士論文発表会
適用実験 適用対象ソフトウェア : Ant 実際に行われた変更に対してシステムを適用 Javaベースのビルドツール (オープンソース) 開発元 : Jakarta Project 規模 : クラス数 96, ソース 約20,000行 (v1.1) 実際に行われた変更に対してシステムを適用 v1.1 → v1.2 において Property::init() が削除されている メソッド Property::init() の削除による被影響メンバを システムを用いて特定し, 実際の修正個所と比較する 2019/2/22 修士論文発表会
適用実験 メソッドProperty::init()の 削除を行う 解析を行い, 変更による 被影響メンバを抽出する 解析を行い, 変更による 被影響メンバを抽出する 多くの被影響メンバが抽出されたため, 抽出する被影響メンバの種類を限定してみる 2019/2/22 修士論文発表会
適用実験 オーバーライド関係が変化したもののみを抽出する Propertyの親クラスTask のメソッド init()がオーバーライドされなくなったことを把握できる 2019/2/22 修士論文発表会
適用実験 システムにより被影響メンバとして抽出されたメソッドは, v1.1→v1.2 において実際に修正が行われていた オーバーライド関係が変化したもののみを抽出する Propertyの親クラスTask のメソッド init()がオーバーライドされなくなったことを把握できる オーバーライド関係の変化 により, 呼び出し先が変化 したメソッドを抽出する システムにより被影響メンバとして抽出されたメソッドは, v1.1→v1.2 において実際に修正が行われていた TaskHandler::init(), Ant::execute() において, 呼び出し先が変化したこと を把握できる 2019/2/22 修士論文発表会
まとめと今後の課題 まとめ 今後の課題 Javaの特性を考慮した影響波及解析手法の提案を行った メンバ間の関係を表現するグラフを利用することで, ユーザの様々な目的に対応可能な被影響メンバの抽出が行える 提案手法の実装として, Java影響波及解析システムの構築を行った 今後の課題 解析精度の向上(データフロー解析, エイリアス解析, etc…) 対応可能な変更の種類の拡張 ソフトウェア開発者を被験者としたシステムの評価実験 2019/2/22 修士論文発表会