グラフマイニングアルゴリズムを用いた...

35
2007/2/27 1 ググググググググググググググググググ ググググググググググググググググググ 井井井井井 井井井井

Upload: prue

Post on 09-Jan-2016

37 views

Category:

Documents


1 download

DESCRIPTION

グラフマイニングアルゴリズムを用いた ギャップを含むクローン抽出手法の提案. 井上研究室 藤野陽平. コードクローン. ソースコード中に存在する同一,もしくは類似したコード片を同一システム中に持つコード片 ( 以降単にクローンと呼ぶ ) コピー & ペースト等により生成される ソフトウェア保守を困難にする バグ修正などコード変更をする際、全てのクローンに対して変更が必要 保守作業の手間が増大. クローンセット. コードクローン検出ツール CCFinder. クローンを対象とした保守支援ツール 検出ツール : CCFinder[1] 国内外の個人・組織に配布 - PowerPoint PPT Presentation

TRANSCRIPT

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

2007/2/27 1

グラフマイニングアルゴリズムを用いた

ギャップを含むクローン抽出手法の提案

井上研究室藤野陽平

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

2007/2/27 2

コードクローン ソースコード中に存在する同一,もしくは類似したコ

ード片を同一システム中に持つコード片 ( 以降単にクローンと呼ぶ )

コピー & ペースト等により生成される ソフトウェア保守を困難にする

バグ修正などコード変更をする際、全てのクローンに対して変更が必要

保守作業の手間が増大

クローンセット

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

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.

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

2007/2/27 4

CCFinder の問題点 問題点・・ギャップを含むクローンが抽出でき

ないので、効率的に分析ができない そうなるべきところが別々の短いクローンとして抽出される

目的・・ CCFinder の出力を元に、ギャップを含むクローンを抽出する

ギャップ

これらを1つのクローンとして抽出したい

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

2007/2/27 5

提案手法 ギャップを含むクローンを抽出する

CCFinder が見つけたコード片をグラフのノードとする

グラフマイニングアルゴリズムを用いて、多頻度グラフパターン(ギャップを含むクローン)を抽出する

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

2007/2/27 6

AGM(Apriori-based Graph Mining) アルゴリズムの概要

[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.

31 2

グラフ1 グラフ2

4 4

頂点の数が 1 の多頻度グラフパターンを見つける

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

2007/2/27 7

AGM(Apriori-based Graph Mining) アルゴリズムの概要

[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.

・・・・・

見つかった多頻度グラフパターンを組み合わせて、頂点の数が 1 つ多い多頻度グラフパターンの候補を生成する

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

2007/2/27 8

AGM(Apriori-based Graph Mining) アルゴリズムの概要

[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.

31 2

グラフ 1 グラフ 2

4 4

生成した候補が多頻度グラフパターンかを確認する

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

2007/2/27 9

AGM(Apriori-based Graph Mining) アルゴリズムの概要

[2] 猪口明博 , 鷲尾隆 , 元田浩 : 多頻度グラフマイニング手法の一般化 . 人工知能学会論文誌 ,vol19,No.5,pp. 368-378, 2004.

31 2

グラフ 1 グラフ 2

4 4

これまでの操作を繰り返し、全ての多頻度グラフパターンを抽出する

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

2007/2/27 10

ギャップを含むクローン抽出手順1. CCFinder が出力するクローンの位置情報

を元に、各クローンのコード片をノードとするグラフを作成する

2. 作成したグラフ集合に対して、 AGM アルゴリズムを適用して多頻度グラフパターンを抽出し、それをギャップを含むクローンとする

3. ギャップを含むクローンの位置情報を出力する

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

2007/2/27 11

CCFinder が出力するクローンの位置情報からグラフを作成する

※ 図に書かれている数字は、何番目のクローンセットに含まれるコードクローンかを表す.

ファイル1

オーバーラップしている

ファイル2

ファイル2

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

2007/2/27 12

CCFinder が出力するクローンの位置情報からグラフを作成する

※ 図に書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.

ファイル 1に対するグラフ

ファイル1

32

ファイル2

ファイル2

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

2007/2/27 13

CCFinder が出力するクローンの位置情報からグラフを作成する

1 1

※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.

ファイル 1に対するグラフ

ファイル 2に対するグラフ

ファイル1

32

ファイル2

ファイル2

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

2007/2/27 14

CCFinder が出力するクローンの位置情報からグラフを作成する

※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.

ファイル 1に対するグラフ

ファイル 2に対するグラフ

ファイル1

32

ファイル2

ファイル2

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

2007/2/27 15

CCFinder が出力するクローンの位置情報からグラフを作成する

※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.

ファイル 1に対するグラフ

ファイル 2に対するグラフ

ファイル1

ファイル1

32

ファイル2

ファイル2

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

2007/2/27 16

CCFinder が出力するクローンの位置情報からグラフを作成する

※ ノードに書かれている数字は、何番目のクローンセットに 含まれるコードクローンかを表す.

ファイル 1に対するグラフ

ファイル 2に対するグラフ

ファイル1

ファイル1

32

ファイル2

ファイル2

※ 2と3はオーバーラップしているのでエッジを引かない

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

2007/2/27 17

多頻度グラフパターンを抽出し、それをギャップを含むクローンとする

23 2

ファイル 1に対するグラフ

ファイル 2に対するグラフ

3 3

囲んだ部分がギャップを含むクローン

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

2007/2/27 18

抽出したギャップを含むクローンの位置情報を出力する

ファイル 1に対するグラフ

ファイル 2に対するグラフ

3 3

ファイル1

ファイル2

濃いオレンジの部分がギャップ

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

2007/2/27 19

ギャップを含むクローン抽出手順(まとめ)

入力 : ギャップを含まないクローンの位置情報

出力:ギャップを含むクローンの位置情報

ファイル1

ファイル2

ファイル1

ファイル2

1 1

ファイル1

ファイル2

1 1

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

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.

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

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%

ソフトウェアによって編集が加えられたクローンセット数の割合の違いが大きい編集が加えられていないクローンセットをフィルタリング出来るようにするなど改良の余地がある

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

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));

クローンセット

クローンセット

文が挿入されている

緑太字:コードが変更された箇所   黒太字:コードが挿入された箇所

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

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 つのクローンがオーバラップしている

ギャップを含むクローン

ギャップを含むクローン

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

2007/2/27 24

まとめと今後の課題 まとめ

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

オープンソースソフトウェアに対してどのようなギャップを含むクローンが抽出されるか調査した

今後の課題 編集されていないクローンのフィルタリング バグ検出手法としての有益性評価

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

2007/2/27 25

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

2007/2/27 26

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

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 クローン

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

2007/2/27 28

コピー&ペーストによる再利用の 流れ

Exact クローン 完全に一致したコード片。ただし空白、改行、コメントなどの違いは考慮しない

Parameterized クローン 変数名、クラス名などのユーザ定義名の違いを除

き一致しているコード片 Gapped クローン

構文的に一致しない不一致コード(ギャップ( Gap))を部分的に含むコード片

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

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

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

2007/2/27 30

実験1:考察 クローンセット数が少なくても、ファイル数

が多ければ実行時間がかかっている AGM アルゴリズムでは各ファイルごとにグラフ

を作成するため 1 つのファイルにクローンが集中していると、

実行時間が格段にかかってしまう グラフのサイズが大きくなると、頻度計算などで時間がかかってしまうため

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

2007/2/27 31

実験2 抽出された Gapped クローンが有益かどうか

を判断するために、抽出されたものに挿入・削除・変更といった編集が加えられているかどうかを人手で判定

メトリクス値 RNR でフィルタリングして実験 値が小さいほど、繰り返し要素を多く含むクロー

ン 連続した変数宣言などのクローンをフィルタリン

グすることで、より効率的に分析作業が可能 閾値として 0.5 を用いる

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

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: クローンセットの要素

直前の繰り返し

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

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

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

2007/2/27 34

オーダー AGM アルゴリズム

グラフの平均ノード数が増えると指数関数的に増加

グラフ構築 O(n^2)

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

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.