パターン

Download Report

Transcript パターン

オブジェクト指向プログラムに対する
メソッド呼び出しパターン違反の
検出手法
井上研究室 山田 吾郎
メソッド呼び出しパターンとは
メソッド定義中に頻出するメソッド呼び出し系列
メソッド呼び出し系列は, 以下の要素からなる
メソッド名
制御構造 (if, while, ...)
パターンの中には,実装を行う上で守るべきルールを
表しているものがある
open();
:
read();
:
close();
open();
:
read();
:
close();
メソッド定義1
メソッド定義2
・・・
open();
:
read();
:
close();
メソッド定義n-1
特別研究発表会
open();
:
read();
:
close();
メソッド定義n
2
パターン違反とは
パターンに違反したメソッド呼び出し系列
open();
:
read();
:
close();
open();
:
read();
:
close();
メソッド定義1
メソッド定義2
・・・
open();
:
read();
:
close();
メソッド定義n-1
open();
:
read();
:
:
メソッド定義n
closeが
欠落している
パターンに違反しているメソッド呼び出し系列
は欠陥を含んでいる可能性がある
特別研究発表会
3
パターン違反の検出手法
相関ルール(association rule)の確信度Cを用いる
相関ルール
P1⇒P2
パターンP1, P2について, あるメソッド定義中でP1が出現する
とき,P2も出現するというルール
確信度C: P1が出現するとき,P2も出現する条件付確
率
C( P1 ⇒ P2 )=
P1, P2ともに出現するメソッド定義
P1の出現するメソッド定義
確信度が1.0でなく,任意の閾値以上であればパ
ターン違反を検出
相関ルールに反しているメソッド定義がパターン違反
特別研究発表会
4
パターン違反の検出例
2つのパターン
P1 = {open, read}
P2 = {open, read, close}
C( P1 ⇒ P2 )=
P1, P2ともに出現するメソッド定義
=
P1の出現するメソッド定義
99
100
パターン違反
open();
:
read();
:
close();
open();
:
read();
:
close();
メソッド定義1
メソッド定義2
・・・
open();
:
read();
:
close();
メソッド定義99
特別研究発表会
open();
:
read();
:
:
メソッド定義100
5
本研究の動機
オブジェクト指向プログラムに対し,パターン
違反を用いた欠陥検出を行った研究は確認でき
ていない
過去の適用例は,C言語で記述されたプログラムのみ
オブジェクト指向プログラムであるJava言語に
適用し,欠陥検出における有効性を確認する
特別研究発表会
6
適用にあたっての問題点と解決方法
オブジェクト指向言語ではメソッド名だけでメ
ソッドを特定できない
C言語では関数名のみで関数を識別できる
Java言語では同名のメソッドが複数存在する
オーバーロード,クラス階層
欠陥検出において検出漏れが起こる可能性がある
メソッド呼び出しに関連する型を考慮
someClass.someMethod(arg1, arg2 );
レシーバオブジェクト
特別研究発表会
引数
7
型を考慮することによる効果の例
型Aa.open();
a.open();
a.open();
a.open();
a.read();
a.open();
a.read();
a.read();
a.read();
a.close();
a.read();
a.close();
a.close();
a.close();
a.close();
型A
a.open();
a.read();
:
x.open();
型Xx.open();
x.open();
x.open();
::
x.open();
::
x.close();
x.read();
x.close();
x.close();
x.close();
:
パターン違反
メソッド名のみ考慮する場合
{x.open, x.read}を{a.open, a.read}と同一視
パターン{open, read}の出現メソッド定義数が増加
確信度C が減少閾値を下回ると検出漏れ
型も考慮する場合
{x.open, x.read}と{a.open, a.read}を区別する
ことができる
特別研究発表会
8
実験目的
オブジェクト指向プログラムに対する有効性の
評価
欠陥を検出できるか,またその検出数を確認
型を考慮することの有効性の評価
型を考慮することで,考慮しない場合に検出できな
かった欠陥を検出できるか調査
欠陥を含まないパターン違反を削減できるか確認
特別研究発表会
9
実験方法
対象
Javaで開発されたプログラムEclipse JDT
行数
ファイル数
メソッド数
334,595
1,654
9,668
パターン違反とみなす確信度の閾値は 0.9
型を考慮する場合としない場合,2通りの実験を
行う
特別研究発表会
10
実験結果とその評価
型を考慮しない
型を考慮
パターン
260
121
パターン違反
456
295
欠陥を含むパターン違反
0
192
欠陥
0
1
欠陥の検出数
型を考慮した場合に, 192のパターン違反から1つの欠
陥が検出された
型を考慮することの有効性
検出された欠陥は, 型を考慮した場合のみ発見された
パターン違反が64.7%に削減された
そのうち65.1%が欠陥を含んでいた
特別研究発表会
11
検出された欠陥について
org.eclipse.jdt.internal.compiler.codegen.ConstantPool
writeU1(NameAndTypeTag); writeU2(nameIndex);
}
index = … = currentIndex++;
31のメソッド定義中1つのみ欠落
if (index > 0xFFFF){
….problemReporter().noMoreAvailableSpaceInConstantPool(…);
}
writeU1(MethodRefTag); writeU2(classIndex);
P1={writeU1, writeU2, writeU1, writeU2}
P2={problemReporter, ...}
C( P1 ⇒ P2 )=
P1, P2ともに出現するメソッド定義
P1の出現するメソッド定義
特別研究発表会
12
まとめと今後の課題
まとめ
オブジェクト指向プログラムに対し,パターン違反
を用いた欠陥検出を行った
適用に際し, 精度を高めるため型情報を用いた
欠陥の検出に成功し,型情報を用いる有効性も確認
した
今後の課題
他のプログラムへの適用
他の欠陥検出ツールとの比較
特別研究発表会
13
ご清聴ありがとうございました
特別研究発表会
14