コードクローンに対する一貫性のない変更に着目した潜

Token Comparison Approach to
Detect Code Clone-related Bugs
YongLee Yii
Yasuhiro Hayase
Makoto Matsushita
Katsuro Inoue
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
概要
複製されたソースコード片の間で識別子の変更による
不整合を検出し、欠陥の候補として提示する手法を提
案
発表構成
 研究背景
 研究動機と目的
 提案手法
 評価実験
 まとめと今後の課題
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
2
コードクローン
ソースコード中に存在する、同一または類似し
たコード片を持つコード片
 コードの再利用のために、コピーアンドペースト
により生成

ソースファイル
ソースファイル
クローンペア
コード片
コード片
コード片
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
3
再利用の際に発生する不整合

コピーアンドペーストによる再利用の手順
 実装したい機能と似ているコードを複製する
 そのコードを編集する

修正の不整合による欠陥を招く 原因となる
 コードクローンとなっているコード片に識別子の名
称の修正を行う
 修正漏れにより不整合が発生
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
4
欠陥の作り込み例
File: Linux-2.6.6/drivers/pci/hotplug/shpchp_ctrl.c
1497: rc = p_slot->hpc_ops->check_cmd_status(ctrl);
1498: if (rc) {
1499: err("%s: Failed to enable slot, error
code(%d)\n", __FUNCTION__, rc);
.....
1501: up(&ctrl->crit_sect);
1502: return rc;
1503: }
......
1573: retval= p_slot->hpc_ops->check_cmd_status(ctrl);
1574: if (retval) {
1575: err("%s: Failed to disable slot, error
code(%d)\n", __FUNCTION__, rc);
1576:
Retvalに変更すべき
1577: up(&ctrl->crit_sect);
1578: return retval;
1579: }
SIGSS 3月研究会
コード片1
コード片2
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
5
研究動機と目的

大規模ソフトウェアにはコードクローンが多く存在する
 Linuxファイルシステムを実装したコードの12%はクローン
となっている
修正漏れによる欠陥は実際のシステムに多く存在して
いる
 大量のソースコードを精査するには労力がかかる


一貫性のない識別子の修正による欠陥を検出
 特定の範囲のみコードを精査
 大規模ソフトウェアに適用できる
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
6
提案手法
ソースファイル
欠陥候補の絞り込み
クローン
検出
ツール
字句解析
クローン位
置情報
ファイル
メトリクス
計算
マッピング
解析
クローンペ
アのトーク
ン列
不整合のフィ
ルタリング
修正の不
整合
欠陥候補
検出されたコードクローンをトーク
不整合が検出された識別子
クローン検出ツールを用いてソー
メトリクスを用いて欠陥の可能性
クローンペア間で対応する識別子
ンに分割 を欠陥候補として出力
が低い不整合を取り除く
スファイルに存在するコードクロー
のマッピングを行い、識別子間の
ンを検出
不整合を検出
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
7
字句解析
o_count
= v_count
127: o_count
= v_count;;
128: o_var = variables;
o_var = varse ;
129:
130: v_count
STORE_INCR;
v_count
+= +=
STORE_INCR
131: variables = (char **) malloc (v_count*sizeof(char *));
varse
= ( char ** ) malloc ( v_count * sizeof (
132:
133: ( forindx
(indx == 3; 1indx
o_count;
for
; <indx
< indx++)
o_count ; indx ++ )
134: variables[indx] = o_var[indx];
varse
135: [ indx ] = o_var [ indx ] ;
136:( for; (; indx
indx <<v_count;
indx++)
for
v_count
; indx ++ )
137: variables[indx] = NULL;
varse [......
indx ] = NULL ;
161: o_count = a_count;
162: o_ary
arrays;
o_count
= = a_count
;
163:
o_ary
= arrays
;
164: a_count
+= STORE_INCR;
165: arrays
**) malloc (a_count*sizeof(char *));
a_count
+== (char
STORE_INCR
166:
arrays
( =char
** < o_count;
) mallocindx++)
( a_count * sizeof (
167: for=(indx
1; indx
168: ( variables[indx]
for
indx = 1 =
; o_ary[indx];
indx < o_count ; indx ++ )
169:
varse
= o_ary
[ indx ] ;
170: for[ (; indx
indx <] v_count;
indx++)
171: lists[indx] = NULL;
for ( ; indx < v_count ; indx ++ )
lists
[
indx ]
=
char * )
)
;
char * )
)
;
NULL ;
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
8
マッピング解析
コード片1
= v_count
;
o_var
=
varse
=
(
char **
) ・・・・・・
=
;
o_ary
=
arrays ; a_count += STORE_INCR ; arrays =
(
char **
) ・・・・・・
o_count
; v_count += STORE_INCR ; varse
コード片2
o_count
a_count
識別子変更テーブル
コード片1
コード片2
varse
arrays
2
lists
1
varse
1
a_count
4
v_count
1
o_count
o_count
2
o_var
o_ary
2
v_count
回数
一貫性のない修正 = 不整合
一貫性のある修正
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
9
欠陥候補の絞り込み
全ての不整合は必ずしも欠陥ではない
 2つの可能性がある

 修正漏れによる欠陥である場合
 意図的に変更されていない場合

メトリクスを用いて修正漏れによる欠陥の可能
性の度合を数値化する
 UnchangedRatio
 Conflict
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
10
UnchangedRatio
識別子がほとんどの箇所で変えられて、数箇所だけで変えられていない
場合、欠陥の可能性が高い
NumOfUnchangedID
UnchangedRatio =
TotalNumOfID

クローンとなっているコード片にある識別子の変更されていない比率

UnchangedRatioが0に近い場合、変更されていない識別子は欠陥
の有力な候補となる


変更漏れの可能性が高い
UnchangedRatioが0、または1の場合、不整合が発生しないことを
示す


UnchangedRatio=0の時、全ての識別子が変更されている
UnchangedRatio=1の時、全ての識別子が変更されていない
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
11
UnchangedRatioの計算例
コード片1 コード片2
v_count
varse

回数
a_count
4
v_count
1
arrays
2
lists
1
varse
1
UnchangedRatio
0.20
0.25
v_countのUnchangedRatioは0.20となる
 この変数名は5回出現している
 コード片2で1回変更されていない
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
12
Conflict
コード片1にある識別子がコード片2で元の識別子と異なる複数の識別
子に対応する場合は、機能を実装するために、意図的に複数の識別子
の名称に変更した可能性が高い
このような場合は、Conflict = trueと設定
 欠陥の候補から取り除く

コード片1
v_count
varse
コード片2
回数
a_count
4
v_count
1
arrays
2
lists
1
varse
1
UnchangedRatio
Conflict
0.20
False
0.25
True
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
13
出力される欠陥候補
コード片1
v_count
コード片2
回数
a_count
4
v_count
1
UnchangedRatio
Conflict
0.20
False
コピー元のコード片
コピー先のコード片
識別子
UnchangedRatio
コード片1
コード片2
v_count
0.20
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
14
提案手法の実装
対象言語:CとJava
 ツールの記述言語: Java
 クローン検出部には既存のコードクローン検出
ツールCCFinderを利用
 字句解析部は字句解析器生成ツールJFLEXを
用いて構築
 検出された欠陥候補を可視化するために、GUI
で提示

SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
15
ツールのGUI
欠陥候補
リスト
ソースコード
ビュー
識別子変
更テーブル
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
16
適用実験

目的:
 識別子の修正不整合による欠陥を検出できている
かを確認
 Conflictの有効性を評価

対象:Linux kernel 2.6.6
 ファイル数:
6,491
 LOC: 約400万

実験設定
 クローンの最小トークン数:30
 UnchangedRatioの閾値:0.4
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
17
欠陥候補の検出
モジュール
ファイル数
総行数
欠陥候補数
欠陥候補を含
むクローンの総
行数
Linux-2.6.6/arch
2,355
724,858
87
1,615
Linux-2.6.6/drivers
2,323
2,344,594
120
3,637
archモジュールでは87個、driversモジュールで
は120個の欠陥候補が検出された
 欠陥候補を含むクローンの総行数はモジュー
ルの総行数の0.25%未満

SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
18
欠陥候補の検証
モジュール
arch
証明された
欠陥数
可能性の高い
欠陥数
欠陥以外個数
合計
3
5
79
87
検証方法:Linuxの変更記録やLinux-2.6.6以降の
バージョンと確認
 修正された欠陥は3件
 欠陥の可能性が高い候補は5件

僅かなコードを調べることで 8 件もの欠陥を検出できた
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
19
Conflictの効果(候補の数)
Conflictフィルタリング無効
モジュール
arch
Conflictフィルタリング有効
証明された
欠陥数
可能性の高い
欠陥数
合計
証明された
欠陥数
可能性の高い
欠陥数
合計
3
5
123
3
5
87
29%減
Conflictを無効とする時と比べて欠陥候補数を
29%減らした
 取り除いた欠陥候補には実際の欠陥が含まれ
ていない

SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
20
Accumulated Number of Bugs Found
Conflictの効果(発見された欠陥数)
8
7
6
5
4
3
2
32%減
1
0
0
20
42
40
62
60
80
100
120
140
Number of Reviewed Inconsistencies
With Conflict Filtering

Without Conflict Filtering
Conflictフィルタリングの有無に対し、archモジュール
に潜在する8件の欠陥を見つかるために調査すべき
欠陥候補の数を示す
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
21
まとめと今後の課題

まとめ
 ソフトウェアに多く存在しているコードクローンに着
目
 クローンとなっているコード片の間で識別子に対す
る修正の不整合を検出する手法を提案
 修正の不整合を絞り込み、欠陥候補を提示

今後の課題
 他の種類のクローンに適用
 他の手法との比較
SIGSS 3月研究会
2008/03/03
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
22