ソフトウェアの類似性の分析とその 応用に関する研究 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室 川口真司 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェアリポジトリ ソースコードや ドキュメントなどの 開発中に発見した ネットワーク上の開発基盤サービス 管理を行う バグの管理を行う 大量のソフトウェア 版管理システム バグ追跡システム (SourceForge: 約 10 万 プロジェクト) 一般ユーザ 開発者 ソフトウェアリポジトリ 掲示板 ユーザの要望等を 2005/12/21 受け付ける ML管理システム 開発者間で行われた 議論を保存 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2 ソフトウェアの持つ類似性 膨大な数の成果物 これまでに作成された大量のソフトウェア 大規模なソフトウェアに含まれる大量のコンポーネント、ソースコード 成果物がもつ類似性とその活用 ソフトウェア 類似の定義、発見 付属ドキュメントを用いて ソースコードを用いて コンポーネント 継承関係、利用関係、ソー スコード等を用いて コード片 コードクローンに関する研究 類似の応用 ソフトウェアライブラリ 派生ソフトウェアの分類 コンポーネントライブラリ ソフトウェアクラスタリング クローン削除作業の支 援、リファクタリング 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 3 ソフトウェアの類似性 GURU (Maarek ら [46]) Unix の各コマンドを、man を利用して分類 IR メソッドを利用 Ugurel らの手法 [62] ソフトウェアに付随するドキュメントを利用して分類 support vector machine (SVM) を利用 SMMT (山本ら [64]) ソースコードそのものを直接用いて分類 CCFinder を利用 ソフトウェアライブラリの構築 [46, 62] 派生ソフトウェア群の分類 [64] 4.4BSD Lite から派生した、FreeBSD, NetBSD, OpenBSD の各バージョン 間の類似度を比較 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 4 コンポーネントの類似性 継承関係から (Spanoudakis ら *) 利用関係から (SPARS **) コンポーネントのソースコードに機械学習手法を適用 LSA(潜在的意味解析手法) を用いて (Maletic ら [47]) 自己組織化マップを用いて (Chan ら [15]) コンポーネントライブラリの構築 (SPARS **) ソフトウェアクラスタリング [47] ひとつのソフトウェアを、いくつかのコンポーネント群に分割 * Giorgos Spanoudakis, Panos Constantopoulos, Measuring Similarity Between Software Artifacts 1994, Proc. of the 6th International Conference on Software Engineering and Knowledge Engineering - SEKE '94, Jurmala, Latvia, June 1994. ** Katsuro Inoue, Reishi Yokomori, Tetsuo Yamamoto, Makoto Matsushita, Shinji Kusumoto, “Ranking Significance of Software Components Based on Use Relations”, IEEE Transactions on Software Engineering, Vol.31, No.3, pp.213-225 (2005) 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5 コード片の類似性 コードクローン 字句解析ベース [5, 6, 7, 11, 20, 33, 39, 40, 43, 53, 55] CCFinder (神谷ら [33] ) CloneDr (Baxter ら [11] ) メトリクスベース [8, 9, 10, 32, 49, 51] メソッド単位でメトリクスを定義 (Balazinskaら [8, 9, 10]) クローン削除作業の支援 コードクローンは保守工程における重大な障害のひとつ ある部分に修正が必要 → その部分のクローン全ての修正を検討 コードクローン分析環境 Gemini (植田ら *) リファクタリング支援 (肥後ら **) * 植田 泰士, 神谷 年洋, 楠本 真二, 井上 克郎, "開発保守支援を目指したコードクローン分析環境", 電子情報通信学会論文誌 D-I, Vol. J86-D-I, No. 12, pp. 863871 (2003-12). ** 肥後 芳樹, 植田 泰士, 神谷 年洋, 楠本 真二, 井上 克郎, "コードクローン解析に基づくリファクタリングの試み", 情報処理学会論文誌, no. 45, vol. 5, pp. 13571366 (2004-5). 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 6 ソフトウェアの持つ類似性 膨大な数の成果物 これまでに作成された大量のソフトウェア 大規模なソフトウェアに含まれる大量のコンポーネント、ソースコード 成果物がもつ類似性とその活用 ソフトウェア 類似の定義、発見 付属ドキュメントを用いて ソースコードを用いて コンポーネント 継承関係、利用関係、ソー スコード等を用いて コード片 コードクローンに関する研究 類似の応用 ソフトウェアライブラリ 派生ソフトウェアの分類 コンポーネントライブラリ ソフトウェアクラスタリング クローン削除作業の支 援、リファクタリング 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7 論文の構成 第1章: まえがき 第2章: MUDABlue: ソフトウェアシステム自動分類 手法 [1-1, 1-2, 1-3, 1-4] 第3章: 版管理システムを用いたクローン履歴抽出 手法 [1-5] 第4章: むすび 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 8 MUDABlue: ソフトウェア自動分類システム [2章] ソフトウェアそのものの分類の重要性 大量のソフトウェア → 分類、整理が必要 ML の議論や、掲示板やバグ追跡情報も有用 既存のソフトウェアライブラリ構築手法は不十分 分類先はあらかじめ用意する必要あり 分類結果は排他的 ドキュメントに依存 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 9 MUDABlue の構成 ソフトウェア自動分類部 大量のソフトウェアを自動的に分類する 潜在的意味解析手法 LSA に基づく手法 自然言語文書の類似性を計測する手法 分類結果提示ユーザインタフェース キーワード検索、ディレクトリ型検索の両方をサポート Unifiable Cluster Map 手法による描画 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10 提案手法の特徴 1. 階層構造も自動的に作成 カテゴリの作成には、さまざまなライブラリ・アーキテクチャに関する 深い知識が必要 日々新しいカテゴリが誕生 2. 非排他的な分類 ソフトウェアの分類には、複数個の基準が存在 ソフトウェアの用途 利用しているライブラリ、依存アーキテクチャ、等々 3. ソースコードのみを用いて分類 既存手法はソフトウェアに付属するドキュメントに基づいて分類 ドキュメントの量や質(特に均一性)に大きく依存 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 11 非排他的分類 regexp エディタ 表計算 GUI (MFC) GUI (MFC) 正規表現サポート (regexp) 正規表現サポート (regexp) ソフトウェア3 ソフトウェア1 MFC エディタ 表計算 GUI (GTK) GUI (GTK) 正規表現サポート (regexp) ソフトウェア2 ソフトウェア4 GTK 2005/12/21 エディタ 表計算 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 12 潜在的意味解析法 LSA Latent Semantic Analysis [41, 42] 自然言語で書かれた文書、単語の類似度を計測 する ベクトル空間モデルに従った手法の一つ ベクトル空間モデルでは検出できない間接的な関連 の抽出を可能にしている 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 13 LSA の例 文書1 文書4 A B B F 文書2 B 文書ベクトル 文書5 A B C D E 文書3 G G F G H H 単語頻度行列を 文書間、単語間の類似度は 文書6 Cベクトル間の角度の C C D E G H cos作成 や、 相関係数によって表す 単語ベクトル A B C D E F G H 1 1 2 0 0 0 1 0 0 2 1 1 1 1 1 0 0 0 3 0 1 3 1 0 0 0 0 4 0 0 0 0 0 0 2 0 5 0 0 0 0 0 1 1 2 6 0 0 0 0 1 0 1 1 LSA A B C D E F G H 1 0.3 0.7 0.9 0.4 0.3 0.2 0.3 0.3 2 0.4 1.0 1.4 0.6 0.3 0.2 0.1 0.1 3 0.6 1.5 2.3 1.0 0.4 0.2 -0.2 -0.2 4 0.1 0.1 -0.2 0.0 0.2 0.4 0.9 0.9 5 0.1 0.2 -0.2 0.0 0.4 0.6 1.5 1.4 6 0.1 0.2 -0.1 0.0 0.3 0.4 1.0 0.9 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 14 LSA の効果 間接的に関連している文書間の類似度も高い 文書間の類似度がより鮮明になる 文書間の相関係数行列 1 2 3 4 5 6 1 2 3 4 5 6 1 1.0 0.2 -0.1 -0.3 -0.3 -0.5 1 1.0 1.0 0.9 -0.6 -0.6 -0.5 2 0.2 1.0 0.5 -0.5 -0.9 -0.5 2 1.0 1.0 1.0 -0.8 -0.8 -0.7 3 -0.1 0.5 1.0 -0.2 -0.4 -0.5 3 0.9 1.0 1.0 -0.8 -0.8 -0.8 4 -0.3 -0.5 -0.2 1.0 0.3 0.5 4 -0.6 -0.8 -0.8 1.0 1.0 1.0 5 -0.3 -0.9 -0.4 0.3 1.0 0.5 5 -0.6 -0.8 -0.8 1.0 1.0 1.0 6 -0.5 -0.5 -0.5 0.5 0.5 1.0 6 -0.5 -0.7 -0.8 1.0 1.0 1.0 LSA適用前 LSA適用後 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 15 識別子による分類 ソースコード中の識別子は、その動作を表している window という識別子があるプログラム文の周辺は、なんらかの GUI に関する操作を行っている 識別子のうち特に類似しているものを結びつけて、それらをひ とつのグループとみなして分類を行う エディタ window cmdButton 2005/12/21 表計算 menuBar window GUI (MFC) GUI (MFC) ソフトウェア1 ソフトウェア3 MFC Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 16 提案手法(1/2) Sof1 Soft1 Soft4 A B B F Soft2 Soft5 J Soft2 1.トークン 抽出 Soft3 Soft6 Soft4 G G J Soft5 A B C D E Soft3 I F G H H J Soft6 B C C C D E G H J 2.共起行列の作成 I J 0 0 1 0 0 0 0 0 0 0 0 2 0 0 1 0 1 0 A B C D E F G H A B C D E F G H 1 1 2 0 0 0 1 0 1 1 2 0 0 0 1 0 0 2 1 1 1 1 1 0 0 2 1 1 1 1 1 0 0 0 3 0 1 3 1 0 0 0 3 0 1 3 1 0 0 0 0 4 0 0 0 0 0 1 1 4 0 0 0 0 0 0 2 0 5 0 0 0 1 2 0 1 5 0 0 0 0 0 1 1 2 6 0 0 0 1 1 0 1 6 0 0 0 0 1 0 1 1 3.孤立トークン, 普遍トークンの 削除 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 17 提案手法(2/2) A B C D E F G H 1 1 2 0 0 0 1 0 0 2 1 1 1 1 1 0 0 0 3 0 1 3 1 0 0 0 4 0 0 0 0 0 0 5 0 0 0 0 0 6 0 0 0 0 1 A B C D E F G H 1 0.3 0.7 0.9 0.4 0.3 0.2 0.3 0.3 2 0.4 1.0 1.4 0.6 0.3 0.2 0.1 0.1 0 3 0.6 1.5 2.3 1.0 0.4 0.2 -0.2 -0.2 2 0 4 0.1 0.1 -0.2 0.0 0.2 0.4 0.9 0.9 1 1 2 5 0.1 0.2 -0.2 0.0 0.4 0.6 1.5 1.4 0 1 1 6 0.1 0.2 -0.1 0.0 0.3 0.4 1.0 0.9 1 2 3 4.LSA 5.トークン間の類似度計測、 クラスタ分析 D A B C F G 1 H 2 3 ClusterName1 6.ソフトウェア クラスタの 作成 1 4 5 6 7.クラスタ タイトルの 作成 1 4 5 6 ClusterName2 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 18 ケーススタディ 実験を通じて以下のことを示す MUDABlue システムの実際のカテゴリ描画 抽出したカテゴリの評価 抽出カテゴリの概要 既存手法との適合率、再現率の比較 テストデータ SourceForge から無作為に選んだ 6 つのジャンル boardgames, compilers, database, editor, videoconversion, xterm 以上の 6 ジャンルに含まれる C プログラム 41 個 計 164,102 個の識別子 孤立トークン、普遍トークンを除く 22,048 識別子を LSA の入力として利用 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 19 分類結果 40 個のカテゴリ SourceForge のカテゴリに合致するカテゴリ ライブラリ、アーキテクチャに関するカテゴリ 18 11 はずれのカテゴリ 11 ライブラリ、アーキテクチャに関するカテゴリの内訳 GTK(2 カテゴリ) win32(3 カテゴリ) yacc SSL regexp getopt JNI Python/C GUI ライブラリ Windows32 API 構文解析ライブラリ SSL 通信用ライブラリ 正規表現用ライブラリ コマンドラインオプション読み取り用ライブラリ Java Native Interface Python インタプリタ拡張用インタフェース 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20 適合率、再現率の評価 GURU 1 IR メソッドを利用 Unix の各コマンドを、man を利用して 分類 Precision 0.8 Ugurel らの手法 0.6 support vector machine (SVM) を 利用 ソフトウェアに付随するドキュメントに対 して SVM を適用 0.4 0.2 0 0 0.2 0.4 0.6 0.8 1 Recall MUDABlue GURU Ugurel MUDABlue は既存の研 究に対して同程度の信頼 性を保っている 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 21 考察 適合率、再現率は既存研究と同程度の水準を保っている MUDABlue は前提知識の入力が必要ない MUDABlue はカテゴリやライブラリを自動的に抽出する ドキュメントに依存しない 非排他的な分類の実現 今後の課題 「その他」カテゴリを減らす 識別子を選別する部分の改善が必要 カテゴリタイトルをよりわかりやすく 分かりやすいものもあれば、分かりにくいものも ライブラリに基づくカテゴリには分かりやすいタイトルがつく傾向 カテゴリの粒度をより適正に 細粒度にすぎる傾向 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 22 クローン履歴分析手法 [3章] 既存のクローン抽出手法 exact なコピーだけではなく、多少の変更があってもクロー ンとして抽出 過去に exact にコピーされた時点の状態を見れば 明白 版管理システムが持つ履歴情報 版管理システムは、これまでにおこわなわれた変更の履 歴を全て保持 過去の任意の時点のプロダクトを取得可能 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 23 コードクローン コードクローン(あるいは単に クローン) 類似文字列が存在するコー ド片 クローンの位置は (ファイル名、 開始行番号、終了行番号) で指定 クローンペア クローンA-1 とクローンA-2 が 類似文字列であるときに、こ れらをクローンペアとよぶ Clone A-1 Clone A-3 Clone A-2 Clone B-2 Clone B-1 クローンセット クローンペア関係において推 移関係が成り立つクローンの 集合 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 24 履歴を考慮したクローン分析 過去にクローン関係にあったコード片の抽出 過去の時点でのクローン解析情報 現在のクローンは、過去のどのクローンに対応するか? Clone A-3 追加 Clone A-1 Clone A-1 Clone B-1 Clone B-1 Clone A-3 Clone A-1 Clone B-1 Clone A-3 Clone A-4 Clone A-4, A-5 追加 Clone A-2 Clone B-2 Clone B-3 Clone A-2 Clone B-5 Clone B-4 Clone B-2 Clone B’-3 Clone A-2 Clone B’-2 Clone B’-1 Clone B’-3 Clone B-3, B-4, B-5 が編集 されて別クローンセットに 2005/12/21 Clone B’-2 Clone B-2 Clone A-5 Clone B’-1 Clone B’-3 削除 クローンセット B, B’ を 「分離クローンセット」と呼ぶ Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 25 クローン履歴関係 クローン履歴関係 (過去のコード片, 現在のコード片)のペア ファイル1 ファイル1 挿入 Clone A Clone A Clone A クローン関係 CCFinder に よって発見され たクローンペア ファイル2 ファイル2 Clone A Clone A ファイル3 Clone B 2005/12/21 削除 ファイル3 Clone B Clone B Vt-1 Vt Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 26 クローン履歴関係抽出手法(1/2) 指定された期間 [0, t]、間隔Δt について期間 [0, t] を Δt ごとに分割、 それぞれの時のファイルの状態をバージョン V0, V1, ..., Vt と表す 過去のプロダクトの取得には版管理システム (ex. cvs, subversion, ...) を用いる となりあうバージョン間について分析 V0, V1 をリポジトリから取得 V0, V1 間のクローン履歴関係を分析 Vt をリポジトリから取得 Vt-1, Vt 間を分析 ・・・ V0 V1 Vt-1 Vt 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 27 クローン履歴関係抽出手法(2/2) 隣あうバージョン Vt-1, Vt について以下を行う 1. クローン分析 クローン分析には CCFinder を使用する クローンの行数、総行数に対する割合も計算 2. クローン履歴関係分析 1. HCt : バージョン間でクローン関係に変化のない履歴関 係抽出 2. HAt: Vt において新規に追加されたクローンの履歴関係 抽出 3. HTt: Vt において片方が削除されたクローンの履歴関係 抽出 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 28 2-1: クローン関係に変化のない履歴関係抽出 行番号 行番号 ファイル1 Clone A ファイル1 25 31 HCt 7 18 Clone A 37 43 Clone A ファイル2 Clone A クローン 関係 クローン 履歴関係 ファイル2 22 28 ファイル3 Clone B 11 22 Clone B 42 48 HCt 22 28 Clone A Vt の各クローンについて、Vt-1 の 「写像先」にクローンが存在す ファイル3 るかどうか検索 Vt-1 Vt 写像先の決定には、編集操作による行番号のズレを考慮 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 29 2-2: 追加されたクローンの履歴関係抽出 ファイル1 ファイル1 HAt Clone A クローン 関係 Clone A Clone A HAt ファイル2 ファイル2 Clone A Clone A クローン 履歴関係 ファイル3 Clone B ファイル3 Clone B Vt-1 2005/12/21 Vt-1 と 差分との間で CCFinder を適用 V t 発見したクローンに対応する部分を履歴関係とする Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 30 2-3:片方が削除されたクローン候補の抽出 行番号 行番号 ファイル1 ファイル1 Clone A クローン 関係 Clone A Clone A ファイル2 ファイル2 Clone A Clone A ファイル3 Clone B Clone B Vt-1 クローン 履歴関係 Vt-1 において、対応がないクローンについて、 Vt との対応行とテキスト比較 ファイル3 HTt Clone B Vt 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 31 提案手法の特徴 となりのバージョン同士でのつながり 任意の二点間の分析を行うのはコス トが大きい 計算量を極力抑える バージョン間の diff に対してのみク ローン分析を適用 Vt-1, Vt 全体に対して CCFinder を 適用するのはコストが大きい 各バージョンごとにクローン分析を適 用 正確なクローン分析 差分情報のみからクローン情報の類 推を行わない 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 32 PostgreSQL のクローン履歴分析 1. 分離クローンセットを漏れなく抽出できているかどうかの検 証 • • PostgreSQL の src 部分を 2005/01/01 ~ 2005/06/30 の期 間、一週間ごとに解析 クローンセット中のクローン数が減少している部分、時間に着目 • • その時間の差分を確認して、分離クローンセットか、縮退クローンセットか を目視で判定 分離クローンセットであれば、各クローンに正しくクローン履歴関係が抽出 されているかどうかを検証 2. クローン全体の履歴 • • PostgreSQL の開発工程におけるクローンの増加量をグラフ化 1998年7月から2005年7月の6年分を一月区切りで解析 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 33 縮退クローンセット 調査結果 分岐クローンセット 4 本来は分岐クローンセットなのに、クローン減少と判定 0 クローンが削除されたクローンセット 5 価値のないクローンセット 15 全 24 クローンセットを調査 誤判定はなし 15箇所のクローンセットは、定数定義が連続している部分 など無意味なクローン 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 34 過去に関連のあったクローンセットの例 pgsql/src/backend/commands/dbcommands.c 07/01 765 /* 766 * ALTER DATABASE name OWNER TO newowner 767 */ 768 void 769 AlterDatabaseOwner(const char *dbname, AclId newOwnerSysId) 770 { 771 HeapTuple tuple, 772 newtuple; ・・・ 790 791 newtuple = heap_copytuple(tuple); 792 datForm = (Form_pg_database) GETSTRUCT(newtuple); conversioncmds.c 793 aggregatecmds.c 794 /* 795 * If the new owner is the same as the existing owner, consider the 796 * command to have succeeded. This is to be consistent with other objects. 797 */ 798 if (datForm->datdba != newOwnerSysId) 799 { 800 /* changing owner's database for someone else: must be superuser */ opclasscmds.c operatorcmds.c 801 /* note that the someone else need not have any permissions */ 802 if (!superuser()) 803 ereport(ERROR, 804 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), 805 errmsg("must be superuser to change owner"))); 806 807 /* change owner */ 808 datForm->datdba = newOwnerSysId; 809 simple_heap_update(rel, &newtuple->t_self, newtuple); functioncmds.c 810 CatalogUpdateIndexes(rel, newtuple); tablespace.c 811 } 812 813 systable_endscan(scan); 814 heap_close(rel, NoLock); 815 } pgsql/src/backend/commands/dbcommands.c 08/04 765 /* 766 * ALTER DATABASE name OWNER TO newowner 767 */ 768 void 769 AlterDatabaseOwner(const char *dbname, AclId newOwnerSysId) 770 { 771 HeapTuple tuple; 772 Relation rel; ・・・ 792 /* 793 * If the new owner is the same as the existing owner, consider the 794 * command to have succeeded. This is to be consistent with other objects. 795 */ pgsql/src/backend/commands/aggregatecmds.c 07/01 796 if (datForm->datdba != newOwnerSysId) aggregatecmds.c 291 /* 797 { 292 * Change aggregate owner 798 Datum repl_val[Natts_pg_database]; 293 */ 799 char repl_null[Natts_pg_database]; conversioncmds.c 294 void 800 char repl_repl[Natts_pg_database]; 295 AlterAggregateOwner(List *name, TypeName *basetype, AclId newOwnerSysId) 801 Acl *newAcl; 296 { 802 Datum aclDatum; 297 803 Oid bool basetypeOid; isNull; 298 804 Oid procOid; opclasscmds.c HeapTuple newtuple; ・・・ 805 321 806 if (!HeapTupleIsValid(tup)) /* should not happen */ /* changing owner's database for someone else: must be superuser */ 322 807 elog(ERROR, failed forneed function %u",any procOid); /* note "cache that thelookup someone else not have permissions */ 323 808 procForm =if(Form_pg_proc) (!superuser()) GETSTRUCT(tup); opratorcmds.c 324 809 ereport(ERROR, 325 810 /* (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), 326 811* If the new owner is the same as the existing owner, consider the errmsg("must be superuser to change owner"))); 327 812* command to have succeeded. This is for dump restoration purposes. tablecmds.c 328 813*/ memset(repl_null, ' ', sizeof(repl_null)); 329 814 if (procForm->proowner != newOwnerSysId) memset(repl_repl, ' ', sizeof(repl_repl)); 330 815 { 331 816 /* Otherwise, must be superuser to change object */ repl_repl[Anum_pg_database_datdba - 1] =ownership 'r'; functioncmds.c 332 817 if (!superuser()) repl_val[Anum_pg_database_datdba - 1] = Int32GetDatum(newOwnerSysId); 333 818 ereport(ERROR, 334 819 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), tablespace.c /* 335 820 errmsg("must be superuser to change owner"))); * Determine the modified ACL for the new owner. This is only 336 821 * necessary when the ACL is non-null. 337 822 /* Modify */ the owner --- okay to scribble on tup because it's a copy */ 338 823 procForm->proowner = newOwnerSysId; aclDatum = heap_getattr(tuple, 339 824 Anum_pg_database_datacl, schemacmds.c 340 825 simple_heap_update(rel, &tup->t_self, tup); RelationGetDescr(rel), 341 CatalogUpdateIndexes(rel, dbcommands.c tup); 342 } 343 344 heap_close(rel, NoLock); 345 heap_freetuple(tup); 346 } pgsql/src/backend/commands (SQL 文解釈・実行部の実装) Clone A Clone A Clone A Clone A Clone A Clone A schemacmds.c dbcommands.c Clone A Clone A 2005/12/21 Clone A Clone A Clone A Clone A Clone B Clone B Clone B Clone B Clone B 2005/03/04 2005/04/01 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 35 考察 分離クローンセットを漏れなく抽出できているかどうかの検証 縮退クローンセットに的を絞って検証 過去に関係のあったクローンの例 実際に関連性が高い 手動で履歴を探索していくのは手間がかかる 分析を行うための対話的ユーザインタフェースの作成 クローン量の変遷グラフ PostgreSQL の開発工程ではクローン含有率は安定 → 良好な開発パターン ただし src/backend/command 以下では上昇傾向 → 危険な傾向 危険なパターン、良好なパターンの列挙 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 36 関連研究 クローンの生存期間に着目した分析* (Kim ら) ある一定間隔ごとにクローン分析を行い、クローンの寿命を調査 クローンの生存期間によってクローンを分類 クローン分析にはCCFinderを用いる クローン履歴を利用したオリジン分析** (Godfrey ら) 関数が、過去のバージョンのどの関数に由来するものかを調べる 関数の統合、分割を半自動的に検出 クローン分析はメトリクスベース 対話的な分析 利用するメトリクスは分析者が決定 * M. Kim and D. Notkin: “Using a clone genealogy extractor for understanding and supporting evolution of code clones”, MSR 2005, Saint Louis, Missouri, pp. 17-21 (2005) ** M. W. Godfrey and L. Zou: “Using origin analysis to detect merging and splitting of source code entities”, IEEE Trans. Software Engineering, 31, 2, pp.166-181 (2005) 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 37 むすび ソフトウェアリポジトリに存在する大量のソフトウェアか ら、類似性を抽出しソフトウェア開発への応用を行っ た ソフトウェア自動分類システム MUDABlue の構築 事前知識なしでカテゴリを自動的に抽出し、分類 SourceForge から得たソフトウェアの分類実験 クローン履歴抽出手法の提案 コードクローンの履歴を抽出する手法の提案 PostgreSQL からの履歴抽出 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 38 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 39 特異値分解 特異値分解は、行列の次元 を削減する b l 誤差は最小二乗誤差になるよ うにする。 高次元配列の次元削減を行 うメリット a 2 次元データ (a, b) を 1 次元 データ (l) に削減する例 データサイズ削減 同じ値の分布をする次元(相関 の高い次元)から優先的に一つ の次元に併合される 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 40 行番号の調整 行番号 ft-1 ft 9 9 削除 22 Clone A 31 Clone A ft 行番号 8 Clone A 15 18 24 29 34 39 行番号 挿入 8 18 衝突 Clone A 15 18 18 24 22 29 34 31 36 ft-1 行番号 衝突時には対応行が一意でない 2005/12/21 最小、最大の推定値両方を考慮 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 41 0.2 1800000 0.18 1600000 0.16 1400000 0.14 1200000 0.12 1000000 0.1 800000 0.08 600000 0.06 400000 0.04 200000 0.02 0 クローン含有率 2000000 その他-クローン その他-非クローン configure-クローン configure-非クローン contrib-クローン contrib-非クローン doc-クローン doc-非クローン src-クローン src-非クローン クローン含有率 0 19 9 19 8年 98 7月 年 19 11 99 月 19 年3 9 月 19 9年 99 7月 年 20 11 00 月 20 年3 0 月 20 0年 00 7月 年 20 11 01 月 20 年3 0 月 20 1年 01 7月 年 20 11 02 月 20 年3 0 月 20 2年 02 7月 年 20 11 03 月 20 年3 0 月 20 3年 03 7月 年 20 11 04 月 20 年3 0 月 20 4年 04 7月 年 20 11 05 月 年 3月 行数 分析2: PostgreSQL 全体のコード量 クローン含有率は開発工程全体をとおして安定 2005/12/21 src 以下が全体の8割を占めている Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 42 分析2: PostgreSQL コア部分のコード量 1200000 その他-クローン その他-非クローン src/backend/commands-クローン src/backend/commands-非クローン src/backend/access-クローン src/backend/access-非クローン src/backend/po-クローン src/backend/po-非クローン src/backend/utils-クローン src/backend/utils-非クローン 2000年11月、utils 以下のクローン含有率 1000000 800000 utils には文字コード変換用データの大量追加 600000 400000 200000 2005年4月 2005年1月 2004年10月 2004年7月 2004年4月 2004年1月 2003年10月 2003年7月 2003年4月 2003年1月 2002年10月 2002年7月 2002年4月 2002年1月 2001年10月 2001年7月 2001年4月 2001年1月 2000年10月 2000年7月 2000年4月 2000年1月 1999年10月 1999年7月 1999年4月 1999年1月 1998年10月 1998年7月 0 commands 以下のクローン率は徐々に上昇 0.2 0.18 0.16 0.14 その他 src/backend/commands src/backend/access src/backend/po src/backend/utils 0.12 0.1 0.08 0.06 0.04 0.02 02005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 43 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 44 今後の研究方針 クローン以外のエンティティに対する、過去情報を考 慮した類似度測定 開発進捗度を考慮したソフトウェア類似判定 過去の開発過程を考慮したコンポーネント分類 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 45 ソースコードや ドキュメントなどの 管理を行う 版管理システム 開発中に発見した バグの管理を行う バグ追跡システム ソフトウェアリポジトリ 掲示板 ユーザの要望等を 2005/12/21 受け付ける ML管理システム 開発者間で行われた 議論を保存 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 46 クローン履歴の活用法 2.コード中に含まれるコード クローンの変化を分析 Clone A-3 追加 Clone A-1 Clone A-1 Clone B-1 Clone B-1 Clone A-3 Clone A-1 Clone B-1 Clone A-3 Clone A-4 Clone A-4, A-5 追加 Clone A-2 Clone B-2 Clone B-3 Clone A-2 Clone B-5 Clone B-4 Clone B-2 Clone B’-3 Clone A-2 Clone B’-2 Clone B’-1 Clone B-3, B-4, B-5 が編集 されて別クローンセットに Clone B’-2 Clone B-2 Clone B’-3 Clone A-5 Clone B’-1 Clone B’-3 削除 1.過去に同じクローンセットだった クローンセットの発見 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 47 クローン履歴 2. ひとつのクローンセットを クローン発生時期から分類 Clone A-3 追加 Clone A-1 Clone A-1 Clone B-1 Clone B-1 Clone A-3 Clone A-1 Clone B-1 Clone A-3 Clone A-4 Clone A-4, A-5 追加 Clone A-2 Clone B-2 Clone B-3 Clone A-2 Clone B-5 Clone B-4 Clone B-2 Clone B’-3 Clone A-2 Clone B’-2 Clone B’-1 Clone B-3, B-4, B-5 が編集 されて別クローンセットに 3.コード中に含まれるコード クローンの変化を分析 Clone B’-2 Clone B-2 Clone B’-3 Clone A-5 Clone B’-1 Clone B’-3 削除 1.過去に同じクローンセットだった クローンセットの発見 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 48 1: クローン分析 ファイル1 ファイル1 Clone A クローン 関係 Clone A Clone A Vt 全体を CCFinder で分析 ファイル2 Clone A クローン 履歴関係 ファイル2 Clone A ファイル3 Clone B ファイル3 Clone B Clone B Vt-1 Vt 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 49 Step1: クローン分析 ファイル1 ファイル1 Clone A クローン 関係 Clone A Clone A Vt 全体を CCFinder で分析 ファイル2 Clone A クローン 履歴関係 ファイル2 Clone A Clone B ファイル3 Clone B ファイル3 Clone B Clone B Vt-1 Vt 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 50 Step2-1: 編集されていないクローンの 履歴関係抽出 行番号 行番号 ファイル1 Clone A ファイル1 25 31 7 18 Clone A 37 43 Clone A ファイル2 Clone A クローン 関係 クローン 履歴関係 ファイル2 22 28 22 28 Clone A 編集操作による行番号のズレを吸収Clone B ファイル3 Clone B 11 22 Clone B 42 48 Vt-1 ファイル3 30 36 Clone B Vt の各クローンについて、Vt-1 の対応する Vt 行にクローンが存在するかどうか検索 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 51 行番号の調整 行番号 ft-1 ft 9 9 削除 22 Clone A 31 Clone A ft 行番号 8 Clone A 15 18 24 29 34 39 行番号 挿入 8 18 衝突 Clone A 15 18 18 24 22 29 34 31 36 ft-1 行番号 衝突時には対応行が一意でない 2005/12/21 最小、最大の推定値両方を考慮 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 52 Step2-2: 追加されたクローンの 履歴関係抽出 ファイル1 ファイル1 Clone A クローン 関係 Clone A Clone A ファイル2 ファイル2 Clone A Clone A クローン 履歴関係 Clone B ファイル3 Clone B ファイル3 Clone B Clone B Vt-1 2005/12/21 Vt-1 と 差分との間で CCFinder を適用 Vt 発見したクローンに対応する部分を履歴関係とする Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 53 まとめと今後の課題 自動ソフトウェア分類システム MUDABlue の提案 事前知識なしでカテゴリを自動的に発見し、ソフトウェアをカ テゴライズすることを示した 今後の課題 「その他」カテゴリを減らす 識別子を選別する部分の改善が必要 カテゴリタイトルをよりわかりやすく 分かりやすいものもあれば、分かりにくいものも ライブラリに基づくカテゴリには分かりやすいタイトルがつく傾向 カテゴリの粒度 生成カテゴリの粒度は細粒度にすぎる傾向 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 54 まとめ コードクローンの履歴を抽出する手法の提案 PostgreSQL から抽出した履歴の例の提示 課題 となりのバージョンだけで分析できないクローン履歴の抽 出 一度削除されてまた後で復活したクローン 活用方法の考察 分析用ユーザインタフェースの作成 2005/12/21 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 55 過去に関連のあったクローンセットの例 pgsql/src/backend/commands/dbcommands.c 07/01 765 /* 766 * ALTER DATABASE name OWNER TO newowner 767 */ 768 void 769 AlterDatabaseOwner(const char *dbname, AclId newOwnerSysId) 770 { 771 HeapTuple tuple, 772 newtuple; ・・・ 790 791 newtuple = heap_copytuple(tuple); 792 datForm = (Form_pg_database) GETSTRUCT(newtuple); conversioncmds.c 793 aggregatecmds.c 794 /* 795 * If the new owner is the same as the existing owner, consider the 796 * command to have succeeded. This is to be consistent with other objects. 797 */ 798 if (datForm->datdba != newOwnerSysId) 799 { 800 /* changing owner's database for someone else: must be superuser */ opclasscmds.c operatorcmds.c 801 /* note that the someone else need not have any permissions */ 802 if (!superuser()) 803 ereport(ERROR, 804 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), 805 errmsg("must be superuser to change owner"))); 806 807 /* change owner */ 808 datForm->datdba = newOwnerSysId; 809 simple_heap_update(rel, &newtuple->t_self, newtuple); functioncmds.c 810 CatalogUpdateIndexes(rel, newtuple); tablespace.c 811 } 812 813 systable_endscan(scan); 814 heap_close(rel, NoLock); 815 } pgsql/src/backend/commands/dbcommands.c 08/04 765 /* 766 * ALTER DATABASE name OWNER TO newowner 767 */ 768 void 769 AlterDatabaseOwner(const char *dbname, AclId newOwnerSysId) 770 { 771 HeapTuple tuple; 772 Relation rel; ・・・ 792 /* 793 * If the new owner is the same as the existing owner, consider the 794 * command to have succeeded. This is to be consistent with other objects. 795 */ pgsql/src/backend/commands/aggregatecmds.c 07/01 796 if (datForm->datdba != newOwnerSysId) aggregatecmds.c 291 /* 797 { 292 * Change aggregate owner 798 Datum repl_val[Natts_pg_database]; 293 */ 799 char repl_null[Natts_pg_database]; conversioncmds.c 294 void 800 char repl_repl[Natts_pg_database]; 295 AlterAggregateOwner(List *name, TypeName *basetype, AclId newOwnerSysId) 801 Acl *newAcl; 296 { 802 Datum aclDatum; 297 803 Oid bool basetypeOid; isNull; 298 804 Oid procOid; opclasscmds.c HeapTuple newtuple; ・・・ 805 321 806 if (!HeapTupleIsValid(tup)) /* should not happen */ /* changing owner's database for someone else: must be superuser */ 322 807 elog(ERROR, failed forneed function %u",any procOid); /* note "cache that thelookup someone else not have permissions */ 323 808 procForm =if(Form_pg_proc) (!superuser()) GETSTRUCT(tup); opratorcmds.c 324 809 ereport(ERROR, 325 810 /* (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), 326 811* If the new owner is the same as the existing owner, consider the errmsg("must be superuser to change owner"))); 327 812* command to have succeeded. This is for dump restoration purposes. tablecmds.c 328 813*/ memset(repl_null, ' ', sizeof(repl_null)); 329 814 if (procForm->proowner != newOwnerSysId) memset(repl_repl, ' ', sizeof(repl_repl)); 330 815 { 331 816 /* Otherwise, must be superuser to change object */ repl_repl[Anum_pg_database_datdba - 1] =ownership 'r'; functioncmds.c 332 817 if (!superuser()) repl_val[Anum_pg_database_datdba - 1] = Int32GetDatum(newOwnerSysId); 333 818 ereport(ERROR, 334 819 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), tablespace.c /* 335 820 errmsg("must be superuser to change owner"))); * Determine the modified ACL for the new owner. This is only 336 821 * necessary when the ACL is non-null. 337 822 /* Modify */ the owner --- okay to scribble on tup because it's a copy */ 338 823 procForm->proowner = newOwnerSysId; aclDatum = heap_getattr(tuple, 339 824 Anum_pg_database_datacl, schemacmds.c 340 825 simple_heap_update(rel, &tup->t_self, tup); RelationGetDescr(rel), 341 CatalogUpdateIndexes(rel, dbcommands.c tup); 342 } 343 344 heap_close(rel, NoLock); 345 heap_freetuple(tup); 346 } pgsql/src/backend/commands (SQL 文解釈・実行部の実装) Clone A Clone A Clone A Clone A Clone A Clone A schemacmds.c dbcommands.c Clone A Clone A 2005/12/21 Clone A Clone A Clone A Clone A Clone B Clone B Clone B Clone B Clone B 2004/07/01 2004/08/04 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 56
© Copyright 2024 ExpyDoc