230 likes | 296 Views
アイテムセットマイニングを利用した コードクローン分析作業の効率向上. 大阪大学大学院情報科学研究科 M2 宮崎 宏海. 概要. コードクローン分析技術をより効率的に行える手法を提案 コードクローンの散布図では,個々のコードクローンに対して調査をする際はどこから見ていけば良いか分からない. コードクローンとは. コードクローンの弊害 コードクローン部分に修正を加える場合,全てのコード片に対して修正を検討する必要がある. ソースコード中に出現する同一または類似するコード片 主な出現要因 コピー&ペースト 定型的な処理(ファイルオープン,データベース処理など).
E N D
アイテムセットマイニングを利用したコードクローン分析作業の効率向上アイテムセットマイニングを利用したコードクローン分析作業の効率向上 大阪大学大学院情報科学研究科 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 C4 C2 C5 C3 クローンペアとクローンセット • クローンペア:互いにクローンとなっているコード片の対 • クローンセット:互いにクローンとなっているコード片の集合 類似したコード片 類似したコード片
散布図 定義 対象とするソースコードの集合に含まれるコードクローンの散布状況を表す 左上を始点として水平方向・垂直方向にソースコードのトークンを出現順に配置 水平方向・垂直方向のトークンが一定数以上連続して一致する箇所に点をつける a b c a b c c c a b a b c a b c c c a b a, b, c, ... : トークン : トークンが一致した箇所
散布図の利点と問題点 • 利点 • システムのどこにコードクローンが含まれているかを瞬時に把握できる • 問題点 • 個々のコードクローンを調査する場合に,どのコードクローンから調査すればいいか分かり辛い • コードクローンが固まっている部分に分析すべきものがあるとは限らない
研究の目的とアプローチ • 目的 • 個々のコードクローンを分析する際に,散布図上にどのコードクローンから調査するべきかを表示する • アプローチ • コードクローンの出現パターンを抽出する • 同じクローンセットに属するコードクローンは類似した機能を持つ • 複数のコードクローンを共有するファイルは類似度が高いと考えられる
a c c a b c b d b a b c a c c b a c c e f a e f a a e b b f c c d a b a c a c c c c c c b b a f 出現パターンの抽出 • 個々のコードクローンではなく,その出現パターンを見ることでより巨視的な視点による分析が可能 ファイル2 ファイル4 ファイル6 フ ァ イ ル 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 ACMSIGMOD Conference on Management of Data,pp.1-12, 2000.
C1 C6 C4 C7 C2 C5 C8 C3 クローンパターン • コードクローンの出現パターンを以降では「クローンパターン」と呼称 • 定義 • 構成要素はクローンセットID • 構成するクローンセットに属するコードクローンが,全て同じファイルに存在 • クローンパターンの特徴 • コードクローンの出現する順番は考慮しない • パターンは複数のファイルに含まれる ファイル2 ファイル1 ファイル3 :CS1(クローンセット1)に属する コードクローン :CS2(クローンセット2)に属する コードクローン F1 [CS1,CS1] [CS1,CS2] [CS1,CS1,CS2] F2 [CS1,CS2] F3 [CS1,CS1] [CS1,CS2] [CS1,CS1,CS2] パターンに含まれるクローンの個数が2個以上の場合
1.コードクローンの検出 • 既存のコードクローン検出ツールを使用 • クローンセット情報の構築 • クローンパターンを構成する要素がクローンセットIDであるため • コードクローンが属するクローンセットIDと,コードクローンを含むファイルとの対応付け
2.FP-treeの作成(1/2) 頻出クローンセットIDを取得 パターンを含むファイルの数の閾値を設定 閾値以上の個数のファイルに含まれるクローンセットをファイルの個数と共に保持 各ファイルについて,含む頻出クローンセットIDを総出現回数の降順でソート ファイルID クローンセットID 1 a, b, c, d 2 a, b, e, f 3 c, d 4 a, b, c, e 5 a, b, c, e, f 総出現回数 閾値以上 閾値未満 頻出クローンセットID a, b, c (d : 2個) (f : 2個) (a : 4個) (b : 4個) (c : 4個) (e : 3個) 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つのファイルに 含まれていることが分かる
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:1 c:3 前頁のFP-treeからcを含むパターンを見つける場合
ファイルID 頻出パターンID クローンセットID f1, f2, f3, f4 1 a, b, c, d f1, f2, f3, f4 2 a, b, c 3.頻出パターンの取得(2/2) • 不要なパターンを除去 • 不要なパターンの条件 • 2つのパターンが同じファイルに含まれる • パターンを構成するクローンセットIDが包含関係になっている • 包含されているパターンを除去する • 包含しているパターンに比べて,新たに得られる情報がないため パターン間でクローンセットIDが包含関係になる例
実験の概要 実験の目的 コードクローンの頻出パターンがコードクローン分析に有用かを調べる 実験の条件 コードクローン検出ツール:CCFinder パターンを構成するクローンセット数の最小値:2 パターンを含むファイル数の最小値:2 JHotDraw(バージョン5.4)に適用 ファイル数:484個(71736行) 検出したコードクローン:1604個 検出したクローンセット:323個 取得したパターン:40個
コードクローン分析に有用であるかの判断基準コードクローン分析に有用であるかの判断基準 • パターンを構成するコードクローンがファイルの特徴を表しているか • パターンを含むファイルが,コードクローンを含むファイルに比べて絞り込めているか CS1を含むファイルの集合F1 CS2を含むファイルの集合F2 CS3を含むファイルの集合F3 パターンを含むファイルの集合F 全てのファイル 絞り込めている 絞り込めていない パターン{CS1, CS2, CS3}の場合
取得した頻出パターンの例(1/2) • 43public void execute() { • 44super.execute(); • 45setUndoActivity(createUndoActivity()); • 46getUndoActivity().setAffectedFigures( • 47 view().selection()); • 48FigureEnumeration fe = • 49 getUndoActivity().getAffectedFigures(); • 50while (fe.hasNextFigure()) { • 51 fe. nextFigure( • 79public boolean undo() { • 80if (!super.undo()) { • 81 return false; • 82} • FigureEnumeration fe = • getAffectedFigures(); • 85while (fe.hasNextFigure()) { • 86 Figure f = fe.nextFigure(); • 31public void execute() { • 32super.execute(); • 33setUndoActivity(createUndoActivity()); • 34getUndoActivity().setAffectedFigures( • 35view().selectionZOrdered()); • 36FigureEnumeration fe = • 37getUndoActivity().getAffectedFigures(); • 38while (fe.hasNextFigure()) { • 39view(). drawing( • 64public boolean undo() { • 65if (!super.undo()) { • 66return false; • 67} • FigureEnumeration fe = • getAffectedFigures(); • 70while (fe.hasNextFigure()) { • 71 Figure currentFigure = • 72 fe.nextFigure(); SendToBackCommand.java ChangeAttributeCommand.java :クローンペアになっているコード片
取得した頻出パターンの例(2/2) • パターンを構成するコードクローン • メソッドexecute():複数の図形を対象としたコマンドの実行を記述 • メソッドundo():そのファイルが記述するコマンドの取り消し処理を記述 • パターンを含むファイル • ChangeAttributeCommand.java • SendToBackCommand.java • 頻出パターンが持つ情報 • 複数の図形を対象としたコマンドを実行 • そのコマンドを取り消す
ファイルの絞り込みを行ったパターン • JHotDrawから取得したパターン40個中6個 • 具体例 • 前述の頻出パターン • execute()の一部を含むファイル • BringToFrontCommand.java • ChangeAttributeCommand.java • SendToBackCommand.java • undo()の一部を含むファイル • AlignCommand.java • ChangeAttributeCommand.java • ConnectedTextTool.java • SendToBackCommand.java UndoActivityクラスを持つが undo()メソッドの記述はない execute()メソッドを持つが,複数の図形を対象としたものではない execute()メソッドを持たない
考察 • 単一のコードクローンからは得られない情報を取得 • ファイルが持つ機能を表すパターン • ファイルの絞り込みが出来たパターン • 特定の機能を持つファイルに分類できた • 取得した頻出パターンを含むファイルと類似した機能を持つファイルが存在 • パターンを含むべきファイルの検出漏れ
まとめと今後の課題 • まとめ • 散布図上で効率的なクローン調査が可能となる手法を提案 • JHotDrawに対して実験を行い,取得したパターンがコードクローン分析に有用であるか判断した • 今後の課題 • 散布図への情報の付加 • パターンを構成する要素の検討 • CCFinderで検出するコードクローンの最小トークン数を変更 • 評価基準の検討