アイテムセットマイニングを利用した コードクローン分析作業の効率向上

Slides:



Advertisements
Similar presentations
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University メソッド呼び出しパターンとして 現れる 横断的関心事の特徴評価 井上研究室 B4 三宅達也.
Advertisements

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

アイテムセットマイニングを利用した コードクローン分析作業の効率向上 大阪大学大学院情報科学研究科 M2  宮崎 宏海

概要 コードクローン分析技術をより効率的に行える手法を提案 コードクローンの散布図では,個々のコードクローンに対して調査をする際はどこから見ていけば良いか分からない

コードクローンとは ソースコード中に出現する同一または類似するコード片 コードクローンの弊害 主な出現要因 コピー&ペースト 定型的な処理(ファイルオープン,データベース処理など) コードクローンの弊害 コードクローン部分に修正を加える場合,全てのコード片に対して修正を検討する必要がある コピーアンドペースト コードクローン

コードクローンに関するこれまでの研究 コードクローンに対する支援ツール CCFinder[1] コードクローン検出ツール トークン単位でコードクローンを検出 多種のプログラミング言語(C, C++. Java, etc..)に対応 解析結果はテキスト形式で出力 [1] T. Kamiya, S. Kusumoto, K. Inoue : “CCFinder : A multi-linguistic token-based code clone detection system for large scale source code” , IEEE Transactions on Software Engineering, 28(7), pp.654-670, July 2002. [2] Y. Ueda, T. Kamiya, S. Kusumoto and K. Inoue, “Gemini: Maintenance Support Environment Based on Code Clone Analysis”, Proc. Of the 8th IEEE International Symposium on Software Metrics, 67-76, 2002.

クローンペアとクローンセット クローンペア:互いにクローンとなっているコード片の対 クローンセット:互いにクローンとなっているコード片の集合 類似したコード片 クローンペア クローンセット (C1,C3) {C1,C3,C4} (C1,C4) {C2,C5} (C3,C4) (C2,C5) C1 C3 C2 C4 C5 類似したコード片

散布図 定義 対象とするソースコードの集合に含まれるコードクローンの散布状況を表す 左上を始点として水平方向・垂直方向にソースコードのトークンを出現順に配置 水平方向・垂直方向のトークンが一定数以上連続して一致する箇所に点をつける a b c a b c c c a b a b c a b c c c 長さが2以上で線分を引いていることを言う! 図はあるファイルについての例 a b a, b, c, ... : トークン : トークンが一致した箇所

散布図の利点と問題点 利点 問題点 システムのどこにコードクローンが含まれているかを瞬時に把握できる 個々のコードクローンを調査する場合に,どのコードクローンから調査すればいいか分かり辛い コードクローンが固まっている部分に分析すべきものがあるとは限らない

研究の目的とアプローチ 目的 アプローチ 個々のコードクローンを分析する際に,散布図上にどのコードクローンから調査するべきかを表示する コードクローンの出現パターンを抽出する 同じクローンセットに属するコードクローンは類似した機能を持つ 複数のコードクローンを共有するファイルは類似度が高いと考えられる 類似度が高いファイルを見つけるのはなぜか? -処理内容(機能)が類似したファイルは,処理の流れにも類似したところがあるのでは ないかと考えており,その情報を用いれば,コードクローンでない箇所に修正を加えた 場合に同時に見るべきファイルと出来るかもしれない.また,同様にコードクローンで ある箇所に修正を加えた場合に,コードクローンでない箇所に与える影響にも類似して いるかもしれない

出現パターンの抽出 個々のコードクローンではなく,その出現パターンを見ることでより巨視的な視点による分析が可能 ファイル2 ファイル4 ファイル6 a b c d a b c a b c d e f フ ァ イ ル 5 フ ァ イ ル 1 フ ァ イ ル 3 ファイル1~4同士の類似度は, ファイル1~4とファイル5,6の類似度より高いと考えられる

*:対象とするプロジェクトに一定回数以上出現するパターン 提案手法 CCFinderから得たコードクローン情報から各ファイルに含まれるコードクローンの出現パターンを求める 手法の手順 コードクローンを検出する コードクローン情報をもとに,FP-tree[3]を作成する コードクローンの頻出パターン*を求める *:対象とするプロジェクトに一定回数以上出現するパターン [3] J. Han, J. Pei and Y. Yin ”Mining Frequent Patterns without Candidate Generation” In Proc. of the ACM SIGMOD Conference on Management of Data,pp.1-12, 2000.

パターンに含まれるクローンの個数が2個以上の場合 パターンに含まれるクローンの個数が2個以上の場合 クローンパターン コードクローンの出現パターンを以降では「クローンパターン」と呼称 C6 C8 C7 定義 構成要素はクローンセットID 構成するクローンセットに属するコードクローンが,全て同じファイルに存在 クローンパターンの特徴 コードクローンの出現する順番は考慮しない パターンは複数のファイルに含まれる C1 C4 C2 C5 C3 ファイル2 ファイル1 ファイル3 :CS1(クローンセット1)に属する  コードクローン :CS2(クローンセット2)に属する  コードクローン パターンに含まれるクローンの個数が2個以上の場合 F1 [CS1,CS1] [CS1,CS2] [CS1,CS1,CS2] F2 [CS1,CS2] F3 [CS1,CS1] [CS1,CS2] [CS1,CS1,CS2] パターンに含まれるクローンの個数が2個以上の場合

1.コードクローンの検出 既存のコードクローン検出ツールを使用 クローンセット情報の構築 クローンパターンを構成する要素がクローンセットIDであるため コードクローンが属するクローンセットIDと,コードクローンを含むファイルとの対応付け

例:パターンを含むファイルの個数の最小値を3個とした場合 2.FP-treeの作成(1/2) 頻出クローンセットIDを取得 パターンを含むファイルの数の閾値を設定 閾値以上の個数のファイルに含まれるクローンセットをファイルの個数と共に保持 各ファイルについて,含む頻出クローンセットIDを総出現回数の降順でソート 総出現回数 ファイルID 1 2 3 4 5 クローンセットID a, b, c, d a, b, e, f c, d a, b, c, e a, b, c, e, f 頻出クローンセットID 閾値以上 閾値未満 a, b, c (a : 4個) (b : 4個) (c : 4個) (e : 3個) (d : 2個) (f : 2個) a, b, e c a, b, c, e a, b, c, e 例:パターンを含むファイルの個数の最小値を3個とした場合

2.FP-treeの作成(2/2) FP-treeを構築 FP-treeの特徴 木構造 各ノードではクローンセットIDとカウントを保持 各ノードからrootまでの経路上にあるノードが保持するクローンセットの組み合わせが,カウントの数だけ同一ファイル内に出現 前頁の表のFP-tree root c:1 a:4 b:4 c:3 e:1 e:2 { c } が1つのファイルに 含まれていることが分かる { a,b,c } が同時に3つのファイルに 含まれていることが分かる

前頁のFP-treeからcを含むパターンを見つける場合 3.頻出パターンの取得(1/2) FPーtreeから頻出パターンを取得 クローンセットID=cを含む頻出パターンの取得手順 cを保持するノードのカウントと,rootまでの経路上のノードが保持するクローンセットIDを調べる cを含む全てのファイルについて1.の情報を調べ,統合する 2.の情報とパターンを含むファイル数の閾値から頻出パターンを求める a:4 a, b, cが同時に 3つのファイルに 現れる a, b, cが同時に3つのファイルに, cが4つのファイルに同時に現れる 頻出パターン {a, b, c} {c} b:4 cが1つの ファイルに現れる c:3 c:1 前頁のFP-treeからcを含むパターンを見つける場合

パターン間でクローンセットIDが包含関係になる例 3.頻出パターンの取得(2/2) 不要なパターンを除去 不要なパターンの条件 2つのパターンが同じファイルに含まれる パターンを構成するクローンセットIDが包含関係になっている 包含されているパターンを除去する 包含しているパターンに比べて,新たに得られる情報がないため ファイルID f1, f2, f3, f4 頻出パターンID 1 2 クローンセットID a, b, c, d a, b, c パターン間でクローンセットIDが包含関係になる例

実験の概要 実験の目的 実験の条件 JHotDraw(バージョン5.4)に適用 コードクローンの頻出パターンがコードクローン分析に有用かを調べる 実験の条件 コードクローン検出ツール:CCFinder パターンを構成するクローンセット数の最小値:2 パターンを含むファイル数の最小値:2 JHotDraw(バージョン5.4)に適用 ファイル数:484個(71736行) 検出したコードクローン:1604個 検出したクローンセット:323個 取得したパターン:40個

コードクローン分析に有用であるかの判断基準 パターンを構成するコードクローンがファイルの特徴を表しているか パターンを含むファイルが,コードクローンを含むファイルに比べて絞り込めているか CS1を含むファイルの集合F1 CS2を含むファイルの集合F2 パターンがファイルの特徴を表しているか -適切に表していれば,ファイルの類似度が高いといえる パターンを含むファイルが絞り込まれているか -単一のコードクローンからは得られない,特定の機能を持ったファイルの集合を取得できる - CS3を含むファイルの集合F3 パターンを含むファイルの集合F 全てのファイル 絞り込めている 絞り込めていない パターン{CS1, CS2, CS3}の場合

取得した頻出パターンの例(1/2) :クローンペアになっているコード片 SendToBackCommand.java 31 public void execute() { 32    super.execute(); 33    setUndoActivity(createUndoActivity()); 34    getUndoActivity().setAffectedFigures( 35  view().selectionZOrdered()); 36    FigureEnumeration fe = 37       getUndoActivity().getAffectedFigures(); 38    while (fe.hasNextFigure()) { 39   view(). drawing( 64 public boolean undo() { 65    if (!super.undo()) { 66  return false; 67    }   FigureEnumeration fe =        getAffectedFigures(); 70   while (fe.hasNextFigure()) { 71     Figure currentFigure = 72         fe.nextFigure(); 43 public void execute() { 44    super.execute(); 45    setUndoActivity(createUndoActivity()); 46    getUndoActivity().setAffectedFigures( 47 view().selection()); 48    FigureEnumeration fe = 49 getUndoActivity().getAffectedFigures(); 50    while (fe.hasNextFigure()) { 51 fe. nextFigure( 79 public boolean undo() { 80   if (!super.undo()) { 81 return false; 82   }   FigureEnumeration fe =          getAffectedFigures(); 85   while (fe.hasNextFigure()) { 86 Figure f = fe.nextFigure(); SendToBackCommand.java ChangeAttributeCommand.java :クローンペアになっているコード片

取得した頻出パターンの例(2/2) パターンを構成するコードクローン パターンを含むファイル 頻出パターンが持つ情報 メソッドexecute():複数の図形を対象としたコマンドの実行を記述 メソッドundo():そのファイルが記述するコマンドの取り消し処理を記述 パターンを含むファイル ChangeAttributeCommand.java SendToBackCommand.java 頻出パターンが持つ情報 複数の図形を対象としたコマンドを実行 そのコマンドを取り消す

execute()メソッドを持つが,複数の図形を対象としたものではない ファイルの絞り込みを行ったパターン JHotDrawから取得したパターン40個中6個 具体例 前述の頻出パターン execute()の一部を含むファイル BringToFrontCommand.java ChangeAttributeCommand.java SendToBackCommand.java undo()の一部を含むファイル AlignCommand.java ConnectedTextTool.java UndoActivityクラスを持つが undo()メソッドの記述はない execute()メソッドを持つが,複数の図形を対象としたものではない execute()メソッドを持たない

考察 単一のコードクローンからは得られない情報を取得 取得した頻出パターンを含むファイルと類似した機能を持つファイルが存在 ファイルが持つ機能を表すパターン ファイルの絞り込みが出来たパターン 特定の機能を持つファイルに分類できた 取得した頻出パターンを含むファイルと類似した機能を持つファイルが存在 パターンを含むべきファイルの検出漏れ

まとめと今後の課題 まとめ 今後の課題 散布図上で効率的なクローン調査が可能となる手法を提案 JHotDrawに対して実験を行い,取得したパターンがコードクローン分析に有用であるか判断した 今後の課題 散布図への情報の付加 パターンを構成する要素の検討 CCFinderで検出するコードクローンの最小トークン数を変更 評価基準の検討