200 likes | 248 Vues
コードクローンに対する一貫性のない変更に起因する欠陥の検出. 井上研究室 博士前期課程2年 Yii Yong Lee. 概要. 複製されたソースコード片の間で識別子の変更による不整合を検出し、欠陥の候補として提示する手法を提案 発表構成 研究背景 研究動機と目的 提案手法 評価実験 まとめと今後の課題. ソースファイル. ソースファイル. クローンペア. コード片. コード片. コード片. コードクローン. ソースコード中に存在する、同一または類似したコード片を持つコード片 コードの再利用のために、コピーアンドペーストにより生成.
E N D
コードクローンに対する一貫性のない変更に起因する欠陥の検出コードクローンに対する一貫性のない変更に起因する欠陥の検出 井上研究室 博士前期課程2年 Yii Yong Lee
概要 複製されたソースコード片の間で識別子の変更による不整合を検出し、欠陥の候補として提示する手法を提案 発表構成 • 研究背景 • 研究動機と目的 • 提案手法 • 評価実験 • まとめと今後の課題 修士論文発表会
ソースファイル ソースファイル クローンペア コード片 コード片 コード片 コードクローン • ソースコード中に存在する、同一または類似したコード片を持つコード片 • コードの再利用のために、コピーアンドペーストにより生成 修士論文発表会
再利用の際に発生する不整合 • コピーアンドペーストによる再利用の手順 • 実装したい機能と似ているコードを複製する • そのコードを編集する • 修正の不整合による欠陥を招く 原因となる • コードクローンとなっているコード片に識別子の名称の修正を行う • 修正漏れにより不整合が発生 修士論文発表会
欠陥の作り込み例 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: } コード片1 コード片2 Retvalに変更すべき 修士論文発表会
研究動機と目的 • 大規模ソフトウェアにはコードクローンが多く存在する • Linuxファイルシステムの12%のコードはクローンとなっている • 修正漏れによる欠陥は実際のシステムに多く存在している • 大量のソースコードを精査するには労力がかかる • 一貫性のない識別子の修正による欠陥を検出 • 特定の範囲のみコードを精査 • 大規模ソフトウェアに適用できる 修士論文発表会
クローン位置情報ファイル 修正の不整合 クローンペアのトークン列 提案手法 ソースファイル 欠陥候補の絞り込み 不整合のフィルタリング メトリクス計算 マッピング解析 クローン検出ツール 字句解析 欠陥候補 検出されたコードクローンをトークンに分割 不整合が検出された識別子を欠陥候補として出力 クローン検出ツールを用いてソースファイルに存在するコードクローンを検出 メトリクスを用いて欠陥の可能性が低い不整合を取り除く クローンペア間で対応する識別子のマッピングを行い、識別子間の不整合を検出 修士論文発表会
字句解析 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_count = v_count ; o_var = varse ; v_count += STORE_INCR varse = ( char ** ) 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_count = a_count ; o_ary = arrays ; a_count += STORE_INCR arrays = ( char ** ) 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 ; 修士論文発表会
・・・・・・ o_count = v_count ; o_var = varse ; v_count += STORE_INCR ; varse = ( char ** ) ・・・・・・ o_count = a_count ; o_ary = arrays ; a_count += STORE_INCR ; arrays = ( char ** ) マッピング解析 コード片1 コード片2 識別子変更テーブル 一貫性のない修正 = 不整合 一貫性のある修正 修士論文発表会
欠陥候補の絞り込み • 全ての不整合は必ずしも欠陥ではない • 2つの可能性がある • 修正漏れによる欠陥である場合 • 意図的に変更されていない場合 • メトリクスを用いて修正漏れによる欠陥の可能性の度合を数値化する • UnchangedRatio • Conflict 修士論文発表会
UnchangedRatio NumOfUnchangedID UnchangedRatio = TotalNumOfID • クローンとなっているコード片にある識別子の変更されていない比率 • 仮定:識別子がほとんどの箇所で変えられて、あるいくつかの箇所だけで変えられていない場合、変えられていない識別子は大抵の場合、欠陥である • UnchangedRatioが0に近い場合、変更されていない識別子は欠陥の有力な候補となる • 変更漏れの可能性が高い • UnchangedRatioが0、または1の場合、不整合が発生しないことを示す • UnchangedRatio=0の時、全ての識別子が変更されている • UnchangedRatio=1の時、全ての識別子が変更されていない 修士論文発表会
UnchangedRatioの計算例 • v_countのUnchangedRatioは0.20となる • この変数名は5回出現している • コード片2で1回変更されていない 修士論文発表会
Conflict • 元の識別子と異なる複数の識別子に対応する場合: Conflict = true • 機能を実装するために、意図的に複数の識別子の名称に変更する可能性が高い • 欠陥の候補から取り除く 修士論文発表会
出力される欠陥候補 修士論文発表会
提案手法の実装 • 対象言語:CとJava • ツールの記述言語: Java • クローン検出部には既存のコードクローン検出ツールCCFinderを利用 • 字句解析部は字句解析器生成ツールJFLEXを用いて構築 • 検出された欠陥候補を可視化するために、GUIで提示 修士論文発表会
ツールのGUI 欠陥候補リスト ソースコードビュー 識別子変更テーブル 修士論文発表会
適用実験 • 目的:識別子の修正不整合による欠陥を検出できているかを確認 • 対象:Linux kernel 2.6.6 • ファイル数: 6,491 • LOC: 約400万 • 実験設定 • クローンの最小トークン数:30 • UnchangedRatioの閾値:0.4 修士論文発表会
欠陥候補の検出 • archモジュールでは87個、driversモジュールでは120個の欠陥候補が検出された • 欠陥候補を含むクローンの総行数はモジュールの総行数の0.25%未満 修士論文発表会
欠陥候補の検証 • 検証方法:Linuxの変更記録やLinux-2.6.6以降のバージョンと確認 • 修正された欠陥は3件 • 欠陥の可能性が高い候補は5件 • 僅かなコードを調べることで 8 件もの欠陥を検出できた 修士論文発表会
まとめと今後の課題 • まとめ • ソフトウェアに多く存在しているコードクローンに着目 • クローンとなっているコード片の間で識別子に対する修正の不整合を検出する手法を提案 • 修正の不整合を絞り込み、欠陥候補を提示 • 今後の課題 • より多くのクローンパターンに適用 • 他の手法との比較 修士論文発表会