シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法

Slides:



Advertisements
Similar presentations
シーケンス図の生成のための実行履歴圧縮手法
Advertisements

XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
CCC DATAset における マルウェアの変遷
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
時空間データからのオブジェクトベース知識発見
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
複数のモジュールに共通する ソースコード片の検出と活用
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
分散処理を用いた大規模ソフトウェアに対するコーディングパターン検出ツール
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
静的情報と動的情報を用いた プログラムスライス計算法
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
リファクタリング中に生じる コンパイルエラーの自動解消手法
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
実行時情報に基づく OSカーネルのコンフィグ最小化
雑音環境下における 非負値行列因子分解を用いた声質変換
Javaプログラムの変更を支援する 影響波及解析システム
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
動的データ依存関係解析を用いた Javaプログラムスライス手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
Webコミュニティ概念を用いた Webマイニングについての研究 A study on Web Mining Based on Web Communities 清水 洋志.
不確実データベースからの 負の相関ルールの抽出
バイトコードを単位とするJavaスライスシステムの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
パターンマイニング技術を 用いた実時間プログラムの コーディングパターン検出
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
「マイグレーションを支援する分散集合オブジェクト」
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
アスペクト指向言語のための視点に応じた編集を可能にするツール
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案と実装
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
分散処理を用いたコーディングパターン検出ツールの実装
プログラム依存グラフの一貫性検査に基づく欠陥候補の検出手法
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法 ○山田 吾郎, 吉田則裕, 井上克郎 大阪大学

概要 ソースコードを解析し, 品質の低い部分を自動的に特定する研究がある 本研究はソースコードの自動解析による欠陥 (バグ)検出を目的としている メソッド呼び出しパターンの抽出 シーケンシャルパターンマイニングを用いる メソッド呼び出しパターンのパターン違反検出 パターン違反は欠陥を含む可能性が高い オブジェクト指向プログラムに対するパターン違反検出手法の提案 適用実験として欠陥検出における有効性を評価 マイニング→データマイニング 要練習

目次 背景 提案手法 実験 まとめ メソッド呼び出しパターン シーケンシャルパターンマイニング パターン違反 オブジェクト指向言語に適用する際の問題点とその解決方法 実験 提案手法と既存手法の比較 まとめ スライドの流れをちゃんというところ!!! !!!!!!!!!!!!!!重要!!!!!!!!!!!!!!! !!!!!!!!!!!!!!至急!!!!!!!!!!!!!!!

メソッド呼び出しパターンとは メソッド定義で頻出するメソッド呼び出し系列 メソッド呼び出し系列は, 以下の要素からなる メソッド名, 制御構造 (if, while, ...) シーケンシャルパターンマイニングにより抽出 パターンの中には,実装を行う上で守るべきルールを表しているものがある open(); : read(); close(); open(); : read(); close(); open(); : read(); close(); open(); : read(); close(); スライドの下に例をあげました。 この例では、メソッド呼び出し系列open, read, closeがメソッド定義1~nで出現しています。 同じメソッド呼び出し系列がたくさんのメソッド呼び出し定義に出現するので、open, read, close はパターンとして抽出されます ・・・ メソッド定義1 メソッド定義2 メソッド定義n-1 メソッド定義n

メソッド呼び出しパターン抽出までの流れ ソースコードを入力 ソースコードからメソッド呼び出し系列を抽出 メソッド呼び出し系列に対しシーケンシャルパターンマイニングを適用 メソッド呼び出しパターンを出力 method1(){ int i; open(); if (…){ read(); } close(); open #IF read #END-IF close

シーケンシャルパターンマイニングとは 多数の系列から頻出する部分系列を抽出する手法 PrefixSpanアルゴリズム[1]を使用 系列: 順序を考慮するデータの集合 メソッド呼び出しパターンではメソッド呼び出しと制御構造 部分系列: 系列の任意の要素を, 順序を保存したまま取り出すことでできる系列 PrefixSpanアルゴリズム[1]を使用 系列 部分系列 部分系列ではない a b c d e a c e a e c 部分系列と系列の関係 [1]Pei, J., Han, J., Mortazavi-Asl, B., Pinto., H., Chen, Q., Dayal, U. and Hsu, M.- C.: PrefixSpan: Mining Sequential Patterns Efficiently by Prefix-Projected Pattern Growth, Proc. of ICDE 2001, Heidelberg, Germany, pp.215–224 (2001).

PrefixSpanアルゴリズム概要 入力 出力 系列の集合 シーケンシャルパターンの出現数の最小値 シーケンシャルパターンの長さの最小値 系列中での出現位置 系列の集合 出現数2以上 長さ2以上 [ab]:2 [cd]:2 [abcd] [dafb] [ac]:2 [acd]:2 [aeade] [acd] [ad]:2

パターン違反とは パターンに違反したメソッド呼び出し系列 パターンに違反しているメソッド呼び出し系列は欠陥を含んでいる可能性がある open(); : read(); close(); open(); : read(); close(); open(); : read(); close(); open(); : read(); ・・・ メソッド定義1 メソッド定義2 メソッド定義n-1 メソッド定義n closeが 欠落している

パターン違反の検出手法(1/2) 相関ルール(association rule)の確信度Cを用いる C( P1 ⇒ P2 )= パターンP1, P2について, あるメソッド定義中でP1が出現するとき,P2も出現するというルール 確信度C: P1が出現するとき,P2も出現する条件付確率 P1, P2ともに出現するメソッド定義数 C( P1 ⇒ P2 )= P1の出現するメソッド定義数 弁ず

パターン違反の検出手法(2/2) 確信度が1.0でなく,ある閾値以上であればパターン違反として検出 P1⇒P2で,確信度が高いときの例 P2 閾値はユーザが任意に指定 P1⇒P2で,確信度が高いときの例 P2 P1 パターン違反

パターン違反の検出例 2つのパターン C (P 1 ⇒ P 2)= = P1 = [open, read] P2 = [open, read, close] P1, P2ともに出現するメソッド定義 99 C (P 1 ⇒ P 2)=                    = 100   P1の出現するメソッド定義 パターン違反 open(); : read(); close(); open(); : read(); close(); open(); : read(); close(); open(); : read(); むりすぎ 図でごり押し 2ページにわける 式だす ・・・ メソッド定義1 メソッド定義2 メソッド定義99 メソッド定義100

目次 背景 提案手法 実験 まとめ メソッド呼び出しパターン シーケンシャルパターンマイニング パターン違反 オブジェクト指向言語に適用する際の問題点とその解決方法 実験 提案手法と既存手法の比較 まとめ

本研究の動機 オブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った研究は確認できていない 過去の適用例は,C言語で記述されたプログラムのみ オブジェクト指向言語Javaで記述されたプログラムに適用し,欠陥検出における有効性を確認する この手法ー>口頭ではちゃんとしゃべれ

適用にあたっての問題点と解決方法 オブジェクト指向言語ではメソッド名だけでメソッドを特定できない C言語では関数名のみで関数を識別できる Java言語では同名のメソッドが複数存在する オーバーロード,クラス階層 欠陥検出において検出漏れが起こる可能性がある メソッド呼び出しに関連する型を考慮 レシーバオブジェクト    引数の順序つき列 オブジェクト指向言語に従来の手法をそのまま適用するとうまくいかない なんでか C言語ではどーこー Javaではこーこー someClass.someMethod(arg1, arg2 );

型を考慮することによる効果 メソッド名のみ考慮する場合 型も考慮する場合 [x.open, x.read]を[a.open, a.read]と同一視 パターン[open, read]の出現メソッド定義数が増加 確信度C が減少 閾値を下回ると検出漏れ 型も考慮する場合 [x.open, x.read]と[a.open, a.read]を区別可能 型A 型A 型A a.open(); a.read(); a.close(); 型A 型A x.open(); : x.close(); x.read(); a.open(); a.read(); a.close(); 型X 型X a.open(); a.read(); a.close(); a.open(); a.read(); a.close(); a.open(); a.read(); : a.open(); a.read(); a.close(); パターン違反

作成したツールについて 提案手法を実装したツールを作成 入力: 出力: ソースコード ソースコードから抽出したメソッド呼び出しパターン(XML) 出力: パターン違反の閲覧画面 パターン違反を生じている相関ルール ソースコード上でのパターン違反の出現場所 パターン違反検出 ソースコード→検出ツール←人間 入力と出力に該当する図 ツールが何をしているのか書く ふんぐー 矢印はデータフローかプロセスフローか

目次 背景 提案手法 実験 まとめ メソッド呼び出しパターン シーケンシャルパターンマイニング パターン違反 オブジェクト指向言語に適用する際の問題点とその解決方法 実験 提案手法と既存手法の比較 まとめ スライドの流れをちゃんというところ!!! !!!!!!!!!!!!!!重要!!!!!!!!!!!!!!! !!!!!!!!!!!!!!至急!!!!!!!!!!!!!!!

実験目的 オブジェクト指向プログラムに対する有効性の評価 型を考慮することの有効性の評価 欠陥を検出できるか,またその検出数を確認 型を考慮することで,考慮しない場合に検出できなかった欠陥を検出できるか調査 欠陥を含まないパターン違反を削減できるか確認 しきいちかけ Itemizeおかしい 一つ目と二つめが逆になってる

実験方法(1/2) 対象 メソッド呼び出しパターンを,最小出現回数30,パターンの最小の長さを4として抽出 Javaで開発されたプログラムEclipse JDT メソッド呼び出しパターンを,最小出現回数30,パターンの最小の長さを4として抽出 パターン違反とみなす確信度の閾値は 0.9 型を考慮する場合としない場合,2通りの実験を行う 行数 ファイル数 メソッド数 334,595 1,654 9,668

実験方法(2/2) 以下の4項目について比較 パターン パターン違反 欠陥を示すパターン違反 欠陥 抽出されたメソッド呼び出しパターンの総数 検出されたパターン違反の総数 欠陥を示すパターン違反 パターン違反を起こしているメソッド定義中に欠陥が含まれていたものの数 欠陥 すべてのパターン違反の中から見つかった欠陥の総数 包含関係の説明 流れ

実験結果とその評価 欠陥の検出数 型を考慮することの有効性 型を考慮した場合に, 192のパターン違反から1つの欠陥が検出された 型を考慮しない 型を考慮 パターン 260 121 パターン違反 456 295 欠陥を示すパターン違反 192 欠陥 1 欠陥の検出数 型を考慮した場合に, 192のパターン違反から1つの欠陥が検出された 型を考慮することの有効性 検出された欠陥は, 型を考慮した場合のみ発見された パターン違反が64.7%に削減された そのうち65.1%が欠陥を含んでいた どういう

org.eclipse.jdt.internal.compiler.codegen.ConstantPool 検出された欠陥について org.eclipse.jdt.internal.compiler.codegen.ConstantPool writeU1(NameAndTypeTag); writeU2(nameIndex); } index = … = currentIndex++; if (index > 0xFFFF){ ….problemReporter().noMoreAvailableSpaceInConstantPool(…); writeU1(MethodRefTag); writeU2(classIndex); 31のメソッド定義中1つのみ欠落 P1=[writeU1, writeU2, writeU1, writeU2] P2=[problemReporter, ...] 実験結果について、なんでバグっぽいか説明する 赤でかこったところが何をしてるのか説明する P1, P2ともに出現するメソッド定義 C ( P 1 ⇒ P 2 )= P1の出現するメソッド定義

まとめと今後の課題 まとめ 今後の課題 オブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った 適用に際し, 精度を高めるため型情報を用いた 欠陥の検出に成功し,型情報を用いる有効性も確認した 今後の課題 他のプログラムへの適用 他の欠陥検出ツールとの比較 共通の親クラスの探索 脆弱性に関する欠陥の検出 こんごのかだいかこう

ご清聴ありがとうございました

PrefixSpan :数え上げ対象の 系列の集合 :系列 :抽出された パターン :出現回数が閾値を 下回ったパターン 2. 系列から要素に続く部分系列を抽出 1.各要素を含む系列の数を数え上げる [abcd] [aeade] [dafb] [acd] [a]:4 [b]:2 [c]:2 [d]:3 [e]:1 [f]:1 [cd] [d] [d] [afb] [cd]:2  :数え上げ対象の   系列の集合  :系列  :抽出された   パターン  :出現回数が閾値を    下回ったパターン *出現回数の閾値は2 φ [bcd] [eade] [fb] [cd] [ab]:2 [ac]:2 [ad]:2 [ae] [af] [cd] [d] [d] [e] [acd]:2 φ

型を考慮することによる効果(2/2) メソッド名のみ考慮する場合 型も考慮する場合 パターン違反 a.closeと x.closeを区別できない 型も考慮する場合 x.closeが異なる型から呼び出されているため,異なるメソッドと認識 型A a.open(); : x.close(); 型A 型X a.open(); : a.close(); a.open(); : a.close(); a.open(); : a.close(); a.open(); : a.close(); a.open(); : a.close(); パターン違反 型A ソースコードX中のメソッド呼び出しcloseは他とは違うオブジェクトから呼び出されており 誤って異なるオブジェクトからメソッドを呼び出してしまった可能性があり、欠陥かもしれない しかし、メソッド名のみ考慮するばあい

パターン違反の検出手法(2/2) 確信度:0 確信度:1 確信度: 低 確信度: 高(1ではない) P1 P2 P1 P2 P2 P1 相関ルールに反しているメソッド定義がパターン違反 確信度:0 確信度:1 確信度: 低 確信度: 高(1ではない) P1 P2 P1 P2 P2 P1 大きさ同じにする いっこが違うのはおかしい P1,P2の意味の再掲 大事

PrefixSpanアルゴリズム :数え上げ対象の 系列の集合 :系列 :抽出された パターン :出現回数が閾値を 下回ったパターン [abcd] [aeade] [dafb] [acd] [a]:4 [b]:2 [c]:2 [d]:3 [e]:1 [f]:1 [cd] [d] [d] [afb] [cd]:2  :数え上げ対象の   系列の集合  :系列  :抽出された   パターン  :出現回数が閾値を    下回ったパターン *出現回数の閾値は2 φ [bcd] [eade] [fb] [cd] [ab]:2 [ac]:2 [ad]:2 [ae] [af] [cd] [d] [d] [e] 入力・出力が何がでてくるのか 出現回数はパラメタである。閾値があるんや! Prefixspanとはこんなんやっておおざっぱな説明でええんちゃうか [acd]:2 φ

作成したツール(2/2) 実験結果につながる ばいばい