グラフマイニングアルゴリズムを用いた ギャップを含むクローン抽出手法の提案

Slides:



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

コードクローン履歴閲覧環境を用いたクローン評価の試み
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
TF-IDF法とLSHアルゴリズムを用いた 関数単位のコードクローン検出法
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
コードクローン分析ツールGeminiを用いたコードクローン分析手順
コードクローンの分布情報を用いた特徴抽出手法の提案
ギャップを含むコードクローンの フィルタリング手法の提案
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードの生存期間を考慮したコードクローンと欠陥修正の関係調査
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
プログラム実行履歴を用いたコードクローン検出手法
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードクローン編集者数に着目した開発履歴の分析
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
コードクローンのメトリクス値と 開発者の相関の調査
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
メトリクス値の変化に基づく コードクローンの編集傾向分析
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
Geminiを用いた効果的なコードクローン分析方法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
コードクローンを対象とした リファクタリングの有効性に関する調査
Presentation transcript:

グラフマイニングアルゴリズムを用いた ギャップを含むクローン抽出手法の提案 井上研究室 藤野陽平 2007/2/27

コードクローン ソースコード中に存在する同一,もしくは類似したコード片を同一システム中に持つコード片 (以降単にクローンと呼ぶ) コピー&ペースト等により生成される ソフトウェア保守を困難にする バグ修正などコード変更をする際、全てのクローンに対して変更が必要 保守作業の手間が増大 クローンセット 2007/2/27

コードクローン検出ツールCCFinder クローンを対象とした保守支援ツール 検出ツール: CCFinder[1] 国内外の個人・組織に配布 配布先からのフィードバックを得ている [1] T. Kamiya, S. Kusumoto, and K. Inoue, “CCFinder: A multi-linguistic token-based code clone detection system for large scale source code”, IEEE Transactions on Software Engineering, 28(7):654-670, 2002. 2007/2/27

CCFinderの問題点 問題点・・ギャップを含むクローンが抽出できないので、効率的に分析ができない そうなるべきところが別々の短いクローンとして抽出される 目的・・CCFinderの出力を元に、ギャップを含むクローンを抽出する これらを1つのクローンとして抽出したい ギャップ 2007/2/27

提案手法 ギャップを含むクローンを抽出する CCFinderが見つけたコード片をグラフのノードとする グラフマイニングアルゴリズムを用いて、多頻度グラフパターン(ギャップを含むクローン)を抽出する 2007/2/27

AGM(Apriori-based Graph Mining)アルゴリズムの概要 グラフ1 グラフ2 1 1 1 3 2 3 5 2 4 4 頂点の数が1の多頻度グラフパターンを見つける [2]猪口明博,鷲尾隆,元田浩:多頻度グラフマイニング手法の一般化.人工知能学会論文誌,vol19,No.5,pp. 368-378, 2004. 2007/2/27

AGM(Apriori-based Graph Mining)アルゴリズムの概要 1 1 1 1 2 1 3 ・・・・・ 2 4 1 2 3 4 1 見つかった多頻度グラフパターンを組み合わせて、頂点の数が1つ多い多頻度グラフパターンの候補を生成する [2]猪口明博,鷲尾隆,元田浩:多頻度グラフマイニング手法の一般化.人工知能学会論文誌,vol19,No.5,pp. 368-378, 2004. 2007/2/27

AGM(Apriori-based Graph Mining)アルゴリズムの概要 グラフ1 グラフ2 1 1 1 3 2 3 5 2 4 4 生成した候補が多頻度グラフパターンかを確認する [2]猪口明博,鷲尾隆,元田浩:多頻度グラフマイニング手法の一般化.人工知能学会論文誌,vol19,No.5,pp. 368-378, 2004. 2007/2/27

AGM(Apriori-based Graph Mining)アルゴリズムの概要 グラフ1 グラフ2 1 1 1 3 2 3 5 2 4 4 これまでの操作を繰り返し、全ての多頻度グラフパターンを抽出する [2]猪口明博,鷲尾隆,元田浩:多頻度グラフマイニング手法の一般化.人工知能学会論文誌,vol19,No.5,pp. 368-378, 2004. 2007/2/27

ギャップを含むクローン抽出手順 CCFinderが出力するクローンの位置情報を元に、各クローンのコード片をノードとするグラフを作成する 作成したグラフ集合に対して、AGMアルゴリズムを適用して多頻度グラフパターンを抽出し、それをギャップを含むクローンとする ギャップを含むクローンの位置情報を出力する 2007/2/27

CCFinderが出力するクローンの位置情報からグラフを作成する ファイル1 ファイル2 ファイル2 1 1 1 2 3 2 2 ※図に書かれている数字は、何番目のクローンセットに含まれるコードクローンかを表す. オーバーラップしている 2007/2/27

CCFinderが出力するクローンの位置情報からグラフを作成する ファイル1 ファイル2 ファイル2 1 ファイル1に対するグラフ 1 1 1 2 3 2 2 ※図に書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す. 2007/2/27

CCFinderが出力するクローンの位置情報からグラフを作成する ファイル1 ファイル2 ファイル2 1 1 ファイル1に対するグラフ ファイル2に対するグラフ 1 1 1 2 3 2 2 ※ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す. 2007/2/27

CCFinderが出力するクローンの位置情報からグラフを作成する ファイル1 ファイル2 ファイル2 1 1 ファイル2に対するグラフ ファイル1に対するグラフ 1 1 1 2 2 3 2 2 ※ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す. 2007/2/27

CCFinderが出力するクローンの位置情報からグラフを作成する ファイル1 ファイル1 ファイル2 ファイル2 1 1 ファイル2に対するグラフ ファイル1に対するグラフ 1 1 1 1 2 2 2 2 3 2 2 ※ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す. 2007/2/27

CCFinderが出力するクローンの位置情報からグラフを作成する ファイル1 ファイル1 ファイル2 ファイル2 1 1 ファイル2に対するグラフ ファイル1に対するグラフ 1 1 1 1 2 2 3 2 2 2 3 2 2 ※2と3はオーバーラップしているのでエッジを引かない ※ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す. 2007/2/27

多頻度グラフパターンを抽出し、それをギャップを含むクローンとする ファイル1に対するグラフ ファイル2に対するグラフ 1 1 3 2 2 2 5 3 3 囲んだ部分がギャップを含むクローン 2007/2/27

抽出したギャップを含むクローンの位置情報を出力する ファイル1に対するグラフ ファイル2に対するグラフ ファイル1 ファイル2 1 1 2 2 3 3 濃いオレンジの部分がギャップ 2007/2/27

ギャップを含むクローン抽出手順 (まとめ) 入力:ギャップを含まないクローンの位置情報 出力:ギャップを含むクローンの位置情報 ファイル1 ファイル2 ファイル1 ファイル1 ファイル2 ファイル2 1 1 1 1 2 2 3 2 2 2007/2/27

実験 目的: どのようなギャップを含むクローンが抽出されるか調査する 対象:Java,C言語で記述されたオープンソースソフトウェア Java: EJE,jasmin,javadjvu C  : f2j CCFinderは30トークン以上のコードクローンを検出 グラフを構築するときに、メトリクスRNR[3]を用いる 検出する必要がないクローンのフィルタリングが可能 例:連続した変数宣言、switch文のcaseエントリなど 閾値として0.5を用いる 挿入・削除・変更といった編集が加えられているクローンとそうでないクローンに分類 [3]肥後芳樹,吉田則裕,楠本真二,井上克郎:産学連携に基づいたコードクローン可視化手法の改良と実装,情報処理学会論文誌,vol48,No.2,pp. 811-822, 2007. 2007/2/27

実験結果 EJE f2j jasmin javadjvu 編集が加えられたクローンセット数 4 7 内訳 挿入・削除 2 変更 3 1 編集が加えられていないクローンセット数 26 10 9 編集が加えられたクローンセット数の割合 80% 21% 41% 31% ソフトウェアによって編集が加えられたクローンセット数の割合の違いが大きい 編集が加えられていないクローンセットをフィルタリング出来るようにするなど改良の余地がある 2007/2/27

編集が加えられたクローンの例 クローンセット 文が挿入されている クローンセット CodeAttr init = new CodeAttr(); init.addInsn(new Insn(opc_aload_0)); init.addInsn(new Insn(opc_invokenonvirtual, new MethodCP("java/lang/Object", "<init>", "()V"))); init.addInsn(new Insn(opc_return)); // Actual code to print string CodeAttr doit = new CodeAttr(); // store refs in local variables doit.addInsn(new Insn(opc_getstatic, new FieldCP("java/lang/System", "out", "Ljava/io/PrintStream;"))); doit.addInsn(new Insn(opc_astore_1)); doit.addInsn(new Insn(opc_ldc,       new StringCP(“Hello World”))); doit.addInsn(new Insn(opc_astore_2)); // Loop index in var reg 3 doit.addInsn(new Insn(opc_bipush, 5)); CodeAttr code = new CodeAttr();        // No operands code.addInsn(new Insn(opc_return)); // one arg operands code.addInsn(new Insn(opc_astore, 5)); // one arg arguments with wide operand code.addInsn(new Insn(opc_dstore, 256)); code.addInsn(new Insn(opc_istore, 2576)); // Add a label code.addInsn(new Label("First label")); // refer back to it code.addInsn(new Insn(opc_jsr, new Label("First label"))); // add another label code.addInsn(new Label("second_label")); // insn with CP argument code.addInsn(new Insn(opc_ldc_w, new StringCP("sdfsdf"))); 文が挿入されている クローンセット 緑太字:コードが変更された箇所   黒太字:コードが挿入された箇所 2007/2/27

編集が加えられていない クローンの例 2つのクローンがオーバラップしている ギャップを含むクローン ギャップを含むクローン public void reload( ) { Iterator iterator = reloadables.iterator(); while (iterator.hasNext()) { Reloadable reloadable = (Reloadable) iterator.next(); reloadable.reload(); } public void store( ) { Iterator iterator = storers.iterator(); Storer storer = (Storer) iterator.next(); storer.store(); public void addReloadable(Reloadable reloadable) { reloadables.addElement(reloadable); public void removeReloadable(Reloadable reloadable) { reloadables.removeElement(reloadable); 2つのクローンがオーバラップしている ギャップを含むクローン ギャップを含むクローン 2007/2/27

まとめと今後の課題 まとめ 今後の課題 グラフマイニングアルゴリズムを用いたギャップを含むクローン抽出手法を提案し、ツールを実装した オープンソースソフトウェアに対してどのようなギャップを含むクローンが抽出されるか調査した 今後の課題 編集されていないクローンのフィルタリング バグ検出手法としての有益性評価 2007/2/27

2007/2/27

2007/2/27

コピー&ペーストによる再利用の 流れ 挿入 削除 変更 Exact クローン Parameterized クローン Gappedクローン コピー&ペーストによる再利用の 流れ if(a = b){ a = a + 1; b = b*3;} コピー&ペーストによる 再利用 識別子名の変更 if(a = b){ a = a + 1; b = b*3;} if(i = j){ i = i + 1; j = j*3;} 挿入 削除 変更 if(a = b){ b = b – 2; a = a + 1; b = b*3;} if(a = b){ b = b*3;} if(a = b){ a = a ++; b = b*3;} Exact クローン Parameterized クローン 2007/2/27 Gappedクローン

コピー&ペーストによる再利用の 流れ Exactクローン Parameterizedクローン Gappedクローン コピー&ペーストによる再利用の 流れ Exactクローン 完全に一致したコード片。ただし空白、改行、コメントなどの違いは考慮しない Parameterizedクローン 変数名、クラス名などのユーザ定義名の違いを除き一致しているコード片 Gappedクローン 構文的に一致しない不一致コード(ギャップ(Gap))を部分的に含むコード片 そしてコードクローンは以下の3つに分けることができます。 2007/2/27

実験1:結果 EJE f2j jasmin javadjvu 57 15 104 66 82 90 149 215 42 63 102 45 ファイル数 57 15 104 66 クローン セット数 82 90 149 215 Gapped クローン セット数 42 63 102 45 実行時間(s) 3.995 16.73 94.165 1518.60 2007/2/27

実験1:考察 クローンセット数が少なくても、ファイル数が多ければ実行時間がかかっている AGMアルゴリズムでは各ファイルごとにグラフを作成するため 1つのファイルにクローンが集中していると、実行時間が格段にかかってしまう グラフのサイズが大きくなると、頻度計算などで時間がかかってしまうため 2007/2/27

実験2 抽出されたGappedクローンが有益かどうかを判断するために、抽出されたものに挿入・削除・変更といった編集が加えられているかどうかを人手で判定 メトリクス値RNRでフィルタリングして実験 値が小さいほど、繰り返し要素を多く含むクローン 連続した変数宣言などのクローンをフィルタリングすることで、より効率的に分析作業が可能 閾値として0.5を用いる 2007/2/27

RNR: クローン内の重複した処理の 少なさの度合い ∑ Tokensrepeated(C) RNR = 1 - C ∈ S ∑ S: クローンセット C: クローンセットの要素 Tokensall(C) C ∈ S Tokensall(C) : クローンC中の総トークン数 Tokensrepeated(C) : クローンC中の繰り返し部分のトークン数 8トークン RNRというのはこのような式で表されます. これは,クローンセットの各要素であるクローン中に 繰り返しでない部分が存在する割合の平均値をとっています. RNRが小さいほど,クローン中に繰り返しが多く存在する ことになります. 次にTokens allとTokens repeatedについて説明します. 例えば,このようなトークン列の場合, 全体で8トークンなので,Tokens all = 8となります. このトークン列の繰り返し部分に着目すると 4トークン分繰り返しが存在するので, Tokens repeated = 4となります Tokensall = 8 X A B A B A B Y Tokensrepeated = 4 4トークン 直前の繰り返し 2007/2/27

クローン位置情報のフォーマット フォーマット グループID.ファイルID 開始行,開始カラム,開始トークン 終了行,終了カラム,終了トークン 繰り返し処理でないトークン数    0 . 1 73 , 3 , 128 82 , 59 , 172 12 #begin{set}(1番目のクローンセット) 0.1 73,3,128 82,59,172 12 0.1 84,3,180 92,24,222 24 0.2 90,12,178 99,4,210 23 #end{set} #begin{set}(2番目のクローンセット) 0.2 101,3,215 122,14,252 24 0.3 71,3,114 87,29,167 20 #begin{set}(3番目のクローンセット) 0.1 89,5,194 101,26,252 45 0.2 112,7,243 142,29,289 22 ・・・・・・ 2007/2/27

オーダー AGMアルゴリズム グラフの平均ノード数が増えると指数関数的に増加 グラフ構築 O(n^2) 2007/2/27

CP-Miner[1] コピー&ペーストによって生成されたコードの検出を目的として開発されたツール Clospan[2]と呼ばれるマイニングアルゴリズムを用いる コピー&ペーストの後、数行の挿入や削除といった修正が加えられたコードも検出可能 検出対象言語はC,C++ [1] Zhen Li, Shan Lu, Suvda Myagmar, Yuanyuan Zhou , “CP-Miner: Finding Copy-Paste and Related Bugs in Large-Scale Software Code” , IEEE TSE, Vol.32, No.3 MARCH 2006 . [2] X. Yan, J. Han, and R. Afshar, “CloSpan: Mining Closed Sequential Patterns in Laegr Datasets”, Proc.SIAM Int’l Conf.Data Mining, May 2003. 2007/2/27