大規模ソースコード集合を対象とした 類似関数集合群の抽出 大阪大学大学院情報科学研究科 コンピュータサイエンス専攻 ○田中 健介,肥後 芳樹,楠本 真二 1 研究概要 • 大規模ソースコードから関数単位のクローン セットを生成する手法を提案 – 類似した関数集合群の抽出 • 約2,000のソフトウェアに対して適用実験 – 再利用性の高い関数の検出 – メトリクスによる関数のフィルタリング 2 研究背景 • ソフトウェア開発の大規模化 – 開発コストの増大 これまで作成したソースコードやオープンソース 資源の再利用 • 問題点 – 再利用候補の発見 多数存在する処理の把握 処理の類似した部分を発見できないだろうか・・・ 3 コードクローンとは? • ソースコード上に存在する類似したコード片 • 主にコピー&ペーストによって発生 コピー&ペースト コピー& ペースト 処理が類似した部分を発見することができる! 4 クローンペアとクローンセット • クローンペア – 互いに類似する2つのコード片 • クローンセット – 互いに類似するコード片の集合 類似した処理の集合 コードクローン clone A-1 クローンペア 類似した処理を効率的に把握・再利用! clone A-1 clone A-2 clone A-1 clone A-2 クローンセット clone A-3 clone B-1 clone B-1 clone A-1 clone A-3 clone A-2 5 既存のクローン検出ツールの問題点 • 一度に検出対象にできるソースコードの量に 限界がある – 大規模ソースコードに適用不可能 • 大規模ソースコードを対象にしたクローンセッ トを生成する手法は提案されていない 複数のクローン検出結果を組合わせて クローンセットを生成できないだろうか? 6 クローンセット生成のアイデア コードクローン コードクローン 結果を組合せた 検出結果1クローンセット 検出結果2 funcA { } funcC { funcE { } } 一回目の検出対象二回目の検出対象 funcB { funcD { funcF { } } } ソースコード1 ソースコード2 ソースコード3 関数(機能)単位クローンを検出! 7 関数クローンペアの検出 funcA { funcB { } } ソースコード1 ソースコード2 クローン行の割合が閾値を超えた場合 互いに関数クローンペア 8 関数クローンセットの定義 • 関数 a i と関数クローンペアになる関数の集合 が {b1 , b2 , b3 ,...bn }の場合、{ai , b1 , b2 , b3 ,...bn } を a i をもとにした関数クローンセット 関数 をもとにした 関数クローンセット 9 関数クローンセットのマージ 関数クローンペア 関数クローンセット マージ 10 再利用性の高い関数 • 再利用性の高い関数とは? – 複数回記述されている – 多くのソフトウェアに存在する – ソフトウェアの種類に関係なく利用されている – ある特定のソフトウェアで何度も記述されている 関数クローンセットから特定するには・・・ •関数クローンセットの要素数 •関数クローンセットの要素の行数 •関数クローンセットの要素が存在するソフトウェアの数 •関数クローンセットの要素が存在するソフトウェアの偏り 11 関数クローンセットメトリクス (1/2) • ある関数クローンセットに対して 関数の利用回数 – POP ( Population ) : 要素数 – LEN ( Length ) : 要素の平均行数 関数の規模 – FOF ( Frequency of Functions ) : 要素がいくつのソフトウェアにあるか – DOS ( Dispersion of Software ) : 関数の 汎用性 要素がどの程度異なるソフトウェアに分散しているか DOS ( FOF 1) ( POP 1) [例] 要素数3の関数クローンセットが・・・ ・1つのソフトウェアから得られた → (1 1) (3 1) 0 ・3つのソフトウェアから得られた → (3 1) (3 1) 1 12 関数クローンセットメトリクス (2/2) • ある関数クローンセットに対して 関数の汎用性 – GVOF ( General Versatility of Functions ): 要素がいくつのドメインにあるか – DOD ( Dispersion of Domains ): 要素がどの程度異なるドメインに分散しているか DOD (GVOF 1) ( POP 1) [例] 要素数3の関数クローンセットが・・・ ・1つのドメインから得られた → (1 1) (3 1) 0 ・3つのドメインから得られた → (3 1) (3 1) 1 ソフトウェアの種類による分類.dns,editors,ftpなど 13 関数クローンセットメトリクスの例 関数クローンセット ①関数A,ドメインα,ソフトウェアⅠ POP = 7 ②関数B,ドメインα,ソフトウェアⅠ FOF = 5 ③関数C,ドメインα,ソフトウェアⅡ DOS = 4 / 6 = 0.67 ④関数D,ドメインα,ソフトウェアⅢ ⑤関数E,ドメインβ,ソフトウェアⅣ ⑥関数F,ドメインβ,ソフトウェアⅣ ⑦関数G,ドメインγ,ソフトウェアⅤ GVOF = 3 DOD = 2 / 6 = 0.33 14 実装 • 一台の計算機では計算時間が膨大 • 並列計算を利用 – 複数の計算機で関数クローンペアを検出 • 関数の位置情報の抽出(Ctags) • クローン検出ツールの実行(CCFinder) • 関数クローンペアの検出 – 検出結果を一台の計算機集め、関数クローン セットを生成 計算時間の削減が可能! 15 実験 • 実験で調査したいこと – 関数クローンと閾値との関係 – 関数クローンセットメトリクスと関数クローンとの関係 • 実験方法 – 実験対象から閾値別に関数クローンペア・セットを生成し, 関数クローン数を確認 – メトリクス別に関数クローン数を確認 • 実験対象:FreeBSDソフトウェア集合ports(C言語) 関数クローンペアを得る際,関数のクローン行の割合 16 ケース1 ~1つのドメインを対象とした場合~ • 対象:mailドメイン – ソフトウェア数:717 – 総行数:27,076,351 • 目的: 同ドメインのソフトウェア間の関数クローンの調査 • クローン検出方法 – 完全一致検出 – 名前変更検出 ソフトウェアの種類による分類.dns,editors,ftpなど 17 完全一致 / 名前変更 検出 コードクローンでないと判定 完全一致検出 名前変更検出 コードクローンであると判定(完全一致に比べ多くのクローン) 18 閾値60%以上のほとんどが 関数は修正されずに 実験結果 閾値が上がるにつれて減少 閾値100%の関数クローン(セット) そのまま利用されることが多い ~mailドメイン~ THRESHOLD (%) 60 70 80 90 100 ペア数 (完全一致) 475,022 446,592 421,502 403,447 383,091 セット数 (完全一致) 70,796 69,910 69,024 5%減 67,941 67,064 関数の数 (完全一致) 255,050 252,275 249,466 1%減 246,275 242,868 ペア数 (名前変更) 1,064,941 929,141 819,848 763,538 718,048 セット数 (名前変更) 72,196 70,971 69,313 8%減 67,881 66,455 関数の数 (名前変更) 269,463 265,787 261,757 6%減 257,541 253,455 THRESHOLD・・・関数クローンペアとなるクローン行の割合の閾値 19 617,713個の関数のうち253,455個を 実験結果 名前変更のほうが多くの関数クローンペア 完全一致のほうが多い・・・? 66,455種類に分類 ~mailドメイン~ THRESHOLD (%) ペア数 (完全一致) 60 70 80 90 100 475,022 446,592 421,502 403,447 383,091 セット数 (完全一致) 使用されているソフトウェアに偏りがある関数 70,796 69,910 69,024 67,941 多くのソフトウェアに分散して使用されている関数 関数の数 255,050 252,275 249,466 246,275 →FOF,DOS (完全一致) 67,064 242,868 パラメータ化により関数クローンセット同士が類似するため ペア数 1,064,941 929,141 819,848 763,538 718,048 セット数 (名前変更) 72,196 70,971 69,313 67,881 66,455 関数の数 (名前変更) 269,463 265,787 261,757 257,541 253,455 (名前変更) THRESHOLD・・・関数クローンペアとなるクローン行の割合の閾値 20 メトリクス値と関数クローンセット数との関係 ソフトウェア間の関数クローンのほうが多い 同ドメイン内の関数クローンは分散傾向 ~mailドメイン~ ほぼ全て lightning,thunderbird,enigmail-thunderbird,enigmail-seamonkey 間 要素がある1つのソフトウェアにのみ存在する DOS 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 postfix,postfix23,postfix24,postfix-current間 関数クローンセット数 ~0.1 ~0.2 ~0.3 ~0.4 ~0.5 ~0.6 ~0.7 ~0.8 ~0.9 ~1.0 FOF 1 2 3 mutt,mutt-lite,mutt-devel,mutt-devel-lite 間 3,405 0 0 0 0 0 0 0 0 bogofilter,bogofilter-qdbm,bogofilter-sqlite,bogofilter-tc間 トータル 40 108 36 の関数クローンセット 307 252 0 0 0 0 3,405 ソースファイル単位のクローン 9,942 38 57 66 411 34 0 148 0 4 164 510 537 263 2,661 19 0 920 0 35,891 5 7 91 別バージョンや拡張機能 58 90 88 40 11 199 0 812 6 1 16 22 17トータル 36 3 2 0 15 53 7 0 13 4 1 63,050 8 3 2 0 15 53 8 0 1 30 9 0 5 17 10~ 0 4 79 多くのソフトウェアで分散して利用されている 4 5 0 4 0 0 1 (高FOF,高DOSの)関数は 1 1 0 0 0 1 4 どのような機能があるのか? 0 2 0 1 1 10 13 要素が複数のソフトウェアに存在する FOF : 要素がいくつのソフトウェアに存在しているか 関数クローンセット数 DOS : 要素がどの程度異なるソフトウェアに分散しているか 0 0 7,643 21 関数クローンの例 FOF,DOSを利用することにより ~mailドメイン~ mailドメインにおいて 再利用性の高い関数を得ることができた! FOF : 26 DOS : 1.0 FOF 23,DOS 1.0: UINT4からunsigned charにエンコードする関数 MD5メッセージダイジェスト操作を終了する関数 FOF 21,DOS 1.0: unsigned charからUINT4にデコードする関数 MD5の基本的な変換を行う関数 FOF 19,DOS 1.0 文字列をコピーする関数 など・・・ 文字列において指定した文字へのポインタを返す関数 22 ケース2 ~複数のドメインを対象とした場合~ • 対象:8ドメイン( accessibility, archivers, benchmarks, converters, finance, ftp, irc, misc ) – ソフトウェア数:1,306 – 総行数:18,339,890 • 目的: ドメイン間の関数クローンの調査 • クローン検出方法 – 完全一致検出 – 名前変更検出 23 421,008個の関数のうち88,918個を 名前変更のほうが多くの関数クローンペア・セット 実験結果 閾値が上がるにつれて大きく減少 36,378種類に分類 差が大きい ~複数ドメイン~ THRESHOLD (%) 60 ペア数 (完全一致) セット数 (完全一致) 関数の数 (完全一致) 88,913 70 80,417 80 72,405 90 65,927 使用されているドメインに偏りがある関数 36,980 34,798 24%減 32,717 30,468 多くのドメインに分散して使用されている関数 変更の加えられた関数クローンが多い! 83,070 78,311 23%減 73,912 69,443 →GVOF,DOD 100 56,832 28,016 64,122 ペア数 (名前変更) 407,860 335,802 259,790 221,538 201,565 セット数 (名前変更) 49,290 45,966 41,818 26%減 38,941 36,378 関数の数 (名前変更) 113,387 107,011 99,980 22%減 94,238 88,918 THRESHOLD・・・関数クローンペアとなるクローン行の割合の閾値 24 ドメイン間の関数クローンのほうが少ない メトリクス値と関数クローンセット数との関係 2つのドメイン間の関数クローンが多い ソースファイル単位のクローン ~複数ドメイン~ DOD GVOF 1 2 3 要素がある1つのドメインにのみ存在する 0.2 0.3 0.4 0.5 0.6 0.7 ~0.3 関数クローンセット数 ~0.4 ~0.5 ~0.6 ~0.7 ~0.8 0.0 ~0.1 0.1 ~0.2 0.8 ~0.9 0 0 0トータル 0 0 0 0 多くのドメインで分散して利用されている ドメイン間の関数クローンは 268 220 (高GVOF,高DODの)関数は 67 91 31,923 1,198 0 0 0 特定のソフトウェア,ドメイン間での数の偏りはなかった どのような機能があるのか? 31,923 0.9 ~1.0 0 0 0 1,263 55 129 143 129 86 0 103 0 0 206 4 0 13 36 50 33 25 0 26 0 2 5 0 40 20 24 11 1 4 2 0 0 6 190 4 2 6 0 0 0 0 0 7 0 3 0 0 0 0 0 0 5 トータル 0 4,455 0 GVOF : 要素がいくつのドメインに存在しているか 要素が複数のドメインに存在する DOD : 要素がどの程度異なるドメインに分散しているか 関数クローンセット数 25 関数クローンの例 GVOF,DODを利用することにより ~複数ドメイン~ ドメインによらず 汎用的な機能の関数を得ることができた! GVOF :7 DOD : 0.38 GVOF 7,DOD 0.15: 文字列に対して指定した文字へのポインタを返す関数 引数1つの関数を複数回呼び出す関数 GVOF 6,DOD 0.45: 引数2つの関数を複数回呼び出す関数 コマンドライン引数の要素を調べる関数 カレントディレクトリのパス名を返す関数 など・・・ メモリ領域を解放する関数 26 まとめと今後の課題 • 大量のソースコードから関数クローンセットを 生成する手法を提案 • 今後の課題 – クローン検出ツールによる比較実験 – 他のプログラミング言語を対象とした実験 – 関数の呼び出し回数に応じた評価方法 27
© Copyright 2024 ExpyDoc