tf-idf 法と lsh アルゴリズムを 用 いた 関数単位のコードクローン検出法

24
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka Univ TF-IDF 法法 LSH 法法法法法法法法法法 法法法法法法法法法法法法法法法 法法法法法 法法法法

Upload: isi

Post on 23-Feb-2016

116 views

Category:

Documents


1 download

DESCRIPTION

TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法. 井上研究室 山中裕樹. コードクローン. ソースコード中に同一・類似した部分を持つ コード 片 ソースコードのコピーアンドペーストなどによって発生 本研究 では関数単位のコードクローンが対象. 関数 C. 関数 A. クローンペア. 関数 B. コードクローンの 定義 [1]. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

TF-IDF 法と LSH アルゴリズムを用いた

関数単位のコードクローン検出法

井上研究室

山中裕樹

Page 2: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

2Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

コードクローンソースコード中に同一・類似した部分を持つ

コード片►ソースコードのコピーアンドペーストなどによって

発生►本研究では関数単位のコードクローンが対象

クローンペア

関数 A

関数 B

関数 C

Page 3: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

3Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

コードクローンの定義 [1]

種類 意味

タイプ 1

レイアウト・空白・コメントの違いを除き完全に一致している

タイプ 2

タイプ 1 に加え変数名・型の違いを除き構文的に一致している

タイプ 3 タイプ 2 に加え文が挿入・削除・変更されている

タイプ 4 構文上異なる実装だが,類似処理を実行している[1]C. K. Roy, J. R. Cordy, R. Koschke. Comparison and evaluation of code clone

detection techniques and tools: a qualitative approach. Science of Computer Programming, Vol. 74, No. 7, pp. 470–495, 2009.

Page 4: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

4Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

種類 意味

タイプ 1

レイアウト・空白・コメントの違いを除き完全に一致している

タイプ 2

タイプ 1 に加え変数名・型の違いを除き構文的に一致している

タイプ 3 タイプ 2 に加え文が挿入・削除・変更されている

タイプ 4 構文上異なる実装だが,類似処理を実行している

int sum(int[] data){ int sum = 0; for(int i=0; i<data.length; i++){ sum = sum + data[i] ;

} return sum;}

int sum(int[] data){ int sum = 0; for(int i=0; i<data.length; i++){ sum = sum + data[i] ;

} return sum;}

コードクローン:タイプ 1

関数 A 関数 B

Page 5: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

5Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

種類 意味

タイプ 1

レイアウト・空白・コメントの違いを除き完全に一致している

タイプ 2

タイプ 1に加え変数名・型の違いを除き構文的に一致している

タイプ 3 タイプ 2 に加え文の挿入・削除・変更されている

タイプ 4 構文上異なる実装だが,類似処理を実行している

関数 A

int sum(int[] data){ int sum = 0; for(int i=0; i<data.length; i++){ sum = sum + data[i] ;

} return sum;}

double sum(double[] data){ double sum = 0; for(int j=0; j<data.length; j++){ sum = sum + data[j] ;

} return sum;}

コードクローン:タイプ 2

関数 B

Page 6: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

6Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

種類 意味

タイプ 1

レイアウト・空白・コメントの違いを除き完全に一致している

タイプ 2

タイプ 1 に加え変数名・型の違いを除き構文的に一致している

タイプ 3 タイプ 2に加え文が挿入・削除・変更されている

タイプ 4 構文上異なる実装だが,類似処理を実行している

int sum(int[] data){ int sum = 0; for(int i=0; i<data.length; i++){ sum = sum + data[i];

} return sum;}

int sum(int[] data){ int sum = 0; for(int i=0; i<data.length; i++){ sum += data[i]; } return sum;}

コードクローン:タイプ 3

関数 A 関数 B

Page 7: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

7Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

種類 意味

タイプ 1

レイアウト・空白・コメントの違いを除き完全に一致している

タイプ 2

タイプ 1 に加え変数名・型の違いを除き構文的に一致している

タイプ 3 タイプ 2 に加え文が挿入・削除・変更されている

タイプ 4 構文上異なる実装だが,類似処理を実行している

int sum(int[] data){ int sum = 0; for(int i=0; i<data.length; i++){ sum = sum + data[i];

} return sum;}

int sum(int[] data){ int sum = 0, i=0; while(i<data.length){ sum += data[i];   i++; } return sum;}

コードクローン:タイプ 4

関数 A 関数 B

Page 8: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

8Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

コードクローン検出の目的リファクタリング支援

一貫した修正漏れによるバグの検出(タイプ 3,4 )

Class A

hoge()

Class B

hoge()Class A

Class S

hoge()

Class Bクローンペア

メソッドの引上げ

int sum(int[] data){ if ( data == null) return null; ・・・}

int sum(int[] data){ // 例外処理漏れ ・・・}

例外処理の追加漏れ

Page 9: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

9Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

既存のコードクローン検出手法構文的な類似性に着目した手法

►CCFinder[2] など►メリット:タイプ 1,2 のコードクローンを高速

に検出可能►デメリット:タイプ 3,タイプ 4のコードクロー

ンの検出が困難

処理の意味的な類似性に着目した手法►MeCC[3] など►メリット:タイプ 1- タイプ 4 のコードクローン

を検出可能►デメリット:検出時間に膨大な時間がかかる

[2] T. Kamiya, S. Kusumoto, K. Inoue. CCFinder: a multilinguistic token-based code clone detection system for large scale source code. IEEE Trans. Softw. Eng., Vol. 28, No. 7, pp. 654–670, 2002. [3] H. Kim, Y. Jung, S. Kim, K. Yi. MeCC: memory comparison-based clone detector. In Proc. of ICSE ’11, pp. 301–310, 2011.

Page 10: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

10Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

提案手法の概要関数中のワードに重み付けを行い特徴ベクトル

を計算►識別子名を構成する単語 ( 関数名,変数名 )►予約語に含まれる単語 ( if, while )

近似アルゴリズムを用いて特徴ベクトルをクラスタリング

全タイプの関数単位のコードクローンを高速に検出

Page 11: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

11Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

検出アルゴリズム

ワード 回数xxx 3yyy 2

・・・・・・

Function AFunction B

ワード 回数xxx 2yyy 4

・・・ ・・・

Function CFunction DFunction E

類似度 関数対クロー

0.95 Function A ✓Function B

0.70 Function C  Function D

0.70 Function C  Function E

0.90 Function D ✓Function E・・・ ・・・ ・・・

},,,{ 321  aaa

},,,{ 321  bbb

Function A

Function B Function B

Function A

STEP1 STEP2 STEP3 STEP4

ソースコード

ワードリスト

特徴ベクトル

クラスタ クローンペアリスト

STEP1 :各関数からワードの抽出STEP2: TF-IDF 法を用いて関数を特徴ベクトルに変換STEP3: LSH アルゴリズムを用いて特徴ベクトルをクラスタリングSTEP4: クラスタ中の特徴ベクトル間の類似度を計算

Page 12: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

12Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

STEP1 :ワードの抽出各関数から識別子名・予約語を抽出

►2 文字以下の識別子は全て同一のワード(メタワード)として扱う

►複数の単語の場合,区切り文字や大文字で分割例: dataSize data + size⇒

ワード 出現回数

予約語int 4for 1

return 1

分割した識別子名

data 4sum 4size 2

メタワード 4

int sum(int[] data, int dataSize){ int sum = 0; for(int i=0; i<dataSize; i++) sum += data[i]; return sum;}

関数 A のソースコード関数 A のワードリスト

Page 13: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

13Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

STEP2 :特徴ベクトルの計算

TF-IDF 法を利用►文書中の単語に関する重み付けの手法►TF値と IDF値の積で表される

各ワードの重みを特徴量として各関数を特徴ベクトルに変換

関数中のワードの出現頻度

ソースコード全体のワードの希少さ×

TF値 IDF値

Page 14: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

14Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

STEP3 :特徴ベクトルのクラスタリング

LSH(Locality-Sensitive Hashing)[4] を利用►近似最近傍探索アルゴリズムの一つ

ハッシュ関数を用いて高速にクラスタリング可能►クローンペアと成りうる候補を絞ることが目的

関数名 特徴ベクトルFunction A (5,4,2,1, ・・・ )

Function B (0,0,2,2, ・・・ )

Function C (0,0,2,2, ・・・ )

Function D (3,4,2,1, ・・・ )

Function E (5,4,2,3, ・・・ )

Function F (0,1,2,2, ・・・ )

・・・ ・・・各関数の特徴ベクトル

クラスタリング

関数のクラスタ

[4] P. Indyk, R. Motwani. Approximate nearest neighbors: towards removing the curse of dimensionality. In Proc. of STOC ’98, pp. 604-613, 1998.

Function AFunction DFunction F

Function BFunction CFunction E

Page 15: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

15Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

STEP4: ベクトル間の類似度計算各クラスタ内で特徴ベクトル間の類似度を

計算►コサイン類似度を利用►特徴ベクトル 間の類似度の計算方法

閾値( 0.9 )以上であればクローンペアとして検出

ba ,

Page 16: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

16Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

評価実験実験 1 :ベンチマークを用いた検出性の評価

►本手法でコードクローンを検出することができるか

実験 2 :既存手法との比較実験►検出時間と検出精度の比較

実験 3 :検出したコードクローンの調査►本手法でどのようなタイプ 4 のコードクローンを検

出できたか

Page 17: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

17Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験 1 :検出性の評価Roy らのベンチマーク [5] を利用

►タイプ 1- タイプ 4 の 16 個のクローンペアが用意

全タイプのコードクローンを検出することを確認

タイプ1

タイプ2

タイプ3

タイプ4

ベンチマーク

3 4 5 4

検出結果 3 2 5 4

[5] C. K. Roy, J. R. Cordy, R. Koschke. Comparison and evaluation of code clone detection techniques and tools: a qualitative approach. Science of Computer Programming, Vol. 74, No. 7, pp.470-495, 2009.

Page 18: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

18Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験 2 :既存手法との比較メモリベースの検出ツール MeCC と比較

►タイプ 1- タイプ 4 の関数単位のコードクローン検出

MeCC の評価実験で利用された OSS に適用►検出精度・検出時間を比較プロジェクト名 言語 サイズ バー

ジョンApacheHTTPD C 343KLOC 2.2.14

Python C 435KLOC 2.5.1PostgreSQL C 937KLOC 8.5.1

Page 19: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

19Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

検出精度の比較結果適合率と各タイプの正解検出数を比較

プロジェクト名

適合率検出クローン

タイプ1

タイプ2

タイプ3

タイプ4

本手法

ApacheHTTPD 95.4% 71 100 190 11Python 94.5% 19 103 159 21

PostgreSQL 94.7% 57 230 341 17合計 94.6% 147 433 690 49

MeCC

ApacheHTTPD 87.5% 2 84 71 10Python 85.3% 3 127 82 13

PostgreSQL 83.1% 9 120 88 14合計 85.0% 14 331 241 37• MeCC よりも高い適合率で検出可能であ

る• 各タイプの検出数も MeCC を上回ってい

Page 20: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

20Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

検出時間の比較結果

ApacheHTTPD Python PostgreSQL

本手法 1m43s 2m13s 4m39s

MeCC 310m34s 65m26s 428m32s

MeCC よりも高速な検出を行うことが可能

MeCC の実行環境と同一のものを利用►Ubuntu 64-bit ( RAM: 8.0GB, CPU: Intel Xeon 2.4GHz)

Page 21: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

21Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験 3 :コードクローンの実例(1/2)

繰り返し処理の置き換えstatic const XML_Char * FASTCALLpoolCopyString(STRING_POOL *pool, const   XML_Char *s){ // 例外処理漏れの可能性がある ! do { if (!poolAppendChar(pool, *s)) return NULL; }while (*s++); s = pool->start; poolFinish(pool); return s;}

static const XML_Char *poolCopyStringN(STRING_POOL *pool, const     XML_Char *s, int n){ if (!pool->ptr && !poolGrow(pool)) return NULL; for (; n > 0; --n, s++) { if (!poolAppendChar(pool, *s)) return NULL; } s = pool->start; poolFinish(pool); return s;}

for 文を用いた繰り返し do-while 文を用いた繰り返し

Page 22: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

22Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験 3 :コードクローンの実例(2/2)

文の並び替え static PyObject *dequereviter_next(dequeiterobject *it){ PyObject *item; if (it->counter == 0) return NULL; if (it->deque->state != it->state) { it->counter = 0; PyErr_SetString(PyExc_RuntimeError,

"deque mutated during iteration"); return NULL; } assert (!(it->b == it->deque->leftblock && it->index < it->deque->leftindex));

・・・

}

static PyObject *dequeiter_next(dequeiterobject *it){ PyObject *item; if (it->deque->state != it->state) { it->counter = 0; PyErr_SetString(PyExc_RuntimeError, "deque mutated during iteration"); return NULL; } if (it->counter == 0) return NULL; assert (!(it->b == it->deque->rightblock &&

it->index > it->deque->rightindex));

・・・

}

例外処理の位置が異なる

Page 23: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

23Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

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

►全タイプの関数単位のコードクローン検出法を提案TF-IDF 法を利用して関数を特徴ベクトルに変換LSH アルゴリズムを用いて特徴ベクトルをクラスタリ

ング►既存手法と比較して高精度・高速な検出を実現

今後の課題►LSI ( Latent Semantic Indexing )などの手法との

比較►様々なプログラミング言語に対応►他のコードクローン検出ツールとの比較

Page 24: TF-IDF 法と LSH アルゴリズムを 用 いた 関数単位のコードクローン検出法

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ご清聴ありがとうございました