ソフトウェア保守のための コードクローン情報検索ツール 特別研究報告 井上研究室 泉田 聡介
研究の背景(1/2) コードクローン ソースコード中に含まれる同一もしくは類似したコードのこと, いわゆる“重複したコード” クローン H15/02/26 平成14年度特別研究報告
研究の背景(2/2) コードクローンはソフトウェア保守を困難にする コードクローン検出ツールCCFinder コードクローンにバグがあった場合、全てのコードクローンについて修正を考慮しなければならない 機能追加の場合も同様 コードクローン検出ツールCCFinder ソースコードをトークン単位で直接比較することによりクローンを検出 数百万行規模のシステムにも実用時間で解析可能 実用的に意味のないクローンを検出しない 様々な企業のソフトウェアにも適用している ユーザー定義名の置き換え 名前空間の正規化 テーブル初期化部分を取り除く モジュールの区切りを認識する H15/02/26 平成14年度特別研究報告
CCFinderの出力 検出結果はクローンの位置情報のみであり、その結果を直感的に理解することは困難 #version: ccfinder 4.5h #langspec: JAVA #option: -b 30,1 #option: -k: - #option: -r abcdfikmnprsv #option: -c w-f-g #begin{file description} 0.0 130 90 D:\test1.java 0.1 700 1980 D\GUI.java 0.2 380 560 D:\search.java : #end{file description} #begin{syntax error} #end{syntax error} #begin{clone} 0.1 1615,12,2291 1636,34,2325 1.0 57,12,19 83,34,53 34 0.2 1646,15,2334 1665,12,2382 1.0 94,15,60 120,12,108 48 0.21 1878,12,2767 1909,12,2808 1.0 57,12,19 94,15,60 41 0.21 82,12,61 136,15,150 1.0 57,12,19 120,12,108 89 0.217 136,15,150 150,1,198 1.0 94,15,60 120,12,108 48 #end{clone} 対象ファイルのID (file 0 in group 0) クローンの位置 file 0.1:1615~1636行 file 1.0: 57~83行 がクローンである 検出結果はクローンの位置情報のみであり、その結果を直感的に理解することは困難 検出結果はクローンペアの位置情報のみであり その結果を直感的に理解することは困難 ユーザの利用目的に応じた ユーザインタフェースが求められている H15/02/26 平成14年度特別研究報告
研究の目的 CCFinderを利用したコードクローン情報検索ツールの試作 ユーザが入力したコード片に対して,そのコードクローンを含むファイルを検索し、提示する H15/02/26 平成14年度特別研究報告
利用状況の想定 デバッグへの適用 機能追加時の使用 修正箇所の特定 機能を追加 修正箇所に関するクローンの検索 追加前のコード片のクローン を検索 発見したクローン全てに対し、修正コードを適用 機能追加時の使用 クローン全てについて機能追加の是非を検討 利用状況のイメージを入れる H15/02/26 平成14年度特別研究報告
クローン情報検索ツール 入力: ユーザが指定するコード片 検索対象ファイル名のリスト 検索対象ファイル名のリスト 出力: ユーザが指定したコード片のクローンを含 むファイルのリスト 特徴 簡単な操作 検索結果のソースコード上での確認 ハイライト表示等 Javaで実装.サイズは約3千行. H15/02/26 平成14年度特別研究報告
ツールの使用例(1/2) ファイルのリストを入力 検索したいコード片を入力 解析対象言語の選択 解析開始ボタン H15/02/26 平成14年度特別研究報告
ツールの使用例(2/2) 起動画面 検索項目の入力 検索結果 ソースコードの確認 H15/02/26 平成14年度特別研究報告
評価実験 擬似デバッグへの適用 SourceForge で開発されている日本語入力システム「かんな」の修正例へ適用 修正の対象となるコード片を検出できるか 実行にかかる時間はどれくらいか 適用環境 CPU Pentium4 2GHz、メインメモリ 512MB OS WindowsXP HomeEdition SP1 Java VM JDK1.4付属のもの H15/02/26 平成14年度特別研究報告
「かんな」の修正例 「かんな」のver3.6とver3.6p1間の修正例 セキュリティー問題の修正において、バッファ処理の前にオーバーフローを調べる処理を追加する. ほぼ同じ修正を行っている部分が21ヵ所あった. H15/02/26 平成14年度特別研究報告
評価方法 以下の2つの方法の比較を行う. 検索対象:かんなver3.6の全ソースコード (約21,000行) grepを用いた検索 修正箇所で使用されている変数“Request.type”で検索 本ツールを用いた検索 入力コード片として,典型的なバッファ処理を行っている2行を与えて検索 検索対象:かんなver3.6の全ソースコード (約21,000行) H15/02/26 平成14年度特別研究報告
結果 検索結果 検索時間 grep 243行(58箇所) 約1秒 本ツール 17箇所 約8秒 本ツールでの検索では,4箇所が検出されず 検索結果 検索時間 grep 243行(58箇所) 約1秒 本ツール 17箇所 約8秒 本ツールでの検索では,4箇所が検出されず 2行が連続していなかった 検出された17箇所は正しい grepでの検索結果のうち134行(20箇所)が 修正箇所に関連していた H15/02/26 平成14年度特別研究報告
f値を用いた比較 完全性、効率性からf値を求め比較 完全性 効率性 f値 grep 95% 34% 0.50 本ツール 81% 100% 完全性 - 必要な情報のうち実際に検索された情報の割合 効率性 - 実際に検索された情報のうち必要な情報の割合 完全性 効率性 f値 grep 95% 34% 0.50 本ツール 81% 100% 0.90 本ツールでの検索の方が効率的である H15/02/26 平成14年度特別研究報告
まとめと今後の課題 ユーザが入力したコード片のクローンを検索するツールの試作を行った 「かんな」の修正へ適用した 今後の課題 実用性の向上 出力する結果の表示方法の検討 H15/02/26 平成14年度特別研究報告
H15/02/26 平成14年度特別研究報告
H15/02/26 平成14年度特別研究報告
性能の評価 JDK1.4.01 ?file ??万行 Gemini FreeBSD 10行30token 20行 30token 100行 H15/02/26 平成14年度特別研究報告
適用実験概要(1/2) 適用対象 SourceForgeで開発されている日本語入力システム「かんな」 「かんな」のバグ修正を行うことを想定 約21,000行 「かんな」のバグ修正を行うことを想定 実際のバグ修正履歴を用いた擬似的なデバッグ 修正すべき(実際に修正された)コード片を本ツールでどの程度見つけることができるか 実行環境 Pentium4 2GHz メインメモリ512MB OS Windows XP HomeEdition SP1 Java VM JDK1.4付属のもの H15/02/26 平成14年度特別研究報告
適用実験概要(2/2) 用いたバグ修正履歴 ver3.6からver3.6p1 バッファオーバーフローが起こるバグの修正 ir_debug(Dmsg(10,”ProcWideReq3 start\n”) ); buf += HEADER_SIZE; Request.type3.context = S2TOS(buf); buf += SIZEOFINT; Request.type3.buflen = S2TOS(buf); : 用いたバグ修正履歴 ver3.6からver3.6p1 バッファオーバーフローが起こるバグの修正 該当バッファを扱う処理コードへバッファサイズチェックコードの追加 修正が行われたのは30ヵ所(3ファイル) うち21ヵ所は同じようなコード片に対し、同じような修正を行っていた結果の分析 ir_debug(Dmsg(10,”ProcWideReq3 start\n”) ); if(Request.type3.datalen != SIZEOFSHORT *2) return(-1); buf += HEADER_SIZE; Request.type3.context = S2TOS(buf); buf += SIZEOFINT; Request.type3.buflen = S2TOS(buf); : H15/02/26 平成14年度特別研究報告