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

Slides:



Advertisements
Similar presentations
シーケンス図の生成のための実行履歴圧縮手法
Advertisements

6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
アルゴリズムとデータ構造1 2007年6月12日
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
クラス動作シナリオ可視化手法の プログラム理解作業に対する有効性評価
RMI ソフトウェア特論 第6回 /
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向プログラムのための 動的結合メトリクスの評価
ソフトウェア工学 知能情報学部 新田直也.
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
アルゴリズムとプログラミング (Algorithms and Programming)
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
第11週:super/subクラス、継承性、メソッド再定義
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オブジェクト指向プログラムにおける エイリアス解析・視覚化ツールの試作
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
UMLモデルを対象とした リファクタリング候補検出の試み
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
バイトコードを単位とするJavaスライスシステムの試作
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
ソフトウェア工学 知能情報学部 新田直也.
静的情報と動的情報を用いた Javaプログラムスライス計算法
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案と実装
メソッドの同時更新履歴を用いたクラスの機能別分類法
統合開発環境のための プログラミング言語拡張 フレームワーク
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラム理解のための 付加注釈 DocumentTag の提案
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

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 修士論文発表会