Token Comparison Approach to Detect Code Clone-related Bugs

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
TF-IDF法とLSHアルゴリズムを用いた 関数単位のコードクローン検出法
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
情報伝播によるオブジェクト指向プログラム理解支援の提案
コードクローンの長さに基づく プログラム盗用確率の実験的算出
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
プログラム実行履歴を用いたトランザクションファンクション抽出手法
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
コードクローン分析ツールGeminiを用いたコードクローン分析手順
ギャップを含むコードクローンの フィルタリング手法の提案
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
構文定義記述を用いた 多言語対応コードクローン検出ツールの改善
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
実行時情報に基づく OSカーネルのコンフィグ最小化
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードの生存期間を考慮したコードクローンと欠陥修正の関係調査
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードクローン編集者数に着目した開発履歴の分析
コードクローンのメトリクス値と 開発者の相関の調査
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
類似度メトリクスを用いた Javaソースコード間類似度測定ツールの試作
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
メトリクス値の変化に基づく コードクローンの編集傾向分析
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
アスペクト指向言語のための視点に応じた編集を可能にするツール
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
メソッドの同時更新履歴を用いたクラスの機能別分類法
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
関数の変更履歴と呼び出し関係に 基づいた開発履歴理解支援システム
Geminiを用いた効果的なコードクローン分析方法
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

Token Comparison Approach to Detect Code Clone-related Bugs YongLee Yii Yasuhiro Hayase Makoto Matsushita Katsuro Inoue 大阪大学の Yii Yong Leeです。 「Token Comparison Approach to Detect Code Clone-related Bugs」というタイトルで発表させていただきます。

概要 複製されたソースコード片の間で識別子の変更による不整合を検出し、欠陥の候補として提示する手法を提案 発表構成 研究背景 研究動機と目的 提案手法 評価実験 まとめと今後の課題 本発表では、複製されたソースコード片の間で識別子の変更による不整合を検出し、欠陥の候補として提示する手法の提案を行います。 発表の構成は、研究背景、研究動機と目的、提案手法、評価実験と考察、まとめと今後の課題という流れになります。 SIGSS 3月研究会 2008/03/03

コードクローン ソースコード中に存在する、同一または類似したコード片を持つコード片 コードの再利用のために、コピーアンドペーストにより生成 クローンペア コード片 ソースファイル まず,背景としまして,コードクローンについて説明します。 コードクローンとは、ソースコード中に存在する、同一または類似したコード片を持つコード片のことです。 この図では、みどりの部分がコードクローンを表しています。コードクローンの対をクローンペアと呼びます。 コードクローンは様々な理由により生成されます。最も多い事例としては、プログラミングの労力を減らすために、ソースコードをコピーアンドペーストして再利用することが挙げられます。 SIGSS 3月研究会 2008/03/03

再利用の際に発生する不整合 コピーアンドペーストによる再利用の手順 修正の不整合による欠陥を招く 原因となる 実装したい機能と似ているコードを複製する そのコードを編集する 修正の不整合による欠陥を招く 原因となる コードクローンとなっているコード片に識別子の名称の修正を行う 修正漏れにより不整合が発生 再利用の際に、多くの場合は、実装したい機能と似ているコードをコピーアンドペースによって複製し、そのコードを編集します。 しかし、これは修正の不整合による欠陥を招く原因となります。 例えば、コードクローンとなっているコード片に識別子の名称を修正する際に、修正漏れによって不整合が発生し、欠陥を作り込んでしまいます。 次のスライドで、このような欠陥の例を示します。 SIGSS 3月研究会 2008/03/03

欠陥の作り込み例 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 この例は実際に Linux の Kernel で見つけた欠陥です。 コード片1とコード片2はクローンペアとして検出されました。このクローンペアはコピーアンドペーストにより生成された可能性が高いと考えられます。 コード片1で rc であった識別子は、コード片2では全てretvalに変更される必要がありますが、 ここに一つ修正漏れがあります。 この欠陥により、システムは間違ったエラーコードを表示します。 コード片2 Retvalに変更すべき SIGSS 3月研究会 2008/03/03

研究動機と目的 大規模ソフトウェアにはコードクローンが多く存在する 修正漏れによる欠陥は実際のシステムに多く存在している Linuxファイルシステムを実装したコードの12%はクローンとなっている 修正漏れによる欠陥は実際のシステムに多く存在している 大量のソースコードを精査するには労力がかかる 一貫性のない識別子の修正による欠陥を検出 特定の範囲のみコードを精査 大規模ソフトウェアに適用できる 過去の研究によると、大規模ソフトウェアにコードクローンが多く存在します。 実際のシステムには、先程述べたような修正漏れによる欠陥も多く存在しています。 このような欠陥を取り除くためには、大量のソースコードを精査する必要がありますが、これは大きな労力がかかります。 本研究では、大規模ソフトウェアに潜在する一貫性のない識別子の修正による欠陥を、特定の範囲のコードを精査することにより効率的に検出することを目的としています。 SIGSS 3月研究会 2008/03/03

提案手法 検出されたコードクローンをトークンに分割 不整合が検出された識別子を欠陥候補として出力 ソースファイル 欠陥候補の絞り込み メトリクス計算 不整合のフィルタリング マッピング解析 クローン検出ツール 字句解析 クローン位置情報ファイル クローンペアのトークン列 修正の不整合 欠陥候補 提案手法の流れはこのようになっています。 まず、クローン検出ツールにより、ソースファイルに存在するコードクローンを検出し、クローン位置情報ファイルを出力します。 次に、字句解析部が、クローンの位置情報を用いて、コードクローンをトークン単位に分割します。 そして、クローンペアの間で対応する識別子のマッピングを行い、識別子間の不整合を検出します。 さらに、メトリクスを用いて欠陥の可能性が低い不整合を取り除きます。 最後に、不整合が検出された識別子を欠陥候補として提示します。 ここから、各手順の詳細を説明します。 検出されたコードクローンをトークンに分割 不整合が検出された識別子を欠陥候補として出力 クローン検出ツールを用いてソースファイルに存在するコードクローンを検出 メトリクスを用いて欠陥の可能性が低い不整合を取り除く クローンペア間で対応する識別子のマッピングを行い、識別子間の不整合を検出 SIGSS 3月研究会 2008/03/03

字句解析 o_count 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; = 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 字句解析は、検出されたクローンペアをプログラミング言語の字句規則に基づいてトークン単位に分割します。 コード片ごとにそれぞれ1つのトークン列が作られます。 そして、トークン列から識別子を特定します。 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 ; SIGSS 3月研究会 2008/03/03

マッピング解析 一貫性のない修正 = 不整合 一貫性のある修正 識別子変更テーブル コード片1 コード片2 回数 varse arrays ; o_var varse = o_count v_count += STORE_INCR ( char ) ** ・・・・・・ コード片2 ; o_ary arrays = o_count a_count += STORE_INCR ( char ) ** ・・・・・・ 識別子変更テーブル コード片1 コード片2 回数 varse arrays 2 lists 1 v_count a_count 4 o_count o_var o_ary 一貫性のない修正 = 不整合 次の手順であるマッピング解析では、クローンペア間に対応する識別子に対してマッピングを行い、その結果を識別子変更テーブルにまとめます。 コード片1にある識別子が常にコード片2にある同じ識別子と対応する場合、一貫性のある修正といいます。逆に、1つの識別子が複数の識別子と対応する場合は、一貫性のない修正と言い、修正の不整合が発生します。 一貫性のある修正、または変更されていない識別子は欠陥になりませんので、ここで取り除きます。 一貫性のある修正 SIGSS 3月研究会 2008/03/03

欠陥候補の絞り込み 全ての不整合は必ずしも欠陥ではない 2つの可能性がある メトリクスを用いて修正漏れによる欠陥の可能性の度合を数値化する 修正漏れによる欠陥である場合 意図的に変更されていない場合 メトリクスを用いて修正漏れによる欠陥の可能性の度合を数値化する UnchangedRatio Conflict しかし、全ての不整合は必ずしも欠陥ではありません。 ここで、不整合には2つの可能性があります。1つ目は、修正漏れによる欠陥である場合、2つ目は、意図的に変更されていない場合です。 そこで、修正漏れによる欠陥のみを抽出するために、メトリクスを用いて修正漏れによる欠陥の可能性の度合を数値化します。 本研究では、2つのメトリクスを用いました。 これから、この2つのメトリクスを説明します。 SIGSS 3月研究会 2008/03/03

UnchangedRatio 識別子がほとんどの箇所で変えられて、数箇所だけで変えられていない場合、欠陥の可能性が高い NumOfUnchangedID UnchangedRatio = TotalNumOfID クローンとなっているコード片にある識別子の変更されていない比率 UnchangedRatioが0に近い場合、変更されていない識別子は欠陥の有力な候補となる 変更漏れの可能性が高い UnchangedRatioが0、または1の場合、不整合が発生しないことを示す UnchangedRatio=0の時、全ての識別子が変更されている UnchangedRatio=1の時、全ての識別子が変更されていない 1つ目のメトリクスはUnchangedRatioです。 このメトリクスは、識別子がほとんどの箇所で変えられて、数箇所だけで変えられていない場合、欠陥の可能性が高いことを仮定します。 この仮定を踏まえてUnchangedRatioをこのように定義され、クローンとなっているコード片にある識別子の変更されていない比率を計算します。 UnchangedRatioが0に近い場合、変更されていない識別子は欠陥の有力な候補となります。つまり、変更漏れの可能性が高いです。 UnchangedRatio=0の時、全ての識別子が変更されています。一方、 UnchangedRatio=1の時、全ての識別子が変更されていません。したがって、UnchangedRatioが0、または1の場合、不整合が発生しないことを表します。 次に UnchangedRatio の計算例を示します。 SIGSS 3月研究会 2008/03/03

UnchangedRatioの計算例 v_countのUnchangedRatioは0.20となる この変数名は5回出現している コード片1 コード片2 回数 UnchangedRatio v_count a_count 4 0.20 1 varse arrays 2 0.25 lists v_countのUnchangedRatioは0.20となる この変数名は5回出現している コード片2で1回変更されていない この識別子変更テーブルには、コード片1にある識別子とコード片2で対応する識別子の名前が記録されています。 例えば、v_countはコード片1で5回出現しており、コード片2では5回のうち、一回変更されていないため、 UnchangedRatioは0.2となります。 SIGSS 3月研究会 2008/03/03

Conflict このような場合は、Conflict = trueと設定 欠陥の候補から取り除く コード片1にある識別子がコード片2で元の識別子と異なる複数の識別子に対応する場合は、機能を実装するために、意図的に複数の識別子の名称に変更した可能性が高い このような場合は、Conflict = trueと設定 欠陥の候補から取り除く コード片1                                  コード片2 回数 UnchangedRatio Conflict v_count a_count 4 0.20 False 1 varse arrays 2 0.25 True lists 2つ目のメトリクスは Conflict です。 コード片1にある識別子がコード片2で元の識別子と異なる複数の識別子に対応する場合は、機能を実装するなどのために、意図的に複数の識別子の名称に変更した可能性が高いと考えられます。 このような場合は、 Conflict を true とし、欠陥の候補から取り除きます。 このテーブルでは、varseは 複数の異なる識別子である arraysとlistsに対応しますので、conflict = trueとなり、欠陥の候補から取り除かれます。 SIGSS 3月研究会 2008/03/03

出力される欠陥候補 コード片1 コード片2 回数 UnchangedRatio Conflict v_count a_count 4 0.20 False 1 コピー元のコード片 コピー先のコード片 識別子 UnchangedRatio コード片1 コード片2 v_count 0.20 最後に、メトリクスを用いて修正の不整合を絞り込んだ結果を出力します。 欠陥の候補は、コピー元のコード片、コピー先のコード片、不整合を起こした識別子、そして UnchangedRatio の値から成ります。 SIGSS 3月研究会 2008/03/03

提案手法の実装 対象言語:CとJava ツールの記述言語: Java クローン検出部には既存のコードクローン検出ツールCCFinderを利用 字句解析部は字句解析器生成ツールJFLEXを用いて構築 検出された欠陥候補を可視化するために、GUIで提示 提案手法を実装した欠陥検出ツールを試作しました。 現在のところ、対象言語はCとJavaになっています。 クローン検出部には、既存のコードクローン検出ツールであるCCFinderを用いました。 また、字句解析部は字句解析器生成ツールJFLEXを用いて構築しました。 ユーザはGUIを通じて、欠陥候補のインスペクションを行うことができます。 SIGSS 3月研究会 2008/03/03

ツールのGUI 欠陥候補リスト ソースコードビュー 識別子変更テーブル これは、ツールのスナップショットです。 この部分は欠陥候補リストと呼ばれるもので、欠陥候補の一覧を表示します。識別子のUnchangedRatioに基づいて一覧を昇順、降順にソートすることができます。 欠陥候補リストで候補を選択すると、その候補を含む識別子変更テーブルが表示されます。 また、ソースコードビューでは、選択された欠陥候補のコード片と、周辺のソースコードも表示されます。 SIGSS 3月研究会 2008/03/03

適用実験 目的: 対象:Linux kernel 2.6.6 実験設定 識別子の修正不整合による欠陥を検出できているかを確認 Conflictの有効性を評価 対象:Linux kernel 2.6.6 ファイル数: 6,491 LOC: 約400万 実験設定 クローンの最小トークン数:30 UnchangedRatioの閾値:0.4 提案手法が実際に識別子の修正不整合による欠陥を検出できることを確認するために、適用実験を行いました。 また、実験を通じて本研究で定義したメトリクスであるConflictの有効性も評価します。 実験対象はLinux kernel 2.6.6としました。 実験では、クローンの最小トークン数を30とし、 UnchangedRatio が0.4以下の候補のみを調査しました。 SIGSS 3月研究会 2008/03/03

欠陥候補の検出 archモジュールでは87個、driversモジュールでは120個の欠陥候補が検出された ファイル数 総行数 欠陥候補数 欠陥候補を含むクローンの総行数 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%未満 提案手法を実行したところ、archモジュールでは87個、driversモジュールでは120個の欠陥候補が検出されました。 欠陥候補を含むクローンの総行数はモジュールの総行数の0.25%未満でした。 SIGSS 3月研究会 2008/03/03

欠陥候補の検証 検証方法:Linuxの変更記録やLinux-2.6.6以降のバージョンと確認 修正された欠陥は3件 モジュール 証明された欠陥数 可能性の高い欠陥数 欠陥以外個数 合計 arch 3 5 79 87 検証方法:Linuxの変更記録やLinux-2.6.6以降のバージョンと確認 修正された欠陥は3件 欠陥の可能性が高い候補は5件 僅かなコードを調べることで 8 件もの欠陥を検出できた 検出された欠陥候補を確認したところ、実際に欠陥だと考えられる候補が 8 件見つかりました。 Linux の変更記録や Linux 2.6.6 以降のバージョンを調べたところ、このうち3件は未来のバージョンで修正されていました。 僅かなコードを調べることで 8 件もの欠陥を検出できたことから、本手法の有効性が示されました。 SIGSS 3月研究会 2008/03/03

Conflictの効果(候補の数) Conflictを無効とする時と比べて欠陥候補数を29%減らした モジュール Conflictフィルタリング無効 Conflictフィルタリング有効 証明された欠陥数 可能性の高い欠陥数 合計 arch 3 5 123 87 29%減 Conflictを無効とする時と比べて欠陥候補数を29%減らした 取り除いた欠陥候補には実際の欠陥が含まれていない 続いて、Conflictの効果の評価ですが、Conflictフィルタリングを無効とするときに、欠陥候補は123件が検出されました。 一方、Conflictフィルタリングを有効とするときに、欠陥候補は87件が検出されました。つまり、欠陥候補数を29%減らしました。 また、取り除いた欠陥候補のうちに実際の欠陥が含まれていないことから、Conflictの有効性が示されました。 SIGSS 3月研究会 2008/03/03

Conflictの効果(発見された欠陥数) 32%減 42 62 このグラフは、archモジュールに潜在する欠陥を検査する際に、Conflictフィルタリングがどのくらい有効に働くかを評価したものです。x軸は調査した欠陥数を表し、y軸は累積した欠陥数を表します。 Conflictフィルタリングを無効としたときには、 8件目の欠陥を見つかるためには、62個目までの欠陥候補を調査することが必要でした。 一方、 Conflictフィルタリングを有効としたときには、42個目までの欠陥候補を調査することで、8件の欠陥を見つけることができました。 つまり、Conflictフィルタリングにより、調査すべき欠陥候補数を32%減らすことが出来ました。 この結果から、Conflictフィルタリングによって、より少ない数の候補を調査することで欠陥を見つけられることがわかりました。 Conflictフィルタリングの有無に対し、archモジュールに潜在する8件の欠陥を見つかるために調査すべき欠陥候補の数を示す SIGSS 3月研究会 2008/03/03

まとめと今後の課題 まとめ 今後の課題 ソフトウェアに多く存在しているコードクローンに着目 クローンとなっているコード片の間で識別子に対する修正の不整合を検出する手法を提案 修正の不整合を絞り込み、欠陥候補を提示 今後の課題 他の種類のクローンに適用 他の手法との比較 では,まとめと今後の課題について述べます。 本研究では,ソフトウェアに多く存在しているコードクローンに着目し、クローンとなっているコード片の間で識別子に対する修正の不整合を検出する手法を提案しました。検出された修正の不整合を絞り込んで、欠陥の候補として提示します。 今後は、実装したツールを改善し、他の種類のクローンに適応できるようにしたいと考えています。 また、他の手法との比較が考えられます。 SIGSS 3月研究会 2008/03/03