22
奈奈奈奈奈奈奈奈奈奈奈奈奈 奈奈奈奈奈奈奈 奈奈奈奈 奈奈奈奈奈奈奈奈奈奈 ○ 奈奈奈 奈奈奈奈 奈奈奈奈 奈奈奈奈 奈奈奈奈奈奈奈 奈奈奈奈奈奈奈奈奈奈奈奈奈奈 奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈 2008 奈 12 奈 18 奈 奈奈奈奈奈奈奈奈奈奈奈奈奈奈

コードクローンの長さに基づく プログラム盗用確率の実験的算出

Embed Size (px)

DESCRIPTION

コードクローンの長さに基づく プログラム盗用確率の実験的算出. † 奈良先端科学技術大学院大学 情報科学 研究科 ‡ 大阪大学 大学院情報科学研究科 ○岡原聖 †  真鍋雄貴 ‡  山内 寛 己 † 門田暁人 †  松本健一 †  井上克郎 ‡. 背景. オープンソースソフトウェアの普及に伴い, プログラム盗用が問題となっている エプソンコーワが提供している Linux 向けの プリンタ ドライバで GPL 違反を起こした事例 AppStore で提 供されている iPhone アプリ「 Mocha Remote Desktop 」が GPL 違反していた事例 - PowerPoint PPT Presentation

Citation preview

Page 1: コードクローンの長さに基づく プログラム盗用確率の実験的算出

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

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

門田暁人†  松本健一†  井上克郎‡

コードクローンの長さに基づくプログラム盗用確率の実験的算出

2008 年 12 月 18 日

ソフトウェアサイエンス研究会

Page 2: コードクローンの長さに基づく プログラム盗用確率の実験的算出

2

背景

• オープンソースソフトウェアの普及に伴い,プログラム盗用が問題となっている– エプソンコーワが提供している Linux 向けのプリン

タドライバで GPL 違反を起こした事例

– AppStore で提供されている iPhone アプリ「 Mocha Remote Desktop 」が GPL 違反していた事例

• プログラム盗用を検出する技術が必要とされる.

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

Page 3: コードクローンの長さに基づく プログラム盗用確率の実験的算出

3

プログラム盗用検出の既存手法

• ソフトウェアバースマーク– ソフトウェアが持つプログラムの特徴を抽象化して

表現したもの– バースマークが類似しているプログラムは盗用の疑

いありと判断する.

• コードクローン– プログラムテキスト中の一致または類似した部分の

こと– プログラム間にまたがったクローンが多くみられる

場合に盗用の疑いありと判断する.

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

既存手法の問題点盗用の「疑いあり」というのが曖昧で

ある.どの程度の確からしさがあるのか不

明.

Page 4: コードクローンの長さに基づく プログラム盗用確率の実験的算出

4

目的とアプローチ

• 目的– プログラム盗用の有無を確率的に求める.

• アプローチ– プログラム間にまたがるクローンの長さを盗

用の根拠とする– 多数のプログラムを題材として,実験的に

「盗用確率」を求める– 盗用と流用は区別しない

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

Page 5: コードクローンの長さに基づく プログラム盗用確率の実験的算出

5

仮説

• 仮説1プログラム間で見つかるクローンが長いほど盗用(流用)が行われた可能性が高い.

• 仮説2短いクローンは,盗用(流用)の有無にかかわらず生じる.– 定型処理– 偶然の一致など

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

盗用(流用)でないクローンの実態をまず明らかにする必要がある.

どの程度の長さのクローンであれば,定型処理や偶然により発生するか.

↓定型処理や偶然では起こりえないような

長さのクローンが見つかったならば,盗用(流用)が行われたと判断できる.

Page 6: コードクローンの長さに基づく プログラム盗用確率の実験的算出

6

実験目的

• 定型処理などの理由で発生するクローンの長さと検出確率の関係を明らかにする.– この検出確率を「定型クローン検出確率」と

する

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

0 20 40 60 80 100 120 140 160 180 2000

0.2

0.4

0.6

0.8

1

ソフトウェア間コードクローンの長さ

コー

ドク

ロー

ン検

出確

盗用(流用)確率 = 1- 定型クローン検出確率

とみなす.

Page 7: コードクローンの長さに基づく プログラム盗用確率の実験的算出

7

実験環境

• クローン検出ツール– CCFinderX[1]

• 実験対象– GPL のオープンソースソフトウェア 100 件

• 開発言語: C または C++• ドメイン: Audio, Game, Security など

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

[1] CCFinderX :” http://www.ccfinder.net/ccfinderx-j.html”

Page 8: コードクローンの長さに基づく プログラム盗用確率の実験的算出

8

実験環境

• クローン検出ツール– CCFinderX[1]

• 実験対象– GPL のオープンソースソフトウェア 100 件

• 開発言語: C または C++• ドメイン: Audio, Game, Security など

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

[1] CCFinderX :” http://www.ccfinder.net/ccfinderx-j.html”

Page 9: コードクローンの長さに基づく プログラム盗用確率の実験的算出

9

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

CCFinderX のクローン検出手順

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

• トークン変換– 変数 (p), 定数 (i), 型 (t) といった種類ごとにトークンを置換する

• マッチング– 一致する部分列を探して,クローンとして認識する

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

...

...

...

...

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

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

Page 10: コードクローンの長さに基づく プログラム盗用確率の実験的算出

10

CCFinderX のクローン検出手順

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

• トークン変換– 変数 (p), 定数 (i), 型 (t) といった種類ごとにトークンを置換する

• マッチング– 一致する部分列を探して,クローンとして認識する

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

...

...

...

...

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 11: コードクローンの長さに基づく プログラム盗用確率の実験的算出

11

CCFinderX のクローン検出手順

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

• トークン変換– 変数 (p), 定数 (i), 型 (t) といった種類ごとにトークンを置換する

• マッチング– 一致する部分列を探して,クローンとして認識する

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

...

...

...

...

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 12: コードクローンの長さに基づく プログラム盗用確率の実験的算出

12

CCFinderX のクローン検出手順

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

• トークン変換– 変数 (p), 定数 (i), 型 (t) といった種類ごとにトークンを置換する

• マッチング– 一致する部分列を探して,クローンとして認識する

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

...

...

...

...

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 13: コードクローンの長さに基づく プログラム盗用確率の実験的算出

13

CCFinderX のクローン検出手順

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

• トークン変換– 変数 (p), 定数 (i), 型 (t) といった種類ごとにトークンを置換する

• マッチング– 一致する部分列を探して,クローンとして認識する

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

...

...

...

...

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

}

x = b - c ;

if ( x

while

> 0 ) n = 0 ;

( b > 0 ) {

y = 0

x = y - z ;

;

if ( x

z = 0 ;

> 0 ) n = 1 ;

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

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

トークン数をクローン長とする

Page 14: コードクローンの長さに基づく プログラム盗用確率の実験的算出

14

実験環境

• クローン検出ツール– CCFinderX[1]

• 実験対象– GPL のオープンソースソフトウェア 100 件

• 開発言語: C または C++• ドメイン: Audio, Game, Security など

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

[1] CCFinderX :” http://www.ccfinder.net/ccfinderx-j.html”

プログラム盗用(流用)の有無の確認

Page 15: コードクローンの長さに基づく プログラム盗用確率の実験的算出

15

プログラム盗用(流用)の確認手順

1. CCFinderX を用いてクローン検出– 検出される最小のクローン長: 30

2. 検出されたクローンを目視で確認– クローン長の長いクローンから確認– クローン長が 80 未満のクローンは数が多すぎたた

め未確認

3. プログラム盗用(流用)のあった 54 件のソフトウェアを除外– 実験対象となるソフトウェアは 46 件

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

Page 16: コードクローンの長さに基づく プログラム盗用確率の実験的算出

16

プログラム盗用(流用)とみなした一例

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

--------------xalloca_free (ctx.y);xalloca_free (ctx.next);xalloca_free (ctx.notfirst);xalloca_free (ctx.oddflag);xalloca_free (x);--------------

--------------free(e_inv.c);free(e_res.c);free(e_con.c);free(e_post.c);free(e_fil.c);--------------

引数の数が同じため検出されている

コメントの内容を確認することで

ライセンスに従っていることを確認

処理の記述形式を確認

Page 17: コードクローンの長さに基づく プログラム盗用確率の実験的算出

17

ソフトウェア数:検出するクローンの最低長さ:クローン長 以上のクローン検出数:

実験手順

1. 2 つのソフトウェア Pi, Pj (i≠j)間のクローンの最大の長さを調べる.

2. 全てのソフトウェアの組み合わせ Pi, Pj に対して 1 .の操作を繰り返す

3. 定型クローン検出確率を算出し,グラフを作成する.

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

)(lmll

n2

)()(

C

lmlP

n

定型クローン検出確率

Page 18: コードクローンの長さに基づく プログラム盗用確率の実験的算出

18

ソフトウェア数 46 件の実験結果

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

30 60 90 120 150 1800

0.1

0.2

0.3

0.4

0.5

0.6

0.7

ソフトウェア間クローンの最大クローン長

定型

クロ

ーン

検出

確率

クローン長 80 未満でプログラム間で発生するクローン

の約 95% が検出されている

クローン長が長くなるほど検出確率が低くなっている約 5% でクローン長 60以

上のクローンが検出される

約 95% の確率でプログラム盗用と考えら

れる

Page 19: コードクローンの長さに基づく プログラム盗用確率の実験的算出

19

ソフトウェア数 25 件の実験結果

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

30 60 90 120 150 1800

0.1

0.2

0.3

0.4

0.5

0.6

0.7

ソフトウェア間クローンの最大クローン長

定型

クロ

ーン

検出

確率

30 60 90 120 150 1800

0.05

0.1

0.15

0.2

0.25

0.3

0.35

0.4

0.45

0.5

ソフトウェア間クローンの最大クローン長

定型

クロ

ーン

検出

確率 2 つの実験結果でほぼ同じ値をとることを確認

クローン長とクローン検出確率の関係はソフトウェア数に依存しないと考えられる

本実験で検出された最大のクローン長: 200

Page 20: コードクローンの長さに基づく プログラム盗用確率の実験的算出

20

長い定型クローン

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

Page 21: コードクローンの長さに基づく プログラム盗用確率の実験的算出

21

実験結果の近似式

• プログラム盗用と判断する確率を算出するための近似式を算出–残差平方平均から近似式の精度を確認

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出

ソフトウェア数 46件

近似式

残差平方平均

918.24.9072 lPl

000101.0

Page 22: コードクローンの長さに基づく プログラム盗用確率の実験的算出

22

まとめと今後の課題

• まとめ– プログラム盗用(流用)の判断基準を明確にするこ

とを目的とした• プログラム盗用(流用)のないソフトウェアのクローン長

とクローン検出確率の関係を調査した

• 今後の課題– 近似式についての検討を行う– ソフトウェア数を増やして,今回の結果を再現でき

るかどうかを確認する

– プログラム盗用(流用)が行われたソフトウェアを用いて調査を行っていく(派生開発ソフトウェアなど)

2008 年 12 月 18 日コードクローンの長さに基づく

プログラム盗用確率の実験的算出