Javaバーチャルマシンを利用した 動的依存関係解析手法の提案

Slides:



Advertisements
Similar presentations
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
Advertisements

XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
背景 我々の研究室で開発しているJavaプログラム解析フレ ームワークでは,解析情報はメモリ上に保持される 問題点
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
情報伝播によるオブジェクト指向プログラム理解支援の提案
プログラムの動作を理解するための技術として
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
大阪大学 大学院基礎工学研究科 情報数理系専攻 ソフトウェア科学分野 高田 智規
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
アスペクト指向プログラムに対する プログラムスライシング
プログラム実行履歴を用いたトランザクションファンクション抽出手法
進捗 Javaバイトコード変換による 細粒度CPU資源管理
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
プログラミング言語入門 手続き型言語としてのJava
プログラム依存グラフを利用した 情報漏洩解析手法の提案と実現
動的スライスを用いた バグ修正前後の実行系列の比較
暗黙的に型付けされる構造体の Java言語への導入
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
動的情報を利用したソフトウェア 部品評価手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
Integer Java Virtual Machine
実行時情報に基づく OSカーネルのコンフィグ最小化
Javaプログラムの変更を支援する 影響波及解析システム
社会シミュレーションのための モデル作成環境
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
通信機構合わせた最適化をおこなう並列化ンパイラ
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オブジェクト指向プログラムにおける エイリアス解析・視覚化ツールの試作
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
new Calc(7,3).divInt()実行前
ソフトウェア保守のための コードクローン情報検索ツール
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
Josh : バイトコードレベルでのJava用 Aspect Weaver
同期処理のモジュール化を 可能にする アスペクト指向言語
設計情報の再利用を目的とした UML図の自動推薦ツール
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
アスペクト指向プログラミングの 動的プログラムスライスへの応用
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コンパイラ 2012年10月11日
回帰テストにおける実行系列の差分の効率的な検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
1.2 言語処理の諸観点 (1)言語処理の利用分野
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

Javaバーチャルマシンを利用した 動的依存関係解析手法の提案 大阪大学 大学院基礎工学研究科 誉田 謙二,梅森 文彰,大畑 文明,井上 克郎

フォールト位置の特定を効率よく行う一手法 背景 ソフトウェアの大規模化・複雑化 テスト工程のコストの増大 フォールトの検出 フォールト位置の特定・修正(デバッグ) フォールト位置の特定を効率よく行う一手法 プログラムスライス 2002/01/30 ソフトウェアサイエンス研究会

プログラムスライス プログラム中のある文sのある変数v (スライス基準)の値に影響を与えうる文の集合 スライスの他の用途 プログラム再利用・プログラム理解 1: a = 5; 2: b = a + a; 3: if (b > 0) { 4: c = a; 5: } 6: d = b; 1: a = 5; 2: b = a + a; 3: if (b > 0) { 4: c = a; 5: } 6: d = b; スライス基準(6, b)のスライス 2002/01/30 ソフトウェアサイエンス研究会

スライスの計算過程 ソースコード 定義・参照変数抽出 依存関係解析 プログラム依存グラフ構築 スライス (ソースコード) スライス(PDG) プログラム依存グラフ (PDG) スライス計算(グラフ探索) 2002/01/30 ソフトウェアサイエンス研究会

プログラム依存グラフ(PDG) プログラムの各文を節点、文間に存在する依存関係を有向辺としたグラフ プログラムの文間の依存関係 制御依存関係(Control Dependence, CD) 条件節~述部 データ依存関係 (Data Dependence, DD) 同一変数の定義~参照 a=5; b=3; if (b>0) { c=a; } else { d=b; } DD CD 2002/01/30 ソフトウェアサイエンス研究会

静的スライス PDG節点:プログラムの各文 CD解析:静的 DD解析:静的 1: a[1]=1; 2: a[2]=2; 3: a[3]=3; 4: read(c); 5: while (c>0) { 6: b=a[c]+1; 7: c=c-1; 8: } 9: write(b); s9 s1 s2 s4 s6 s7 s5 CD DD s3 s1 s2 s4 s6 s7 s5 s3 s9 スライス基準<9,b> 2002/01/30 ソフトウェアサイエンス研究会

動的スライス PDG節点:実行系列の各点 CD解析:動的 DD解析:動的 e1: a[1]=1; e2: a[2]=2; e4: read(c); e5: while (c>0) { e6: b=a[c]+1; e7: c=c-1; e9: write(b); e3: a[3]=3; CD DD 1: a[1]=1; 2: a[2]=2; 3: a[3]=3; 4: read(c); 5: while (c>0) { 6: b=a[c]+1; 7: c=c-1; 8: } 9: write(b); 2002/01/30 ソフトウェアサイエンス研究会

Dependence Cache(DC)スライス PDG節点:プログラムの各文 CD解析:静的 DD解析:動的 入力c=2を与えて実行 1: a[1]=1; 2: a[2]=2; 3: a[3]=3; 4: read(c); 5: while (c>0) { 6: b=a[c]+1; 7: c=c-1; 8: } 9: write(b); s1 s2 s4 s6 s7 s5 s9 s1 s2 s4 s6 s7 s5 s3 CD DD s9 2002/01/30 ソフトウェアサイエンス研究会

各スライス手法の比較 スライスサイズ(精度): 静的 ³ DC ³ 動的 依存関係解析コスト: 動的 ≫ DC > 静的 静的スライス 動的スライス 制御依存関係 静的 動的 データ依存関係 PDG節点 プログラム文 実行系列の各点 スライスサイズ(精度): 静的 ³ DC ³ 動的 依存関係解析コスト: 動的 ≫ DC > 静的 2002/01/30 ソフトウェアサイエンス研究会

オブジェクト指向言語 Java 近年ソフトウェア開発環境で多く利用される Javaにおける実行時決定要素 静的解析の限界・動的解析の必要性 配列の添字・オブジェクト参照変数・動的束縛・例外・並列処理 静的解析の限界・動的解析の必要性 2002/01/30 ソフトウェアサイエンス研究会

関連研究(1/2) バイトコード埋め込みによる動的解析† バイトコードに解析命令を埋め込み、それを実行することによりバイトコードの動的情報を抽出 ソース Java Virtual Machine プログラムの動的情報 ・実行系列のトレース ・分岐の成功比率 ・実行命令数 など Javaコンパイラ バイトコード + 解析コード バイトコード 変換ツール 変換記述コード † “BIT:A Tool for Instrumenting Java Bytecode”, Han Bok Lee and Benjamin G.Zorn 2002/01/30 ソフトウェアサイエンス研究会

関連研究(2/2) ソースコード埋め込みによる動的解析†† ソースコードに解析命令を付加し、コンパイル・実行することにより動的情報を持つPDGを構築 ソース Java Virtual Machine プログラム依存グラフ (PDG) プリプロセッサ バイトコード + 解析コード ソース + 解析命令 Javaコンパイラ ††“A Slicing Method for Object-Oriented Programs Using Lightweight Dynamic Information”, Fumiaki OHATA, Kouya HIROSE, Masato FUJII and Katsuro INOUE 2002/01/30 ソフトウェアサイエンス研究会

既存手法の問題点(1/2) バイトコードの埋め込みによる動的解析 埋め込むバイトコードをユーザが記述 抽出される動的情報は、主に統計量の測定を目的としており、依存関係解析といった複雑な解析は非現実的 ソースプログラムの情報を取得するのが困難 2002/01/30 ソフトウェアサイエンス研究会

既存手法の問題点(2/2) ソースコードの埋め込みによる動的解析 Javaの構文制約によるソースコードの埋め込み位置の制限が厳しく、十分な精度の解析が困難 解析の際にソースコードの存在が必須であり、クラスファイルしか存在しないクラス(JDKライブラリ等)を介した依存関係の解析では精度低下が著しい 2002/01/30 ソフトウェアサイエンス研究会

提案する手法 実利用を考慮したJavaスライスシステムの構築 JVMに基づいたDCスライスのJavaへの適用 動的情報の利用による精度の高いスライス計算 動的情報の抽出をユーザに意識させない JVMに基づいたDCスライスのJavaへの適用 ソースコード・バイトコードに解析命令を挿入しない バイトコードに対し、JVM上での動的データ依存関係解析・静的制御依存関係解析を行い、PDGを構築、スライスを計算し、ソースコードへ反映 2002/01/30 ソフトウェアサイエンス研究会

方針 コンパイル時に、バイトコードの各命令とソースコードのトークン集合との対応表*を生成 バイトコードに対し、依存関係解析を行う データ依存関係解析 : 動的(JVMを用いる) 制御依存関係解析 : 静的(JVMとは独立に) バイトコードに対しPDG構築、スライス計算 対応表*をもとにバイトコードでのスライスをソースコードに対応付ける 2002/01/30 ソフトウェアサイエンス研究会

手順 Javaコンパイラ ソースコード スライス結果 j= istore_1 + iadd j iload_1 2 iconst_2 対応表 class A スライス結果 j= istore_1 + iadd j iload_1 2 iconst_2 対応表 class A Javaコンパイラ バイトコードレベルのPDG class A iconst_2 iload_1 iadd istore_1 クラスファイル Java Virtual Machine 通常の実行結果 2002/01/30 ソフトウェアサイエンス研究会

動的データ依存関係解析の実現 データ依存関係 命令tの実行時に、値vがどの命令で定義されたかが分かれば動的データ依存関係解析が可能 命令sで定義された値vが命令tで参照されるとき、   sからtへ、vに関するデータ依存関係が存在する 命令tの実行時に、値vがどの命令で定義されたかが分かれば動的データ依存関係解析が可能 各値ごとにデータキャッシュを用意し、 最後にその値を定義した命令を記憶しておく 2002/01/30 ソフトウェアサイエンス研究会

JVMでの動的データ依存関係解析 方針 アルゴリズム 各データ(スタック領域・ローカル変数・フィールド変数など)と1対1対応するようにデータキャッシュを用意 データキャッシュは各データを最後に定義した命令を保持 アルゴリズム データが定義されたとき 定義した命令をデータキャッシュに保存 データが参照されたとき その値を最後に定義した命令をデータキャッシュから取得 取得した命令と、実行中の命令との間のデータ依存関係を抽出 2002/01/30 ソフトウェアサイエンス研究会

動的データ依存関係解析(例) 1: iconst_1 1: iconst_1 2: iconst_2 3: iadd 4: istore_0 Java Virtual Machine データ依存 2: iconst_2 3: iadd ローカル変数 スタック 4: istore_0 3 1 2 1 3 対応するデータキャッシュ s4 s1 s2 s3 s1 2002/01/30 ソフトウェアサイエンス研究会

JVMを用いることによる利点 解析精度の向上 ユーザに特別な知識を要求しない コードの埋め込みを行わないため、構文制約の影響を受けず、解析精度の低下を防止 バイトコードの命令をPDG節点とするため、ソースコードの各文を節点とするより解析精度が向上 クラスファイルしか存在しないクラス(JDKライブラリ等)を介したデータ依存関係も抽出可能 ユーザに特別な知識を要求しない 2002/01/30 ソフトウェアサイエンス研究会

静的制御依存関係解析の実現 ソースコードで定義された制御依存関係の定義を、バイトコードに対して適用するのは困難 バイトコードにおける制御依存関係 以下の条件を満たすとき、命令 s と命令 t の間に制御依存関係が存在する s は分岐命令 t は、s から直接到達する基本ブロック内の命令 2002/01/30 ソフトウェアサイエンス研究会

バイトコードの静的制御依存関係解析 方針 アルゴリズム データ依存関係解析とは独立に解析 バイトコードを基本ブロックに分割する 各基本ブロックの最終命令が分岐命令なら、その命令から直接到達可能な基本ブロック内の各命令に対し発生する制御依存関係を抽出する 2002/01/30 ソフトウェアサイエンス研究会

バイトコードでのスライス計算 local_1 ≠ null で実行 aload_1 ifnull L10 iload_2 iconst_1 iadd goto L20 ireturn aload_1 CD DD ifnull L10 iconst_1 iload_2 iadd aload_1 aload_1 ifnull L10 iload_2 iconst_1 iadd goto L20 L10: iconst_1 L20: ireturn ireturn 2002/01/30 ソフトウェアサイエンス研究会

提案手法の実現 コンパイラ・JVM JDK付属の javac,java にそれぞれ機能追加 Java Compiler Java Virtual Machine 実装言語:C言語(約70,000行) 2002/01/30 ソフトウェアサイエンス研究会

システム構成 ソースコード スライス(ソースコード) スライス基準 スライス ソースコード⇔バイトコード (バイトコード) 対応表 スライス (バイトコード) Javaコンパイラ バイトコード PDG(バイトコード) スライサ Java Virtual Machine 2002/01/30 ソフトウェアサイエンス研究会

まとめ・今後の課題 JVMを用いたDCスライス計算手法の提案 今後の課題 JVMによる動的データ依存関係解析 バイトコードに対する静的制御依存関係解析 バイトコードでのスライスをソースコードに対応付け 今後の課題 提案手法の実装 提案手法の実験的評価 スライスサイズ(精度)・時間コスト・空間コスト 2002/01/30 ソフトウェアサイエンス研究会

センキュ センキュ 2002/01/30 ソフトウェアサイエンス研究会