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