クローン検出ツールを用いた ソースコード分析ツールの試作

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
Advertisements

背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
プログラムの動作を理解するための技術として
プログラム変更支援を目的とした コードクローン情報付加手法の提案と実装
大規模収集データに基づいた ソフトウェアエンジニアリング
大規模開発データの収集と エンピリカルソフトウェア工学
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
大規模ソースコード集合を対象とした 類似関数集合群の抽出
コードクローン検出技術と その利用法 神谷年洋‡, 植田泰士†, 肥後芳樹†, 楠本真二†, 井上克郎†
静的情報と動的情報を用いた プログラムスライス計算法
コードクローン分析ツールGeminiを用いたコードクローン分析手順
コードクローンの分布情報を用いた特徴抽出手法の提案
ギャップを含むコードクローンの フィルタリング手法の提案
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
コードクローンの集約によるリファクタリング支援システムの提案と実装
ネットワーク共生環境を築く情報技術の創出 テーマ4:高信頼性・高安全性を有するネットワーク共生環境の構築技術の創出
オブジェクト指向プログラミング言語に対応した コードクローン検出技法の提案と実験
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向メトリクスを用いた 開発支援法に関する研究
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
ソフトウェア制作論 平成30年10月3日.
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローン統合分析ツール ICCA 肥後 芳樹† ,吉田 則裕† ,神谷 年洋‡,楠本 真二† ,井上 克郎†
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
プログラム実行履歴を用いたコードクローン検出手法
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コンパイラ 2011年10月20日
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
第7回OACISシンポジウム 大阪大学におけるソフトウェア工学研究と産学連携活動
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コンパイラ 2012年10月11日
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
コードクローンを対象とした リファクタリングの有効性に関する調査
Presentation transcript:

クローン検出ツールを用いた ソースコード分析ツールの試作 植田 泰士*,神谷年洋**,楠本真二*,井上克郎*   * 大阪大学 大学院基礎工学研究科 情報数理系専攻 ** 科学技術振興事業団 若手個人研究推進事業 2019/2/23 ソフトウェアサイエンス研究会

研究の背景(1/2) ソースコード中に類似したコード片があるとき、 それらをコードクローンという クローンペア クローンクラス 2019/2/23 ソフトウェアサイエンス研究会

研究の背景(2/2) コードクローンはソフトウェア保守を困難にする 我々の研究室ではコードクローン検出ツールCCFinderを開発している コードクローンにフォールトがあった場合、 すべてのコードクローンについて修正を 行わなければならない 我々の研究室ではコードクローン検出ツールCCFinderを開発している 検出結果はクローンペアの位置情報のみであり その結果を直感的に理解することは困難 2019/2/23 ソフトウェアサイエンス研究会

目的 CCFinderの検出結果を用いてソースコードを分析するGUIシステムの試作を行う プログラム演習に適用実験を行い システムの有効性を確認する 2019/2/23 ソフトウェアサイエンス研究会

CCFinderの特徴 ソースコードをトークン単位で直接比較することによりクローンを検出 数百万行規模のシステムにも実用時間で解析可能 ユーザー定義名の置き換え 実用的に意味のあるクローンのみを検出 名前空間の正規化 テーブル初期化部分を取り除く モジュールの区切りを認識する 2019/2/23 ソフトウェアサイエンス研究会

CCFinderの処理概要 ソースコード CCfinder 字句解析 トークン列 変換処理 変換後トークン列 検出処理 クローン情報 出力整形処理 クローンペア位置情報 2019/2/23 ソフトウェアサイエンス研究会

CCFinderの処理概要 1. static void foo() throws RESyntaxException { ソースコード 字句解析 1. static void foo() throws RESyntaxException { 2. String a[] = new String [] { "123,400", "abc", "orange 100" }; 3. org.apache.regexp.RE pat = new org.apache.regexp.RE("[0-9,]+"); 4. int sum = 0; 5. for (int i = 0; i < a.length; ++i) 6. if (pat.match(a[i])) 7. sum += Sample.parseNumber(pat.getParen(0)); 8. System.out.println("sum = " + sum); 9. } 10. static void goo(String [] a) throws RESyntaxException { 11. RE exp = new RE("[0-9,]+"); 12. int sum = 0; 13. for (int i = 0; i < a.length; ++i) 14. if (exp.match(a[i])) 15. sum += parseNumber(exp.getParen(0)); 16. System.out.println("sum = " + sum); 17. } トークン列 変換処理 変換後トークン列 検出処理 クローン情報 出力整形処理 クローンペア位置情報 2019/2/23 ソフトウェアサイエンス研究会

CCFinderの処理概要 ソースコード 字句解析 トークン列 変換処理 変換後トークン列 検出処理 クローン情報 出力整形処理 クローンペア位置情報 2019/2/23 ソフトウェアサイエンス研究会

CCFinderの処理概要 ソースコード 字句解析 トークン列 変換処理 変換後トークン列 検出処理 クローン情報 出力整形処理 クローンペア位置情報 2019/2/23 ソフトウェアサイエンス研究会

CCFinderの処理概要 1. static void foo() throws RESyntaxException { ソースコード 1. static void foo() throws RESyntaxException { 2. String a[] = new String [] { "123,400", "abc", "orange 100" }; 3. org.apache.regexp.RE pat = new org.apache.regexp.RE("[0-9,]+"); 4. int sum = 0; 5. for (int i = 0; i < a.length; ++i) 6. if (pat.match(a[i])) 7. sum += Sample.parseNumber(pat.getParen(0)); 8. System.out.println("sum = " + sum); 9. } 10. static void goo(String [] a) throws RESyntaxException { 11. RE exp = new RE("[0-9,]+"); 12. int sum = 0; 13. for (int i = 0; i < a.length; ++i) 14. if (exp.match(a[i])) 15. sum += parseNumber(exp.getParen(0)); 16. System.out.println("sum = " + sum); 17. } 字句解析 トークン列 変換処理 変換後トークン列 検出処理 クローン情報 出力整形処理 クローンペア位置情報 2019/2/23 ソフトウェアサイエンス研究会

CCFinderの出力 テキストベースのクローンペアの位置情報とソースコードだけから分析を行うのは困難 解析ファイル番号 #version: ccfinder 3.1 #langspec: JAVA #option: -b 30,1 #option: -k + #option: -r abcdfikmnprsv #option: -c wfg #begin{file description} 0 52 C:\Gemini.java 1 94 C:\GeneralManager.java : #end{file description} #begin{clone} 0 53,9 63,13 10 542,9 553,13 35 1 53,9 63,13 10 624,9 633,13 35 2 124,9 152,31 2 154,9 216,51 42       : #end{clone} テキストベースのクローンペアの位置情報とソースコードだけから分析を行うのは困難 解析ファイル番号 0番ファイルの53~63行目と 10番ファイルの542~553行目 がコードクローンとして検出 2019/2/23 ソフトウェアサイエンス研究会

分析ツールの構成 ユーザ ソースコード コードクローン検出部 クローンペア 管理部 クローンクラス 管理部 ソースコード管理部 クローン散布図 ソースコード コードクローン検出部 クローンペア 管理部 メトリクスグラフ クローンクラス 管理部 ソースコードビュー ユーザ ソースコード管理部 2019/2/23 ソフトウェアサイエンス研究会

分析ツールの機能 クローンペアの位置情報を散布図で表現 クローンクラスに関するソフトウェアメトリクスの算出とグラフ表示 類似率に基づくソート機能 指定クローンペア集合のソースコードを比較する クローンを持たないファイルを散布図から取り除く ズーム機能 クローンクラスに関するソフトウェアメトリクスの算出とグラフ表示 指定クローンクラスのソースコードを比較する フィルタリング機能 2019/2/23 ソフトウェアサイエンス研究会

クローン散布図表示機能(1/3) 原点は左上角 水平軸,垂直軸には共に同じ順で同じ要素を並べる 各座標で一致している部分に点をプロット コードクローンとなっている部分は直線として現れる 対角線は自己比較なので 一本の直線が引かれる 分布状態は対角線に線対称 実際のGUI上では行単位で描画するので対角線に平行でない直線も現れる 10 9 8 7 6 5 4 3 2 1 1, 2, 3, ・・・ : 行番号 A, B, C, ・・・ : トークン A B C X Y A B C ● X Y 2019/2/23 ソフトウェアサイエンス研究会

クローン散布図表示機能(2/3) 座標軸上に単純にファイル を並べる(辞書順等) f1 f2 f3 f4 f5 f6 ● クローンペアの分布が 散布図上で分散し どこに注目すべきなのか 判断が難しい 分布状態ができる限り 密集する順でファイルを 並べる必要がある 2019/2/23 ソフトウェアサイエンス研究会

クローン散布図表示機能(3/3) ファイル配置順のソート機能 あるファイルfの位置が確定すればその隣には,位置が未確定な残りのファイル集合から,fに対し最も類似率の高いファイルを並べる ソート基準はファイル間類似率 あるファイルが対象ファイルによっ てコードクローンでどれだけカバー されているか 先頭のファイルの決定,もしくは最も高い類似率でも0である場合には,残りの解析対象ファイル全体に関してコードクローンで占められるカバー率を用いる f1 f6 f3 f5 f2 f4 ● f1 f2 f3 f4 f5 f6 ● 2019/2/23 ソフトウェアサイエンス研究会

クローン散布図の表示例 2019/2/23 ソフトウェアサイエンス研究会

分析ツールの機能 クローンペアの位置情報を散布図で表現 クローンクラスに関するソフトウェアメトリクスの算出とグラフ表示 類似率に基づくソート機能 指定クローンペア集合のソースコードを比較する クローンを持たないファイルを散布図から取り除く ズーム機能 クローンクラスに関するソフトウェアメトリクスの算出とグラフ表示 指定クローンクラスのソースコードを比較する フィルタリング機能 2019/2/23 ソフトウェアサイエンス研究会

クローンクラスに関するメトリクス(1/2) LEN(C):クローンクラスC内の1コード片のトークン数 POP(C):クローンクラスC内の要素数 DFL(C):クローンクラスCを1サブルーチンに まとめた場合のコード減少量の予測値   =(再構築対象コードサイズ)-(再構築後コードサイズ) サブルーチン サブルーチンコールに置き換え DFL値 2019/2/23 ソフトウェアサイエンス研究会

RAD(a) = 2 RAD(b) = 3 RAD(c) = 0 RAD(d) = 1 クローンクラスに関するメトリクス(2/2) RAD(C):ファイルシステム内にクローンクラスC内の 要素がどれだけ分散しているか ディレクトリ ファイル コード片 b a c RAD(a) = 2 RAD(b) = 3 RAD(c) = 0 RAD(d) = 1 d d c b a b 2019/2/23 ソフトウェアサイエンス研究会

クローンクラス管理部の表示例 パラレルコーディネーショングラフ(多次元平行座標) 各メトリクス値の警戒範囲を指定することによりクローンクラスの選択を行う 2019/2/23 ソフトウェアサイエンス研究会

適用実験概要 大学のプログラム演習*において作成された プログラムのソースコードに適用 Pascal風言語ソースコードをCASLへ変換するコンパイラを作成 C言語で開発 課題1:構文チェッカ(Parser) 課題2:意味チェッカ(Checker) 課題3:コンパイラ(SPC) 課題1→2,2→3では積極的に再利用して拡張することが望まれる 計76人分(約38万行)のソースコードを利用 *受講対象は大阪大学基礎工学部情報科学科3年生 2019/2/23 ソフトウェアサイエンス研究会

適用結果-散布図(1/2) 類似プログラムの検出 A 1区切り:1個人 最小一致トークン数:30 各個人内で課題順に配置 ソートにより要分析領域は 大幅に縮小 容易に類似性を判断可能 Parser Checker SPC A A A B AB A B A B 2019/2/23 ソフトウェアサイエンス研究会

適用結果-散布図(2/2) 3課題を通した再利用性 (原点から順にParser,Checker,SPC) 課題1-2間:平均7.5%の再利用 課題2-3間:平均30.3%の再利用 課題1-2間での再利用が最も低い例 課題1-2間での再利用が最も高い例 2019/2/23 ソフトウェアサイエンス研究会

(原点から順にParser, Checker, SPC) 適用結果-メトリクスグラフ(1/2) DFL値が高いクローンクラスを持つ人物 拡張時にモジュール整理をほとんど行っていない者を特定 ほぼ同じ処理 の繰り返し ソースコード 全体へ分散 さらに分散 (原点から順にParser, Checker, SPC) 2019/2/23 ソフトウェアサイエンス研究会

適用結果-メトリクスグラフ(2/2) RAD,POP値が共に高いクローンクラス 多くの人に頻繁に使われたコードパターン (例) 構文解析部の「変数宣言の並び」と 「仮パラメータの並び」に関する処理のコードクローン 与えられた仕様の構文定義が全く同じであった 処理的意味が異なるので一概に1ルーチンに 再構築すべきであるとは言えない例 「変数宣言の並び」 =変数名の並び “:” 型 {変数名の並び “:” 型} 「仮パラメータの並び」=変数名の並び “:” 型 {変数名の並び “:” 型} 2019/2/23 ソフトウェアサイエンス研究会

まとめ ソースコード分析ツールを試作した 演習に適用する中で有効性を確認 クローン分析における散布図ソート機能の有効性 メトリクスグラフから特徴あるコード片集合を容易に抽出 2019/2/23 ソフトウェアサイエンス研究会

今後の課題 メトリクス値の散布図への反映 含んでいる構文によりクローンペア,クロー ンクラスを分類表示 コードクローンとバグとの相関 2019/2/23 ソフトウェアサイエンス研究会

参考:Suffix-treeによるマッチングアルゴリズム 以下の条件を満たす木 (1)木の葉は部分文字列の開始位置 (2)根から葉までラベルをたどると部分文字列になる (3)ひとつの節点から出る辺のラベルはすべて異なる文字で始まる →共通のパス=クローン 2019/2/23 ソフトウェアサイエンス研究会

参考 : モジュール整理 拡張時にモジュール整理を的確に行った者と, ほとんど行っていない者 モジュール整理が的確に行えた例 ほぼ同じ処理 の繰り返し ほぼ同じ処理 の繰り返し ソースコード 全体へ分散 1サブルーチン に再構築 さらに分散 モジュール整理が的確に行えた例 モジュール整理が行えていない例 2019/2/23 ソフトウェアサイエンス研究会