コードクローンとは
 ソースコード中に存在する，他のコード片と一致または類似している

コードクローン検出技術とその利用法

コード片 さまざまな理由により生成されるコードクローン
コピーアンドペースト

 コピーアンドペーストによる再利用
 定型的な処理

大阪大学 大学院情報科学研究科
コンピュータサイエンス専攻 井上研究室¾ 例： ファイルオープン，データベース接続
 意図的な繰り返し¾ パフォーマンス重視

肥後 芳樹(y-higo@ist.osaka-u.ac.jp)
 ソフトウェアの保守を困難にする
 あるコード片にバグがあると，そのコードクローン全てについて修正の検討を行う必要がある 機能を追加する場合も同様のことがいえる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

1

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

コードクローンの定義 コードクローンの一般的な定義はない

コードクローンの定義 これまでにいくつかのコードクローン検出手法が提案されているが，それらはどれも異なるコードクローンの定義を持つ
 紹介するコードクローン検出技術
 行単位での検出手法
 AST(Abstract Syntax Tree)を用いた検出手法
 PDG(Program Dependency Graph)を用いた検出手法
 メトリクスを持ちいた検出手法
 トークン単位での検出手法

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

3

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

コードクローンの定義
行単位での検出手法

コードクローンの定義
ASTを用いた検出手法

 ソースコードを行単位で比較し，コードクローンを検出する[1] ソースコードを構文解析し，AST（Abstract Syntax Tree）

4を作成．一致する部分木をコードクローンとして検出する[2] 比較の前に空白，タブは取り除かれる¾変数名の違いは吸収される
 初期の検出技術
 実用的な検出手法であり，商用ツールとして実装されている
 CloneDR: http://www.semanticdesigns.com/Products/Clone/

 検出の精度が良くない コーディングスタイルが違うと検出できない¾例：if 文や while 文の括弧の位置
 変数名が異なると検出できない¾変数名が違っても，ロジックが同じ部分はコードクローンとして検出したい[2] I.D. Baxter, A. Yahin, L. Moura, M.S. Anna, and L. Bier, Clone Detection Using Abstract
Syntax Trees, Proc. International Conference on Software Maintenance 98, pp368-377, 16-19,
Nov. 1998.

[1]B. S. Baker, A Program for Identifying Duplicated Code, Proc. Computing Science andStatistics 24th Symposium on the Interface, pp.49-57, Mar. 1992.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

5

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

61コードクローンの定義
PDGを用いた検出手法

コードクローンの定義 ソースコードを意味解析し，コントロールフロー・データフローを

 互いにインタートバインド（絡み合っている）なコードクローン

PDGを用いた検出手法（インタートバインドクローン）抽出．この情報からPDG(Program Dependence
Graph)を作成し，一致する部分グラフをコードクローンとして検出[3]．
 非常に高い検出精度
 他の検出手法では検出できないコードクローンも検出可能

ソースコード：a = x1 + y1;
b = x2 + y2;
printf(“%d¥n”, a);printf(“%d¥n”, b);：

 インタートバインドクローン，リオーダードクローン

 非常に計算コストが大きい

コードクローンA

コードクローンBa = x1 + y1;
b = x2 + y2;
printf(“%d¥n”, a);printf(“%d¥n”, b); 実用的でない[3] R. Komondoor and S. Horwitz, Using slicing to identify duplication in source code, Proc.
the 8th International Symposium on Static Analysis, pp.40-56, July, 16-18, 2001.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

7

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

PDGを用いた検出手法（リオーダードクローン）

コードクローンの定義
メトリクスを用いた検出手法

 文の順番が入れ替わっている（リオーダード）コードクローン

 関数・メソッド単位で（21種類の）メトリクスを計測，その値

コードクローンの定義

ソースコードA：
リオーダー
a = x1 / y1;
b = x2 * y2;c = a + b;
printf(“%d¥n”, c);：8の近似・一致によりコードクローンを検出[4]．

ソースコードB：b = x2 * y2;
a = x1 / y1;c = a + b;
printf(“%d¥n”, c);： 検出されるコードクローンは関数・メソッド単位 関数の一部のみが重複している場合，検出できない リファクタリングには有効¾リファクタリングを行いやすい単位[4] J. Mayland, C. Leblanc, and E.M. Merlo, Experiment on the automatic detection of function
clones in a software system using metrics, Proc. International Conference on Software
Maintenance 96, pp.244-253, Nov. 1996.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

9

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

コードクローンの定義
トークン単位での検出手法

コードクローンの定義
比較 ソースコードをトークン単位で直接比較することによりコードク クローンの検出精度が優れている手法

ローンを検出[5] PDGを用いた検出手法

 型名，変数名などを表すトークンは，特別なトークンに置き換 行単位での検出手法，メトリクス単位手法での検出は検出

える．

10

漏れが多い

 非常に高いスケーラビリティ

 実用的に使える手法

 ASTやPDGなどの作成を必要としない

 ASTを用いた検出手法，トークン単位での検出手法
 PDGを用いた検出手法は計算コストが大きすぎる[5] 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,
vol. 28, no. 7, pp. 654-670, Jul. 2002.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

11

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

122コードクローン検出ツール: CCFinder概要 ソースコードをトークン単位で直接比較することにより，コード

コードクローン検出ツール: CCFinder

クローンを検出する（トークン単位での検出手法）
 より実用的なコードクローンを見つけることができるように設計されている
 ユーザ定義名の置き換え
 テーブル初期化部分の取り除き
 モジュールの区切りの認識 解析結果はテキスト形式で出力
 数百万行規模でも実用的な時間で解析可能
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

13

コードクローン検出ツール: CCFinder
検出プロセスSoftware Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

14

コードクローン検出ツール: CCFinder
検出例
 三つのOSのソースコードを対象にコードクローンを検出した
Linux 2.4.0

NetBSD 1.5

 Linux

トークン列
トークン列

FreeBSD 4.0

 FreeBSD

字句解析
字句解析

 NetBSDとFreeBSDは多くの

変換処理
変換処理

 祖先が同じだからLinux 2.4.0

コードクローンが存在している

変換後トークン列
変換後トークン列
検出処理
検出処理
クローン情報クローン情報NetBSD 1.5

1. static
static void
void foo()
foo() throws
throws RESyntaxException
RESyntaxException {{1.
2. String
String a[]a[] == new
new String
String [][] {{ "123,400","123,400", "abc","abc", "orange"orange 100"
100" };};
2.
3.
org.apache.regexp.RE
pat == new
new org.apache.regexp.RE("[0-9,]+");
org.apache.regexp.RE("[0-9,]+");
3. org.apache.regexp.RE pat
4. intint sumsum == 0;0;
4.
5. forfor (int(int ii == 0;0; ii << a.length;a.length; ++i)
++i)
5.
6.
(pat.match(a[i]))6.
ifif (pat.match(a[i]))7.
sum +=+= Sample.parseNumber(pat.getParen(0));
Sample.parseNumber(pat.getParen(0));
7.
sum
8. System.out.println("sumSystem.out.println("sum == "" ++ sum);
sum);
8.
9. }}
9.
10. static
static void
void goo(String
goo(String [][] a)a) throws
throws RESyntaxException
RESyntaxException {{10.
11. RERE expexp == new
new RE("[0-9,]+");
RE("[0-9,]+");
11.
12. int
int sumsum == 0;0;
12.
13. forfor (int(int ii == 0;0; ii << a.length;a.length; ++i)
++i)
13.
14.
(exp.match(a[i]))14.
ifif (exp.match(a[i]))15.
sum +=+= parseNumber(exp.getParen(0));
parseNumber(exp.getParen(0));
15.
sum
16. System.out.println("sumSystem.out.println("sum == "" ++ sum);
sum);
16.
17. }}
17.

FreeBSD 4.0

 NetBSD

Source files

出力整形処理出力整形処理クローンペア位置情報

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

15

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

16

コードクローン分析ツール: Gemini
背景 CCFinder を用いることにより，大規模なソフトウェアから短コードクローン検出ツール：Gemini

時間でコードクローンを検出できるようになった
 しかし，大量のコードクローンが検出されてしまい，手作業です

べてのコードクローンをチェックするのは非現実的
 大量のコードクローン情報を上手に扱うメカニズムが必要 ソフトウェア内でのコードクローンの分布状態の表示
 ユーザが興味のある特徴を持ったコードクローンの提示

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

17

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

18

3コードクローン分析ツール: Gemini
概要

コードクローン分析ツール: Gemini
クローンペアとクローンセット

 CCFinderの出力した検出結果ファイル（テキストファイル）を クローンペア

読み込み，コードクローン情報を視覚的に表示

 互いに一致または類似しているコード片の対（ペア） クローンセット

 インタラクティブなコードクローン分析を実現 互いに一致または類似しているコード片の集合（セット） 共にコードクローンを表す用語であるが，これらを使い分ける 主なビュー

ことにより，よりスムーズに議論を行うことができる

 スキャタープロット： コードクローンの量・分布状態を俯瞰的に表示

C1

 メトリクスグラフ・ファイルリスト： コードクローン・ファイルを定量的に特徴づける．またその特徴を用いたコードクローン・ファイ
ルの選択機構を実現
 フィルタリングメトリクス RNR： ユーザが目で確認を行う必要のないコードクローンのフィルタリングを行う
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

C4

C2

クローンセット{C1, C2, C4}(C1, C4){C3, C5}(C2, C4)

C5

C3

クローンペア(C1, C2)(C3, C5)

19

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

コードクローン分析ツール: Gemini
説明に用いる例

コードクローン分析ツール: Gemini
フィルタリングメトリクス RNR（定義） Geminiの各特徴を説明するために以下の例を用いる

 CCFinderの検出するコードはトークンの列であり，重要でな

 ディレクトリ D1 以下には２つのファイル F1，F2 が存在する

いコードクローンを多数検出してしまう ディレクトリ D2 以下には２つのファイル F3, F4 が存在する

 switch文の各caseエントリ

 各ファイルは以下の５トークンから成る

 連続した変数宣言や関数呼び出し

 F1: a b c a bb, フィルタリングメトリクス RNR(S) F2: c c* c* a bb, F3: d e f a bb,
 F4: c c* d e f,f

20

 クローンセット S に含まれるコード片の非繰り返し度を表す

C(Fi, j, k) はファイル Fi の ｊ 番目のトークン
から k 番目までのトークンのコード片を表す

定義

 これら４つのファイルから長さが２以上のコードクローンを検出すると，次RNR(S) = 1 -の３つのクローンセットが得られる．
 S1: { C(F1, 1, 2), C(F1, 4, 5), C(F2, 4, 5), C(F3, 4, 5) }}，∑ Tokensall(C)C∈S S2: { C(F2, 1, 2), C(F2, 2, 3), C(F4, 1, 2) },Tokensall(C) : コード片Cの総トークン数

 S3: { C(F3, 1, 3), C(F4, 3, 5) }Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University∑ Tokensrepeated(C)C∈S

Tokensrepeated(C) : コード片C中の繰り返し部分のトークン数
21

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

コードクローン分析ツール: Gemini
フィルタリングメトリクス RNR（例）コードクローン分析ツール: Gemini
D1
D2
F2
F3
F1
F4
スキャタープロット

 アスタリスク＊の付いたトークンは，その直後のトークン列の 水平・垂直方向にソース

D2
F4

出現する
は RNR が閾値以上のコードクローンを表す
 は RNR が閾値未満のコードクローンを表す
a b c a b c c c a b d e f a b c c d e f

 クローンペアは線分として
F3

23はその水平方向のトークンと垂直方向のトークンが等しいことを意味する

F2

F1: a b c a b, S1: { C(F1, 1, 2), C(F1, 4, 5), C(F2, 4, 5), C(F3, 4, 5) }，F2: c c* c* a b, S2: { C(F2, 1, 2), C(F2, 2, 3), C(F4, 1, 2) },F3: d e f a b,
S3: { C(F3, 1, 3), C(F4, 3, 5) }F4: c c* d e f,D1

 原点は左上隅

0+0+0+08=
RNR(S1) = 1 = 1.0
2+2+2+28
1+2+1
2== 0.33333…
RNR(S2) = 1 2+2+2
6
繰り返しの多いクローンで
0+0
6
=
= 1.0
RNR(S3) = 1 あることを表している
3+3
6

F1

繰り返しであることを表している

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

a b c a b c c c a b d e f a b c c d e f

コード中のトークンを出現順に配置

 クローンセット S1, S1, S3 のRNRは，

22 ひと目で分布状態を把握

F1, F2, F3, F4 : files
D1, D2 : directories: matched position detected as a practical code clone: matched position detected as a non-interesting code clone
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
24

できる

4

コードクローン分析ツール: Gemini
メトリクスグラフ(用いているメトリクス)

コードクローン分析ツール: Gemini
選択前メトリクスグラフ(メカニズム)
3
1.0
3

 LEN(S): クローンセット S 内に含まれるコード片のトークン数の平均

 多次元並行座標表現を用いている

値を表す

4

S3

 各メトリクスにつき１つの座標軸が存在する

 LEN(S1) = 2,

LEN(S2) = 2,

LEN(S3) = 3

 各クローンセットにつき１つの折れ線がメトリクス

値に基づいて描画される
 POP(S): S に含まれるコード片の数を表す
 POP(S1) = 4,

POP(S2) = 3,

 ユーザは各メトリクスの上限・下限を変更する

POP(S3) = 2

NIF(S2) = 2,

 全てのメトリクスが上限と下限の間にあるクローンセットが選択状態になる
 選択状態にあるクローンセットのソースコードは
簡単に閲覧可能NIF(S3) = 2

 RNR(S): S に含まれるコード片の非繰り返し度を表す
 RNR(S1) = 1.0,

RNR(S2) = 0.33,

0.0

1

2

LEN

RNR

NIF

POP

3
S3

1.0

3

4

S1
S2
2

0.0

1

2

LEN

RNR

NIF

POP

ことでクローンセットの選択・選択解除を行う

 NIF(S): S に含まれるコード片を所有しているファイルの数を表す
 NIF(S1) = 3,

S1
S2
2

RNR(S3) = 1.0

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

25

選択後

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

コードクローン分析ツール: Gemini
ファイルリスト(用いているメトリクス)

コードクローン分析ツール: Gemini
ファイルリスト(メカニズム)

 全てのメトリクスは閾値 th を用いている．

 対象ファイル一覧を表示

 RNRの値が th 以上のコードクローンのみを対象にする

 ROCth(F): ファイル F の重複度を表す
 完全にクローンになっている場合は 1.0
 全くクローンを含まない場合は 0.0
 ROC0.5(F1) = 0.8,
 ROC0.5(F3) = 1.0,

ROC0.5(F2) = 0.4,
ROC0.5(F4) = 0.6

 各ファイルはファイル名・メトリクスと共に表示される¾ 括弧の外の値は閾値 th の値，括弧の中の値は閾値 0 の値

F1: a b c a b,
F2: c c* c* a b,
F3: d e f a b,
F4: c c* d e f

 ソーティング機能 ファイルを任意のメトリクスの昇順・降順で並び替え可能 興味のある特徴をもったファイ

ルをすぐに特定できる

 NOCth(F): F に含まれるコードクローンの数を表す
 NOC0.5(F1) = 2,
 NOC0.5(F3) = 2,

 メトリクスグラフとして実装しな

NOC0.5(F2) = 1,
NOC0.5(F4) = 1

かった理由 クローンセットはメトリクス値の NOFth(F): F とコードクローンを共有しているファイルの数を表す
 NOF0.5(F1) = 2,
 NOF0.5(F3) = 3,

26

みに基いて選択される

NOF0.5(F2) = 2,
NOF0.5(F4) = 1

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

 ファイルはファイル名などでも選択されることがある
27

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

28

デモンストレーション(1/2)
 対象

デモンストレーション 大阪大学の学生演習プログラム¾C言語で簡単なコンパイラを作成¾5人の学生のプログラムを用いる¾演習は３回に分けてプログラムを作成
9 STEP1: 構文チェッカーを作成
9 STEP2: 構文チェッカーを利用して意味チェッカーを作成
9 STEP3: 意味チェッカーを利用してコンパイラを作成

 目的
 学生間の類似度の調査¾他人のプログラムを利用している学生はいないか
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

29

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

30

5デモンストレーション(2/2)
 １人の学生のソースコードを１つのグループとしてコードクロー

これまでの適用事例

ン検出を行う ５人の学生のプログラムから５つのグループが作成される
 適切にグループを設定することでコードクローン分析を効率的に行うことができる
 ソースコードビューではコードクローンが強調表示される
 水平方向のコードクローン：青 垂直方向のコードクローン：赤31

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

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

オープンソースソフトウェアへの適用
概要

オープンソースソフトウェアへの適用調査するコードクローン

 目的

 スキャタープロットを用いた調査

 CCFinder，Geminiを用いてどのようなコードクローンが見つ32 目立つ部分に存在するコードクローン

かるか調査する

 メトリクスグラフを用いた調査 オープンソースソフトウェア Ant (version 1.6.0)

 要素数の多いクローンセットの特定

 ビルドツールの一種，Java言語で記述されている
 ソースファイル数: 627

 トークン数の多いクローンセットの特定

 総行数: 約18万行

 多くのファイルを巻き込んでいるクローンセットの特定

 検出対象: ３０トークン以上
 2,406個のクローンセット
 190,004個のクローンペア
33

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

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

オープンソースソフトウェアへの適用
目立つ部分に存在するクローン(全体)

オープンソースソフトウェアへの適用
目立つ部分に存在するクローン(部分Ａ) 右図は対象ソースコード全 クローンの場所: ファイルを読み込体を表したクローン散布図

34

む機能を実装している部分

A 先頭の数行のみを読み込み ユーザが指定した文字列を含む

 A, B, Cの部分がどのような行のみを読み込み

コードクローンであるかを調査した

 各行にプレフィックスを付けて読み込み

B クローンが実装している機能:C ストリームから1文字読み込む．終端まできたら，それに応じた処理をする
 新しく java.io.Reader オブジェクトを生成し，それを返す

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

35

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

36

6

オープンソースソフトウェアへの適用
目立つ部分に存在するクローン(部分Ｂ)

オープンソースソフトウェアへの適用
目立つ部分に存在するクローン(部分C) クローンの場所: 簡単なGUIを実装

 クローンの場所: ClearCaseのしているファイル

各機能を実装しているファイル

 ビルド情報をAntに渡す

 Checkin, Antの処理状況の閲覧

 Checkout, Update, ファイルの特定の部分ではなく，ほぼ全体がクローンになっていた クローンが実装している機能:
 イベントがどこで起こったかを判定している if文¾ イベントのソースに応じて処理を変更
 GUIの部品を作成しているメソッド¾ 一つの部品につき，一つのメソッドが存在
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

37

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

オープンソースソフトウェアへの適用
要素数の多いクローンセット

オープンソースソフトウェアへの適用
トークン数の多いクローンセット

 予めRNRを用いて，その値が0.5未満のクローンセットは除外

 予めRNRを用いて，その値が0.5未満のクローンセットは除外

 最も要素数の多いクローンセット

 最もトークン数の多いクローンセット

 要素数:31個

 クローンの大きさ:282トークン（77行）

 クローンの場所: 簡単なGUIを実装しているファイル

 クローンの場所:WebLogicとWebShereのタスクを定義しているファイル

 クローンが実装している機能:GUIの部品を生成しているメソッド

 クローンが実装している機能:メソッド isRebuildRequired（引数で与え38られたJarファイルがリビルドする必要があるかどうかを判断） 大まかな把握（Bの部分）のクローンの一部} catch (Throwable iExc) {handleException(iExc);}

 一部の使用変数，メソッド名が異なる}
return iAboutCommandPanel;¾ コピーアンドペーストによる作成を示唆 インデント，空行，コメントなど他のコードスタイルが全く同じ}
private Label getAboutContactLabel() {if (iAboutContactLabel == null) {try {iAboutContactLabel = new Label();iAboutContactLabel.setName("AboutContactLabel");Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

39

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

オープンソースソフトウェアへの適用
多くのファイルを巻き込んでいるクローンセット

ベンダーの開発したソフトウェアへの適用

 予めRNRを用いて，その値が0.5未満のクローンセットは除外

 スキャタープロットを用いた分析

 最も多くのファイルを巻き込んでいるクローンセット

40

 予期しない部分間のコードクローンの発見 巻き込んでいるファイル数:19ファイル
 クローンの場所:さまざまなファイル

 メトリクスグラフを用いた分析

 クローンが実装している機能:連続したアクセサ コピーアンドペースト後，修正漏れのあるコードクローンの発見 Antだからではなく，Java言語で記述されているから存在しているクローン

 リファクタリングを行うべきと思われるコードクローンの発見
 このクローンセットに限らず，多くのファイルを巻き込んでいるクローンセッ

トの多くが，Java言語で記述されていることがその存在理由と思われた ファイルリストを用いた分析
 使われていないファイルの検出 同じ機能を実装しているファイルの検出

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

41

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

42

7これまでの活動
ツールの配布 コードクローン検出・可視化ツール

これまでの活動 検出ツール: CCFinder[1] 分析ツール: Gemini[2] 国内外の個人・組織に配布
 研究機関での利用
 企業での商用ソフトウェアの開発プロセスへの導入
 配布先からのフィードバックを得ている

 その他の利用
 大学の演習

 プログラム著作権関係の裁判証拠[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.
[2] Y. Ueda, T. Kamiya, S. Kusumoto and K. Inoue, “Gemini: Maintenance Support Environment Based on
Code Clone Analysis”, Proc. Of the 8th IEEE International Symposium on Software Metrics, 67-76, 2002.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

43

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

44

これまでの活動
コードクローンセミナー
 ツール開発者（大学）と利用者（産業界）との意見交換との場として今後の展開

コードクローンセミナーを開催
 第１回（2002年11月）：大阪
 第２回（2003年3月）：東京
 第３回（2003年6月）：大阪
 第４回（2005年3月）：東京
 第５回（2005年12月）：東京
 第６回（2006年3月）：大阪

 ツールの利用法，コードクローンの分析法などについて議論を行っている 詳しくはをhttp://sel.ist.osaka-u.ac.jp/kobo/を参照

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

45

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

今後の展開
ソフトウェア開発プロセスへの組込み

今後の展開
ギャップドコードクローンの検出 コードクローン検出技術をどのようにソフトウェア開発プロセス コピーアンドペーストされたコード片は，その後修正が加えられる

46

 現在検出できているのは，Exactクローン，Renamedクローンのみへ組み込むか レビュー支援If (a > b) { b++; a=1;}

 リファクタリング支援

resued by ‘copy-andpaste’‘コピーとペースト’による再利用

 ソースコード修正支援
識別子名の変更

 実プロジェクトでの使用・評価が必要

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

47

挿入

削除

変更

If (i > j){i = i / 2;// comment
j++;
i=0;
}

If (i > j){// comment
i=0;}

If (i > j){// comment
j = j + 1;
i=0;}

If (a > b){// comment
b++;
a=1;
}

If (i > j){// comment
j++;
i=0;
}

Exact クローンParameterized クローン

Gapped クローン

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

48

8

今後の展開CCFinderXの開発

最後に 大阪大学井上研究室出身の神谷年洋氏（現：産業技術

 ツールに興味を持たれた方はメールでご連絡下さい

総合研究所勤務）による CCFinderX の開発

 大阪大学 肥後芳樹: y-higo@ist.osaka-u.ac.jp

 2004年度第2回未踏ソフトウェア創造事業の支援
 天才プログラマー／スーパークリエータの認定を受ける

 現在，特許申請中につき，配布管理を行っています CCFinderX の特徴

 CCFinderXの配布管理は行っていません

 検出スピードの向上¾CCFinderXの配布については http://www.ccfinder.net/をご覧下さい 前処理のカスタマイズ SWTを用いたGUI CCFinderX ウェブページ http://www.ccfinder.net/
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

49

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

50

9