スライド 1

コードクローン履歴閲覧環境を用いたク
ローン評価の試み
川口真司* 松下誠**
井上克郎** 飯田元*
* 奈良先端科学技術大学院大学
** 大阪大学
2006/11/27
第154回ソフトウェア工学研究会
Page 1
コードクローンとは
 プログラム中に何度も類似した箇所が現れるコー
ド片
 主に、安易なコピー & ペーストによって生まれ
る
 大規模ソフトウェアの保守において問題となって
いる
 ある一箇所のクローンにバグがあった場合,すべての
類似箇所について同じ修正が必要かどうか,検討が必
要
 若干の修正が加わっていることが多く,網羅的に把握
することが困難
CWindow wnd = new CWindow();
CDialog wnd = new CDialog();
wnd.init();
wnd.init();
CWindow wnd = new CWindow();
wnd.show(mouose_x, mouse_y);
wnd.show(0, 0);
CWindow
wnd
=
new
CWindow();
wnd.init();
CWindow wnd = new CWindow();
wnd.init();
wnd.show(0, rundom());
wnd.init(WM_MIN);
CWindow wnd = new CWindow();
CWindow wnd = newwnd.show(0,
CWindow(); 0);
wnd.show(0, 0);
wnd.init();
wnd.init();
CWindow wnd = new CWindow();
wnd.show(0, 0);
wnd.show(0, 0);
CWindow wnd = new CWindow();
CWindow wnd = new CWindow();wnd.init();
wnd.init();
wnd.init(WM_NOBORDER);
wnd.show(0, 0);
wnd.show(0, rundom());
wnd.show(0, 0);
2006/11/27
第154回ソフトウェア工学研究会
Page 2
クローン抽出システム
 文字列を利用するもの
 ソースコードの字句そのものから類似部を抽出
 CCFinder* など
 依存関係グラフを利用するもの
 各種単位間の依存関係グラフの形から
 Baxter らの手法**など
 メトリクスを利用するもの
 関数,クラスなどの単位ごとにメトリクスを定義し,その値が類
似したものを抽出
 Balazinska らの手法***など
 これらの手法により,大規模なソフトウェアからクロー
ンを自動的に検出することが可能になった
* T. Kamiya, S. Kusumoto, and K. Inoue. Ccfinder: A multilinguistic token-based code clone detection system for large scale source code.
IEEE Transactions on Software Engineering, 28(7):654–670, Jul 2002.
** I. Baxter, A. Yahin, L. Moura, M. Anna, and L. Bier. Clone detection using abstract syntax trees.
In Proc. International Conference on Software Maintenance 98, pp. 368–377, Mar 1998.
*** M. Balazinska, E. Merlo, M. Dagenais, B. Lague, and K. Kontogiannis. Advanced clone-analysis to support object-oriented system refactoring.
In Proc. 7th Working Conf. on Reverse Engineering (WCRE 2000), pp. 98.107, Brisbane, Queensland, Australia, Nov 2000.
2006/11/27
第154回ソフトウェア工学研究会
Page 3
問題点
1. 検出されるクローンの数が膨大
 大規模ソフトウェアの場合に顕著
 全体的な傾向からの考察はできても,改善行動に結び
つけるのが困難
2. すべてのクローンが一律に除去対象とは限らな
い
 削除すべきクローン
 抽象化の手間を惜しんでコピー&ペーストしたコード片
 役割分担の関係上,変更が困難なコード片
 削除すべきでない,削除しなくてもよいクローン
 将来の変更を見越して,意図的に重複箇所としている
 デザインパターンやフレームワークを適用している箇所
削除すべきクローンとそうでないものとの判別が必要
2006/11/27
第154回ソフトウェア工学研究会
Page 4
クローン評価に向けて
 クローンの中身を解析
 クローンを含む関数,クラスについて解析
メトリクスの算出
依存関係の解析
 開発者の意図までを把握するのは困難
 クローンの発展過程,履歴を解析
クローンの過去を知ることで,関係した開発者やその
意図を推し量ることはできないだろうか
すぐ消されたクローンと,発生以来さまざまな部分にコピー
されているクローンとでは明確な違いはあるのではないか
クローンを作成した開発者によって,違いがあるのではない
か
2006/11/27
第154回ソフトウェア工学研究会
Page 5
クローン履歴・関係者の解析
 クローンの発展過程,関係した開発者を解析する
手法の提案
 クローン履歴手法の紹介*
 クローン関係者解析手法
関係者: 作成者,編集者,削除者すべてを含んだ総称
 得られた解析結果と,クローン評価との関連性に
関する予備実験
 変更種別(作成,編集,削除)回数がクローン関係者
ごとに異なるかどうかの検証
 単一コミットに含まれるクローンセット数と,クロー
ン評価との関連の分析
* 川口真司, 松下誠, 井上克郎: "版管理システムを用いたコードクローン履歴分析手法の提案",
電子情報通信学会論文誌 D, Vol.J89-D, No.10, pp.2279-2287, 2006
2006/11/27
第154回ソフトウェア工学研究会
Page 6
クローンに関する諸定義
 クローン
 類似文字列が存在するコード片
 クローンの位置は (ファイル名,開始行番号,終了行番号) で表される
 クローンペア
 互いに類似文字列であるクローンの対
 クローンセット
 クローンペア関係において推移関係が成り立つ
クローンの集合
Clone A-1
Clone A-1
Clone A-3
Clone A-2
Clone B-2
Clone B-1
2006/11/27
Clone A-1
クローン
Clone A-3
クローンペア
Clone A-1
Clone A-2
第154回ソフトウェア工学研究会
Clone A-3
クローンセット
Page 7
クローン履歴抽出手法
 指定された期間 [0, t]、間隔Δt について期間 [0, t] を Δt ごとに分
割、それぞれの時間におけるファイル群を F0, F1, ..., Ft と表す
過去のプロダクトの取得には版管理システム (ex. cvs, subversion, ...) を用い
る
 となりあうバージョン間について分析
 F0 をリポジトリから取得,クローンを抽出
 F1 をリポジトリから取得,クローン抽出
 F0, F1 のクローンについて,クローン履歴関係を分析
…
 Ft をリポジトリから取得,クローン抽出
 Ft-1, Ft のクローンについて,クローン履歴関係を分析
・・・
F0
2006/11/27
F1
Ft-1
第154回ソフトウェア工学研究会
Ft
Page 8
クローン関係者
 クローンの変更に何らかの形で関わった開発者
 以下の3つの和集合
 クローンを作成した開発者
 クローンを編集した開発者
 クローンを削除した開発者
削除: dean
作成: alex
・・・
F0
2006/11/27
F1
編集: emily
Ft-1
第154回ソフトウェア工学研究会
Ft
Page 9
版管理システムから得られる差分情報を用いて
編集元の領域 編集先の領域
関係者抽出手法
1. f に編集元領域に存在するクローン
t-1
8a9,18
2. ft に編集先領域に存在するクローン
編集操作
>
があれば,そのコミットのauthorが変更者とする
a: 挿入
>…
挿入
d: 削除
>
9
Clone
c: A変更
行番号
行番号
8
15
18
Clone A
18
Clone A
22
31
Clone A
…
8a9,18
>
>…
>
ft-1
Commit
24
29
34
Clone A
ft
revision 1.82
date: 2003/07/20 21:56:32; author: tgl;
state: Exp; lines: +51 -29
Another round of error message editing, covering backend/commands/.
2006/11/27
第154回ソフトウェア工学研究会
Page 10
複数回のコミットがあった場合
行番号
行番号
行番号
実際の追加対象は100行下
8
挿入
Clone A
15
18
Clone A
5
9
18
105
Clone A
22
31
24
Clone A
29
34
Clone A
118
Clone A
2006/11/27
…
ft-1
Clone A
5a5,105
>
>…
5行目に100行挿入
>
…
8a9,18
>
>…
>
109
Commit1
第154回ソフトウェア工学研究会
Commit2
124
129
134
Clone A
ft
Page 11
行番号の調整
9
行番号
ft-1
ft
行番号
9
Clone A
15
18
d:削除
22
Clone A
31
Clone A
24 29 34 39
ft
行番号
8
a:挿入
8
18
c:変更
15
18
18
24
22
29
34
31
Clone A
36
ft-1
行番号
衝突時には対応行が一意でない
2006/11/27
最小、最大の推定値を考慮
第154回ソフトウェア工学研究会
Page 12
複数のコミットを考慮した解析手
順
行番号
5
行番号
8
9
18
24 29 34 39
9
ft
18
24 29 34 39
15
18
Clone A
8
8
15
15
15
18
18
18
22
22
22
31
Clone A
2006/11/27
Clone A
Commit1
8a9,18
>
>…
>
Commit2
第154回ソフトウェア工学研究会
…
8a9,18
>
>…
>
…
8a9,18
>
>…
>
109
118
行番号
…
ft-1
Clone A
ft-1
行番号
行番号
31
105
ft
36
ft-1
ft-1
24 29 34 39
31
36
36
18
行番号
8
31
22
9
ft
行番号
行番号
Commit3
124
129
134
Clone A
ft
Page 13
クローン履歴の評価への応用
 過去の履歴がクローン評価に利用可能かどうかを
以下の2つの視点から検証する
 開発者によって,クローンとの関わり方に差があるか
どうか
 ある一度のコミット時に編集したクローン数と,そこ
に含まれるクローンの品質との関連
 分析対象
 PostgreSQL のサブモジュール
(src/backend/commands 以下のソースコード)
 2003/01/01 ~ 2004/01/01 までを30日間隔で解析
2006/11/27
第154回ソフトウェア工学研究会
Page 14
実験方法
 実験1: 開発者とクローン変更回数
 開発者ごとのクローン変更回数を集計
ある時刻に,1つのクローンセットを変更していたら1回.
ある時刻に,クローンセットを5個変更していたら,5回とカウント.
 開発者によって,変更作業(作成,編集,削除)に差があるかどう
かを
分析
クローンを追加してばかりの開発者がいないか
逆に,クローンの削除を多く行っている開発者はいないか
 実験2: コミットに含まれるクローンセット数
 同時に単一の開発者によって行われたコミットについて,そのと
き編集したクローンセット数の分布を集計
(本実験では同時 = 1分以内とする)
 含まれるクローンの傾向について分析
少数のクローンセットのみを編集しているコミット
大量のクローンセットを一度に編集しているコミット
2006/11/27
第154回ソフトウェア工学研究会
Page 15
実験結果1 – 開発者ごとの特性
 対象サブモジュールに関係した開発者は10人
全コミット数に対して,
 解析期間中にクローンの変更に関わっていたのは3人
クローン追加が多い
momjian
petere
tgl
クローン追加
クローン削除
クローン編集
6
2
35
10
3
27
32
17
135
(小計)
43
40
184
1317
143
1428
総コミット数
2006/11/27
第154回ソフトウェア工学研究会
Page 16
実験結果2 – コミットから見た特
性
25
頻度
20
15
10
5
29
62
31
27
25
23
21
19
17
15
13
11
9
7
5
3
1
0
コミットに含まれるクローンセット数
 大多数のコミットでは,そのとき編集されたクローンセットは一つ
 ただし,いくつかのコミットでは多数のクローンセットを一斉に編集している
2006/11/27
第154回ソフトウェア工学研究会
Page 17
大量のクローンを編集したコミッ
トの例
<
<
-->
>
>
>
elog(WARNING, "DefineAggregate: attribute \"%s\" not recognized",
defel->defname);
ereport(WARNING,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("aggregate attribute \"%s\" not recognized",
defel->defname)));
“Another round of error
message editing, covering
backend/commands/.”
 機械的な変換作業
エラーメッセージ出力部の一括変換
 クローンの発見が困難でなかったと考えられる
grep 等を利用した文字列検索可能なクローン
 このようなクローンは対処優先度が低い
 機械的に処理をすべき対象を同定可能
 保守工程において障害とならない
2006/11/27
第154回ソフトウェア工学研究会
Page 18
実験結果の考察
 開発者に着目した分析
 全体のコミット回数と比較して,クローン作成の多い
開発者が見つかった
 彼が作成したクローンのいくつかは他の開発者によっ
て削除されていた
 開発者によってクローンへのかかわり方は異なってく
る
 コミットに着目した分析
 コミット時に編集したクローンセット数の寡多から,
着目しなくてもよいクローンセットが見つかった
 膨大なクローン情報のスクリーニングに有用
2006/11/27
第154回ソフトウェア工学研究会
Page 19
まとめと今後の課題
 クローン履歴分析手法の紹介,およびクローン関係者抽
出手法の提案
 クローン評価のためのクローン履歴,関係者の分析
 今後の課題
 分析手法について
適正に開発者が漏れなく取得できているかどうかの評価
ブランチを考慮した分析
 分析作業について
広範なデータ分析
 PostgreSQL の他モジュールも含めた解析
 他のソフトウェアを対象とした解析
実験結果のより精細な検証
その他,クローン評価に有用な仮説立案・検証
2006/11/27
第154回ソフトウェア工学研究会
Page 20
2006/11/27
第154回ソフトウェア工学研究会
Page 21
以下,予備役スライド
2006/11/27
第154回ソフトウェア工学研究会
Page 22
クローン履歴・関係者の解析
 クローンの発展過程を知るためには,最新時点の
クローンの過去の状態を知る必要がある.
 ソースコードそのものは版管理システムにより入手可
能
 ただし,過去にあったクローンが現在も残っているか,
残っているならばどこが該当部分かは自明ではない
 クローン履歴手法の紹介*
 クローン関係者解析手法
 関係者: 作成者,編集者,削除者すべてを含んだ総称
 実験・分析
* 川口真司, 松下誠, 井上克郎: "版管理システムを用いたコードクローン履歴分析手法の提案",
電子情報通信学会論文誌 D, Vol.J89-D, No.10, pp.2279-2287, 2006
2006/11/27
第154回ソフトウェア工学研究会
Page 23
クローン関係者抽出手法
 入力
 版管理システムが持つ情報
任意の時点のソースコード
コミットの集合
 変更日時
 開発者
 変更内容
 クローン履歴解析の結果
各解析時点でのクローン
隣り合う解析時点間でのクローン履歴関係
2006/11/27
第154回ソフトウェア工学研究会
Page 24
関係者抽出手順
 すべてのファイルの解析期間内に行われたコミッ
トについて
 コミット日時と開発者を取得 (cvs log)
 そのときに行われた作業内容を取得 (cvs diff)
 各 diff エントリについて
変更を施した行にクローンがあれば
 そのクローンの前にクローン履歴がなければ「作成」
 そのクローンについて,後ろクローン履歴がなければ「削除」
 両方あれば,「編集」
2006/11/27
第154回ソフトウェア工学研究会
Page 25
クローン評価に向けて
 クローンの中身に着目
 ソースコードを静的/動的に解析
 クラス,変数間の依存関係など
 クローンの属性に着目
 クローンの行数
 クローンの開発過程(期間やファイル数など)
 クローンを作った,もしくは編集した開発者
2006/11/27
第154回ソフトウェア工学研究会
Page 26
抽出手順
ファイル1
ファイル1
挿入
Clone A
Clone A
Clone A
2006/11/27
ファイル2
ファイル2
Clone A
Clone A
第154回ソフトウェア工学研究会
Page 27
行番号変換の適用方法
F1
9
18
24 29 34 39
ft
F2
行番号
8
15
18
22
31
36
ft-1
行番号
2006/11/27
第154回ソフトウェア工学研究会
Page 28
複数回のコミットがあった場合
行番号
行番号
行番号
挿入
8
Clone A
15
18
22
31
Clone A
f0
2006/11/27
8a9,18
9
>
Clone
A
>…
15,18d24
18
<
< …A 24
Clone
22c31
<
29
< … 34
-> A
Clone
>…
f1
第154回ソフトウェア工学研究会
9
Clone A
18
24
29
34
Clone A
f2
Page 29