インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案

Slides:



Advertisements
Similar presentations
API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラムの動作を理解するための技術として
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
過負荷時の分散ソフトウェアの 性能劣化を改善する スケジューリングの提案
静的情報と動的情報を用いた プログラムスライス計算法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
動的スライスを用いた バグ修正前後の実行系列の比較
暗黙的に型付けされる構造体の Java言語への導入
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
動的データ依存関係解析を用いた Javaプログラムスライス手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
ソフトウェア制作論 平成30年11月21日.
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
エイリアス解析を用いた メソッドの入力データの 利用法可視化ツール
制御フローを考慮しない データ依存関係解析の実験的評価
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
独習Java ・ 5.7  静的変数と静的メソッド ・ 5.8  ローカル変数と変数のスコープ  11月20日    小笠原 一恵.
JAVAバイトコードにおける データ依存解析手法の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
オブジェクトの動的支配関係解析を 用いたシーケンス図の縮約
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
JSPの基本 データベース論 第2回.
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
統合開発環境のための プログラミング言語拡張 フレームワーク
発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
回帰テストにおける実行系列の差分の効率的な検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
C#プログラミング実習 第1回.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
Presentation transcript:

インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案 井上研B4 竹之内啓太

Reachability Questions(1/2) プログラムの開発者がデバッグ等を行うとき,さまざまな問題に遭遇する. LaTozaら[1]の論文では,開発者が直面する問題の多くはReachability Questionsとして解釈できることを明らかにした. [1]Thomas D. LaToza, Brad A. Myers: Developers Ask Reachability Questions, ICSE 2010

Reachability Questions(2/2) プログラムの実行経路

Reachability Questions(2/2) プログラムの実行経路 特定の実行経路 たとえば ・特定のエラー文を含む経路 ・特定の変数に書き込みをしている経路 ・特定のメソッドを呼び出している経路 B

列挙する実行経路の仕様 プログラムの実行経路の列挙を出力するツールを作成した. 列挙する実行経路は メソッド内の制御フロー メソッド間の呼び出し を考慮したものになっている.

実行経路の仕様 プログラムの実行経路の列挙を出力するツールを作成した. 列挙する実行経路は メソッド内の制御フロー メソッド間の呼び出し を考慮したものになっている. A f() B ※クラス図 A a; … a.f(); 実行されるメソッドは aの型によって決定される

既存のメソッド呼び出し解析手法 メソッド呼び出しによって,どのメソッドが実行されるかを静的に解析する手法は考案されてきた. ※クラス図 A f() , m() B C A a; if(i == 0){ a = new B(); }else{ a = new C(); } a.f(); a.m();

既存のメソッド呼び出し解析手法 メソッド呼び出しによって,どのメソッドが実行されるかを静的に解析する手法は考案されてきた. ※クラス図 A f() , m() B C A a; if(i == 0){ a = new B(); }else{ a = new C(); } a.f(); a.m(); ※VTAによる解析 B.f か C.f が実行される B.m か C.m が実行される

実行経路の列挙における問題点 a.f() a.m() 既存手法では各呼び出しについて独立に候補を考えるため,実行不能な経路が現れる. 実行可能経路 A a; if(i == 0){ a = new B(); }else{ a = new C(); } a.f(); a.m(); 実行不能経路 B.f() C.f() B.m() C.m() a.f() a.m()

研究の手法 a.f() a.f() a.m() a.m() 実行されるメソッドの情報と同じオブジェクトが格納されている変数の情報を合わせることで,列挙から実行不能経路を削減する. 同じオブジェクト B.f() C.f() B.m() C.m() B.f() C.f() a.f() a.f() B.m() C.m() a.m() a.m()

提案手法 STEP1 各メソッドごとのコントロールフローグラフを作成 if(i == 0){ a = new B(); }else{ A a; a = new B(); a = new C(); a.f(); a.m(); A a; if(i == 0){ a = new B(); }else{ a = new C(); } a.f(); a.m(); ※実際はバイトコードを解析

提案手法 STEP2 各呼び出しのレシーバの型を考慮することで実行可能なメソッド呼び出しの系列のみを求める. a.f() a.m() インスタンスの型 実行されるメソッド B B.f() C C.f() レシーバaの インスタンスの型 実行されるメソッド B B.m() C C.m() レシーバa の型がBのとき { B.f , B.m } Cのとき { C.f , C.m }

提案手法 STEP3 各系列に従ってコントロールフローグラフのメソッド間のエッジを逐次作成し,経路を探索. B.f() B.m() a.f(); a.m(); C.f() C.m() { B.f , B.m } の場合 { C.f , C.m } の場合

作成ツール 指定したメソッド内の 実行経路の列挙 ... ->B.f()-> ... -> B.m() -> ... という列が出力される.

評価実験 方法 メソッド名を指定し、そのメソッドの始点から終点までの実行経路数を、手法を組み込んだ場合と組み込まない場合で比較する. 探索は5分間で打ち切り. 対象 3つのJavaプログラム。 SVNKit 1.8.8 Apache Xerces 2.10 Quartz 1.8.3

結果1.各メソッドの個数 探索における各メソッドの個数 探索した全メソッドのうち, 約2.2%のメソッドに手法の効果があった. 結果1.各メソッドの個数  探索における各メソッドの個数 システム名 探索した全メソッド数 列挙が完了した メソッド数 手法により経路数が減ったメソッド数 SVNKit 3123 2467 75 Xerces 1355 1195 11 Quartz 1049 808 37 探索した全メソッドのうち, 約2.2%のメソッドに手法の効果があった. 対象のメソッドにはゲッターやセッターが多く含まれていたため,Reachability Questionsの対象になるようなある程度複雑なメソッドに対してはこの数値以上の効果を期待できる.

結果2.実行経路数の比較 (手法を用いたときの実行経路数) (手法を用いなかったときの実行経路数) 手法が有効であったメソッドの (手法を用いたときの実行経路数) (手法を用いなかったときの実行経路数) SVNKit Xerces Quartz 中央値で,元の実行経路数から6~8割にまで 削減することができた.

今後の課題 メソッド間でインスタンスの型情報を伝播. 探索方法の改善. 実行不能経路を削減できる可能性がある. ZDDを利用できる可能性がある.