F11: Analysis III (このセッションは論文2本です)

Slides:



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

XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
全体ミーティング (4/25) 村田雅之.
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
データフロー情報を用いたコード ナビゲーションツールの実装と評価
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
変数間データフローグラフを用いた ソースコード間の移動支援
第4回放送授業.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
Solving Shape-Analysis Problems in Languages with Destructive Updating
アスペクト指向プログラミングを用いたIDSオフロード
プログラム実行履歴を用いたトランザクションファンクション抽出手法
型付きアセンブリ言語を用いた安全なカーネル拡張
静的情報と動的情報を用いた プログラムスライス計算法
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
動的スライスを用いた バグ修正前後の実行系列の比較
暗黙的に型付けされる構造体の Java言語への導入
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
プログラミング 4 記憶の割り付け.
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
実行時情報に基づく OSカーネルのコンフィグ最小化
Javaプログラムの変更を支援する 影響波及解析システム
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
バイトコードを単位とするJavaスライスシステムの試作
フロントエンドとバックエンドのインターフェース
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
データ構造とアルゴリズム 第11回 リスト構造(1)
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
保守請負時を対象とした 労力見積のためのメトリクスの提案
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
メソッドの同時更新履歴を用いたクラスの機能別分類法
発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19
SMP/マルチコアに対応した 型付きアセンブリ言語
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
ソフトウェア工学 知能情報学部 新田直也.
回帰テストにおける実行系列の差分の効率的な検出手法
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

F11: Analysis III (このセッションは論文2本です) 石尾 隆,鹿島 悠 大阪大学

Inferring Data Polymorphism in Systems Code 大阪大学 情報科学研究科 井上研究室 石尾 隆

論文の概要 “Data Polymorphism” を解析する手法を提案 Linux カーネルを対象に構築,実験 ポインタのダウンキャストの安全性をチェックする手法 技術的にはポインタ/エイリアス解析の一種 Linux カーネルを対象に構築,実験 カーネルのコードの書き方を想定した手法 C言語だけを対象にした手法 4.4MLOC のコードから,28,767か所のダウンキャストのうち75%の安全を確認

Data Polymorphism 一般的な型の変数(long や void*)として,特定のデータ型のポインタを扱うこと 渡された関数ポインタと データの利用側 void __run_timers(…) { … timer = … fn = timer-> function; data = timer-> data; fn(data); } 2章 EXAMPLE の簡易版: buffer_timeout 関数を呼び出してもらうように登録する. void init(…) { … mydata.timeout.function = buffer_timeout; mydata.timeout.data = (unsigned long)(&mydata); } /* 引数 を,必要なデータ型にダウンキャストして利用 */ void buffer_timeout(unsigned long data) { struct my_datatype *my_data = (my_datatype*)data;

解析の目的 データ型へのダウンキャストが安全かどうかを静的に知りたい 関連研究には,C言語自体の型安全性・メモリ安全性の向上や,動的な型検査が挙げられている /* 引数 を,必要なデータ型にダウンキャストして利用 */ void buffer_timeout(unsigned long data) { struct my_datatype *my_data = (my_datatype*)data; … }  このキャストは安全か?

解析の手法 構造体に,関数ポインタと引数が組で設定されることが多い mydata.timeout.function = buffer_timeout; mydata.timeout.data = (unsigned long)(&mydata); 上記のような同時に代入されるデータの組 (Structural Relationship) を検出 型 my_datatype, “.function” と “.data” を組として記録 抽出された組が使われる場所に実際に到達するデータの組 (Structural Correlation) をすべて取り出す 「.function = buffer_timeout 関数,.data = init 関数の mydata という変数」という組を抽出 引数(.data)の型とダウンキャストの型が一致すればよい

解析の特徴 構造体メンバーに対するエイリアス解析 (5章) うまく解析できない場所は,手動の annotation で対応(6章) Global Points-to Graph を作らず,メモリ使用量を抑制する そのかわり,手続き間のデータフローを毎回探索 Linux カーネル解析に 50コアのクラスタで 3時間40分 CPU時間の合計は 130時間 Linux カーネルのサイズに対応できる,ヒープ構造を考慮した解析であることに新規性がある ただし,調べる対象を void* などに限っている うまく解析できない場所は,手動の annotation で対応(6章) アノテーションは2種類: 既知の Structural Relationship/Correlation を手動で割り当てる 特定の関係を調査対象から除外するもの

実験結果 Linux 2.6.17.1, 4.4MLOC Data Polymorphism と思われる呼び出しは7,850か所 11,976 箇所に,関数ポインタを使った呼び出し うち 7,850 箇所 (66%) で,引数が void* 型か,void* 型のフィールドを含む構造体となっていた ダウンキャストは28,767か所,うち75%の安全を確認 177か所のアノテーションが必要だった アノテーションなしでどこまで正確だったのかは不明 アノテーションが解析に必要だと判断する方法は与えられていない

大阪大学 情報科学研究科 井上研究室 M2 鹿島悠 Boosting the Performance of Flow-sensitive Points-to Analysis using Value Flow 大阪大学 情報科学研究科 井上研究室 M2 鹿島悠

高速なFlow-senstiveポインタ解析の提案 Value Flow Graph : ポインタ・メモリーオブジェクトのフローを表現 SSA形式に 変換された ソースコード ポインタ 変数・store load命令 alloc_B alloc_A A = alloc_A B = alloc_B t1 = alloc_a t2 = alloc_b store t1, A store t2, B … Direct Edge B 代入によるフロー を表す A store t2, B store t1, A Indirect Edge a1 = load t1 s2 = load q ポインタを介して のフローを表す s1 = load p store p, s2 store q,s1 a3 = load t1 a2 = load t1 あるポインタが代入される変数 = ポインタノードから到達可能な変数

SSAからVFGへの変換 (1/2) VFGにDirect Edgeを引くルール VFGにIndirect Edgeを引くルール a = alloc_o alloc_o → a a = b a → b SSAの命令 VFGの操作 store x, b … a = load y x,yが同じポインタを指していてかつ,store命令が他のstore命令でkillされていなければ, b ⇢ a store x, b1 1: x = alloc_o 2: y = x 3: store x, b1 4: store x, b2 5: a = load y store x, b2 a3 = load t1 4のstore命令により, 3のstore命令はkillされる

SSAからVFGへの変換 (2/2) store命令のkillの求め方 メソッド呼び出しの扱い strong update を用いる store (X, …)があり, Xがalloc_oのみを指すとき,このstore命令以前に存在する,alloc_oに対するstore命令を全てkillする 正確性を持たせつつ,不必要な計算を省くため,ポインタにEscape Orderを定め,その順にstrong updateを行う store X, Y ( X ← alloc_A, Y ← alloc_B ) のとき, alloc_A < alloc_B とする メソッド呼び出しの扱い 予備変数を導入し,参照を渡している場合でも,値渡しのように扱う

実験 実験設計 実験結果 (Timeは 分:秒) 本手法(VF-PA)と,Flow-Insensitiveなポインタ解析(IPA),既存のFlow-Sensitiveなポインタ解析(SS-PA)を比較 実験結果 (Timeは 分:秒) IPA SS-PA VF-PA Time Mem sendmail 0:57 228 MB 2:15 292 MB 1:09 881 MB 403.gcc 7:31 2590 MB 22:15 1466MB 3:05 8147 MB Solaris 232:23 6672 MB - 76:27 14 GB 本手法は既存のFlow-Sensitiveな解析よりも高速に動作した メモリ使用量は既存手法より増大する場合が多い 大規模なソースコードが対象の場合,Flow-Insensitiveな解析よりも高速であった

おわり