コードクローンに対する一貫性の ない変更に起因する欠陥の検出 井上研究室 博士前期課程2年 Yii Yong Lee Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 概要 複製されたソースコード片の間で識別子の変更による 不整合を検出し、欠陥の候補として提示する手法を提 案 発表構成 研究背景 研究動機と目的 提案手法 評価実験 まとめと今後の課題 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 2 コードクローン ソースコード中に存在する、同一または類似し たコード片を持つコード片 コードの再利用のために、コピーアンドペースト により生成 ソースファイル ソースファイル クローンペア コード片 コード片 コード片 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 3 再利用の際に発生する不整合 コピーアンドペーストによる再利用の手順 実装したい機能と似ているコードを複製する そのコードを編集する 修正の不整合による欠陥を招く 原因となる コードクローンとなっているコード片に識別子の名 称の修正を行う 修正漏れにより不整合が発生 修士論文発表会 2008/02/15 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: } 修士論文発表会 コード片1 コード片2 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 5 研究動機と目的 大規模ソフトウェアにはコードクローンが多く存在する Linuxファイルシステムの12%のコードはクローンとなって いる 修正漏れによる欠陥は実際のシステムに多く存在して いる 大量のソースコードを精査するには労力がかかる 一貫性のない識別子の修正による欠陥を検出 特定の範囲のみコードを精査 大規模ソフトウェアに適用できる 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 6 提案手法 ソースファイル 欠陥候補の絞り込み クローン 検出 ツール 字句解析 クローン位 置情報 ファイル メトリクス 計算 マッピング 解析 クローンペ アのトーク ン列 不整合のフィ ルタリング 修正の不 整合 欠陥候補 検出されたコードクローンをトーク 不整合が検出された識別子 クローン検出ツールを用いてソー メトリクスを用いて欠陥の可能性 クローンペア間で対応する識別子 ンに分割 を欠陥候補として出力 が低い不整合を取り除く スファイルに存在するコードクロー のマッピングを行い、識別子間の ンを検出 不整合を検出 修士論文発表会 2008/02/15 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 ; 修士論文発表会 2008/02/15 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 回数 一貫性のない修正 = 不整合 一貫性のある修正 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 9 欠陥候補の絞り込み 全ての不整合は必ずしも欠陥ではない 2つの可能性がある 修正漏れによる欠陥である場合 意図的に変更されていない場合 メトリクスを用いて修正漏れによる欠陥の可能 性の度合を数値化する UnchangedRatio Conflict 修士論文発表会 2008/02/15 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の時、全ての識別子が変更されていない 修士論文発表会 2008/02/15 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回変更されていない 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 12 Conflict 元の識別子と異なる複数の識別子に対応する場合: 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 2008/02/15 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 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 14 提案手法の実装 対象言語:CとJava ツールの記述言語: Java クローン検出部には既存のコードクローン検出 ツールCCFinderを利用 字句解析部は字句解析器生成ツールJFLEXを 用いて構築 検出された欠陥候補を可視化するために、GUI で提示 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 15 ツールのGUI 欠陥候補 リスト ソースコード ビュー 識別子変 更テーブル 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 16 適用実験 目的:識別子の修正不整合による欠陥を検出 できているかを確認 対象:Linux kernel 2.6.6 ファイル数: 6,491 LOC: 約400万 実験設定 クローンの最小トークン数:30 UnchangedRatioの閾値:0.4 修士論文発表会 2008/02/15 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%未満 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 18 欠陥候補の検証 モジュール arch 証明された 欠陥数 可能性の高い 欠陥数 合計 3 5 87 検証方法:Linuxの変更記録やLinux-2.6.6以 降のバージョンと確認 修正された欠陥は3件 欠陥の可能性が高い候補は5件 僅かなコードを調べることで 8 件もの欠陥を検 出できた 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 19 まとめと今後の課題 まとめ ソフトウェアに多く存在しているコードクローンに着 目 クローンとなっているコード片の間で識別子に対す る修正の不整合を検出する手法を提案 修正の不整合を絞り込み、欠陥候補を提示 今後の課題 より多くのクローンパターンに適用 他の手法との比較 修士論文発表会 2008/02/15 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 20
© Copyright 2024 ExpyDoc