柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 識別子名のタグクラウドを用いた.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
シーケンス図の生成のための実行履歴圧縮手法
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
TF-IDF法とLSHアルゴリズムを用いた 関数単位のコードクローン検出法
コンパイラ 2011年10月17日
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
情報伝播によるオブジェクト指向プログラム理解支援の提案
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
プログラムの動作を理解するための技術として
コンパイラ 2012年10月15日
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
コードクローン分析ツールGeminiを用いたコードクローン分析手順
ギャップを含むコードクローンの フィルタリング手法の提案
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
FlexとBison+アルファ -実習編-
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
構文定義記述を用いた 多言語対応コードクローン検出ツールの改善
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
情報検索技術に基づくベクトル表現と 深層学習を用いたコード片の類似性判定法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コード片のベクトル表現に基づく 大規模コードクローン集合の特徴調査
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
プログラム実行履歴を用いたコードクローン検出手法
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードクローン編集者数に着目した開発履歴の分析
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コンパイラ 2011年10月20日
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
C言語 はじめに 2016年 吉田研究室.
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
同期処理のモジュール化を 可能にする アスペクト指向言語
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
統合開発環境のための プログラミング言語拡張 フレームワーク
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
ソフトウェア理解支援を目的とした 辞書の作成法
コンパイラ 2012年10月11日
コードクローン解析に基づく デザインパターン適用候補の検出手法
Geminiを用いた効果的なコードクローン分析方法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発 井上研究室 瀬村 雄一 それでは,柔軟に変更可能な字句解析機構を持つコードクローン検出ツールの開発という題目で、井上研究室の瀬村が発表いたします

コードクローン 同一または類似した部分を持つコード片 主な発生原因はコピーアンドペースト ソフトウェアの保守作業を難しくすると言われている クローンセット コードクローンとは,ソースコード上の同一または類似した部分を持つコード片のことをいいます 主な発生原因はコピーアンドペーストといわれています.コードクローンの存在はソフトウェアの保守作業を難しくするとされています. 図のように,互いにコードクローンとなるコード片の集合のことをクローンセットといいます. コードクローン

コードクローンの分類[1] 関数名と変数名のみが違っている void show(int x){ int i ; 定義 タイプ1 空白,タブ文字,改行やコメントなどを除いて一致する     コードクローン タイプ2 タイプ1の条件に加えて,リテラル,型,識別子を除いて一致する コードクローン タイプ2 のコードクローンの例 void show(int x){ int i ; for( i=0 ; i<x ; i++){ printf(“%d ”,x); x=x+i; } void print(int min){ int i ; for( i=0 ; i<min ; i++){ printf(“%d ”,min); min=min+i; } タイプ1は,空白,タブ文字,改行やコメントなどを除いて一致するコードクローン. タイプ2は,タイプ1の条件に加えて,下の例のように,リテラル,型、識別子を除いて一致するコードクローンをいいます 関数名と変数名のみが違っている [1] Roy et, al., Comparison and Evaluation of Code Clone Detection Techniques and Tools: A Qualitative Approach, Science of Computer Programming, 2009

多言語に対応したコードクローン検出 CCFinderはコードクローン検出ツールであり, 多くの企業や研究で使用されている[2] しかし,対応言語を1つ1つ増やすのは手間がかかる ツールを各言語に対応して実装するより,多くの言語に   柔軟に対応できる仕組みを使用したほうが負担が少ない[3] コードクローンを自動的に検出するツールとしてCCFinderというものがあります。CCFinderは井上研究室が開発したものであり,ユーザから新たな言語に対応してほしいとの要望が寄せられます しかし,対応言語を一つ一つふやしていくのは手間がかかります。ツールを各言語に対して実装するより,多くの言語に柔軟に対応できる仕組みを使用したほうが負担が少ないと考えられます [2] 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, 2002. [3] Kazunori Sakamoto. Occf: A framework for developing test coverage measurement tools supporting multiple programming languages. Software Testing, Verification and Validation (ICST), 2013 IEEE Sixth International Conference on,pp.422--430,IEEE. 2013

CCFinderの処理概要(字句解析) if(b==c) value=i ; ソースファイル 字句解析 変換処理 クローン検出・出力 クローン情報 if ( b == c ) value = i ; 字句解析は言語の文法に依存する 新たな言語を検出対象として増やすには,        その言語の字句解析を実装する必要がある CCFinderの処理概要について説明したいと思います.CCFinderはトークン単位のコードクローンを検出するために字句解析を行っています. この字句解析は右上に示すようなもので,このような文があると,このようにトークンを分割するようなことをいいます.字句解析は言語によって依存しているため,対象となる言語1つ1つに別の字句解析が必要です。 検出対象となる言語を増やすには,その言語の字句解析を実装する必要があります.

CCFinderの処理概要(変換処理) if(b==c) value=i ; ソースファイル 字句解析 変換処理 クローン検出・出力 クローン情報 if b == c value = i ; ( ) $ 識別子を表す文字列を,全て同じトークンに    置き換える タイプ2 のコードクローンを検出するために    行われる CCFinderではタイプ2のコードクローンを検出するために識別子を別のトークンに置き換える作業を行っています. 字句解析で分割されたトークンがこれです.これから識別子を表す文字列を全て同じトークンに置き換えます. 今回の例では全てドルマークに置き換えています.

言語間の字句解析の違い コメントは字句解析における言語間の差の大きな要因 定義より,コードクローンにコメントは含まれないので  字句解析ではコメントを無視する 多くの言語でコメント機能が使われているため,         言語別にコメントルールの入力が必要である  言語によるコメントの違い(行コメント) C言語 Ruby v=v+i; //ここはコメント 次に言語間の字句解析における違いについて説明します.言語間の文法の差の大きな要因の1つとしてコメントが挙げられます. コードクローンの定義より,コメントは含まれないため,字句解析ではコメントを無視している.多くの言語で,コメント機能が使われているため,字句解析部へのコメントルールの入力が必要である. 言語によるコメントの違い例として,C言語ではこのようにスラッシュが2つが現れると,それ以降行末までをコメントとしています.Rubyでは#が現れると,それ以降行末までをコメントとしています. y=5+6 #ここはコメント

識別子の検出 タイプ2のコードクローンを検出するために, ソースコードから識別子を探し出す必要がある タイプ2のコードクローンを検出するために,      ソースコードから識別子を探し出す必要がある 手順1:ソースコードの中から英数字列を検出する 手順2:英数字列を識別子と予約語に分別する 手順1が可能になるようなトークン分割を行えば良い 手順2を行うために予約語の入力が必要 次に識別子の検出です.タイプ2のコードクローン検出を行うためには,ソースコードから識別子を探し出す必要がある. その手順1として,ソースコードの中から英数字列を検出する.手順2として,英数字列を識別子と予約語に分別する必要があります 手順1が可能になるトークン分割を行う必要があります。手順2を行うために予約語の入力が必要です. 予約語:  言語によって定められた識別子名に使用できない文字列

研究概要 提案ツール タイプ2 までのトークン単位のコードクローンが検出可能 字句解析の入力要素はコメントルールと予約語 コメントルールに関する26 種類のオプションで,    多くの言語のコメント除去が可能になる仕組みを持つ 適用実験 コメント除去部を使用して,175 言語に対して    コメント除去を行い,有用性を示した 字句解析が可能だったいくつかの言語に対し,     コードクローン検出を行った

提案する字句解析機構 ソースファイル コメント除去 コメントルール トークン分割 識別子判別 予約語 トークン列 字句解析機構 こちらが本研究で提案する字句解析機構の概要図で,ソースファイルからトークン列を切り出すところまでを表しています. コメント除去→トークン分割→識別子判別の順番で行っています.必要な入力であるコメントルールと予約語は,それぞれコメント除去と識別子判別で使用しています. トークン列

コメントルールの分類 プログラミング言語におけるコメントを5つに分類した 1, 行コメント 例:C言語 2, 複数行コメント 例:C言語 3, 行全体コメント 例:Fortran 4, 複数行全体コメント 例:Ruby 5, 文字列リテラル 例:Java v=v+i; //ここはコメント v=v+i; /*ここはコメント ここもコメント*/ c ここはコメント =begin ここはコメント =end ここもコメント まずコメント除去を実装するにあたって,プログラミング言語において使用されるコメントルールを5種類に分類しました. 行コメントは例えば//から行末までをコメントとするコメントをいいます。複数行コメントは例えば/*から*/までをコメントとするコメントをいいます 行全体コメント行頭の文字だけを見てその文字がアルファベットのCだった場合に行全体をコメントとするコメントをいいます 複数行全体コメントは行頭の文字をみて=beginから始まる行から=endで始まるような行までをコメントとするコメントといいます 文字列リテラルはコメントのルールではありませんが,ダブルクオーテーションで囲まれた文字列リテラルの中ではコメントは認識しないので,文字列リテラルの定義のルールを定めました。 String x = “comment start /* "; String y = “comment end  */ ";

26種類のコメントオプション 26種類のコメント除去に関するオプションを作成し, それぞれにa~zのアルファベットを当てはめる 実行時にオプションを指定して,除去したいコメントのルールを決めることが出来る. コマンドラインでの実行時に引数として”ek”を与えると eとkのルールでコメント除去を行う アルファベット コメントルールの分類 開始記号 終了記号 d 行コメント ; なし e # f -- g % k 複数行コメント { } このコメントの分類を用いて,コメント除去に関する26種類のオプションを作成しました. 実行時にオプションを指定して,除去したいコメントルールを決めることができる。オプションの例としてこのようなものがあります. アルファベットdを選択すると,セミコロンが出現すると以降をコメントとみなす行コメントが対象言語に含まれていると考えて除去を行います コマンドラインでの実行時に引数としてekを選択するとeとkのコメントルールで除去を行います

オプションの追加・変更 オプションは,分類に基づく範囲で追加・変更が可能 例:cのオプションをC言語のコメントルールに変更 対応アルファベット・分類・開始記号・終了記号を   設定ファイルに記述することでルールが追加可能 アルファベット コメントルールの分類 開始記号 終了記号 c 文字列リテラル ‘ “ 行コメント // なし 複数行コメント /* */

トークン分割と変換処理 コメント除去を行ったソースコードをトークン分割する 1. 文字,文字列リテラルは1トークンとする 2. 空白と改行の前後でトークンを分割する 3. 記号は1文字ずつで分割する 4. それ以外の連続した英数字の列は1トークンとする if(b==c) value=i ; トークン分割 トークン分割の手法について説明します. ルールは4つあって,まず.このように分割します if ( b = = c ) value = i ; 変換処理 if ( $ = = $ ) $ = $ ;

コメント除去に関する適用実験 目的:26種類のオプションを使用して,どの言語の コメント除去が可能になるかを調べる    コメント除去が可能になるかを調べる 対象:RosettaCode(RC)[4] の Comments というタスク Comments は各言語のコメント記述例を示したタスクで  今回の適用実験に適している RosettaCode:多くの言語のサンプルコードが掲載されたウェブページ        同じ例題(タスク)を多くの言語で実装している        831のタスクが存在し,646言語が使用されている [4] Rosetta Code. http://rosettacode.org/wiki/Rosetta Code.

コメント除去に関する適用実験:結果 結果: RCのCommentsを実装している175言語中150言語が 26種類のオプションでコメント除去が可能だった(85%)

コードクローン検出に関する適用実験 目的: コメント除去が可能な言語で,予約語が用意できたものに,タイプ2のコードクローンを検出する 手法: 1, 幾つかの言語のソースコードを読んで,タイプ2の コードクローンをリストアップする 2, それらのソースコードに対してツールを実行し, リストアップしたコードクローンが検出されることを 確認する

コードクローン検出に関する適用実験:結果 対象: ・RC内のSudoku という名前のタスク  -- このタスクは複雑で,コード行数が長い傾向にあり    コードクローンが見つかる可能性が高い ・予約語を用意した言語の中で,コードクローンが  見つかった6言語を対象にした 言語は C,C++,Go,Java,Python,Ruby 結果: ・6言語で,リストアップしたコードクローンを  全て検出ができた

まとめと今後の課題 まとめ 今後の課題 -- 柔軟に変更可能な字句解析機構を提案した -- 簡潔なオプションで多くの言語のコメント除去が   可能であることを示した -- 予約語を入力することで,タイプ2のコードクローンを   検出することができた 今後の課題 -- トークン分割などのコメント以外の文法要素を,   簡潔なオプションで変更可能にする -- オプションの作成・指定の自動化