コードの生存期間を考慮したコードクローンと欠陥修正の関係調査

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
Advertisements

コードクローン履歴閲覧環境を用いたクローン評価の試み
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
日本大学 文理学部 情報システム解析学科 谷研究室 益田真太郎
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
ソフトウェアリポジトリにおける コードクローン作成者・利用者関係分析手法とその適用
プログラム実行履歴を用いたトランザクションファンクション抽出手法
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
ギャップを含むコードクローンの フィルタリング手法の提案
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
開発履歴を用いたコードクローン作成者と利用者の 分析手法とその適用
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
コード片の生存期間がコードクローンと欠陥修正の有無に与える影響分析
既存ソフトウェアの変更履歴を利用したソースコード修正支援手法の提案
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
コードクローンの複雑度メトリクスを用いた開発者の特徴分析
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
コードクローン編集者数に着目した開発履歴の分析
コードクローンのメトリクス値と 開発者の相関の調査
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
メトリクス値の変化に基づく コードクローンの編集傾向分析
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案と実装
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
メソッドの同時更新履歴を用いたクラスの機能別分類法
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
関数の変更履歴と呼び出し関係に 基づいた開発履歴理解支援システム
Geminiを用いた効果的なコードクローン分析方法
識別子の読解を目的とした名詞辞書の作成方法の一試案
Presentation transcript:

コードの生存期間を考慮したコードクローンと欠陥修正の関係調査 大阪大学 大学院情報科学研究科 ○齋藤 晃,吉田 則裕,   松下 誠,井上 克郎 理ファクタリングはKimがやってる クローンとバグの関係はまだ探していない だ

概要 コードクローンと欠陥修正の関係には様々な報告が存在 既存研究においてコードクローンと欠陥修正の関連は小さいと報告 しかし既存研究ではコードクローンの生存期間を考慮していない コードクローンの生存期間を考慮してクローンと欠陥修正の関係を再調査 調査の結果,生存期間の短いクローンのほうが 欠陥修正に含まれる割合が多い 概要にもっていく

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

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

背景:コードクローンと欠陥の関係 コードクローンと欠陥との関係には様々な 報告がある コードクローンと欠陥との関係には様々な 報告がある 重複したコードは不吉な匂い(Bad Smell) [Fowler1999] コードクローンは保守性を低下させるので積極的に除去すべき[Jiang2007] コードクローンと欠陥修正の関連は小さい[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. [Jiang2007] L. Jiang, Z. Su, and E. Chiu, “Context-based detection of clone-related bugs” ESEC-FSE 2007 [Rahman2010] F. Rahman, C. Bird, P. Devanbu, "Clones:What is that Smell?“, MSR2010

既存研究 コードクローンと欠陥修正の関連を調査[Rahman2010] 手順1.過去のソースコードのスナップショットを取得 手順2.コードクローン検出 手順3.欠陥修正と対応するコミットの取得 手順4.欠陥修正に含まれるコードクローンの割合を算出 [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を持っています. またリポジトリのコミットログには欠陥が修正された場合,修正者が修正を行った欠陥IDを記述している場合が 多くあります. また修正に関する”fixed”などの文言もあり,それらの情報を基にコミットログを解析して欠陥情報と対応付けを行います. 欠陥ID 状態 詳細 10001 RESOLVED ・・・ 10002 リビジョン番号 欠陥IDがコミットログに記述 コミットログを解析して対応付け

4.欠陥修正に含まれるクローンの割合を算出 欠陥修正が行われたリビジョンと最も近い スナップショットを取得 スナップショットと間に変更が生じている可能性があるので,diffコマンドによって調整 Buggy Code内に含まれるコードクローンの重複率dを算出 多くのコードクローンは欠陥修正に含まれていないという結果を報告

既存手法の問題点 (1/2) 生存期間に着目することでより欠陥に起因するコードクローンを特定できる のではないか? 既存手法の問題点 (1/2) 既存研究の調査はクローンの生存期間を考慮していない 既に修正が頻繁に生じているコード片は今後も変更が生じやすい たとえコードクローンであってもよく知られたプログラミングロジックであれば欠陥修正との関連は小さくなりやすい C1 C’1 C’’1 修正 されやすい 修正 修正 C2 C’2 C’’2 C3 C3 C3 重要なとこを強調 修正 されにくい C4 C4 C4 生存期間に着目することでより欠陥に起因するコードクローンを特定できる   のではないか?

既存手法の問題点 (2/2) 欠陥修正を行ったリビジョンとスナップショットとの期間が増えると誤差が大きくなる 既存手法の問題点 (2/2) 欠陥修正を行ったリビジョンとスナップショットとの期間が増えると誤差が大きくなる 欠陥修正時ではコードクローンであってもスナップショットではクローンでない可能性がある クローンでない 修正 取得したスナップショット 重要なとこを強調 コードを修正 欠陥修正を行ったリビジョン

研究内容 既存手法の手順に以下の手順を追加 Buggy Codeに含まれているコードクローンに包含されるコード片の生存期間を取得 RQ: 生存期間の長いクローンは欠陥が少なく、生存期間が短いクローンは欠陥を多く含む スナップショットを欠陥修正と対応付けした リビジョン全てにコードクローン検出を実行 取得したスナップショットとの誤差を小さくする 重要なとこを強調

クローンの生存期間の取得方法 手順1-4.Buggy Code内に含まれるクローンの抽出と重複率の算出 以下の手順A, Bを追加 既存手法と同様 以下の手順A, Bを追加 A.コード片の変更の有無を過去のリビジョンと比較 B.コード片の生存期間を算出 重要なとこを強調

コード片の変更の判定・生存期間の算出 1ケ月おきに過去のリビジョンから該当するコード片に変更があるかどうかを判定 差異はdiffが存在するかどうか 変更が生じたリビジョンとBuggy Codeが検出されたリビジョンとの日付の差が生存期間 BuggyCode C1 重要なとこを強調 C2 C2 C2 過去にコード片が存在しない 過去にコード片が存在 C3 C4 約1ケ月 r2 r1 r0 rs 2009-03-02 2009-04-04 2009-05-01 2009-06-01

変更の有無の判定 変更の有無はdiffコマンドを使用 過去にリビジョンに対して,下記の1~4の場所に差分が存在すれば変更が生じたと判定 変更が生じた周りの行は取得しないよう設定 過去にリビジョンに対して,下記の1~4の場所に差分が存在すれば変更が生じたと判定 diffの開始行 4. 1. コード片の開始行 3. コード片 コード片の終了行 2. diffの終了行 欠陥修正が行われた リビジョン 過去のリビジョン

適用実験 下記のオープンソースソフトウェアを調査 リポジトリはGitを使用 BugZillaから修正完了したバグレポートを取得 gimp・・・画像処理ソフトウェア evolution・・・Gnome環境に付属するメールクライアント これらは既存研究でも調査対象 リポジトリはGitを使用 BugZillaから修正完了したバグレポートを取得 Statusが“RESOLVED”, “VERIFIED”, “CLOSED”のいずれかに設定 Resolutionが“FIXED”に設定

実験結果:生存期間の抽出 抽出したコードクローンの数と生存期間 生存期間中央値よりも長いコードクローン プロジェクト名 Gimp Evolution コードクローンの数 1093 1114 生存期間最大(日) 3460 3812 生存期間最小(日) 32 41 生存期間中央値(日) 574 1791 全体でクローンはいくつあった?? 生存期間中央値よりも長いコードクローン (Clong)と短いコードクローン(Cshort)に分割

実験結果:欠陥修正に含まれるクローンの分布 ClongとCshortに対して欠陥修正にクローンが含まれる 割合を算出 (a)Gimp (b)Evolution 累積 カバレッジ Clong Cshort 重複率4割以下はClongでは8割をしめるのにCshortは6割程度しかない これはCshortのほうがそれ以上に重複率が高いものを多く含むことを表している よって生存期間が短いクローンの方が欠陥修正に多く含まれる 欠陥修正に含まれるクローンの重複率 累積カバレッジ(縦軸)は欠陥修正に含まれるクローンがx%以下のものが全体の何割を占めるかを表す 生存期間が短いクローンの方が欠陥修正に多く含まれる

実験結果:欠陥修正に含まれるクローンの分布 ClongとCshortに対して欠陥修正にクローンが含まれる 割合を算出 (a)Gimp (b)Evolution Clong Cshort 全体に対する割合 重複率4割以下はClongでは8割をしめるのにCshortは6割程度しかない これはCshortのほうがそれ以上に重複率が高いものを多く含むことを表している よって生存期間が短いクローンの方が欠陥修正に多く含まれる 欠陥修正に含まれるクローンの重複率 生存期間が短いクローンの方が欠陥修正に多く含まれる

考察 (1/2) 生存期間の短いコードクローンはより欠陥に 含まれる コードクローンのリファクタリングによる除去 本調査から得られた知見 考察 (1/2) 本調査から得られた知見 生存期間の短いコードクローンはより欠陥に 含まれる 有効な場面 コードクローンのリファクタリングによる除去 全てのコードクローンのリファクタリングは現実的でなく,優先的に対象を選ぶ必要がある

考察 (2/2) 提案手法で取得した生存期間の定義の検討が必要 過去のバージョンにおいてクローン検出を行い対応付ける必要がある 考察 (2/2) 提案手法で取得した生存期間の定義の検討が必要 提案手法で取得した生存期間 コード片そのものが存在する期間 コード片が存在 しない クローン コード片が存在 過去のバージョンにおいてクローン検出を行い対応付ける必要がある

まとめ 生存期間を考慮して欠陥修正に含まれるコードクローンの割合を調査 生存期間が短いコードクローンのほうが欠陥修正に含まれる割合が大きい 今後は生存期間の取得方法を再検討