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
© Copyright 2024 ExpyDoc