動的依存グラフの3-gramを用いた 実行トレースの比較手法

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
Advertisements

OWL-Sを用いたWebアプリケーションの検査と生成
シーケンス図の生成のための実行履歴圧縮手法
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
情報伝播によるオブジェクト指向プログラム理解支援の提案
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
プログラムの動作を理解するための技術として
デバイスからの異常注入が指定可能なCPUエミュレータ
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
静的情報と動的情報を用いた プログラムスライス計算法
類似するコーディングパターンの 利用状況調査ツールの提案
プログラム依存グラフを利用した 情報漏洩解析手法の提案と実現
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
動的スライスを用いた バグ修正前後の実行系列の比較
暗黙的に型付けされる構造体の Java言語への導入
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
実行時情報に基づく OSカーネルのコンフィグ最小化
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
社会シミュレーションのための モデル作成環境
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
通信機構合わせた最適化をおこなう並列化ンパイラ
動的データ依存関係解析を用いた Javaプログラムスライス手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
ソフトウェア制作論 平成30年10月10日.
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
構造的類似性を持つ半構造化文書における頻度分析
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
使用する CSS・JavaScrpitも指定
統合開発環境のための プログラミング言語拡張 フレームワーク
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コンパイラ 2012年10月11日
回帰テストにおける実行系列の差分の効率的な検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
Presentation transcript:

動的依存グラフの3-gramを用いた 実行トレースの比較手法 ○ブヤンネメフ オドフー,石尾 隆,井上 克郎         大阪大学 大学院情報科学研究科

プログラムの動作を理解するための技術として 背景 ソフトウェアの保守作業では,開発者はプログラムの動作を理解する必要がある 機能追加,デバッグ,テストなど しかし,長期間に渡って継続的に保守されたシステムにおいて 保守する人の知識が十分でない 設計文書や説明書も古く,変更を反映していない プログラムの動作を理解するための技術として プログラムの実行トレースの比較がある

実行トレースとは 実行トレースとはプログラムに何らかの入力を与えたときに実行される命令の系列である 実行トレースは動的束縛や例外処理など,ソースコードの静的解析では得ることが難しい重要な実行時情報を含んでいる 以降,トレースと呼ぶ

トレース比較による プログラムの動作理解 わずかに異なる2つの入力を与えて同一の機能を実行し,動作の違いを調査することで,その機能の詳細な動作を理解する Differential Slicing: 2つの実行がそれぞれ異なる出力を行った命令を基点としてトレースを遡り,実行が異なる原因となったところを特定する カバレッジ比較: ステートメントカバレッジ:実行された行の差分から違いを特定 ブランチカバレッジ:通っていないブランチの差分から違いを特定 全duパスカバレッジ:変数の定義場所から使用場所への 実行経路の違いを特定 比較は細かく,命令間の 動的依存関係を比べる 動作を正確に比較できる 実行回数を無視して,集合で比べる 比較するデータ量は少ない

トレース比較の既存技術の問題点 a=get(i); a=b+c; d=f(a); sum=d+c; sum=d; Differential Slicing:命令間の動的依存関係の情報が必要 カバレッジ比較:高々長さ2の実行経路の動作しか表現できない 比較するデータ量が非常に多い 動作比較の正確さは落ちる if(x>10){  a=get(i); }else{  a=b+c; } a=get(i); a=b+c; d=f(a); if(flag2){  sum=d; }else{  sum=d+c; } d=f(a); sum=d+c; sum=d;

提案手法:トレースを3-gramに 分解して比較する 動的依存グラフを分解し,集合にすることで,実行経路を少ない量のデータで表現できる 実行経路を3-gram分解することで,従来のカバレッジ比較より正確に動作比較ができる

動的依存グラフとは プログラム 頂点はプログラムの実行された文で,辺が文間の動的依存関係を表す 動的依存関係 ある文で定義された変数が 他の文で使用された場合 ある文の実行を制御した 文がある場合 N=2のときの実行に対する動的依存グラフ sum=0; int i=1; i<=N i=1 sum=sum+i; i++; プログラム i<=N i=2 sum=0; for(int i=1;i<=N;i++){ sum=sum+i; } print(sum); sum=sum+i; i++; i<=N i=3 print(sum);

動的依存グラフの3-gram分解 ……. 辺で接続された頂点の3-gramを取り出す 同じ文の異なる実行に 異なる頂点を持つ sum=0; int i=1; i<N sum=sum+i; sum=sum+i; print(sum); sum=sum+i; i++; sum=0; sum=sum+i; sum=sum+i; i<N i<N; i++; i<N; sum=sum+i; i++; ……. i<N print(sum);

3-gram集合の比較 各トレース固有のものと共通するものの3つのカテゴリーに分類する N=2の場合の 3-gram集合 sum=sum+i; sum=sum+i; print(sum); sum=sum+i; sum=sum+i; print(sum); sum=0; sum=sum+i; sum=sum+i; sum=0; sum=sum+i; sum=sum+i; i<N; i++; i<N; N=1の場合の固有の依存関係 … sum=0; sum=sum+i; print(sum); N=1の場合の 3-gram集合 N=2の場合, N=1の場合で 共通する依存関係 sum=0; sum=sum+i; print(sum); i<N; i++; i<N; i<N i++; i<N …

ケーススタディ(1/2) 提案手法の効果を調べる 従来のカバレッジ比較: Q1:トレースを小さな3-gram集合で表現できるか ステートメントカバレッジ ブランチカバレッジ 全duパスカバレッジ

ケーススタディ(2/2) 対象 DaCapoベンチマークソフトのアプリケーションbatik,fop 手段 batik:画像svgファイルを入力とし,pngファイルに変換する fop:XSL-FOファイルを解析し,pdfファイルに変換する small,defaultのオプションでアプリケーションの入力を決める batikのsmall:単一ファイルの変換を行う batikのdefault:3つのファイルの変換を行う 手段 small入力に対するトレースとdefault入力に対するトレースを比較する 異なる入力によって,動作にどんな違いがあるかを調べた

ケーススタディの結果(1/3): トレースを小さな3-gram集合で表現できるか 実行トレース 実行時間 トレースの ファイルサイズ 3-gram分解後の 3-gram 依存関係の個数 batik -small 2542 msec 7.39 GByte 304 KByte 14818 batik -default 4430 msec 40.2 GByte 470 KByte 22310 fop -small 1747 msec 1.53 GByte 253 KByte 11932 fop -default 2886 msec 8.56 GByte 336 KByte 15635 結論:トレースサイズを大幅に減らすことができた

ケーススタディの結果(2/3): 従来のカバレッジでは表現できない経路は存在するか 3-gram分解でなければ,存在を認識できないような実行経路を含むコード片数 アプリケーション名 入力オプション コード片の数 batik small 191 default 296 fop 161 171 結論:トレースの3-gram分解は従来カバレッジ では表現できない動作を含む

ケーススタディの結果(3/3): 異なる入力に対する動作の違い 3-gram依存関係の集合の比較結果 アプリケーション名 入力オプション トレース固有の 3-gram依存関係 トレース間で共通する batik small 405 14413 default 7895 fop 1256 10676 4959 結論:異なる入力に対する,動作の違いを 検出することができた

異なる動作の実例 batik-defaultの固有の動作 batik-smallの固有の動作

まとめ プログラムの2つ異なる実行に対するトレースから得られる動的依存グラフを3-gram分解した集合を比較する手法提案 提案手法を適用したケーススタディを行った 動的依存グラフを分解し,集合にすることで,比較するデータ量を大幅に減らすことができた 従来のカバレッジ比較では差がないが,3-gram比較では差がある実行経路は各アプリケーションの各入力に対して存在した 今後の課題 3-gramを4-gram,5-gramなどにした伸ばした場合の効果調査 3-gramの1つの頂点を文より大きくあるいは小さくした場合の動作表現の効果調査

提案手法適用によって同一と判断された場合,以下の項目が等しい ステートメントカバレッジ ブランチカバレッジ 全duパスカバレッジ ループの0,1,2回以上まわった数

カバレッジ比較で差がない, トレースの3-gramで差があると判断される実行経路 a=get(i); a=b+c; if(x>10){ a=get(i); }else{ a=b+c; } d=f(a); ...... d=f(a); if(flag2){ sum=d; }else{ sum=d+c; } sum=d+c; sum=d; a=get(i); a=b+c; d=f(a); sum=d+c; sum=d;

全duパスカバレッジ