コードクローンに対する一貫性のない変更に起因する欠陥の検出

20
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University コココココココココココ コココココココココココ ココココココ 井井井井井 井井井井井井 Yii Yong Lee

description

コードクローンに対する一貫性のない変更に起因する欠陥の検出. 井上研究室 博士前期課程2年 Yii Yong Lee. 概要. 複製されたソースコード片の間で識別子の変更による不整合を検出し、欠陥の候補として提示する手法を提案 発表構成 研究背景 研究動機と目的 提案手法 評価実験 まとめと今後の課題. ソースファイル. ソースファイル. クローンペア. コード片. コード片. コード片. コードクローン. ソースコード中に存在する、同一または類似したコード片を持つコード片 コードの再利用のために、コピーアンドペーストにより生成. - PowerPoint PPT Presentation

Transcript of コードクローンに対する一貫性のない変更に起因する欠陥の検出

Page 1: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology,Osaka University

コードクローンに対する一貫性のない変更に起因する欠陥の検出

井上研究室博士前期課程2年

Yii Yong Lee

Page 2: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

2

概要

複製されたソースコード片の間で識別子の変更による不整合を検出し、欠陥の候補として提示する手法を提案

発表構成 研究背景 研究動機と目的 提案手法 評価実験 まとめと今後の課題

Page 3: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

3

コードクローン

ソースコード中に存在する、同一または類似したコード片を持つコード片

コードの再利用のために、コピーアンドペーストにより生成

クローンペアコード片

コード片

コード片

ソースファイル

ソースファイル

Page 4: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

4

再利用の際に発生する不整合

コピーアンドペーストによる再利用の手順実装したい機能と似ているコードを複製するそのコードを編集する

修正の不整合による欠陥を招く 原因となるコードクローンとなっているコード片に識別子

の名称の修正を行う修正漏れにより不整合が発生

Page 5: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

5

欠陥の作り込み例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:1577: up(&ctrl->crit_sect);1578: return retval; 1579: }

Retval に変更すべき

コード片 1

コード片 2

Page 6: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

6

研究動機と目的

大規模ソフトウェアにはコードクローンが多く存在する Linux ファイルシステムの12%のコードはクローンと

なっている 修正漏れによる欠陥は実際のシステムに多く存在し

ている 大量のソースコードを精査するには労力がかかる

一貫性のない識別子の修正による欠陥を検出 特定の範囲のみコードを精査 大規模ソフトウェアに適用できる

Page 7: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

7

提案手法

クローン検出ツール

クローン位置情報ファイル

字句解析マッピング

解析

ソースファイル

クローンペアの

トークン列

修正の不整合

欠陥候補

メトリクス計算

不整合のフィルタリ

ング

欠陥候補の絞り込み

クローン検出ツールを用いてソースファイルに存在するコー

ドクローンを検出

検出されたコードクローンをトークンに分割クローンペア間で対応する識別

子のマッピングを行い、識別子間の不整合を検出

メトリクスを用いて欠陥の可能性が低い不整合を取り除く

不整合が検出された識別子を欠陥候補として出力

Page 8: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

8

字句解析127: o_count = v_count;128: o_var = variables;129:130: v_count += STORE_INCR;131: variables = (char **) malloc (v_count*sizeof(char *));132:133: for (indx = 3; indx < o_count; indx++)134: variables[indx] = o_var[indx];135:136: for (; indx < v_count; indx++)137: variables[indx] = NULL;     ......

161: o_count = a_count;162: o_ary = arrays;163:164: a_count += STORE_INCR;165: arrays = (char **) malloc (a_count*sizeof(char *));166:167: for (indx = 1; indx < o_count; indx++)168: variables[indx] = o_ary[indx];169:170: for (; indx < v_count; indx++)171: lists[indx] = NULL;

;o_var varse=

o_count = ;v_count

+= STORE_INCRv_count

( char ) (**varse = malloc v_count * sizeof ( )char * ) ;

for indx( )= 1 ; indx < o_count ; indx ++

varse ][ indx = o_var ][ indx ;

for ( ); indx < v_count ; indx ++

varse ][ indx = NULL ;

;o_ary arrays=

o_count = ;a_count

+= STORE_INCRa_count

( char ) (**arrays = malloc a_count * sizeof ( )char * ) ;

for indx( )= 1 ; indx < o_count ; indx ++

varse ][ indx = o_ary ][ indx ;

for ( ); indx < v_count ; indx ++

lists ][ indx = NULL ;

Page 9: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

9

マッピング解析

;o_var varse=o_count = ;v_count += STORE_INCRv_count ( char )**varse =; ・・・・・・

コード片1

;o_ary arrays=o_count = ;a_count += STORE_INCRa_count ( char )**arrays =; ・・・・・・

コード片2

コード片1 コード片2 回数

varse arrays 2

lists 1

varse 1

v_count a_count 4

v_count 1

o_count o_count 2

o_var o_ary 2

識別子変更テーブル

一貫性のある修正

一貫性のない修正 = 不整合

Page 10: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

10

欠陥候補の絞り込み

全ての不整合は必ずしも欠陥ではない 2 つの可能性がある

修正漏れによる欠陥である場合意図的に変更されていない場合

メトリクスを用いて修正漏れによる欠陥の可能性の度合を数値化するUnchangedRatioConflict

Page 11: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

11

UnchangedRatio

クローンとなっているコード片にある識別子の変更されていない比率 仮定:識別子がほとんどの箇所で変えられて、あるいくつかの箇

所だけで変えられていない場合、変えられていない識別子は大抵の場合、欠陥である

UnchangedRatio が0に近い場合、変更されていない識別子は欠陥の有力な候補となる 変更漏れの可能性が高い

UnchangedRatio が0、または1の場合、不整合が発生しないことを示す UnchangedRatio=0 の時、全ての識別子が変更されている UnchangedRatio=1 の時、全ての識別子が変更されていない

NumOfUnchangedIDUnchangedRatio = TotalNumOfID

Page 12: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

12

UnchangedRatio の計算例

v_count の UnchangedRatio は 0.20 となるこの変数名は 5 回出現しているコード片2で1回変更されていない

コード片1 コード片2 回数 UnchangedRatio

v_counta_count 4

0.20v_count 1

varse

arrays 2

0.25lists 1

varse 1

Page 13: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

13

Conflict

元の識別子と異なる複数の識別子に対応する場合 : Conflict = true

機能を実装するために、意図的に複数の識別子の名称に変更する可能性が高い

欠陥の候補から取り除く

コード片1                                 

コード片2 回数 UnchangedRatio Conflict

v_counta_count 4

0.20 Falsev_count 1

varse

arrays 2

0.25 Truelists 1

varse 1

Page 14: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

14

出力される欠陥候補

コピー元のコード片

コピー先のコード片 識別子 UnchangedRatio

コード片1 コード片2 v_count 0.20

コード片1 コード片2 回数 UnchangedRatio Conflict

v_counta_count 4

0.20 Falsev_count 1

Page 15: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

15

提案手法の実装

対象言語:Cと Java ツールの記述言語: Java クローン検出部には既存のコードクローン

検出ツール CCFinder を利用 字句解析部は字句解析器生成ツール JFLEX

を用いて構築 検出された欠陥候補を可視化するため

に、 GUI で提示

Page 16: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

16

ツールのGUI

欠陥候補リスト

識別子変更テーブ

ソースコードビュー

Page 17: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

17

適用実験

目的:識別子の修正不整合による欠陥を検出できているかを確認

対象: Linux kernel 2.6.6ファイル数 : 6,491LOC: 約 400 万

実験設定クローンの最小トークン数: 30UnchangedRatio の閾値: 0.4

Page 18: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

18

欠陥候補の検出

arch モジュールでは 87 個、 drivers モジュールでは 120 個の欠陥候補が検出された

欠陥候補を含むクローンの総行数はモジュールの総行数の 0.25 %未満

モジュール ファイル数

総行数 欠陥候補数 欠陥候補を含むクローンの総行数

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

Page 19: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

19

欠陥候補の検証

検証方法: Linux の変更記録や Linux-2.6.6以降のバージョンと確認

修正された欠陥は 3 件 欠陥の可能性が高い候補は 5 件 僅かなコードを調べることで 8 件もの欠

陥を検出できた

モジュール

証明された欠陥数

可能性の高い欠陥数 合計

arch 3 5 87

Page 20: コードクローンに対する一貫性のない変更に起因する欠陥の検出

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

修士論文発表会 2008/02/15

20

まとめと今後の課題

まとめソフトウェアに多く存在しているコードクロー

ンに着目クローンとなっているコード片の間で識別子に

対する修正の不整合を検出する手法を提案修正の不整合を絞り込み、欠陥候補を提示

今後の課題より多くのクローンパターンに適用他の手法との比較