コード片の生存期間がコードクローンと欠陥修正の有無に与える影響分析

Slides:



Advertisements
Similar presentations
コードクローン履歴閲覧環境を用いたクローン評価の試み
Advertisements

AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
プログラム実行時情報を用いたトランザクションファンクション抽出手法
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
ギャップを含むコードクローンの フィルタリング手法の提案
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
開発履歴を用いたコードクローン作成者と利用者の 分析手法とその適用
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードの生存期間を考慮したコードクローンと欠陥修正の関係調査
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
コードクローンの複雑度メトリクスを用いた開発者の特徴分析
バイトコードを単位とするJavaスライスシステムの試作
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
コードクローン編集者数に着目した開発履歴の分析
コードクローンのメトリクス値と 開発者の相関の調査
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
メトリクス値の変化に基づく コードクローンの編集傾向分析
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案と実装
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
メソッドの同時更新履歴を用いたクラスの機能別分類法
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
関数の変更履歴と呼び出し関係に 基づいた開発履歴理解支援システム
Geminiを用いた効果的なコードクローン分析方法
ベイジアンネットワークと クラスタリング手法を用いたWeb障害検知システムの開発
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

コード片の生存期間がコードクローンと欠陥修正の有無に与える影響分析 井上研究室 齋藤 晃 理ファクタリングはKimがやってる クローンとバグの関係はまだ探していない だ

概要 コードクローンと欠陥修正の関係には様々な報告が存在 既存研究においてコードクローンと欠陥修正の関連は小さいと報告 しかし既存研究ではコードクローンの生存期間を考慮していない 生存期間に応じてコード片を分類したときに クローンが欠陥を含む割合を分析 結果:コードクローンは非コードクローンに比べ 生存期間の影響を強く受ける傾向がある 概要にもっていく

背景:コードクローンと欠陥の関係 コードクローン:ソースコード中に存在する 一致または類似したコード片 コードクローン:ソースコード中に存在する 一致または類似したコード片 コードクローンと欠陥との関係には様々な 報告がある 重複したコードは不吉な匂い(Bad Smell) [Fowler1999] コードクローンと欠陥修正の関連は小さい[Rahman2010] 欠陥コード内に含まれるコードクローンの割合を算出 ちょうふく [Fowler1999]M. Fowler, K. Beck, J. Brant, W. Opdyke, and D. Roberts,“Refactoring: Improving the Design of Existing Code”, 1st ed.Addison-Wesley Professional, July 1999. [Rahman2010] F. Rahman, C. Bird, P. Devanbu, "Clones:What is that Smell?“, MSR2010

既存研究の問題点 既存研究の調査はクローンの生存期間を考慮していない 生存期間:コードが生成されてから変更されるまでの日数 生存期間の短いクローンは修正されやすく,信頼されたコードであれば生存期間が長く修正が生じににくい C1 C’1 C’’1 修正 されやすい 修正 修正 C2 C’2 C’’2 C3 C3 C3 修正 されにくい 既存研究ではコードクローンの生存期間を考慮していなかったので, 本研究ではコードの生存期間を考慮してクローンと欠陥修正の割合の分析を行います. 生存期間を着目した理由としては,下記の2つが考えられます. C4 C4 C4 生存期間に着目することでより欠陥に起因するコードクローンを特定できるのではないか?

研究内容 生存期間を考慮して以下の項目を分析 項目1:生存期間の短いコードクローンは,生存期間が長いコードクローンよりも欠陥コード を多く含む. 項目2 :生存期間が短い非コードクローンは生存期間が長い非コードクローンより欠陥コード を多く含む. 項目3: コードクローンのほうが非コードクローンよりも   生存期間の影響を受けやすい(項目1, 項目2を比較). 項目4: 欠陥コードには生存期間の短いコードクローンが 生存期間が長いコードクローンよりも多く含まれている. ここだけ説明 重要なとこを強調

クローンであるか,欠陥コードであるかを基準にコードを分類 分析手法の概要 以下の手順でクローンと欠陥修正の関連を分析 ・ 生存期間ごとに欠陥コード を含む割合を算出 ・ ・ ・ クローンであるか,欠陥コードであるかを基準にコードを分類 ソースコード ・ ・ 重要なとこを強調 ・ 生存期間に応じて分割

分析手法:生存期間の取得と分割 1行ごとに生存期間の取得し,4つの区間に分割 D1 D2 D3 D4 生存期間 版管理 システム 2005/12/01 2005/10/01 2005/12/01 2005/10/01 2005/12/01 2005/05/01 最終更新日時 生成日時 版管理 システム 差分から 生存期間を計測 調査手法について説明します. まず,各コード行に対して生存期間の取得と分割を行います. 各行の生存期間を取得することで,全体として生存期間の分布を得ることができます. これを生存期間の第1四分位,中央値,第3四分位を基準として,4つの区間に分けます. この分割した区間を今D1,D2,D3,D4と名前をつけます. 第1四分位 中央値 第3四分位 スナップショット D1 D2 D3 D4 短い 長い 生存期間

分析手法:コードの種類に応じて分割 コードを4つの種類に分割 D1 D2 D3 D4 生存期間 版管理 システム 欠陥管理 システム クローン抽出 欠陥コード抽出 Buggy∧Clone 欠陥コードかつクローン Buggy∧Clone 欠陥コードかつ非クローン 版管理 システム Buggy∧Clone 非欠陥コードかつクローン Buggy∧Clone 非クローンかつ非欠陥コード 欠陥管理 システム スナップショット D1 D2 D3 D4 Buggy…コードが欠陥コードClone …コードがクローン 短い 長い 生存期間

分析手法:コードの種類に応じて分割 コードを4つの種類に分割 D1 D2 D3 D4 生存期間 版管理 システム 欠陥管理 システム クローン抽出 欠陥コード抽出 Buggy∧Clone 欠陥コードかつクローン Buggy∧Clone 欠陥コードかつ非クローン 版管理 システム Buggy∧Clone 非欠陥コードかつクローン Buggy∧Clone 非クローンかつ非欠陥コード 欠陥管理 システム スナップショット D1 D2 D3 D4 Buggy…コードが欠陥コードClone …コードがクローン 短い 長い 生存期間

分析項目の検証方法(項目1) D1 D2 D3 D4 生存期間 項目1:生存期間の短いコードクローンは,生存期間が長いコードクローンよりも欠陥コード を多く含む.  1.1 生存期間D内でクローン欠陥コード率RC(Di)を定義 RC(Di) = (Buggy∧Clone)を満たすコードの行数 1.2 下記の式が成立するか検証 分析項目の1つ目として,生存期間の短いコードクローンは,生存期間の長いコードクローンに比べ,欠陥コードを多く含む,ということを調べます. そのために生存期間D内でクローン欠陥コード率RCを定義します. RCはクローンかつ非欠陥コードの行数に対するクローンかつ欠陥コードの行数を表します 欠陥コード率が生存期間が短いほど高くなるということを確かめるために下記の式が成り立つかどうかを調べます. 1.3 相対的に評価するためにD4を基準に正規化 D1 D2 D3 D4 割合を比較 Buggy∧Clone  Buggy∧Clone 生存期間

分析項目の検証方法(項目2) D1 D2 D3 D4 生存期間 項目2:生存期間の短い非コードクローンは,生存期間が長い非コードクローンよりも欠陥コード を多く含む.  2.1 生存期間D内で非クローン欠陥コード率RU(Di)を定義 RU(Di) = (Buggy∧Clone)を満たすコードの行数 2.2 下記の式が成立するか検証 2.3 相対的に評価するためにD4を基準に正規化 D1 D2 D3 D4 割合を比較 Buggy∧Clone  Buggy∧Clone 生存期間

分析項目の検証方法(項目3) 項目3: コードクローンのほうが非コードクローンよりも生存期間の 影響を受けやすい(項目1, 項目2を比較) 項目3: コードクローンのほうが非コードクローンよりも生存期間の 影響を受けやすい(項目1, 項目2を比較) 生存期間の短いクローンはより欠陥コードを含み,逆に  生存期間が長いクローンはより欠陥を含まないことを検証 下記の式が成立するか検証 クローン欠陥コード率 の変化 非クローン欠陥コード率 の変化

生存期間ごとのコード行数 Antプロジェクト524リビジョンのコード分類結果 D1 D2 D3 D4 Buggy∧Clone 944 505 172 34 2,598 909 778 178 4,551,388 4,014,727 3,885,593 3,545,394 8,804,941 9,420,309 9,520,829 Eclipse JDTプロジェクト1150リビジョンのコード分類結果 D1 D2 D3 D4 Buggy∧Clone 6,331 4,076 1,790 777 8,161 3,095 3,247 2,034 23,445,824 23,233,164 23,190,027 23,341,183 33,529,335 33,846,086 34,191,517 33,864,185

分析結果(項目1, 2) AntとEclipse JDTプロジェクトでの結果 値はD4における欠陥コード率を基準とした相対的な割合を表す クローン,非クローン共に欠陥コード率が減少傾向 生存期間が短いほど欠陥を多く含む D1 D2 D3 D4 Ant RC(Di) 11.52 6.98 2.46 0.53 RU(Di) 16.38 5.36 4.54 1.00 クローンの欠陥コード率を 非クローンの欠陥コード率を計測 D1 D2 D3 D4 Eclipse JDT RC(Di) 4.50 2.92 1.29 0.55 RU(Di) 4.05 1.52 1.58 1.00

分析結果(項目3,Ant) RC(D1) RU(D1) RC(D4) RU(D4) = 21.63 = 16.38 生存期間が長い場合はクローンの方が欠陥コードの割合が低い 生存期間が短い場合はクローンの欠陥コードを  含む割合が増加 クローンの方が生存期間の影響が強い D1 D2 D3 D4 Ant RC(Di) 11.52 6.98 2.46 0.53 RU(Di) 16.38 5.36 4.54 1.00 3つ目の分析項目の結果を説明します. こちらの表は先ほどのEclipseJDTの結果と同じですが. 生存期間が長い場合はクローン欠陥コード率の方が低くなっています. また逆に,生存期間が短い場合はクローン欠陥コード率のほうが高くなっています. このことから,クローンの方が生存期間の影響が強いことが分かります. こちらのクローン欠陥コード率の変化を調べるとこのような差異が得られました. クローン欠陥コード率の変化 非クローン欠陥コード率の変化 RC(D1) RC(D4) RU(D1) RU(D4) = 21.63 = 16.38

分析結果(項目3,Eclipse JDT) RC(D1) RU(D1) RC(D4) RU(D4) = 8.11 = 4.05 生存期間が長い場合はクローンの方が欠陥コードの割合が低い 生存期間が短い場合はクローンの欠陥コードを  含む割合が増加 クローンの方が生存期間の影響が強い D1 D2 D3 D4 Eclipse JDT RC(Di) 4.50 2.92 1.29 0.55 RU(Di) 4.05 1.52 1.58 1.00 3つ目の分析項目の結果を説明します. こちらの表は先ほどのEclipseJDTの結果と同じですが. 生存期間が長い場合はクローン欠陥コード率の方が低くなっています. また逆に,生存期間が短い場合はクローン欠陥コード率のほうが高くなっています. このことから,クローンの方が生存期間の影響が強いことが分かります. こちらのクローン欠陥コード率の変化を調べるとこのような差異が得られました. クローン欠陥コード率の変化 非クローン欠陥コード率の変化 RC(D1) RC(D4) RU(D1) RU(D4) = 8.11 = 4.05

得られた知見と応用例 生存期間が短いコードは長いコードよりも欠陥コードが多い コードクローンと非コードクローンの両者で同じ傾向 コードクローンは非コードクローンに比べ生存期間の影響を強く受ける傾向がある 特に生存期間が長いコードクローンは非コードクローン よりも欠陥コードが少ない 応用例:リファクタリング適用候補の順位付け クローンの生存期間をリファクタリングのための指標の  1つとして使用

まとめ コードを4つの集合に分類することにより 以下の内容を確認 今後の課題 生存期間が短いコードは長いコードよりも 欠陥コードの割合が高い コードを4つの集合に分類することにより 以下の内容を確認 生存期間が短いコードは長いコードよりも   欠陥コードの割合が高い コードクローンは非コードクローンに比べ   生存期間の影響を強く受ける傾向がある 今後の課題 実際に修正が生じたコードの内容分析 結果をコードの品質評価に応用

ご清聴ありがとうございました

以下付録 全体でクローンはいくつあった??

背景:コードクローンとは ソースコード中に存在する一致または類似 したコード片 コードクローンに修正漏れがあると欠陥の 要因となる ソースコード中に存在する一致または類似 したコード片 コピーアンドペーストなどの理由により生成 コードクローンに修正漏れがあると欠陥の 要因となる リファクタリング等を用いて除去する必要がある 修正を検討する必要がある,ぐらいに言っておく バグの原因になりやすい理由を言う クローンペア:2つの要素からなるクローンの対 クローンセット:推移関係が成り立つクローンの集合 欠陥 C4 C1 C2 C5 C3

欠陥管理システム 欠陥に関する内容・発見日時・修正履歴などの情報を一元管理 多くの欠陥管理システムはWebサーバ上で 動作 オープンソースソフトウェアの有名な欠陥管理システムとしてBugZillaが代表的 このスライドいらない?

既存研究 コードクローンと欠陥修正の関連を調査[Rahman2010] クローンを含む割合を算出 1.過去のソースコードのスナップショットを取得 2.コードクローン検出  ・コードクローン検出ツールDECKARDを使用 3.欠陥コード(Buggy Code)の位置を特定  ・欠陥管理システムと版管理システムから抽出 4.欠陥コード内のコードクローンの割合を算出 欠陥管理システム 版管理システム B1 C1 クローンを含む割合を算出 B2 C2 多くのコードクローンは欠陥コードに関連していない結果を報告 スナップショット [Rahman2010] F. Rahman, C. Bird, P. Devanbu, “Clones:What is that Smell?“, MSR2010

1.過去のソースコードのスナップショットを取得 1ケ月おきにリポジトリからスナップショットを取得 ソフトウェア リポジトリ(SVN, Git等) チェックアウト ・・・ 2008/03/01 2008/04/03 2009/02/02 その月の中で最も早い日にコミットされたファイル群を取得

2.コードクローン検出 コードクローン検出ツールDECKARDを使用[Jiang2007] コードクローンは位置を特定する情報を保有 s1 抽象構文木(AST)を構築し,それらの等価性を比較することによりクローンを検出 コードクローンは位置を特定する情報を保有 クローンが含まれるスナップショット(sn), ファイル名(fn) クローンの開始行(lbegin), 終了行(lend) s1 s2 s3 f1…fn f1…fn f1…fn クローン lbegin lend ・・・・・ 2008/03/01 2008/04/03 2009/02/02 [Jiang2007] L.Jiang, Z.Su, G.Misherghi, S.Glondu,  “DECKARD:scalable and accurate tree-based detection of code clones“, ICSE2007 各コードクローンは含まれるスナップショット,ファイル名,開始行,終了行の情報を持つ

3.欠陥修正と対応するコミットの取得 欠陥を含むコードの位置を特定することは困難 修正済みのバグレポートを取得し,欠陥が修正されたコード全てを欠陥コード(Buggy Code)とする Buggy Codeを取得するために,リポジトリから欠陥が修正されたコミットとバグレポートを対応付けを実行 リポジトリのコミットログ 欠陥管理システム ------------------------------------------------------------------------ r201  | authorName | 2009-01-01 add feature: ・・・・ r202  | authorName | 2009-02-01 bug fixed: #10002 欠陥ID 状態 詳細 10001 RESOLVED ・・・ 10002 リビジョン番号 欠陥管理システムには修正済みの欠陥情報の一覧が取得できます これらの欠陥情報には,それぞれ一意の欠陥IDを持っています. またリポジトリのコミットログには欠陥が修正された場合,修正者が修正を行った欠陥IDを記述している場合が 多くあります. また修正に関する”fixed”などの文言もあり,それらの情報を基にコミットログを解析して欠陥情報と対応付けを行います. 欠陥IDがコミットログに記述 コミットログを解析して対応付け

4.欠陥修正に含まれるクローンの割合を算出 欠陥修正が行われたリビジョンと最も近い スナップショットを取得 Buggy Code内に含まれるコードクローンの重複率dを算出 多くのコードクローンは欠陥修正に含まれていないという結果を報告

実験結果詳細(項目3) 4つのオープンソースプロジェクトでの実験結果 値はD4におけるUniqueを基準とした相対的な割合を表す 欠陥コード率 Ant Clone 0.53 Unique 1.00 Gimp 0.40 Nautilus 0.31 Eclipse JDT 0.55 全体でクローンはいくつあった?? 値はD4におけるUniqueを基準とした相対的な割合を表す 生存期間が長い場合,コードクローンの方が欠陥が少ない

コード片の生存期間による分類 生存期間:コードが生成されてから変更されるまでの日数 生存期間に応じて4つの集合に分類 D1 ・・・ 生存期間が第1四分位以下のコード片 D2 ・・・ 生存期間が第1四分位を超え,中央値以下のコード片 D3 ・・・ 生存期間が中央値を超え,第3四分位以下のコード片 D4 ・・・ 生存期間が第3四分位を超えるコード片 D1 D2 D3 D4 NormalClone(NC) NC(D1) NC(D2) NC(D3) NC(D4) BuggyClone(BC) BC(D1) BC(D2) BC(D3) BC(D4) NormalUnique(NU) NU(D1) NU(D2) NU(D3) NU(D4) BuggyUnique(BU) BU(D1) BU(D2) BU(D3) BU(D4)

実験結果(RQ1, RQ2) Ant, Eclipse JDTプロジェクトでの結果 Eclipse JDT Ant 20 10 D1 D2 BuggyCode を含む割合 Ant Eclipse JDT 20 Unique Clone 10 全体でクローンはいくつあった?? D1 D2 D3 D4 D1 D2 D3 D4 生存期間 値はD4を基準とした相対的な割合を表す 生存期間が短いほど欠陥を多く含む

実験結果概要(Gimp) グループ 生存期間平均値 生存期間中央値 クローンかつBuggyCode 547 382 774 606 クローンかつ     非BuggyCode 972 801 非クローンかつ    非BuggyCode 1025 833 全体でクローンはいくつあった?? 単位は(日) BuggyCodeのほうが生存期間が短い クローンであるコードの方が生存期間が短い

実験結果概要(Evolution) グループ 生存期間平均値 生存期間中央値 クローンかつBuggyCode 1225 971 1146 974 クローンかつ     非BuggyCode 1592 1629 非クローンかつ    非BuggyCode 1372 1302 全体でクローンはいくつあった?? 単位は(日) BuggyCodeのほうが生存期間が短い クローンであるコードの方が生存期間が長い

BugZillaを用いたバグレポートの取得 バグレポート一覧 バグレポート詳細 実験データを公開しているかどうかを調べる Replicationしたらどうなるかを考える スナップショットの間隔をもっと短くする?

クローン検出ツールDECKARD 抽象構文木(AST)の類似度からクローンを検出 ASTを特徴ベクトル<C1, ..., Cn>で表現 Ciは,特定の種類のノード数 括弧[, ], (, )など重要でないノードは無視 このスライドいらない 実験設定:対象ソフト、期間 結果のグラフ予想図