インタフェースの仕様化と オブジェクト指向モデリ …apsom.org/docs/T020_FORUM-01-02.pdfインタフェースの仕様化と オブジェクト指向モデリング
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための...
description
Transcript of シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための...
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための
欠陥検出手法
○ 山田 吾郎 , 吉田則裕 , 井上克郎
大阪大学
概要
ソースコードを解析し , 品質の低い部分を自動的に特定する研究がある本研究はソースコードの自動解析による欠陥 ( バグ ) 検出を目的としている
メソッド呼び出しパターンの抽出シーケンシャルパターンマイニングを用いる
メソッド呼び出しパターンのパターン違反検出パターン違反は欠陥を含む可能性が高い
オブジェクト指向プログラムに対するパターン違反検出手法の提案
適用実験として欠陥検出における有効性を評価
2
目次
背景メソッド呼び出しパターンシーケンシャルパターンマイニングパターン違反
提案手法オブジェクト指向言語に適用する際の問題点とその解決方法
実験提案手法と既存手法の比較
まとめ
3
メソッド呼び出しパターンとは
メソッド定義で頻出するメソッド呼び出し系列メソッド呼び出し系列は , 以下の要素からなる
メソッド名 , 制御構造 (if, while, ...)シーケンシャルパターンマイニングにより抽出パターンの中には,実装を行う上で守るべきルールを表しているものがある
4
open(); :read(); :close();
open(); :read(); :close();
open(); :read(); :close();
open(); :read(); :close();
メソッド定義 1 メソッド定義2
メソッド定義 n-1
メソッド定義 n
・・・
メソッド呼び出しパターン抽出までの流れ
1. ソースコードを入力2. ソースコードからメソッド呼び出し系列を抽出
3. メソッド呼び出し系列に対しシーケンシャルパターンマイニングを適用
4. メソッド呼び出しパターンを出力5
method1(){ int i; open(); if (…){ read(); } close();}
open#IFread#END-IFclose
多数の系列から頻出する部分系列を抽出する手法系列 : 順序を考慮するデータの集合
メソッド呼び出しパターンではメソッド呼び出しと制御構造
部分系列 : 系列の任意の要素を , 順序を保存したまま取り出すことでできる系列
PrefixSpan アルゴリズム [1] を使用
系列
シーケンシャルパターンマイニングとは
6
[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 PatternGrowth, Proc. of ICDE 2001, Heidelberg, Germany, pp.215–224 (2001).
a b c d e
部分系列
a c e部分系列ではな
い
a ce
系列の集合
PrefixSpan アルゴリズム概要
入力系列の集合シーケンシャルパターンの出現数の最小値シーケンシャルパターンの長さの最小値
出力シーケンシャルパターン
系列中での出現位置
7
[abcd][aeade
]
[dafb][acd]
出現数 2 以上
長さ 2 以上
[ab]:2[ac]:2[ad]:2
[cd]:2[acd]:2
パターン違反とは
パターンに違反したメソッド呼び出し系列
パターンに違反しているメソッド呼び出し系列は欠陥を含んでいる可能性がある
8
open(); :read(); :close();
open(); :read(); : :
メソッド定義 1 メソッド定義2
メソッド定義 n-1
メソッド定義 n
・・・
open(); :read(); :close();
open(); :read(); :close();
close が欠落してい
る
パターン違反の検出手法 (1/2)
相関ルール (association rule) の確信度 C を用いる
相関ルール P1⇒P2パターン P1, P2 について , あるメソッド定義中で P1 が出現するとき, P2 も出現するというルール
確信度 C: P1 が出現するとき, P2 も出現する条件付確率
9
C( P1 ⇒ P2 )=
P1 の出現するメソッド定義数P1, P2 ともに出現するメソッド定義数
パターン違反の検出手法 (2/2)
確信度が 1.0 でなく,ある閾値以上であればパターン違反として検出
閾値はユーザが任意に指定
P1⇒P2 で,確信度が高いときの例
10
P1 P2
パターン違反
パターン違反の検出例
2 つのパターンP1 = [open, read]P2 = [open, read, close]
11
open(); :read(); :close();
open(); :read(); : :
メソッド定義 1 メソッド定義2
メソッド定義 99 メソッド定義 100
・・・
open(); :read(); :close();
open(); :read(); :close();
パターン違反
C (P 1 ⇒ P 2)=
P1 の出現するメソッド定義
P1, P2 ともに出現するメソッド定義 =10
0
99
目次
背景メソッド呼び出しパターンシーケンシャルパターンマイニングパターン違反
提案手法オブジェクト指向言語に適用する際の問題点とその解決方法
実験提案手法と既存手法の比較
まとめ
12
本研究の動機
オブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った研究は確認できていない
過去の適用例は, C 言語で記述されたプログラムのみ
オブジェクト指向言語 Java で記述されたプログラムに適用し,欠陥検出における有効性を確認する
13
適用にあたっての問題点と解決方法
オブジェクト指向言語ではメソッド名だけでメソッドを特定できない
C 言語では関数名のみで関数を識別できるJava 言語では同名のメソッドが複数存在する
オーバーロード,クラス階層
欠陥検出において検出漏れが起こる可能性がある
メソッド呼び出しに関連する型を考慮
レシーバオブジェクト 引数の順序つき列14
someClass.someMethod(arg1, arg2 );
型を考慮することによる効果
メソッド名のみ考慮する場合[x.open, x.read]を [a.open, a.read] と同一視パターン [open, read] の出現メソッド定義数が増加
確信度 C が減少 閾値を下回ると検出漏れ
型も考慮する場合[x.open, x.read]と [a.open, a.read] を区別可能
15
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read(); :
x.open(); :x.close();
x.open(); :x.close();
x.open(); :x.close();
x.open(); :x.close();
x.open();x.read(); :
型A
型A
型X型X
型A
型A型A
パターン違反
作成したツールについて
提案手法を実装したツールを作成入力 :
ソースコードソースコードから抽出したメソッド呼び出しパターン (XML)
出力 :パターン違反の閲覧画面
パターン違反を生じている相関ルールソースコード上でのパターン違反の出現場所
16
パターン違反検出
目次
背景メソッド呼び出しパターンシーケンシャルパターンマイニングパターン違反
提案手法オブジェクト指向言語に適用する際の問題点とその解決方法
実験提案手法と既存手法の比較
まとめ
17
実験目的
オブジェクト指向プログラムに対する有効性の評価
欠陥を検出できるか,またその検出数を確認
型を考慮することの有効性の評価型を考慮することで,考慮しない場合に検出できなかった欠陥を検出できるか調査欠陥を含まないパターン違反を削減できるか確認
18
実験方法 (1/2)
対象Java で開発されたプログラム Eclipse JDT
メソッド呼び出しパターンを,最小出現回数30 ,パターンの最小の長さを 4 として抽出パターン違反とみなす確信度の閾値は 0.9型を考慮する場合としない場合, 2通りの実験を行う
19
行数 ファイル数 メソッド数
334,595
1,654 9,668
実験方法 (2/2)
以下の 4項目について比較パターン
抽出されたメソッド呼び出しパターンの総数
パターン違反検出されたパターン違反の総数
欠陥を示すパターン違反パターン違反を起こしているメソッド定義中に欠陥が含まれていたものの数
欠陥すべてのパターン違反の中から見つかった欠陥の総数
20
実験結果とその評価
欠陥の検出数型を考慮した場合に , 192 のパターン違反から 1 つの欠陥が検出された
型を考慮することの有効性検出された欠陥は , 型を考慮した場合のみ発見されたパターン違反が 64.7% に削減されたそのうち 65.1% が欠陥を含んでいた
21
型を考慮しない 型を考慮
パターン 260 121パターン違反 456 295
欠陥を示すパターン違反
0 192
欠陥 0 1
検出された欠陥について
P1=[writeU1, writeU2, writeU1, writeU2]P2=[problemReporter, ...]
22
writeU1(NameAndTypeTag); writeU2(nameIndex);}index = … = currentIndex++;if (index > 0xFFFF){ ….problemReporter().noMoreAvailableSpaceInConstantPool(…);}writeU1(MethodRefTag); writeU2(classIndex);
org.eclipse.jdt.internal.compiler.codegen.ConstantPool
31 のメソッド定義中 1 つのみ欠落
C ( P 1 ⇒ P 2 ) =
P1 の出現するメソッド定義P1, P2 ともに出現するメソッド定義
まとめと今後の課題
まとめオブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った
適用に際し , 精度を高めるため型情報を用いた
欠陥の検出に成功し,型情報を用いる有効性も確認した
今後の課題他のプログラムへの適用他の欠陥検出ツールとの比較共通の親クラスの探索脆弱性に関する欠陥の検出
23
ご清聴ありがとうございました
24