プログラムの動作を理解するための技術として

Slides:



Advertisements
Similar presentations
OWL-Sを用いたWebアプリケーションの検査と生成
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
仮想マシンの並列処理性能に対するCPU割り当ての影響の評価
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
クラス動作シナリオ可視化手法の プログラム理解作業に対する有効性評価
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
大阪大学 大学院情報科学研究科 博士前期課程2年 宮原研究室 土居 聡
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
動的スライスを用いた バグ修正前後の実行系列の比較
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
実行時情報に基づく OSカーネルのコンフィグ最小化
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
コンポーネントランク法を用いたJavaクラス分類手法の提案
通信機構合わせた最適化をおこなう並列化ンパイラ
動的データ依存関係解析を用いた Javaプログラムスライス手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
Webコミュニティ概念を用いた Webマイニングについての研究 A study on Web Mining Based on Web Communities 清水 洋志.
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
ソフトウェア制作論 平成30年10月10日.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
オブジェクトの動的支配関係解析を 用いたシーケンス図の縮約
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
使用する CSS・JavaScrpitも指定
ソフトウェア理解支援を目的とした 辞書の作成法
オントロジーを利用した Webサービスの実行支援に関する研究
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
回帰テストにおける実行系列の差分の効率的な検出手法
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
Presentation transcript:

動的依存グラフの3-gramの比較による プログラム動作理解支援 博士前期課程 2年 コンピュータサイエンス専攻 井上研究室 BUYANNEMEKH ODKHUU

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

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

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

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

動的依存グラフとは プログラム 頂点はプログラムの実行された文で,辺が文間の動的依存関係を表す sum=0; N=2のときの実行に対する動的依存グラフ sum=0; int i=1; プログラム i<=N i=1 sum=0; for(int i=1;i<=N;i++){ sum=sum+i; } print(sum); sum=sum+i; i++; i<=N i=2 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を対象に行った small,default,largeのオプションでアプリケーションの入力を決める 手段 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/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で差があると判断される実行経路 ...... 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;