32
ソソソソソソソソソ ソソソソソソソソソソソソソソソソソソソソ 奈奈奈奈奈奈奈奈奈奈奈奈奈 奈奈奈奈奈奈奈 奈奈奈奈 奈奈奈奈奈奈奈奈奈奈 ○ 奈奈奈 奈奈奈奈 奈奈奈奈 奈奈奈奈 奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈

ソースコード流用の コードクローンメトリクスに基づく検出手法

Embed Size (px)

DESCRIPTION

ソースコード流用の コードクローンメトリクスに基づく検出手法. † 奈良先端科学技術大学院大学 情報科学研究科 ‡ 大阪大学 大学院情報科学研究科 ○岡原聖 †  真鍋雄貴 ‡  山内寛己 † 門田暁人 †  松本健一 †. 背景. 出荷前にソースコード流用の有無を 検出する技術が必要とされている. [ 1 ] : “ 「 USB 版 Windows 7 」作成ツールに GPL コード  Microsoft が謝罪 ”, http://www.itmedia.co.jp/news/articles/0911/16/news026.html - PowerPoint PPT Presentation

Citation preview

Page 1: ソースコード流用の コードクローンメトリクスに基づく検出手法

ソースコード流用のコードクローンメトリクスに基づく検出

手法† 奈良先端科学技術大学院大学 情報科学研究科

‡ 大阪大学 大学院情報科学研究科○ 岡原聖†  真鍋雄貴‡  山内寛己†

門田暁人†  松本健一†

知能ソフトウェア工学研究会

Page 2: ソースコード流用の コードクローンメトリクスに基づく検出手法

背景

• 近年,オープンソースソフトウェア( OSS )を流用したソフトウェア開発が増えている– 開発コストの低減,高信頼性の確保

• 開発の外注等により OSS のソースコードが意図せず混入し,ライセンス違反を犯してしまうケースがある– Microsoft が外注した Windows7 への Upgrade 支援ツー

ル [1]

– SCEI が開発した PS2 ゲーム「 ICO 」のライブラリ [2][1] : “「 USB 版 Windows 7 」作成ツールに GPL コード  Microsoft が謝罪” , http://www.itmedia.co.jp/news/articles/0911/16/news026.html[2] : “ PlayStation 2 Game ICO Violates the GPL”, http://news.slashdot.org/article.pl?sid=07/11/28/0328215

2知能ソフトウェア工学研究会

出荷前にソースコード流用の有無を検出する技術が必要とされている

Page 3: ソースコード流用の コードクローンメトリクスに基づく検出手法

ソースコード流用とコードクローン

• 流用したコードはコードクローン(以下クローン)として表れる

3知能ソフトウェア工学研究会

流用元の OSS

コードの流用

流用先のソフトウェア

コードクローン(重複するコード列)

Page 4: ソースコード流用の コードクローンメトリクスに基づく検出手法

ソースコード流用検出の難しさ

• クローンは独立に開発されたソフトウェア間でも存在する– 定型処理,偶然の一致など

4知能ソフトウェア工学研究会

OSS出荷するソフトウェア

コードクローン(重複するコード列)

GUI 生成の定型処理

流用の事実はない GUI 生成の定型処理どの程度の量のクローンが検出されたならば

流用とみなせるかを明らかにする必要がある

  1 .クローンの量を測るメトリクスが必要  2 .メトリクス値について流用とみなす基準値が必要

Page 5: ソースコード流用の コードクローンメトリクスに基づく検出手法

研究目的,アプローチ

• 研究目的– クローンの量によりソースコード流用の有無を

判断する方法を確立する• 任意の2つのソフトウェア間で,一方が他方のソースコー

ドを流用しているか否かを定量的に判断する

• アプローチ– 2つのクローンメトリクスを提案する

• 最大クローン長• 部分類似度

– 各メトリクスの流用と見なす基準値(閾値)を求める• 多数の OSS を用いて実験的に求める

5知能ソフトウェア工学研究会

Page 6: ソースコード流用の コードクローンメトリクスに基づく検出手法

本研究で用いるクローン

• クローンの種類– Exact Clone

完全一致のクローン

– Renamed Clone変数名や空行の不一致を許容するクローン

– Gapped Cloneコードの削除,追加を許容するクローン

知能ソフトウェア工学研究会 6

流用後に変数名や定数名などを変更することがありえるため

Page 7: ソースコード流用の コードクローンメトリクスに基づく検出手法

Renamed Clone の検出方法

知能ソフトウェア工学研究会 7

• トークン解析プログラム言語の字句規則に従いトークンに分割する

• トークン変換変数 (p) ,定数 (i) ,型 (t) 種類毎にトークンを置換する

• マッチング一致する部分列をクローンとする

------------------------------------------------------------------------------------

...

...

...

...

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

-----------------------------------------------------------------------------

Page 8: ソースコード流用の コードクローンメトリクスに基づく検出手法

Renamed Clone の検出方法

知能ソフトウェア工学研究会 8

• トークン解析プログラム言語の字句規則に従いトークンに分割する

• トークン変換変数 (p) ,定数 (i) ,型 (t) 種類毎にトークンを置換する

• マッチング一致する部分列をクローンとする

...

...

...

...

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

------------------------------------------------------------------------------------

-----------------------------------------------------------------------------

Page 9: ソースコード流用の コードクローンメトリクスに基づく検出手法

Renamed Clone の検出方法

知能ソフトウェア工学研究会 9

• トークン解析プログラム言語の字句規則に従いトークンに分割する

• トークン変換変数 (p) ,定数 (i) ,型 (t) 種類毎にトークンを置換する

• マッチング一致する部分列をクローンとする

...

...

...

...

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

p = i

p = p - p ;

;

if ( p

p = i ;

> i ) p = i ;

}

p = p - p ;

if ( p

while

> i ) p = i ;

( p > i ) {

------------------------------------------------------------------------------------

-----------------------------------------------------------------------------

Page 10: ソースコード流用の コードクローンメトリクスに基づく検出手法

Renamed Clone の検出方法

知能ソフトウェア工学研究会 10

• トークン解析プログラム言語の字句規則に従いトークンに分割する

• トークン変換変数 (p) ,定数 (i) ,型 (t) 種類毎にトークンを置換する

• マッチング一致する部分列をクローンとする

...

...

...

...

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

p = i

p = p - p ;

;

if ( p

p = i ;

> i ) p = i ;

}

p = p - i ;

if ( p

while

> i ) p = i ;

( p > i ) {

p = i

p = p - p ;

;

if ( p

p = i ;

> i ) p = i ;

}

p = p - p ;

if ( p

while

> i ) p = i ;

( p > i ) {

------------------------------------------------------------------------------------

-----------------------------------------------------------------------------

Page 11: ソースコード流用の コードクローンメトリクスに基づく検出手法

流用検出のためのクローンメトリクス (1)最大クローン長 [3]

• 定義– 検出されたクローンで最大のトークン数

知能ソフトウェア工学研究会 11

• 最大クローン長と流用の関係– 最大クローン長が大きい:流用の可能性は高い– 最大クローン長が小さい:流用の可能性は低い

[3] :岡原 聖 , 真鍋 雄貴 , 山内 寛己 , 門田 暁人 , 松本 健一 , 井上 克郎 , “ コードクローンの長さに基づくプログラム盗用確率の実験的算出 ,” 信学技報 , No.SS2008-40, pp.7-11, Oct. 2008.

ファイル群 Bファイル群 A

最大クローン 最大クローン長

Page 12: ソースコード流用の コードクローンメトリクスに基づく検出手法

流用検出のためのクローンメトリクス (2)部分類似度

知能ソフトウェア工学研究会 12

• 定義– 最大クローンを含むファイルにのみ着目した類似度

最大クローン長  MLCC

||||

2

ba

MLCCPSim

ファイルの長さ | b|

ファイルの長さ | a|

算出式

ファイル群 Bファイル群 A

ファイル全体を流用していなくとも,部分的な流用が存在すると部分類似度は大きくな

Page 13: ソースコード流用の コードクローンメトリクスに基づく検出手法

(例:最大クローン長 )

流用の判断方法

• 閾値を超えるクローンを流用あり(流用なし)と判断する

知能ソフトウェア工学研究会 13

30 50 70 90 110

130

150

170

190

210

230

250

270

290

0.0 0.1 0.2 0.3 0.4 0.5

0.6 0.7 0.8 0.9 1.0

クローンメトリクスの大きさ

流用

の割合

流用あり閾値流用なし閾値

検出されるクローンは流用である

検出されるクローンは流用ではない

これらの閾値は理論的に求めることは不可能

1 .多数のソフトウェアを集めて正解集合を作成する2 .正解集合を用いて実験的に閾値を求める

Page 14: ソースコード流用の コードクローンメトリクスに基づく検出手法

閾値の決定方法

• 閾値は必ず流用あり(流用なし)と判断できるもの: false-positive なし– 適合率,再現率を用いて閾値を導出

• 適合率– 検出結果中に含まれる正検出の割合を示す指標

• 再現率– 正解集合のうち,どの程度正検出できたかを示す指標

知能ソフトウェア工学研究会 14

適合率が 1 かつ 再現率が最大値となる各メトリクスの値を閾値とする

Page 15: ソースコード流用の コードクローンメトリクスに基づく検出手法

閾値の導出実験

• 実験目的– 流用の判断基準となる閾値を,

多数の OSS を用いて実験的に導出する

• 実験環境– クローン検出ツール

• CCFinderX[4]

– 実験対象のソフトウェア• 50件の OSS• ドメイン: Security, Audio, Game など• 開発言語: C 言語, C++

知能ソフトウェア工学研究会 15

[4] : “ CCFinderホームページ” , http://www.ccfinder.net/ccfinderx-j.html

Page 16: ソースコード流用の コードクローンメトリクスに基づく検出手法

閾値の導出における実験手順

1. 50件の OSS を用いて,正解集合を作成する– プログラムの構造,コメント文,クローンの内容などから判

断した

2. OSS の全ての組合せにおいてクローンを検出する

3. 最大クローン長,部分類似度を算出する

4. 流用あり(流用なし)の適合率,再現率をそれぞれ算出する 知能ソフトウェア工学研究会 16

組合わせの分類 組合せ件数

ソースコード流用ありの組合せ 121

ソースコード流用なしの組合せ 648

クローンのない組合せ 456

Page 17: ソースコード流用の コードクローンメトリクスに基づく検出手法

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

30 50 70 90 110

130

150

170

190

210

230

250

270

290

割合

流用ありの閾値(最大クローン長)

適合率

再現率

閾値の導出結果

知能ソフトウェア工学研究会 17

• 流用あり(最大クローン長)

流用あり閾値

Page 18: ソースコード流用の コードクローンメトリクスに基づく検出手法

閾値の導出結果

知能ソフトウェア工学研究会 18

• 流用なし(最大クローン長)30 50 70 90 110

130

150

170

190

210

230

250

270

290

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

適合率 再現率

流用なしの閾値(最大クローン長)

割合

流用なし閾値

Page 19: ソースコード流用の コードクローンメトリクスに基づく検出手法

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

0.00

0.10

0.20

0.30

0.40

0.50

0.60

0.70

0.80

0.90

1.00

割合

流用ありの閾値(部分類似度)

適合率

再現率

閾値の導出結果

知能ソフトウェア工学研究会 19

• 流用あり(部分類似度)

流用あり閾値

Page 20: ソースコード流用の コードクローンメトリクスに基づく検出手法

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

0.00

0.10

0.20

0.30

0.40

0.50

0.60

0.70

0.80

0.90

1.00

割合

流用なしの閾値(部分類似度)

適合率

再現率

閾値の導出結果

知能ソフトウェア工学研究会 20

• 流用なし(部分類似度)

流用なし閾値

Page 21: ソースコード流用の コードクローンメトリクスに基づく検出手法

閾値の導出結果

知能ソフトウェア工学研究会 21

• 流用あり閾値– 両メトリクスとも半数以上の流用を検出できている

• 流用なし閾値– 部分類似度の流用なし閾値を導出できなかった

2 つのメトリクスを併用して流用を検出することで

検出割合が向上するかを確認する

最大クローン長流用あり

部分類似度流用あり

最大クローン長流用なし

部分類似度流用なし

検出できた件数 91 72 421 -

検出できなかった件数

30 49 227 -

総件数 121 648

Page 22: ソースコード流用の コードクローンメトリクスに基づく検出手法

追実験の結果

• 結果– 最大クローン長で検出できなかった 30件の流用のうち,11件を流用として検出できた

知能ソフトウェア工学研究会 22

作成した流用あり正解集合 121件のうち,102件(約 84% )を false-positive なしで検出

できた

最大クローン長流用あり

部分類似度流用あり

最大クローン長流用なし

部分類似度流用なし

検出できた件数 91 72 421 -

検出できなかった件数

30 49 227 -

総件数 121 648

Page 23: ソースコード流用の コードクローンメトリクスに基づく検出手法

メトリクスを併用して検出できた流用

知能ソフトウェア工学研究会 23

/* Splice in "list" into "head" */static inline void glame_list_splice(struct glame_list_head *list, struct glame_list_head *head){  struct glame_list_head *first = list->next;

  if (first != list) {   struct glame_list_head *last = list->prev;   struct glame_list_head *at = head->next;     first->prev = head;   head->next = first;     last->next = at;   at->prev = last;  }}

/* * Splice in "list" into "head" */static INLINE void list_splice(struct list_head *list, struct list_head *head){  struct list_head *first = list->next;

  if (first != list) {   struct list_head *last = list->prev;   struct list_head *at = head->next;

   first->prev = head;   head->next = first;

   last->next = at;   at->prev = last;  }}

最大クローン長  59 ,部分類似度  0.32

ファイル長さ:141

ファイル長さ:223

Page 24: ソースコード流用の コードクローンメトリクスに基づく検出手法

まとめ,今後の課題

• まとめソースコード流用のクローンメトリクスを用いた検出手法を提案した– 最大クローン長と部分類似度の流用あり閾値,

流用なし閾値を導出した– 流用あり閾値を用いて約 84% の流用を

false-positive なしで検出できた

• 今後の課題流用あり(流用なし)検出の精度向上を目指す– 他のクローンメトリクスを調査する

知能ソフトウェア工学研究会 24

Page 25: ソースコード流用の コードクローンメトリクスに基づく検出手法

知能ソフトウェア工学研究会 25

Page 26: ソースコード流用の コードクローンメトリクスに基づく検出手法

知能ソフトウェア工学研究会 26

Page 27: ソースコード流用の コードクローンメトリクスに基づく検出手法

関連研究

• コードクローンを用いた手法: JPlag[4]

– クローンに基づいた「ソースコード間の類似度」を用いる

• Jplag の問題点– ソースコードの一部分だけを利用する流用を,

流用ありと判断することが難しい

知能ソフトウェア工学研究会 27

[4] : L. Prechelt, G. Malpohl, and M.Philippsen, “Finding Plagiarisms among a Set of Programs with JPlag,” J.Universal Computer Science, vol.8, no.11, pp.1016-1038, Nov. 2002.

ファイル群 Bファイル群 A

クローン

Page 28: ソースコード流用の コードクローンメトリクスに基づく検出手法

関連研究

• バースマークを用いた手法– バースマークとは

クラスの継承関係,クラスの出現回数,クラスの実行順序などのプログラムの特徴量

– バースマークを併用して流用(盗用)の検出を行う

• バースマークの問題点– 流用の検出を行う者(PM,品質管理実施者など)

が定性的に判断する必要がある• 一意に決定することが困難である

– ソフトウェア全体での判断になる

知能ソフトウェア工学研究会 28

[5] :玉田 春昭 , 神崎 雄一郎 , 中村 匡秀 , 門田 暁人 , 松本 健一 , ``Java クラスファイルからプログラム指紋を抽出する方法の提案 '', 信学技報 情報セキュリティ研究会 , Vol. ISEC2003-29, pp.127--133, July 2003.

Page 29: ソースコード流用の コードクローンメトリクスに基づく検出手法

本研究の使用用途

• ソフトウェアの開発委託元が,開発委託先で流用を行っていないかの確認

• 学生の演習課題でコピーアンドペーストを行っていないかの確認

• 民事裁判での証拠– 裁判では互いの資料提出があるため,コードクロー

ンを利用することは可能

知能ソフトウェア工学研究会 29

Page 30: ソースコード流用の コードクローンメトリクスに基づく検出手法

人手によるコスト

• ソフトウェア間でクローン検出を行うと,多数のクローンが検出される– コストが非常に高いことが予想される

知能ソフトウェア工学研究会 30

目安となる閾値が存在することで,人手による判断を行うクローンを減少出来る

Page 31: ソースコード流用の コードクローンメトリクスに基づく検出手法

ソースコード流用による損害賠償

• CAおよび 1999 年に CA が買収した米 PLATINUM technology International で勤務経験のあるプログラマやソフトウエア開発者を雇用して盗用を行う– 賠償内容)約 2億ドルの損害賠償および恒久的差し止めを求める(継続中)

• Mark Zuckerberg が ConnectU の知的財産権およびコードを盗んでこの巨大人気ソーシャルネットワークを構築– 賠償内容)約 6500万ドルの損害賠償を受け取る

知能ソフトウェア工学研究会 31

Page 32: ソースコード流用の コードクローンメトリクスに基づく検出手法

検出できなかった流用

知能ソフトウェア工学研究会 32

if (size == 0) return NULL;   /* no allocation required */

/* Allocate combined header + user data storage. */{ register pointer new = malloc (sizeof (header) + size); /* address of header */

((header *)new)->h.next = last_alloca_header; ((header *)new)->h.deep = depth;

last_alloca_header = (header *)new;

/* User storage begins just after header. */

return (pointer)((char *)new + sizeof(header));}

if (size == 0)  return NULL;   /* No allocation required. */

/* Allocate combined header + user data storage. */{ register pointer new = malloc (sizeof (header) + size);  /* Address of header. */

  ((header *) new)->h.next = last_alloca_header;  ((header *) new)->h.deep = depth;

  last_alloca_header = (header *) new;

  /* User storage begins just after header. */

  return (pointer) ((char *) new + sizeof (header));}

最大クローン長  78 ,部分類似度  0.085

ファイル長さ:636

ファイル長さ:1191