ギャップを含むコードクローンの フィルタリング手法の提案

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 識別子名のタグクラウドを用いた.
Advertisements

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

ギャップを含むコードクローンの フィルタリング手法の提案 井上研究室 博士前期過程2年 宮崎 宏海 2018/11/21

研究概要 既存の手法で検出したギャップを含むコードクローンを調査 基準を定めてギャップを含むコードクローンを分類 見る必要のない不要なものをフィルタリング   コードクローン分析の効率化を図る

発表の流れ 背景 既存手法による実験 提案手法 実験 まとめと今後の課題

発表の流れ 背景 既存手法による実験 提案手法 実験 まとめと今後の課題

コードクローンとは ソースコード中のコード片で同一または類似するコード片を持つもの クローンペア:互いにクローンとなっているコード片の対 主な出現要因:コピー&ペースト 弊害:保守コストの増加 クローンペア:互いにクローンとなっているコード片の対 クローンセット:互いにクローンとなっているコード片の集合 クローンペア クローンセット (C1,C3) (C1,C4) (C3,C4) {C1,C3,C4} (C2,C5) {C2,C5} C4 C1 C2 C5 C3

コードクローンのタイプ 識別子名の変更 Exactクローン 空白などのコーディングスタイルを除いて 完全に一致するコードクローン if(a = =b){ a = a + 1; b = b*3;} コピー&ペーストによる 再利用 if(a = =b){ a = a + 1; b = b*3;} 識別子名の変更 文の挿入 文の削除 文の変更 Exactクローン 空白などのコーディングスタイルを除いて 完全に一致するコードクローン 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 ++; b = b*3;} Parameterizedクローン ユーザ定義名や一部の予約語が異なるコードクローン Gappedクローン 文単位でギャップを含むコードクローン

Gappedクローンの検出について Gappedクローンを検出できる手法は少ない AGMアルゴリズムを用いた検出手法の問題点 *藤野 陽平,TechnicalReport “グラフマイニングアルゴリズムを用いたギャップを含むクローン抽出手法の提案” *肥後 芳樹, 植田 泰士, 楠本 真二, 井上 克郎 “AGMアルゴリズムを用いたギャップを含むコードクローン情報の生成”

AGMアルゴリズムを用いた検出の流れ 1 2 3 4 1 3 4 1 1 2 3 3 4 4 1 3 1 4 3 4 1 3 4 AGMアルゴリズムの適用 (2回以上出現するグラフパターンを検出. ただし,検出されるグラフは分岐と閉路を 含まない)

Gappedクローンの検出について Gappedクローンを検出できる手法は少ない AGMアルゴリズムを用いた検出手法の問題点 *藤野 陽平,TechnicalReport “グラフマイニングアルゴリズムを用いたギャップを含むクローン抽出手法の提案” *肥後 芳樹, 植田 泰士, 楠本 真二, 井上 克郎 “AGMアルゴリズムを用いたギャップを含むコードクローン情報の生成”

発表の流れ 背景 既存手法による実験 提案手法 実験 まとめと今後の課題

調査内容 コードクローン検出ツール 検出したGappedクローンの中で不要なものの数を調べる 対象 CCFinder* Ant 1.7.1 JHotDraw 7.0.9 JDK 1.5.0 コードクローン検出ツール CCFinder* *Toshihiro Kamiya, Shinji Kusumoto, and Katsuro Inoue, "CCFinder: A Multi-Linguistic Token-based Code Clone Detection System for Large Scale Source Code," IEEE Trans. Software Engineering, vol. 28, no. 7, pp. 654-670

不要なGappedクローンの基準 構成するコード片が複数の関数にまたがっている 関数は記述の順序によって処理に影響がない 同型のGappedクローンのインスタンスがオーバーラップしている コピー&ペーストで生成された可能性が低い Gappedクローンが繰り返し構造を持っている ソフトウェア開発や保守の観点から調査の対象にする必要がない 上記の条件を満たすGappedクローンはコードクローン分析を行う上で不要 いずれの条件も満たさないGappedクローンを有用とする

複数の関数にまたがっているGappedクローン public final synchronized Iterator iterator() { if (isReference()) { return ((BaseResourceCollectionContainer) getCheckedRef()).iterator(); } dieOnCircularReference(); return new FailFast(this, cacheCollection().iterator()); /** * Fulfill the ResourceCollection contract. * @return number of elements as int. */ public synchronized int size() { getCheckedRef()).size(); return cacheCollection().size(); /** * Fulfill the ResourceCollection contract. * @return number of elements as int. */ public synchronized int size() { if (isReference()) { return ((BaseResourceCollectionContainer) getCheckedRef()).size(); } dieOnCircularReference(); return cacheCollection().size(); public final synchronized Iterator iterator() { getCheckedRef()).iterator(); return new FailFast(this, cacheCollection().iterator()); A B A 関数の順番を 変更 B A B 関数の順番で 生成されるグラフが違う B A 13

不要なGappedクローンの基準 構成するコード片が複数の関数にまたがっている 関数は記述の順序によって処理に影響がない 同型のGappedクローンのインスタンスがオーバーラップしている コピー&ペーストで生成された可能性が低い Gappedクローンが繰り返し構造を持っている ソフトウェア開発や保守の観点から調査の対象にする必要がない 上記の条件を満たすGappedクローンはコードクローン分析を行う上で不要 いずれの条件も満たさないGappedクローンを有用とする

インスタンスがオーバーラップするGappedクローン } else if (family.equals(FAMILY_OS2)) { isFamily = OS_NAME.indexOf(FAMILY_OS2) > -1; } else if (family.equals(FAMILY_NETWARE)) { isFamily = OS_NAME.indexOf(FAMILY_NETWARE) > -1; } else if (family.equals(FAMILY_DOS)) { isFamily = PATH_SEP.equals(";") && !isFamily(FAMILY_NETWARE); } else if (family.equals(FAMILY_MAC)) { isFamily = OS_NAME.indexOf(FAMILY_MAC) > -1; } else if (family.equals(FAMILY_TANDEM)) { isFamily = OS_NAME.indexOf("nonstop_kernel") > -1; } else if (family.equals(FAMILY_UNIX)) { isFamily = PATH_SEP.equals(":") && !isFamily(FAMILY_VMS) && (!isFamily(FAMILY_MAC) || OS_NAME.endsWith("x")); } else if (family.equals(FAMILY_ZOS)) { isFamily = OS_NAME.indexOf(FAMILY_ZOS) > -1 || OS_NAME.indexOf("os/390") > -1; } else if (family.equals(FAMILY_OS400)) { isFamily = OS_NAME.indexOf(FAMILY_OS400) > -1; } else if (family.equals(FAMILY_VMS)) { isFamily = OS_NAME.indexOf(FAMILY_VMS) > -1; } else { throw new BuildException( 1 G Gappedクローン G1の不一致部分 2 G Gappedクローン G2の不一致部分 G1とG2はクローンペア コピーアンドペーストで生成された可能性は低い

不要なGappedクローンの基準 構成するコード片が複数の関数にまたがっている 関数は記述の順序によって処理に影響がない 同型のGappedクローンのインスタンスがオーバーラップしている コピー&ペーストで生成された可能性が低い Gappedクローンが繰り返し構造を持っている ソフトウェア開発や保守の観点から調査の対象にする必要がない 上記の条件を満たすGappedクローンはコードクローン分析を行う上で不要 いずれの条件も満たさないGappedクローンを有用とする

繰り返し構造を持つGappedクローン g.drawLine(8,1, 1,8); // left edge of roof g.drawLine(8,1, 15,8); // right edge of roof g.drawLine(11,2, 11,3); // left edge of chimney g.drawLine(12,2, 12,4); // right edge of chimney g.drawLine(3,7, 3,15); // left edge of house g.drawLine(13,7, 13,15); // right edge of house g.drawLine(4,15, 12,15); // bottom edge of house // Draw door frame // same color as edge of house g.drawLine( 6,9, 6,14); // left g.drawLine(10,9, 10,14); // right g.drawLine( 7,9, 9, 9); // top // Draw roof body g.setColor(MetalLookAndFeel.getControlDarkShadow()); g.fillRect(8,2, 1,1); //top toward bottom g.fillRect(7,3, 3,1); g.fillRect(6,4, 5,1); g.fillRect(5,5, 7,1); g.fillRect(4,6, 9,2); // Draw doornob // same color as roof body g.drawLine(9,12, 9,12); 不一致部分

不要なGappedクローンの基準 不要なGappedクローンの基準 構成するコード片が複数の関数にまたがっている 関数は記述の順序によって処理に影響がない 同型のGappedクローンのインスタンスがオーバーラップしている コピー&ペーストで生成された可能性が低い Gappedクローンが繰り返し構造を持っている ソフトウェア開発や保守の観点から調査の対象にする必要がない 上記の条件を満たすGappedクローンはコードクローン分析を行う上で不要 いずれの条件も満たさないGappedクローンを有用とする

実験データ ソフトウェア 664 369 (55.6%) 455 (68.5%) 393 (59.2%) 54 (8.1%) 599 281 合計 複数関数 オーバーラップ 繰り返し構造 有用 Ant 664 369 (55.6%) 455 (68.5%) 393 (59.2%) 54 (8.1%) JHotDraw 599 281 (46.9%) 427 (71.3%) 400 (66.8%) 61 (10.2%) JDK 15,433 8.204 (52.5%) 11,444 (74.2%) 11,764 (76.2%) 929 (6.0%) 検出されたGappedクローンのクローンセット数 複数の基準に当てはまるものも存在する

発表の流れ 背景 既存手法による実験 提案手法 実験 まとめと今後の課題

使用するノードやノード間のエッジを少なくすることで 提案手法 グラフ構築時に各基準に当てはまるGappedクローンをフィルタリング 複数関数にまたがるGappedクローンのフィルタリング 異なる関数に含まれるコード片に対応するノード間にエッジを引かない インスタンスがオーバーラップするGappedクローンのフィルタリング 同一のIDを持つコード片に対応するノード間にエッジを引かない 繰り返し構造を持つGappedクローンのフィルタリング 繰り返し構造を持つコード片をノードとして用いない 使用するノードやノード間のエッジを少なくすることで グラフの構築を効率的に行う

フィルタリング(複数関数) 1 2 3 4 フィルタリング する 1 4 3 2 関数A 関数B 1 2 3 4 フィルタリング しない

フィルタリング(オーバーラップ) 1 2 フィルタリング する 1 2 1 2 1 フィルタリング しない

発表の流れ 背景 既存手法による実験 提案手法 実験 まとめと今後の課題

適用実験 目的 対象 コードクローン検出に使用するツール 実験環境 フィルタリング手法の有効性を確認 Ant 1.7.1 JHotDraw 7.0.9 JDK 1.5.0 コードクローン検出に使用するツール CCFinder 実験環境 CPU:Pentium4 3.20 GHz メモリ:2GB OS:Windows Vista

実験の評価 フィルタリング手法の有効性の評価 フィルタリングする場合としない場合を比較 フィルタリング後のGappedクローンを調査

フィルタリングの有無の比較 Gappedクローン数 検出時間(s) ソフトウェア フィルタリング無 フィルタリング有 Ant 650 78 20 53 JHotDraw 598 90 5 33 JDK 15,433 1,020 11,221 887

フィルタリング後に取得したGappedクローン for (int i = 0; i < dirs.length; i++) { File d = new File(dirs[i]); if (!d.exists()) { if (!d.mkdirs()) { log("Unable to create directory " + d.getAbsolutePath(), Project.MSG_ERR); } else { createCount++; } if (createCount > 0) { log("Copied " + dirCopyMap.size() + " empty director“ + (dirCopyMap.size() == 1 ? "y" : "ies") + " to " + createCount + (createCount == 1 ? "y" : "ies") + " under “ + destDir.getAbsolutePath()); ・・・ } File d = new File(toDirNames[i]); if (!d.exists()) { if (!d.mkdirs()) { log("Unable to create directory " + d.getAbsolutePath(), Project.MSG_ERR); } else { createCount++; File fromDir = new File(fromDirName); if (!selfMove && okToDelete(fromDir)) { deleteDir(fromDir); if (createCount > 0) { log("Moved " + dirCopyMap.size() + " empty director" + (dirCopyMap.size() == 1 ? "y" : "ies") + " to " + createCount + (createCount == 1 ? "y" : "ies") + " under " + destDir.getAbsolutePath()); ・・・ ファイルの コピー処理 不一致部分 ログ出力 Copy.java Move.java

考察 Gappedクローンの数を大幅に削減 大規模なソフトウェアに対して検出時間を大幅に削減 →提案手法は有効である 今後の課題 フィルタリング後のGappedクローンの中にコード片間が等しいものが含まれていた コード片間が等しい場合,Gappedクローンとしてではなく1つのコードクローンとして検出されるべき

発表の流れ 背景 既存手法による実験 提案手法 実験 まとめと今後の課題 まとめます

まとめと今後の課題 AGMアルゴリズムにより取得したGappedクローンを基準を定めて有用か判断し,フィルタリングを行った グラフの構築手法を新たに設定 複数のオープンソースソフトウェアに適用 フィルタリングの有効性を確認 今後の課題 コード片間が等しいGappedクローンのフィルタリング その他のコードクローン検出手法へAGMアルゴリズムの適用

各ソフトウェアのサイズ ソフトウェア バージョン 記述言語 ファイル数 総行数 Ant 1.7.1 Java 787 200,401 JHotDraw 7.0.9 471 90,241 JDK 1.5.0 6,551 1,887,008