バイトコードを単位とするJavaスライスシステムの試作

Slides:



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

XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
背景 我々の研究室で開発しているJavaプログラム解析フレ ームワークでは,解析情報はメモリ上に保持される 問題点
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
情報伝播によるオブジェクト指向プログラム理解支援の提案
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
プログラムの動作を理解するための技術として
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
大阪大学 大学院基礎工学研究科 情報数理系専攻 ソフトウェア科学分野 高田 智規
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
二分探索木によるサーチ.
進捗 Javaバイトコード変換による 細粒度CPU資源管理
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
プログラム依存グラフを利用した 情報漏洩解析手法の提案と実現
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
動的スライスを用いた バグ修正前後の実行系列の比較
暗黙的に型付けされる構造体の Java言語への導入
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
動的データ依存関係解析を用いた Javaプログラムスライス手法
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オブジェクト指向プログラムにおける エイリアス解析・視覚化ツールの試作
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
制御フローを考慮しない データ依存関係解析の実験的評価
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
静的情報と動的情報を用いた Javaプログラムスライス計算法
Josh : バイトコードレベルでのJava用 Aspect Weaver
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
アスペクト指向プログラミングの 動的プログラムスライスへの応用
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

バイトコードを単位とするJavaスライスシステムの試作 井上研究室 梅森 文彰

プログラムスライス ある文のある変数(スライス基準)の値に影響を与え得る文の集合 デバッグ対象が限定され、フォールト位置の特定を効率よく行うことができる 1: a = 0; 2: b = 1; 3: if (a > b) { 4: c = a; 5: } else { 6: c = b; 7: } 8: return c; スライス基準 <6,c> 1: a = 0; 2: b = 1; 3: if (a > b) { 4: c = a; 5: } else { 6: c = b; 7: } 8: return c; プログラムスライス。以降単にスライスと呼びます。 ある文のある変数、これをスライス基準と呼びますが、この値に影響を与えうる文の集合をスライスと呼びます。 例えば、左のようなソースコードが与えられたときにスライス基準、6行目のdを与えると右の図の赤字のようなスライスが得られます。 このようにデバッグ対象が限定されるので、フォールト位置の特定を効率よく行うことができます。

スライス - 計算手順 - 1. 依存関係解析 2. プログラム依存グラフ(PDG)構築 3. スライス計算 制御依存関係解析 データ依存関係解析 2. プログラム依存グラフ(PDG)構築 節点: 各プログラム文 辺: 文間の依存関係 3. スライス計算 スライス基準に対応するPDG節点から有向辺を逆向きにたどる 到達可能な節点集合に対応する文が求めるスライス 制御依存関係 if (i < 5) { i++; } データ依存関係 a = 1; b = a; a プログラム依存グラフ スライス計算手順 1.依存関係解析 依存関係解析には、制御依存関係解析とデータ依存関係解析があり、 制御依存関係とは、 ある条件文とその条件文によって実行されるかどうかが決定する文との関係のことです。 例えば、i<5という条件文によりi++という文が実行されるかどうか決定するのでここに制御依存関係が存在します。 データ依存関係とは、 ある変数を定義する文と参照する文の関係のことです。 例えば、変数aについて、a=1で定義され、b=aで参照されているのでここにデータ依存関係が存在します。 2.プログラム依存グラフ(PDG)構築 プログラム依存グラフとは各プログラム文を節点で表し、文間の依存関係を有向辺で表したグラフです。 3. スライス計算 まず、スライス基準に対応するPDGの節点を設定します。 そして、ここから有向辺を逆方向にたどることで到達可能な節点の集合を求めます。

スライス - 分類 - 静的スライス 動的スライス DCスライス (プログラム実行を伴わない)静的依存関係解析に基づく 解析コストは小さいが、すべての実行経路を考慮するため、解析精度は低い 動的スライス (プログラム実行を伴う)動的依存関係解析に基づく 解析精度は高いが、プログラムの実行系列を保存しなければならず、解析コストは大きい DCスライス 動的データ依存関係解析、静的制御依存関係解析に基づく 動的スライスより低コストで、かつ静的スライスより高精度のスライス計算が可能

研究の目的 オブジェクト指向言語 Java Javaを対象とするスライスシステムの構築 近年のソフトウェア開発環境で多く利用される 多くの実行時決定要素の存在 配列の添字、オブジェクトへの参照、動的束縛 例外処理、並列処理 Javaを対象とするスライスシステムの構築 DCスライスを適用 バイトコードを解析単位とし、解析結果をソースコードに反映 研究の目的 オブジェクト指向言語Javaは近年のソフトウェア開発環境で多く利用されていますが、Javaには多くの実行時決定要素が存在します。 そのため、静的スライスでは十分な解析制度が得られず、動的スライスでは解析コストが膨大な量になってしまいます。 そこで、Javaを対象とするスライスシステムの構築としてDCスライスを適用し、またバイトコードを解析単位とすることで、 細粒度のスライスを計算し、その結果をソースコードに反映させます。

Javaスライスシステム - 解析手順 - Phase 1: ソースコード・バイトコード対応表の出力 (b): 動的データ依存関係解析† Phase 3: PDGによるスライス計算 Javaスライスシステムの解析手順 Phase 1: ソースコード・バイトコード対応表の出力 Phase 2: バイトコードに対する依存関係解析 (a): 静的制御依存関係解析 (b): 動的データ依存関係解析† Phase 3: PDGによるスライス計算 今回私が研究したのはPhase1、Phase2の(a)、Phase3で、以降この3つについて説明します。 以降、スライス、スライス基準、PDGに対し、バイトコード、ソースコードそれぞれに関するものを、(S)、(B)を用いて表します。 例えば、ソースコード上のスライス基準はスライス基準(S) 、バイトコード単位のスライスはスライス(B) と表されます。 以降、スライス、スライス基準、PDGに対し、バイトコード、ソースコードそれぞれに関するものを、(S)、(B)を用いて表す。 (例: スライス基準(S) 、スライス(B) ) †誉田謙二:“バイトコード間の動的依存情報を抽出するJavaバーチャルマシン”, 大阪大学大学院基礎工学研究科修士学位論文,2002

Phase 1: ソースコード・バイトコード対応表の出力 ソースコードのトークン列とバイトコードとの対応を抽出 iconst_0 istore_1 i = iconst_5 5 iload_1 i if_cmpge L8 < iinc 1 1 i++ L8: nop return main int i = 0; if (i < 5) { i++; } Phase 1: ソースコード・バイトコード対応表の出力 ここでは、ソースコードのトークン列とバイトコードとの対応を抽出します。 手順、まずトークン列と構文木要素との対応を抽出します。 次に構文木要素とバイトコードとの対応を抽出します。 対応表の例として、図のようなソースコードに対して次のようなバイトコードと対応関係が得られます。 例えば、1行目のiconst_0はソースコードのこの0に対応するのでこちらで0が出力されています。 以下同様になっています。

Phase 2(a): 静的制御依存関係解析† バイトコード間の制御依存関係を静的に解析 手順 基本ブロックの分割 制御フローグラフの構築 制御依存関係の抽出 iconst_0 istore_1 iconst_5 iload_1 if_cmpge L8 iinc 1 1 L8: nop return iconst_0 istore_1 iconst_5 iload_1 if_cmpge L8 iconst_0 istore_1 iconst_5 iload_1 if_cmpge L8 iinc 1 1 L8: nop return Phase 2(a): 静的制御依存関係解析 ここではバイトコード間の制御依存関係を静的に解析します。 手順、まずバイトコードを分岐も合流もない基本ブロックに分割します。 次にプログラムの流れを有向辺で表し、制御フローグラフを構築します。 そして、それから制御依存関係を抽出します。 例えば、図のようなバイトコードをまず基本ブロックに分け、制御フローグラフを構築します。 これにより、この図の赤字のような制御依存関係が得られます。 if_cmpge L8 iinc 1 1 iinc 1 1 L8:nop return †Andrew.W: Modern Compiler Implementation in C, 1998

スライス基準に対応するPDG節点から有向辺を逆向きにたどることで、スライスを抽出 手順 Phase 3: PDGによるスライス計算 スライス基準に対応するPDG節点から有向辺を逆向きにたどることで、スライスを抽出 手順 対応表による、スライス基準(S)からスライス基準(B)への変換 PDG(B)の構築およびその探索 対応表による、スライス(B)からスライス(S)への変換 Phase 3: PDGによるスライス計算 ここでは、スライス基準に対応するPDG節点から有向辺を逆向きにたどります。 手順として、 まずソースコード上のスライス基準から、バイトコード上のスライス基準に変換します。 次にバイトコードのPDGを構築し、探索を行いスライスを得ます。 最後にバイトコード単位のスライスから、ソースコード単位のスライスに変換します。

Javaスライスシステム - 適用例 - スライサ iconst_0 istore_1 iconst_5 iload_1 iinc 1 1 int i = 0; if (i < 5) { i++; } スライス結果 int i = 0; if (i < 5) { i++; } ソースコード スライス基準 Javaコンパイラ iconst_0 1: iconst_0 2: isotre_1 3: iconst_5 4: iload_1 5: if_cmpge L8 6: iinc 1 1 7: L8: nop 8: return 1: 2: i = 3: 5 4: i 5: < 6: i++ 7: 8: main istore_1 スライサ iconst_5 iload_1 Javaスライスシステムの適用例 まずソースコードをJavaコンパイラに通すと、バイトコードと対応関係が得られます。 次にバイトコードをバイトコードダンプツールに通し、静的制御依存関係を求めます。 またバイトコードをJavaバーチャルマシン上で実行することで、通常の実行結果と動的データ依存関係が得られます。 そしてこれらの依存関係と先程の対応表、スライス基準を基にスライサによってPDGを構築し、スライス基準に対応する節点から スライスを求めます。 そしてその結果をソースコードに反映させます。 if_cmpge L8 制御依存関係 解析ツール iinc 1 1 Java バーチャルマシン L8: nop 静的制御依存関係 return 動的データ依存関係 通常の実行結果

Javaスライスシステム - 実装 - Javaコンパイラの機能拡張 言語:Java、行数:約3,000行(約42,000行) Phase 1: ソースコード・バイトコード対応表の出力 Javaコンパイラの機能拡張 言語:Java、行数:約3,000行(約42,000行) Phase 2(a): バイトコードに対する静的制御依存関係解析 バイトコードダンプツールの機能拡張 言語:C、行数:約1,600行(約4,000行) Phase 3: PDGによるスライス計算 言語:C、行数:約1,200行 Javaスライスシステムの実装 Phase1ではJavaコンパイラの機能拡張を行いました。 Phase2の(a)ではバイトコードダンプツールの機能拡張を行いました。 Phase3では約1200行のプログラムを作成しました。 ()内は機能拡張後のツールにおけるコード総行数を表す

Javaスライスシステム - 評価 - 解析精度(スライスサイズ) 対象: 簡易データベースシステム(4クラス・262行) 評価: 提案手法と動的スライス、静的スライスとの比較 スライスサイズ[行](全体に対するスライスの割合) 静的スライス 提案手法 動的スライス スライス基準1 60(22.9%) 30(11.4%) 24(10.3%) スライス基準2 19(7.3%) 15(5.7%) 14(5.4%) Javaスライスシステムの評価 ここでは解析精度としてスライスサイズの評価をしました。 対象プログラムとして簡易データベースシステム、4クラス262行のプログラムを使いました。 評価方法として提案手法と動的スライス、静的スライスとの比較を行いました。 なお、得られたスライスのサイズ小さいほど解析精度が高いということになります。 ここでスライスの結果をUIを用いて表示するとこのようになります。 青い部分がスライスです。 この結果から静的スライスに比べ、十分に高い解析精度を満たすことを確認しました。 静的スライスに比べ、十分に高い解析精度を満たすことを 確認 実験環境: Pentium4 1.5GHz, 512MB, FreeBSD 5.0-CURRENT, JDK1.2.2

まとめ バイトコードを単位とする細粒度Javaスライスシステムの試作 今後の課題 ソースコード・バイトコードの対応表の出力 バイトコードに対する制御依存関係解析 PDGによるスライス計算 高精度のスライスを低コストで抽出可能 今後の課題 バイトコードの最適化に対応したバイトコード・ソースコード対応表の作成 実際のプログラム開発におけるシステムの適用 まとめ 今回、バイトコードを単位とする細粒度Javaスライスシステムの試作として ソースコード・バイトコードの対応表の出力、バイトコードに対する依存関係解析、PDGによるスライス計算を行いました。 今後の課題として バイトコードの最適化に対応したバイトコード・ソースコード対応表の作成、実際のプログラム開発におけるシステムの適用が 挙げられます。

実験環境: Pentium4 1.5GHz, 512MB, FreeBSD 5.0-CURRENT, JDK1.2.2 評価 - 解析コスト - Phase 1: ソースコード・バイトコード対応表の出力 Phase 2(a): バイトコードに対する静的制御依存関係解析 Phase 3: PDGによるスライス計算 簡易データベースシステム(4クラス・262行)のコンパイル 通常出力時[ms] 対応表出力時[ms] 1,114 2,405 JDK付属クラスライブラリの制御依存関係解析 総クラス数 解析時間(全体)[ms] 平均解析時間(一クラス)[ms] 4,807 48,060 9.99 Phase1では、通常の実行時に比べて、対応表出力時は2倍以上のコストがかかっております。 これはバイトコードに対して最適化を一切行わなかったことが原因だと考えられます。 Phase2(a)、Phase3では、比較することができないので結果だけをのせています。 これらの解析コストは動的データ依存関係の解析コストに比べるとはるかに小さいものなのでこれらの解析コストが 特に問題ありません。 簡易データベースシステム(4クラス・262行)のスライス計算 PDG節点数 PDG構築時間[ms] スライス計算時間[ms] 34,996 346 179 実験環境: Pentium4 1.5GHz, 512MB, FreeBSD 5.0-CURRENT, JDK1.2.2