容易に使用可能な grep風コードクローン検索ツール

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
大杉 直樹†, 神谷 年洋‡, 門田 暁人†, 松本 健一† †奈良先端科学技術大学院大学 情報工学科 {naoki-o, akito-m,
コードクローン履歴閲覧環境を用いたクローン評価の試み
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
JavaScript プログラミング入門 2006/11/10 神津.
TF-IDF法とLSHアルゴリズムを用いた 関数単位のコードクローン検出法
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
FreeBSD Ports Collection におけるファイルクローンの検出
プログラム変更支援を目的とした コードクローン情報付加手法の提案と実装
第20章 Flyweight ~同じものを共有して無駄をなくす~
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ギャップを含むコードクローンの フィルタリング手法の提案
類似するコーディングパターンの 利用状況調査ツールの提案
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
動的依存グラフの3-gramを用いた 実行トレースの比較手法
構文定義記述を用いた 多言語対応コードクローン検出ツールの改善
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
コンポーネントランク法を用いたJavaクラス分類手法の提案
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コード片のベクトル表現に基づく 大規模コードクローン集合の特徴調査
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
プログラム実行履歴を用いたコードクローン検出手法
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
開発履歴データのリアルタイム収集・分析システムEPMの拡張について ~ SRGMを用いた予測グラフの実現および既存解析システムとの連携 ~
コードクローン編集者数に着目した開発履歴の分析
グラフマイニングアルゴリズムを用いた ギャップを含むクローン抽出手法の提案
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
コードクローンの分布情報を用いた特徴抽出手法の提案
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
同期処理のモジュール化を 可能にする アスペクト指向言語
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
Eijiro Sumii and Naoki Kobayashi University of Tokyo
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コンパイラ 2012年10月11日
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
Geminiを用いた効果的なコードクローン分析方法
Presentation transcript:

容易に使用可能な grep風コードクローン検索ツール 井上研究室 宮本 裕也

コードクローン コードクローン ソースコードの同一あるいは類似した部分を 持つコード片 ソフトウェアの保守を困難にする大きな要因

コードクローン検索ツール 全クローンペアを検索するツール クエリから特定のクローンを検索するツール CCFinder[1]など NCDSearch[2] grep[3] [1] Toshihiro Kamiya, Shinji Kusumoto, and Katsuro Inoue. CCFinder: A multilinguistic token-based code clone detection system for large scale source code. IEEE Trans. Softw. Eng., Vol. 28, No. 7, pp. 654-670, July 2002. コード片の距離を計算し,距離が一定以下のものをみつける UIが扱いやすく,簡単に使えるので, 関数名検索のような単純な例では,手軽に使用できる つぎは…のスライドです クエリ [2] Takashi Ishio, Naoto Maeda, Kensuke Shibuya, and Katsuro Inoue. Cloned buggy code detection in practice using normalized compression distance. In 2018, ICSME 2018, Madrid, Spain, September 23-29, 2018, pp. 591-594. IEEE Computer Society, 2018. [3] http://www.gnu.org/software/grep/

既存ツールの不満 特定のクローンを検索する場合 全クローン検索ツール 特定クローン検索ツール 検索に手間・時間がかかる 既存ツールでは複雑な検索が難しい NCDSearch : 正規表現などを使用できない grep : 空白・コメントを無視できない grepのUIは良いが書きにくい クエリが複雑に

提案ツール:ccgrep 特定クローン検索ツールccgrepを開発 クエリにマッチするクローンを検索可能 grepに似たUIで手軽に使用可能 トークン単位での複雑な検索に対応 正規表現などを使用できる 空白・コメントを無視できる 短い検索時間 対応言語:C/C++,Java,Python 検索対象:ファイル,ディレクトリ,標準入力 NCDSearch grepと違って

検索するクローンの種類 タイプ1(空白コメント除き完全一致) タイプ2(識別子・リテラルが異なる) パラメータ化されたクローンのみへのマッチ 設定で変更可(緑のみor両方) タイプ3(トークンが追加・削除されている) 任意のトークン列へのマッチ 正規表現 int a = a+1; int a = a+1; int b = b+1; int b = c+1;

検索クエリ 任意のコード片 パラメータ化されたクローンに マッチ(デフォルト) 特殊トークン 識別子の固定 任意のトークン列 正規表現 識別子の頭に“$”をつけると完全一致にのみマッチする 任意のトークン列 正規表現 int $setValue(int val) { val = val + 1; } クエリ例

任意のトークン列 クエリ内で $$ と書くと次のトークン列に最短マッチ $$内部で括弧の釣合いがとれた任意長のトークン列 $$内部に括弧の無い任意長のトークン列 while(a<100){ a++; $$ print(a); } a += 2; if(test(a)){ ifの中括弧が開いたままなので クエリに直接書かれてる print にはマッチせず マッチ継続 1,2にマッチして、また… 括弧が無いけど括弧の対応? 任意のプログラム断片    対応が… 取れてないものを排除? はじく例を追加 func($$) func() func(1, 2) func(g(3), a+b)

正規表現 使用できる表現 クエリ内では $ をつけて使用 選択 | 繰返し * + ? 任意の1トークン . グルーピング ( ) 選択 | 繰返し * + ? 任意の1トークン . グルーピング ( ) クエリ内では $ をつけて使用 a $( + $| - $) b x + y x - y x * y

検索アルゴリズム:パーサ構築 クエリをトークン列に分解し,パーサを構築 a = a $( + $| - $) b a = $( $| + - 文字列 トークン列 パーサ 連接 選択

検索アルゴリズム:マッチング1/3 対象トークン列の先頭から順に,パーサにマッチするか調べる パラメータ化されたクローンのために,対応テーブルを作る 連接 選択 a + = - b 対応 テーブル a↔int 失敗 検索対象ファイル = x - y … int

検索アルゴリズム:マッチング2/3 対象トークン列の先頭から順に,パーサにマッチするか調べる パラメータ化されたクローンのために,対応テーブルを作る 連接 対応 テーブル a = a 選択 b a↔x + - b↔y 成功 検索対象ファイル = x - y … int

検索アルゴリズム:マッチング3/3 対象トークン列の先頭から順に,パーサにマッチするか調べる パラメータ化されたクローンのために,対応テーブルを作る 連接 選択 a + = - b 対応 テーブル 失敗 検索対象ファイル = x - y … int

検索例 f → getPath $$ → new Path(getProject()) val → path 出力オプション n:行番号 f:コード全体 クエリ データを作り,キャッシュして返す関数 コマンド ccgrep ‘f(){ if(val==null){val = $$;} return val; }’ -r src/ -p nf ⋮ src/(中略)/Truncate.java 198: private synchronized Path getPath() { 199: if (path == null) { 200: path = new Path(getProject()); 201: } 202: return path; 203: } 出力 f → getPath $$ → new Path(getProject()) val → path

評価実験1:grepとのクエリ比較 空白やコメントの処理 任意の識別子 括弧の釣合い grepより書きやすい grep ‘\s*T\s+a\s*=\s*b\s*;‘ -r src/ (空白のみ対応) ccgrep ‘$T $a = $b;‘ -r src/ grep ‘[a-zA-Z_][a-zA-Z_0-9]* = [a-zA-Z_][a-zA-Z_0-9]*;‘ -r src/ ccgrep ‘T = a;‘ -r src/ grepより書きやすい grepでは書けない ccgrep ‘if(a == b) { $$ }‘ -r src/

評価実験2:概要 ccgrepの検索時間を計測 検索対象 比較ツール 実行環境 3つのC言語プロジェクト NCDSearch プロジェクト Git PostgreSQL Linux kernel ファイル数 339 904 15,123 行数[KLOC] 127 318 6,273 OS Windows 10 Pro for Workstations 64bit CPU Intel(R) Xeon(R) CPU E5-1603 v4 @ 2.80GHz 2.80 RAM 32.0GB

評価実験2:結果 大規模プロジェクトでも25秒程度と実用的に扱える 比較ツール NCDSearch 提案ツール ccgrep プロジェクト Git PostgreSQL Linux kernel ファイル数 339 904 15,123 行数[KLOC] 127 318 6,273 f($$, $$, $$); T1 f(T2 a){return $$;} クエリ2 クエリ3 a < b ? a : b クエリ1 Linuxでのgrepは6倍の速度 TODO:単純な例はgrepに投げてやれ? 比較ツール NCDSearch 時間[s] クエリ1 10.31 21.82 367.93 提案ツール ccgrep 時間[s] クエリ1 1.24 1.82 19.90 クエリ2 1.29 1.86 19.55 クエリ3 1.44 2.16 24.91

まとめと今後の課題 クエリに対するクローンを検索するツールccgrepを開発 評価実験では,以下の方法で実用性を確認した 今後の課題 独自のクエリ記法により検索可能 grepに似たUIで手軽に使用可能 評価実験では,以下の方法で実用性を確認した 検索クエリの比較 検索時間を計測 今後の課題 クエリや検索機能の拡張 アルゴリズムの改善 被験者実験などの評価実験