ポインタ解析におけるライブラリの スタブコードへの置換の効果

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
JavaScript プログラミング入門 2006/11/10 神津.
アルゴリズムとデータ構造1 2007年6月12日
Lightweight Language Weekend ls-lRシェル
情報伝播によるオブジェクト指向プログラム理解支援の提案
データフロー情報を用いたコード ナビゲーションツールの実装と評価
変数間データフローグラフを用いた ソースコード間の移動支援
F11: Analysis III (このセッションは論文2本です)
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
プログラム実行履歴を用いたトランザクションファンクション抽出手法
静的情報と動的情報を用いた プログラムスライス計算法
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
動的スライスを用いた バグ修正前後の実行系列の比較
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
EclipseでWekaのAPIを呼び出す
オブジェクト指向プログラムにおける エイリアス解析について
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
Javaプログラムの変更を支援する 影響波及解析システム
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
セキュリティ解析アルゴリズムの実現と オブジェクト指向言語への適用に関する一考察
オブジェクト・プログラミング 第8回.
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
アルゴリズムとプログラミング (Algorithms and Programming)
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
静的情報と動的情報を用いた Javaプログラムスライス計算法
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
ソフトウェア理解支援を目的とした 辞書の作成法
JAVA入門⑥ クラスとインスタンス.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

ポインタ解析におけるライブラリの スタブコードへの置換の効果 井上研究室 B4 山本 佑也

ポインタ解析とは 変数の値やオブジェクトの流れを解析するデータフロー解析の一種 変数にどこで生成されたオブジェクトが代入されるのかを解析する a = new Hoge(); b = new Fuga(); c = a; if (…) d = b; else d = c; e = d; new Hoge() a この後内部辺・外部辺の定義? b c d e new Fuga()

内部辺・外部辺 内部辺 外部辺 グラフ上で変数からオブジェクトを指す有向辺 解析が出来ないメソッドの戻り値などの正体の分からない”外部オブジェクト”を指す有向辺 外部辺の数が少ないほどデータフローについて正確な情報が得られている 関係するメソッドを調査するとスタブコードの有用性や必要箇所が分かる

内部辺・外部辺の例 ? ? 内部辺 外部オブジェクト 変数 オブジェクト new Hoge() a a = new Hoge(); b = new Fuga(); c = a; if (…) d = b; else d = c; e = d; a.set(b); f = a.get(); b c 解析が出来ない部分の ポインタグラフは作成されない d e new Fuga() ? ? f Hoge#getの戻り値 追加された二行のコードでは,Hogeのset,getメソッドが呼び出されています. これらのメソッドはsetの引数がgetの戻り値として返るという挙動をしますが,もしHogeクラスのソースコードが解析対象に含まれない場合はそれが分かりません. その場合はfに何が代入されるのか特定できず,bと同じFugaのオブジェクトを指すことが出来ません. なので,代わりに"Hoge#getの戻り値"を1つの外部オブジェクトと考え,それに対して辺を引きます.これが外部辺です. 外部オブジェクト 外部辺

研究背景 ポインタ解析において、ライブラリの中身は解析が困難な場合が多い ライブラリを解析対象外にすると外部辺が増えて解析の精度が犠牲になる 計算コストが大きい (Javaのクラスライブラリなど) ネイティブメソッドのソースコードが入手できない ライブラリを解析対象外にすると外部辺が増えて解析の精度が犠牲になる 解析対象外とは?

既存研究における外部ライブラリの扱い Arztら[1]によると3つのパターンがある 本研究では3つ目の手法で扱うサマリーの表現方法を提案する 外部ライブラリをそのまま解析に含める データフローの規則を定義し,その規則で外部ライブラリを扱う 外部ライブラリの解析に必要な情報をサマリー(要約)としてまとめ,それを解析で利用する 本研究では3つ目の手法で扱うサマリーの表現方法を提案する [1] Steven Arzt and Eric Bodden. Stubdroid: Automatic inference of precise data-flow summaries for the android framework. ICSE '16

提案手法:スタブコード表現 オリジナルのコードから,外部から見たデータフローのみを表現するスタブコードを作成し代わりに解析する 作成するスタブコード public class ArrayList<E>{   public E content;   public boolean add(E e){     content = e;     return true;   }   public E get(int a){    return content; } add()の引数とget()の戻り値に依存関係があることは分かる

スタブコードの作成方法 publicなフィールドを実装する publicなメソッドの外部と関係するデータフローのみを表現する形で実装する publicなフィールドへの代入や,return文など 内部実装はオリジナルに忠実である必要はない

スタブコードの利点 オリジナルのコードより解析が軽い 元々の解析に手を加える箇所が少なくて済む 内部のメソッド呼び出しが少ない ポインタ解析でメソッド呼び出しを処理するのは高コスト 元々の解析に手を加える箇所が少なくて済む 解析対象のコードに混ぜて一緒に解析してしまえる

評価実験 Andersenのポインタ解析のJava実装 6種類のインターフェースのスタブコードを用意 Collection, List, Set, Map, Queue, Deque 対象は6つの比較的小規模な Java プロジェクト ANTLR, DrawSWF, Jasml, JavaCC, JMoney, JUnit スタブコードの適用の有無で以下のデータを比較 内部辺・外部辺数 解析時間 インターフェースの外部辺 インターフェースの使い方

対象としたインターフェース Collectionインターフェースのサブインターフェースをメインに選出 Collection, List, Set, Map, Queue, Deque オブジェクトの管理をするインターフェース 拡張for文で頻繁に使われる for(String str : list){ … } 対応 for (Iterator iterator = list.iterator(); iterator.hasNext();) { String str = iterator.next(); … }

外部辺に関係するメソッド 対象インターフェースの関係する外部辺が大半 2プロジェクトについての外部辺に関係するメソッドの上位3つ ANTLR JavaCC メソッド名 外部辺数 java.util.List#iterator 540,874 17,319 java.util.Collection #iterator 184,710 java.util.List#get 9,912 127,529 java.util.Map#keySet 1,663 上位3メソッド合計 853,113 28,894 総外部辺数 985,676 29,748 (注)メソッド名の欄には "クラス名#メソッド名"の形式で表記している 対象インターフェースの関係する外部辺が大半

評価実験の結果 スタブコード適用の有無ごとの解析結果比較 外部辺数 内部辺数 解析時間(ms) スタブ有無 なし あり ANTLR 985,676 225,782 919,744 1,259,490 5,461,238 6,363,944 DrawSWF 7,490 5,011 32,801 40,589 2,577 4,668 Jasml 108 38 1,528 1,706 1,702 1,812 JavaCC 29,749 6,123 27,688 36,603 4,107 12,693 JMoney 563 465 4,568 4,581 719 844 JUnit 14,491 5,269 10,909 16,158 3,857 8,105

スタブコード適用後の 外部辺に関係するメソッド 2プロジェクトについての外部辺に関係するメソッドの上位3つ ANTLR JavaCC メソッド名 外部辺数 java.util.Stack#peek 70,100 java.util.Enumeration #nextElement 4,078 java.util.Arrays#asList 54,433 java.util.Vector#elementAt 2,016 java.util.Arrays#copyOf 23,365 java.util.Hashtable#keys 13 上位3メソッド合計 147,899 6,107 総外部辺数 225,787 6,129 スタブ適用前は? (注)メソッド名の欄には "クラス名#メソッド名"の形式で表記している

考察(1/2) 提案手法により解析の精度は向上 解析時間は2~3倍 スタブコードとして実装したインターフェースはわずか6つながら大きな効果 許容範囲 ライブラリ丸ごと解析する場合より明らかに低コスト Javaのクラスライブラリを含めた場合数週間かかると思われる

考察(2/2) 外部辺に関係するメソッドにはオブジェクトを管理するクラスのものが未だに多い Stack,VectorはCollectionインターフェースを持つクラス Arraysは配列操作用のメソッドを提供するユーティリティクラス オブジェクトを管理するクラスのスタブコードのみを実装すればほとんどの外部辺は消える可能性がある

まとめと今後の課題 ポインタ解析におけるサマリーの表現方法としてスタブコードを提案 他のデータフロー解析に適用出来るか 実験の結果少数のスタブコードで大幅な精度向上が期待できると判明 他のデータフロー解析に適用出来るか より情報量の多いスタブコードが必要 多様な外部ライブラリの調査 Javaクラスライブラリはどんなソフトウェアでも使う汎用的な機能を実装 各目的に特化したライブラリでは別の傾向が出る可能性