グラフマイニングアルゴリズムを用いた...
DESCRIPTION
グラフマイニングアルゴリズムを用いた ギャップを含むクローン抽出手法の提案. 井上研究室 藤野陽平. コードクローン. ソースコード中に存在する同一,もしくは類似したコード片を同一システム中に持つコード片 ( 以降単にクローンと呼ぶ ) コピー & ペースト等により生成される ソフトウェア保守を困難にする バグ修正などコード変更をする際、全てのクローンに対して変更が必要 保守作業の手間が増大. クローンセット. コードクローン検出ツール CCFinder. クローンを対象とした保守支援ツール 検出ツール : CCFinder[1] 国内外の個人・組織に配布 - PowerPoint PPT PresentationTRANSCRIPT
2007/2/27 1
グラフマイニングアルゴリズムを用いた
ギャップを含むクローン抽出手法の提案
井上研究室藤野陽平
2007/2/27 2
コードクローン ソースコード中に存在する同一,もしくは類似したコ
ード片を同一システム中に持つコード片 ( 以降単にクローンと呼ぶ )
コピー & ペースト等により生成される ソフトウェア保守を困難にする
バグ修正などコード変更をする際、全てのクローンに対して変更が必要
保守作業の手間が増大
クローンセット
2007/2/27 3
コードクローン検出ツール 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 4
CCFinder の問題点 問題点・・ギャップを含むクローンが抽出でき
ないので、効率的に分析ができない そうなるべきところが別々の短いクローンとして抽出される
目的・・ CCFinder の出力を元に、ギャップを含むクローンを抽出する
ギャップ
これらを1つのクローンとして抽出したい
2007/2/27 5
提案手法 ギャップを含むクローンを抽出する
CCFinder が見つけたコード片をグラフのノードとする
グラフマイニングアルゴリズムを用いて、多頻度グラフパターン(ギャップを含むクローン)を抽出する
2007/2/27 6
AGM(Apriori-based Graph Mining) アルゴリズムの概要
[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.
1
3
1
31 2
グラフ1 グラフ2
4 4
5
2
頂点の数が 1 の多頻度グラフパターンを見つける
2007/2/27 7
AGM(Apriori-based Graph Mining) アルゴリズムの概要
[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.
1
2
3
4
1
1
1
2
2
1
1
3
1
4
・・・・・
見つかった多頻度グラフパターンを組み合わせて、頂点の数が 1 つ多い多頻度グラフパターンの候補を生成する
2007/2/27 8
AGM(Apriori-based Graph Mining) アルゴリズムの概要
[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.
1
3
1
31 2
グラフ 1 グラフ 2
4 4
5
2
生成した候補が多頻度グラフパターンかを確認する
2007/2/27 9
AGM(Apriori-based Graph Mining) アルゴリズムの概要
[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.
1
3
1
31 2
グラフ 1 グラフ 2
4 4
5
2
これまでの操作を繰り返し、全ての多頻度グラフパターンを抽出する
2007/2/27 10
ギャップを含むクローン抽出手順1. CCFinder が出力するクローンの位置情報
を元に、各クローンのコード片をノードとするグラフを作成する
2. 作成したグラフ集合に対して、 AGM アルゴリズムを適用して多頻度グラフパターンを抽出し、それをギャップを含むクローンとする
3. ギャップを含むクローンの位置情報を出力する
2007/2/27 11
CCFinder が出力するクローンの位置情報からグラフを作成する
※ 図に書かれている数字は、何番目のクローンセットに含まれるコードクローンかを表す.
2
ファイル1
1
3
オーバーラップしている
2
ファイル2
1
2
ファイル2
1
2007/2/27 12
CCFinder が出力するクローンの位置情報からグラフを作成する
1
※ 図に書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.
ファイル 1に対するグラフ
2
ファイル1
1
32
ファイル2
1
2
ファイル2
1
2007/2/27 13
CCFinder が出力するクローンの位置情報からグラフを作成する
1 1
※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.
ファイル 1に対するグラフ
ファイル 2に対するグラフ
2
ファイル1
1
32
ファイル2
1
2
ファイル2
1
2007/2/27 14
CCFinder が出力するクローンの位置情報からグラフを作成する
1
2
1
※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.
ファイル 1に対するグラフ
ファイル 2に対するグラフ
2
ファイル1
1
32
ファイル2
1
2
ファイル2
1
2007/2/27 15
CCFinder が出力するクローンの位置情報からグラフを作成する
1
2
1
2
※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.
ファイル 1に対するグラフ
ファイル 2に対するグラフ
2
ファイル1
1
2
ファイル1
1
32
ファイル2
1
2
ファイル2
1
2007/2/27 16
CCFinder が出力するクローンの位置情報からグラフを作成する
1
2
1
2
※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.
ファイル 1に対するグラフ
ファイル 2に対するグラフ
2
ファイル1
1
2
ファイル1
1
32
2
ファイル2
1
2
ファイル2
1
3
※ 2と3はオーバーラップしているのでエッジを引かない
2007/2/27 17
多頻度グラフパターンを抽出し、それをギャップを含むクローンとする
1
2
1
23 2
ファイル 1に対するグラフ
ファイル 2に対するグラフ
3 3
5
囲んだ部分がギャップを含むクローン
2007/2/27 18
抽出したギャップを含むクローンの位置情報を出力する
1
2
1
2
ファイル 1に対するグラフ
ファイル 2に対するグラフ
3 3
ファイル1
ファイル2
濃いオレンジの部分がギャップ
2007/2/27 19
ギャップを含むクローン抽出手順(まとめ)
入力 : ギャップを含まないクローンの位置情報
出力:ギャップを含むクローンの位置情報
ファイル1
ファイル2
2
2
ファイル1
ファイル2
1 1
2
2
ファイル1
ファイル2
1 1
3
2007/2/27 20
実験 目的 : どのようなギャップを含むクローンが抽出され
るか調査する 対象 :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 21
実験結果EJE f2j jasmin javadjvu
編集が加えられたクローンセット数 4 7 7 4
内訳挿入・削除 2 7 7 4
変更 3 4 3 1編集が加えられていないクローンセット数 1 26 10 9
編集が加えられたクローンセット数の割合 80% 21% 41% 31%
ソフトウェアによって編集が加えられたクローンセット数の割合の違いが大きい編集が加えられていないクローンセットをフィルタリング出来るようにするなど改良の余地がある
2007/2/27 22
編集が加えられたクローンの例
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")));
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 stringCodeAttr doit = new CodeAttr();
// store refs in local variablesdoit.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 3doit.addInsn(new Insn(opc_bipush, 5));
クローンセット
クローンセット
文が挿入されている
緑太字:コードが変更された箇所 黒太字:コードが挿入された箇所
2007/2/27 23
編集が加えられていないクローンの例
public void reload( ) { Iterator iterator = reloadables.iterator(); while (iterator.hasNext()) { Reloadable reloadable = (Reloadable) iterator.next(); reloadable.reload(); } } public void store( ) { Iterator iterator = storers.iterator(); while (iterator.hasNext()) { 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 24
まとめと今後の課題 まとめ
グラフマイニングアルゴリズムを用いたギャップを含むクローン抽出手法を提案し、ツールを実装した
オープンソースソフトウェアに対してどのようなギャップを含むクローンが抽出されるか調査した
今後の課題 編集されていないクローンのフィルタリング バグ検出手法としての有益性評価
2007/2/27 25
2007/2/27 26
2007/2/27 27
コピー&ペーストによる再利用の 流れ
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 クローン
Gapped クローン
2007/2/27 28
コピー&ペーストによる再利用の 流れ
Exact クローン 完全に一致したコード片。ただし空白、改行、コメントなどの違いは考慮しない
Parameterized クローン 変数名、クラス名などのユーザ定義名の違いを除
き一致しているコード片 Gapped クローン
構文的に一致しない不一致コード(ギャップ( Gap))を部分的に含むコード片
2007/2/27 29
実験1:結果EJE f2j jasmin javadjvu
ファイル数 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 30
実験1:考察 クローンセット数が少なくても、ファイル数
が多ければ実行時間がかかっている AGM アルゴリズムでは各ファイルごとにグラフ
を作成するため 1 つのファイルにクローンが集中していると、
実行時間が格段にかかってしまう グラフのサイズが大きくなると、頻度計算などで時間がかかってしまうため
2007/2/27 31
実験2 抽出された Gapped クローンが有益かどうか
を判断するために、抽出されたものに挿入・削除・変更といった編集が加えられているかどうかを人手で判定
メトリクス値 RNR でフィルタリングして実験 値が小さいほど、繰り返し要素を多く含むクロー
ン 連続した変数宣言などのクローンをフィルタリン
グすることで、より効率的に分析作業が可能 閾値として 0.5 を用いる
2007/2/27 32
RNR: クローン内の重複した処理の少なさの度合い
RNR = 1 -∑
C S∈
Tokensrepeated(C)
∑ Tokensall(C)
Tokensrepeated(C) : クローン C 中の繰り返し部分のトークン数Tokensall(C) : クローン C 中の総トークン数
X A B A B A B YTokensrepeated = 4
Tokensall = 88 トークン
4 トークン
C S∈
S: クローンセットC: クローンセットの要素
直前の繰り返し
2007/2/27 33
クローン位置情報のフォーマット
#begin{set} (1番目のクローンセット)0.1 73,3,128 82,59,172 120.1 84,3,180 92,24,222 240.2 90,12,178 99,4,210 23#end{set}#begin{set} (2番目のクローンセット)0.2 101,3,215 122,14,252 240.3 71,3,114 87,29,167 20#end{set}#begin{set} (3番目のクローンセット)0.1 89,5,194 101,26,252 450.2 112,7,243 142,29,289 22#end{set}・・・・・・
フォーマットグループ ID. ファイル ID 開始行 ,開始カラム ,開始トークン 終了行 ,終了カラム ,終了トークン 繰り返し処理でないトークン数 0 . 1 73 , 3 , 128 82 , 59 , 172 12
2007/2/27 34
オーダー AGM アルゴリズム
グラフの平均ノード数が増えると指数関数的に増加
グラフ構築 O(n^2)
2007/2/27 35
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.