FreeBSD Ports Collection におけるファイルクローンの検出 大阪大学 情報科学研究科 井上研 博士前期課程1年 佐々木 裕介
概要 用語説明(Ports Collection, File Clone) 既存研究(File Clone 検出のきっかけ) 調査実験(度数分布グラフ) まとめ
FreeBSD Ports Collection ports や cvsup などを用いてダウンロード,インストールができる オープンソース プロジェクトの特徴 プロジェクト内で別のオープンソースライブラリを使っているケースが存在する 様々な組織が関与 例) gcc を管理する団体, firefox を管理する団体, … 互いにどのオープンソースライブラリを使っているか気にかける必要がない thunderbird と firefox なら互いに何を使っているか知っているかもしれない
ファイルクローン プロジェクト間またはプロジェクト内部における2つ以上のファイルの一致 インデントやコメントは無視 生成要因:プロジェクトをまたがるコピーなど Project A Project B int main() { printf(“Hello mhwse!”); return 0; } コメント除去後の内容が同じ ※プロジェクト間で一致している場合は便宜的に File Clone の共有と呼ぶ
既存研究 – D-CCFinder Ports Collection に含まれる大量のファイルクローンを発見 トークンベースよりかなり大きな単位でクローンとなっていた ファイル単位で調べても同じ結果が得られる? ファイル単位でクローンについて詳しく調べている研究は知られていない 今までの研究とは異なる新しい知見が得られるのでは?
上記の度数分布がべき乗則に従っていることが判明 調査実験 分析対象 ある時点における Ports Collection の .c, .h 1,300,000 ファイル 次の度数分布を調査: 1ファイル当たりのファイルサイズ 1プロジェクト当たりのファイル数 1File Clone当たりのファイル数 1プロジェクト当たりの他プロジェクトと共有のあるFile Clone 数 (内部の繰り返しは除く) 上記の度数分布がべき乗則に従っていることが判明 各分布に対して線形回帰したときの自由度調整済み寄与率 R*2 を算出
1ファイル当たりのファイルサイズ PHP4,5 両方で登場する File Clone 自由度調整済み寄与率 0.9024 (おそらく自動生成されたもの) 自由度調整済み寄与率 0.9024
1プロジェクト当たりのファイル数 Real-Time OS のクロスコンパイラが アーキテクチャ毎に用意されたもの 自由度調整済み寄与率 0.8868
1File Clone当たりのファイル数 5 10 50 100 左:PHP5 のみで登場 右:PHP4 のみで登場 PHP4,5 両方で登場する File Clone PHP4,5 両方で2回登場する File Clone クローンセットの組数 D E F 5 10 50 100 自由度調整済み寄与率 0.8508 クローンの出現する回数
1プロジェクト当たりの他プロジェクトと共有のあるFile Clone 数 右:PHP4 関連 中:bin のユーティリティ 左:PHP5 関連 自由度調整済み寄与率 0.8263
H:プロジェクト間 File Clone 共有 共有ファイル数が同じエッジについては同じファイルを共有 これらのプロジェクトは展開元のファイルがほぼ同じ可能性が高い
補足:ports extract cd /usr/ports/devel/A make extract フォルダA 下の makefile 展開されたファイルabc-A http://abc.org/abc.zip 展開されたファイルabc-B フォルダB 下の makefile cd /usr/ports/devel/B make extract
考察 べき乗則から外れている File Clone には以下の特徴が見つかった グラフで見せると小さなプロジェクトが目立たない 展開元が同じファイルが多数見つかった ある意味よく再利用されている? 展開元が同じでもカスタマイズされている個所が存在する Makefile も解析する必要がある? グラフで見せると小さなプロジェクトが目立たない
まとめ Ports Collection内のFile Cloneに関する度数分布を調査 今後はソースファイル展開の方法を工夫 以下に関してべき乗則が成立 1ファイル当たりのファイルサイズ 1プロジェクト当たりのファイル数 1File Clone当たりのファイル数 1プロジェクト当たりの他プロジェクトと共有のあるFile Clone 数 (内部の繰り返しは除く) 今後はソースファイル展開の方法を工夫 同じ圧縮ファイルが別々の場所に展開された場合にトレースする
自由度調整済み寄与率 0.8214
クローンの出現する回数 = 240 or 120 219 or 153-149 148 112 61 59 56 増加減少がなだらか php4,php5 120か所で共通に使われているファイルは240か所で共通に使われているファイルと一緒に使われている 219 or 153-149 intel のドライバファイル 148 112 61 504/506 が php4 関連 59 (667-29)/667 が php5 関連 56 (839-2)/839 が gstreamer-plugins-a52dec 関連 増加減少がなだらか 自由度調整済み寄与率 0.8508
1630401 <= SIZE < 1640403 php-5.1.2/ext/date/lib/timezonedb.h
Area D 89277426 & lang/nhc98 \\ \hline 57567073 & x11/xorg-clients \\ \hline 57306997 & audio/flite \\ \hline 56158086 & emulators/xmess \\ \hline 56158086 & emulators/xmame \\ \hline 53685549 & x11/xorg-manpages \\ \hline 53685549 & x11/xorg-libraries \\ \hline 53685549 & devel/imake-6 \\ \hline 52795390 & net/nxserver \\ \hline 51463947 & net/vnc \\ \hline
# of shared file = 28808 archivers/audio 6943- editor カテゴリの openoffice.org 5762 rtems-objc(sparc,sh,powerpc,mips) 5752- mozilla(thunderbird,xulrunner,firefox,sunbird) 3544 x-org-fonts 2140-2087 gdb 1296 59 www/php5-tidy,converters/php5-iconv 1184 binutils(arm,sparc,sh,powerpc,msp430) 1080 postgresql 1043 61 php4関連
845 56 sysutils/gstreamer-plugins-cdio,devel/gstreamer-plugins-gconf 538 x11/ruby-gnome2,accessibility/ruby-atk 下の方でラインがそろっている部分 共通ファイル数が1
Area B 852 => 56 1308 => 59 1261 => 12 1059 => 61 Php5 tidy module for php5 1261 => 12 binutils 1059 => 61 php4 852 => 56 gstreamer-plugins
Area C RTEMS is a Real-Time Operating System of Embedded Software development. 6119 & devel/sparc-rtems-objc 6119 & devel/sparc-rtems-g77 6119 & devel/sh-rtems-objc 6119 & devel/sh-rtems-g77 6119 & devel/powerpc-rtems-objc 6119 & devel/powerpc-rtems-g77 6119 & devel/mips-rtems-objc 6119 & devel/mips-rtems-g77 6119 & devel/m68k-rtems-objc 6119 & devel/m68k-rtems-g77 6119 & devel/i386-rtems-objc 6119 & devel/i386-rtems-g77 6119 & devel/arm-rtems-objc