コードクローン履歴閲覧環境を用いたク ローン評価の試み 川口真司* 松下誠** 井上克郎** 飯田元* * 奈良先端科学技術大学院大学 ** 大阪大学 2006/11/27 第154回ソフトウェア工学研究会 Page 1 コードクローンとは プログラム中に何度も類似した箇所が現れるコー ド片 主に、安易なコピー & ペーストによって生まれ る 大規模ソフトウェアの保守において問題となって いる ある一箇所のクローンにバグがあった場合,すべての 類似箇所について同じ修正が必要かどうか,検討が必 要 若干の修正が加わっていることが多く,網羅的に把握 することが困難 CWindow wnd = new CWindow(); CDialog wnd = new CDialog(); wnd.init(); wnd.init(); CWindow wnd = new CWindow(); wnd.show(mouose_x, mouse_y); wnd.show(0, 0); CWindow wnd = new CWindow(); wnd.init(); CWindow wnd = new CWindow(); wnd.init(); wnd.show(0, rundom()); wnd.init(WM_MIN); CWindow wnd = new CWindow(); CWindow wnd = newwnd.show(0, CWindow(); 0); wnd.show(0, 0); wnd.init(); wnd.init(); CWindow wnd = new CWindow(); wnd.show(0, 0); wnd.show(0, 0); CWindow wnd = new CWindow(); CWindow wnd = new CWindow();wnd.init(); wnd.init(); wnd.init(WM_NOBORDER); wnd.show(0, 0); wnd.show(0, rundom()); wnd.show(0, 0); 2006/11/27 第154回ソフトウェア工学研究会 Page 2 クローン抽出システム 文字列を利用するもの ソースコードの字句そのものから類似部を抽出 CCFinder* など 依存関係グラフを利用するもの 各種単位間の依存関係グラフの形から Baxter らの手法**など メトリクスを利用するもの 関数,クラスなどの単位ごとにメトリクスを定義し,その値が類 似したものを抽出 Balazinska らの手法***など これらの手法により,大規模なソフトウェアからクロー ンを自動的に検出することが可能になった * T. Kamiya, S. Kusumoto, and K. Inoue. Ccfinder: A multilinguistic token-based code clone detection system for large scale source code. IEEE Transactions on Software Engineering, 28(7):654–670, Jul 2002. ** I. Baxter, A. Yahin, L. Moura, M. Anna, and L. Bier. Clone detection using abstract syntax trees. In Proc. International Conference on Software Maintenance 98, pp. 368–377, Mar 1998. *** M. Balazinska, E. Merlo, M. Dagenais, B. Lague, and K. Kontogiannis. Advanced clone-analysis to support object-oriented system refactoring. In Proc. 7th Working Conf. on Reverse Engineering (WCRE 2000), pp. 98.107, Brisbane, Queensland, Australia, Nov 2000. 2006/11/27 第154回ソフトウェア工学研究会 Page 3 問題点 1. 検出されるクローンの数が膨大 大規模ソフトウェアの場合に顕著 全体的な傾向からの考察はできても,改善行動に結び つけるのが困難 2. すべてのクローンが一律に除去対象とは限らな い 削除すべきクローン 抽象化の手間を惜しんでコピー&ペーストしたコード片 役割分担の関係上,変更が困難なコード片 削除すべきでない,削除しなくてもよいクローン 将来の変更を見越して,意図的に重複箇所としている デザインパターンやフレームワークを適用している箇所 削除すべきクローンとそうでないものとの判別が必要 2006/11/27 第154回ソフトウェア工学研究会 Page 4 クローン評価に向けて クローンの中身を解析 クローンを含む関数,クラスについて解析 メトリクスの算出 依存関係の解析 開発者の意図までを把握するのは困難 クローンの発展過程,履歴を解析 クローンの過去を知ることで,関係した開発者やその 意図を推し量ることはできないだろうか すぐ消されたクローンと,発生以来さまざまな部分にコピー されているクローンとでは明確な違いはあるのではないか クローンを作成した開発者によって,違いがあるのではない か 2006/11/27 第154回ソフトウェア工学研究会 Page 5 クローン履歴・関係者の解析 クローンの発展過程,関係した開発者を解析する 手法の提案 クローン履歴手法の紹介* クローン関係者解析手法 関係者: 作成者,編集者,削除者すべてを含んだ総称 得られた解析結果と,クローン評価との関連性に 関する予備実験 変更種別(作成,編集,削除)回数がクローン関係者 ごとに異なるかどうかの検証 単一コミットに含まれるクローンセット数と,クロー ン評価との関連の分析 * 川口真司, 松下誠, 井上克郎: "版管理システムを用いたコードクローン履歴分析手法の提案", 電子情報通信学会論文誌 D, Vol.J89-D, No.10, pp.2279-2287, 2006 2006/11/27 第154回ソフトウェア工学研究会 Page 6 クローンに関する諸定義 クローン 類似文字列が存在するコード片 クローンの位置は (ファイル名,開始行番号,終了行番号) で表される クローンペア 互いに類似文字列であるクローンの対 クローンセット クローンペア関係において推移関係が成り立つ クローンの集合 Clone A-1 Clone A-1 Clone A-3 Clone A-2 Clone B-2 Clone B-1 2006/11/27 Clone A-1 クローン Clone A-3 クローンペア Clone A-1 Clone A-2 第154回ソフトウェア工学研究会 Clone A-3 クローンセット Page 7 クローン履歴抽出手法 指定された期間 [0, t]、間隔Δt について期間 [0, t] を Δt ごとに分 割、それぞれの時間におけるファイル群を F0, F1, ..., Ft と表す 過去のプロダクトの取得には版管理システム (ex. cvs, subversion, ...) を用い る となりあうバージョン間について分析 F0 をリポジトリから取得,クローンを抽出 F1 をリポジトリから取得,クローン抽出 F0, F1 のクローンについて,クローン履歴関係を分析 … Ft をリポジトリから取得,クローン抽出 Ft-1, Ft のクローンについて,クローン履歴関係を分析 ・・・ F0 2006/11/27 F1 Ft-1 第154回ソフトウェア工学研究会 Ft Page 8 クローン関係者 クローンの変更に何らかの形で関わった開発者 以下の3つの和集合 クローンを作成した開発者 クローンを編集した開発者 クローンを削除した開発者 削除: dean 作成: alex ・・・ F0 2006/11/27 F1 編集: emily Ft-1 第154回ソフトウェア工学研究会 Ft Page 9 版管理システムから得られる差分情報を用いて 編集元の領域 編集先の領域 関係者抽出手法 1. f に編集元領域に存在するクローン t-1 8a9,18 2. ft に編集先領域に存在するクローン 編集操作 > があれば,そのコミットのauthorが変更者とする a: 挿入 >… 挿入 d: 削除 > 9 Clone c: A変更 行番号 行番号 8 15 18 Clone A 18 Clone A 22 31 Clone A … 8a9,18 > >… > ft-1 Commit 24 29 34 Clone A ft revision 1.82 date: 2003/07/20 21:56:32; author: tgl; state: Exp; lines: +51 -29 Another round of error message editing, covering backend/commands/. 2006/11/27 第154回ソフトウェア工学研究会 Page 10 複数回のコミットがあった場合 行番号 行番号 行番号 実際の追加対象は100行下 8 挿入 Clone A 15 18 Clone A 5 9 18 105 Clone A 22 31 24 Clone A 29 34 Clone A 118 Clone A 2006/11/27 … ft-1 Clone A 5a5,105 > >… 5行目に100行挿入 > … 8a9,18 > >… > 109 Commit1 第154回ソフトウェア工学研究会 Commit2 124 129 134 Clone A ft Page 11 行番号の調整 9 行番号 ft-1 ft 行番号 9 Clone A 15 18 d:削除 22 Clone A 31 Clone A 24 29 34 39 ft 行番号 8 a:挿入 8 18 c:変更 15 18 18 24 22 29 34 31 Clone A 36 ft-1 行番号 衝突時には対応行が一意でない 2006/11/27 最小、最大の推定値を考慮 第154回ソフトウェア工学研究会 Page 12 複数のコミットを考慮した解析手 順 行番号 5 行番号 8 9 18 24 29 34 39 9 ft 18 24 29 34 39 15 18 Clone A 8 8 15 15 15 18 18 18 22 22 22 31 Clone A 2006/11/27 Clone A Commit1 8a9,18 > >… > Commit2 第154回ソフトウェア工学研究会 … 8a9,18 > >… > … 8a9,18 > >… > 109 118 行番号 … ft-1 Clone A ft-1 行番号 行番号 31 105 ft 36 ft-1 ft-1 24 29 34 39 31 36 36 18 行番号 8 31 22 9 ft 行番号 行番号 Commit3 124 129 134 Clone A ft Page 13 クローン履歴の評価への応用 過去の履歴がクローン評価に利用可能かどうかを 以下の2つの視点から検証する 開発者によって,クローンとの関わり方に差があるか どうか ある一度のコミット時に編集したクローン数と,そこ に含まれるクローンの品質との関連 分析対象 PostgreSQL のサブモジュール (src/backend/commands 以下のソースコード) 2003/01/01 ~ 2004/01/01 までを30日間隔で解析 2006/11/27 第154回ソフトウェア工学研究会 Page 14 実験方法 実験1: 開発者とクローン変更回数 開発者ごとのクローン変更回数を集計 ある時刻に,1つのクローンセットを変更していたら1回. ある時刻に,クローンセットを5個変更していたら,5回とカウント. 開発者によって,変更作業(作成,編集,削除)に差があるかどう かを 分析 クローンを追加してばかりの開発者がいないか 逆に,クローンの削除を多く行っている開発者はいないか 実験2: コミットに含まれるクローンセット数 同時に単一の開発者によって行われたコミットについて,そのと き編集したクローンセット数の分布を集計 (本実験では同時 = 1分以内とする) 含まれるクローンの傾向について分析 少数のクローンセットのみを編集しているコミット 大量のクローンセットを一度に編集しているコミット 2006/11/27 第154回ソフトウェア工学研究会 Page 15 実験結果1 – 開発者ごとの特性 対象サブモジュールに関係した開発者は10人 全コミット数に対して, 解析期間中にクローンの変更に関わっていたのは3人 クローン追加が多い momjian petere tgl クローン追加 クローン削除 クローン編集 6 2 35 10 3 27 32 17 135 (小計) 43 40 184 1317 143 1428 総コミット数 2006/11/27 第154回ソフトウェア工学研究会 Page 16 実験結果2 – コミットから見た特 性 25 頻度 20 15 10 5 29 62 31 27 25 23 21 19 17 15 13 11 9 7 5 3 1 0 コミットに含まれるクローンセット数 大多数のコミットでは,そのとき編集されたクローンセットは一つ ただし,いくつかのコミットでは多数のクローンセットを一斉に編集している 2006/11/27 第154回ソフトウェア工学研究会 Page 17 大量のクローンを編集したコミッ トの例 < < --> > > > elog(WARNING, "DefineAggregate: attribute \"%s\" not recognized", defel->defname); ereport(WARNING, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("aggregate attribute \"%s\" not recognized", defel->defname))); “Another round of error message editing, covering backend/commands/.” 機械的な変換作業 エラーメッセージ出力部の一括変換 クローンの発見が困難でなかったと考えられる grep 等を利用した文字列検索可能なクローン このようなクローンは対処優先度が低い 機械的に処理をすべき対象を同定可能 保守工程において障害とならない 2006/11/27 第154回ソフトウェア工学研究会 Page 18 実験結果の考察 開発者に着目した分析 全体のコミット回数と比較して,クローン作成の多い 開発者が見つかった 彼が作成したクローンのいくつかは他の開発者によっ て削除されていた 開発者によってクローンへのかかわり方は異なってく る コミットに着目した分析 コミット時に編集したクローンセット数の寡多から, 着目しなくてもよいクローンセットが見つかった 膨大なクローン情報のスクリーニングに有用 2006/11/27 第154回ソフトウェア工学研究会 Page 19 まとめと今後の課題 クローン履歴分析手法の紹介,およびクローン関係者抽 出手法の提案 クローン評価のためのクローン履歴,関係者の分析 今後の課題 分析手法について 適正に開発者が漏れなく取得できているかどうかの評価 ブランチを考慮した分析 分析作業について 広範なデータ分析 PostgreSQL の他モジュールも含めた解析 他のソフトウェアを対象とした解析 実験結果のより精細な検証 その他,クローン評価に有用な仮説立案・検証 2006/11/27 第154回ソフトウェア工学研究会 Page 20 2006/11/27 第154回ソフトウェア工学研究会 Page 21 以下,予備役スライド 2006/11/27 第154回ソフトウェア工学研究会 Page 22 クローン履歴・関係者の解析 クローンの発展過程を知るためには,最新時点の クローンの過去の状態を知る必要がある. ソースコードそのものは版管理システムにより入手可 能 ただし,過去にあったクローンが現在も残っているか, 残っているならばどこが該当部分かは自明ではない クローン履歴手法の紹介* クローン関係者解析手法 関係者: 作成者,編集者,削除者すべてを含んだ総称 実験・分析 * 川口真司, 松下誠, 井上克郎: "版管理システムを用いたコードクローン履歴分析手法の提案", 電子情報通信学会論文誌 D, Vol.J89-D, No.10, pp.2279-2287, 2006 2006/11/27 第154回ソフトウェア工学研究会 Page 23 クローン関係者抽出手法 入力 版管理システムが持つ情報 任意の時点のソースコード コミットの集合 変更日時 開発者 変更内容 クローン履歴解析の結果 各解析時点でのクローン 隣り合う解析時点間でのクローン履歴関係 2006/11/27 第154回ソフトウェア工学研究会 Page 24 関係者抽出手順 すべてのファイルの解析期間内に行われたコミッ トについて コミット日時と開発者を取得 (cvs log) そのときに行われた作業内容を取得 (cvs diff) 各 diff エントリについて 変更を施した行にクローンがあれば そのクローンの前にクローン履歴がなければ「作成」 そのクローンについて,後ろクローン履歴がなければ「削除」 両方あれば,「編集」 2006/11/27 第154回ソフトウェア工学研究会 Page 25 クローン評価に向けて クローンの中身に着目 ソースコードを静的/動的に解析 クラス,変数間の依存関係など クローンの属性に着目 クローンの行数 クローンの開発過程(期間やファイル数など) クローンを作った,もしくは編集した開発者 2006/11/27 第154回ソフトウェア工学研究会 Page 26 抽出手順 ファイル1 ファイル1 挿入 Clone A Clone A Clone A 2006/11/27 ファイル2 ファイル2 Clone A Clone A 第154回ソフトウェア工学研究会 Page 27 行番号変換の適用方法 F1 9 18 24 29 34 39 ft F2 行番号 8 15 18 22 31 36 ft-1 行番号 2006/11/27 第154回ソフトウェア工学研究会 Page 28 複数回のコミットがあった場合 行番号 行番号 行番号 挿入 8 Clone A 15 18 22 31 Clone A f0 2006/11/27 8a9,18 9 > Clone A >… 15,18d24 18 < < …A 24 Clone 22c31 < 29 < … 34 -> A Clone >… f1 第154回ソフトウェア工学研究会 9 Clone A 18 24 29 34 Clone A f2 Page 29
© Copyright 2024 ExpyDoc