ソフトウェア保守のための コードクローン情報検索ツール

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
シーケンス図の生成のための実行履歴圧縮手法
TeX で数式を書くための PowerPoint アドイン Ver (2011/06/26) Ver. 0.1 (2007/5/30)
大杉 直樹†, 神谷 年洋‡, 門田 暁人†, 松本 健一† †奈良先端科学技術大学院大学 情報工学科 {naoki-o, akito-m,
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
JavaによるCAI学習ソフトウェアの開発
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
CSP記述によるモデル設計と ツールによる検証
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
プログラム変更支援を目的とした コードクローン情報付加手法の提案と実装
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
プログラム実行履歴を用いたトランザクションファンクション抽出手法
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
プログラム実行時情報を用いたトランザクションファンクション抽出手法
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
コードクローン分析ツールGeminiを用いたコードクローン分析手順
ギャップを含むコードクローンの フィルタリング手法の提案
ソースコードの類似性分析に基づく ソフトウェア保守支援に関する研究
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
動的依存グラフの3-gramを用いた 実行トレースの比較手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
実行時情報に基づく OSカーネルのコンフィグ最小化
クローン検出ツールを用いた ソースコード分析ツールの試作
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
発注者側サイト操作説明書 作成日:2004年6月 Ver1.0 初版 改 訂:2005年9月 Ver1.2 株式会社 コニファ.
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
アスペクト指向言語のための 独立性の高いパッケージシステム
バイトコードを単位とするJavaスライスシステムの試作
コードクローン編集者数に着目した開発履歴の分析
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
Geminiを用いた効果的なコードクローン分析方法
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェアの変更履歴を利用したソースコード修正支援システム
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
メトリクス値の変化に基づく コードクローンの編集傾向分析
保守請負時を対象とした 労力見積のためのメトリクスの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
Geminiを用いた効果的なコードクローン分析方法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
Presentation transcript:

ソフトウェア保守のための コードクローン情報検索ツール 特別研究報告 井上研究室 泉田 聡介

研究の背景(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年度特別研究報告