プログラムに対するメソッド呼び出しパターン違反の 検出手法 井上研究室 山田 吾郎 メソッド呼び出しパターンと は メソッド定義中に頻出するメソッド呼び出し系列 ID: 811453
Download The PPT/PDF document "オブジェクト 指向" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
オブジェクト指向プログラムに対するメソッド呼び出しパターン違反の検出手法
井上研究室
山田 吾郎
Slide2メソッド呼び出しパターンとはメソッド定義中に頻出するメソッド呼び出し系列メソッド呼び出し系列は, 以下の要素からなる
メソッド名
制御構造
(if, while, ...)パターンの中には,実装を行う上で守るべきルールを表しているものがある
特別研究発表会
2
open();
:read(); :close();
open(); :read(); :close();
open(); :read(); :close();
open(); :read(); :close();
メソッド定義1
メソッド定義2
メソッド定義n-1
メソッド定義n
・・・
Slide3パターン違反とは パターンに違反したメソッド呼び出し系列
パターンに違反しているメソッド呼び出し系列は欠陥を含んでいる可能性がある
特別研究発表会
3
open();
:
read(); :close();
open(); :read(); : :
メソッド定義1メソッド定義2メソッド定義n-1
メソッド定義n・・・
open(); :read();
:close();
open();
:read(); :
close();
close
が
欠落している
Slide4パターン違反の検出手法相関ルール(association rule)の確信度Cを用いる相関ルール
P1
⇒P2パターンP1, P2について,
あるメソッド定義中でP1が出現するとき,P2も出現
するというルール確信度C: P1が出現するとき,
P2も出現する条件付確率
確信度が1.0でなく,任意の閾値以上であればパターン違反を検出相関ルールに反しているメソッド定義がパターン違反特別研究発表会
4C( P
1 ⇒ P2
)=P
1の出現するメソッド定義
P
1,
P
2
ともに出現するメソッド定義
Slide5パターン違反の検出例
2
つのパターン
P1 = {open, read}P2 = {open, read, close}
特別研究発表会
5
open();
:read(); :close();
open(); :read(); : :
メソッド定義1メソッド定義2メソッド定義99
メソッド定義100・・・
open(); :read();
:close();
open();
:read(); :
close();
パターン違反
C
(
P
1
⇒
P
2
)
= =
P
1
の出現するメソッド定義
100
P
1
,
P
2
ともに出現するメソッド定義
99
Slide6本研究の動機オブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った研究は確認できていない過去の適用例は,C言語で記述されたプログラムのみ
オブジェクト指向
プログラムである
Java言語に適用し,欠陥検出における有効性を確認する特別研究発表会
6
Slide7適用にあたっての問題点と解決方法オブジェクト指向言語ではメソッド名だけでメソッドを特定できないC言語では関数名のみで関数を識別できるJava
言語では同名のメソッドが複数存在する
オーバーロード,クラス階層
欠陥検出において検出漏れが起こる可能性があるメソッド呼び出しに関連する型を考慮レシーバオブジェクト 引数
特別研究発表会
7
someClass.someMethod(arg1, arg2 );
Slide8型を考慮することによる効果の例メソッド名のみ考慮する場合{x.open, x.read}
を
{a.open, a.read}
と同一視パターン{open, read}の出現メソッド定義数が増加
確信度C が減少
閾値を下回ると検出漏れ
型も考慮する場合{x.open, x.read}と{a.open, a.read}を区別することができる特別研究発表会
8a.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
パターン違反
Slide9実験目的オブジェクト指向プログラムに対する有効性の評価欠陥を検出できるか,またその検出数を確認型を考慮することの有効性の評価
型を考慮することで,考慮しない場合に検出できなかった欠陥を検出できるか調査
欠陥を含まないパターン違反を削減できるか確認
特別研究発表会
9
Slide10実験方法対象Javaで開発されたプログラムEclipse JDT
パターン違反とみなす確信度の閾値は
0.9
型を考慮する場合としない場合,2通りの実験を行う
特別研究発表会
10
行数
ファイル数メソッド数 334,5951,654
9,668
Slide11実験結果とその評価 欠陥の検出数型を考慮した場合に
,
192のパターン違反から1つの欠陥が検出された型を考慮することの有効性検出された欠陥は,
型を考慮した場合のみ発見されたパターン違反が64.7%に削減された
そのうち65.1%が欠陥を含んでいた
特別研究発表会
11
型を考慮しない型を考慮パターン260121パターン違反
456295欠陥を含むパターン違反0192
欠陥01
Slide12検出された欠陥について
P1={
writeU1, writeU2, writeU1, writeU2
}P2={problemReporter, ...}
特別研究発表会
12
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
)
=
P
1
の出現するメソッド定義
P
1
,
P
2
ともに出現するメソッド定義
Slide13まとめと今後の課題まとめオブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った適用に際し, 精度を高めるため型情報を用いた
欠陥の検出に成功し,型情報を用いる有効性も確認した
今後の課題
他のプログラムへの適用他の欠陥検出ツールとの比較
特別研究発表会
13
Slide14ご清聴ありがとうございました特別研究発表会
14
Slide15メソッド呼び出しパターンの抽出特別研究発表会
15
Slide16検出漏れの原因相関ルールの左辺が原因型を考えなかった場合パターンP1{writeU1, writeU2, ...}は49のメソッド定義に出現
19
は異なるレシーバオブジェクトからの呼び出し
確信度Cは0.61
閾値を下回った型を考えた場合パターン
P1は31のメソッド定義に出現確信度
Cは0.97
特別研究発表会16
Slide17型を考慮することによる効果(2/2)メソッド名のみ考慮する場合
a.close
と
x.closeを区別できない型も考慮する場合
x.closeが異なる型から呼び出されているため,異なるメソッドと認識
特別研究発表会
17
a.open();
:a.close();
a.open(); :
a.close();a.
open()
; :
a.close();
a.
open
()
;
:
a.
close()
;
a.
open
()
;
:
a.
close()
;
型
A
型
A
a.
open
()
;
:
x.
close()
;
型
A
型
X
パターン違反
Slide18概要目的オブジェクト指向プログラムからの欠陥(バグ)検出背景
メソッド呼び出しパターンのパターン違反を元に欠陥を検出する研究がある
ただし対象は
C言語オブジェクト指向プログラムでも欠陥はみつかるのか?結論
適用実験を行い, 有効性の確認をした
特別研究発表会
18
Slide19パターン違反とは (2/2)サブパターンと元のパターンで出現インスタンスの差分が少数そのメソッド定義に出現するサブパターンのインスタンスがパターン違反
特別研究発表会
19
method1(){
:
hoge();
:
fuga(); : piyo(); :
method2(){ :
hoge(); : fuga(); : piyo(); :
method3(){ :
hoge(); :
fuga(); :
piyo(); :
method4(){
:
hoge();
:
fuga();
:
piyo();
:
method5(){
:
hoge();
:
:
:
piyo();
:
fuga()
は
?
パターン違反
パターン違反は欠陥を示す場合がある
Slide20パターン違反の検出例以下2つのパターンの信頼度Cを求めるパターンA={hoge, piyo}パターン
B={hoge, fuga, piyo}
特別研究発表会
20
method1(){
:
hoge();
: fuga(); :
piyo(); :
method2(){ : hoge(); : fuga(); :
piyo(); :
method3(){ :
hoge(); :
fuga(); : piyo();
:
method4(){
:
hoge();
:
fuga();
:
piyo();
:
method5(){
:
hoge();
:
:
:
piyo();
:
パターン違反
Slide21パターン違反の検出手法相関ルール(association rule)の信頼度Cを用いる相関ルール
:
パターン
A, Bについて, あるメソッド定義中でAのインスタンスが存在する時B
のインスタンスも同時に存在するというルール. A
⇒Bと書く
パターン違反は次のように定義される
信頼度Cが次の式を満たす相関ルールRがあるとき m≦C<1.0(m:ユーザ定義の閾値)Rの左辺と右辺の出現メソッド定義の差集合に出現する左辺のインスタンスがパターン違反
特別研究発表会21
Slide22メソッド呼び出しパターンとはソースコード中に頻出するメソッド呼び出し系列メソッド呼び出し系列は, 以下の要素からなるメソッド名
制御構造
(if, while,
...)インスタンスパターンに一致するメソッド呼び出し系列である
特別研究発表会
22
if
(!buffer.isEditable()) {
textArea.getToolkit().beep(); return;}
パターン[ IF, isEditable, beep, ENDIF ] (テキスト編集ソフトJEdit中に25回出現)
Slide23パターン違反の検出手法(2/2)信頼度が1.0ではない十分大きな値の相関ルールは, ルールが成立しない箇所にパターン違反が存在することを示すしかし
,
オブジェクト指向プログラムへの適用事例はまだない
特別研究発表会
23
Slide24背景(2/2)しかし, 適用対象のプログラムはいずれもC言語近年普及しているオブジェクト指向型言語のプログラムに適用した例はない
特別研究発表会
24
Slide25提案手法(3/3)特別研究発表会
25
既存手法
提案手法
メソッド名のみでマイニング
⇒同一パターンと判断
a.close((X)y)
は異なるメソッドであり
, 欠陥である可能性があるにもかかわらず検出されない
引数の型を考慮⇒異なるパターンと認識a.close((X)y) をパターン違反として検出できる
a.open((T)x);:a.close(
(X)y);
a.
open((T)x)
;:a.close(
(M)y
)
;
a.
open(
(T)x
)
;
:
a.
close(
(M)y
)
;
a.
open(
(T)x
)
;
:
a.
close(
(M)y
)
;
a.
open(
(T)
x
)
;
:
a.
close(
(X)
y
)
;
a.
open(
(T)x
)
;
:a.close((M)y);a.open((T)x);
:a.
close(
(M)y
)
;
a.
open(
(T)
x
)
;
:
a.
close(
(M)
y
)
;
Slide26評価実験Javaプログラムを対象に2通りの実験を行った型を考慮しない従来の手法をそのまま適用
型を考慮する
提案手法
次の2点で評価を行う欠陥は見つかるのかオブジェクト指向プログラムにおいてもパターン違反による欠陥検出は有効か確かめる
型を考慮する利点はあるのか
提案手法の有効性を確かめる特別研究発表会
26
Slide27提案手法により期待できる効果(1/2)特別研究発表会
27
既存手法
a.
hoge
()
;
:
x.piyo();
提案手法メソッド名のみで
パターン違反検出⇒同一メソッドと判断x.piyo() は欠陥である可能性があるにもかかわらずパターン違反として検出されず, 検出漏れが起こる
メソッド呼び出しに関連の型を考慮⇒異なるメソッドと認識
x.piyo() をパターン違反として検出できる
a.
hoge()
;
:
a.
piyo()
;
a.
hoge
()
;
:
a.
piyo()
;
a.
hoge
()
;
:
a.
piyo()
;
a.
hoge
()
;
:
x.
piyo()
;
a.
hoge
()
;
:
a.
piyo()
;
a.
hoge
()
;
:
a.
piyo()
;
a.
hoge
()
;
:
a.
piyo()
;
型
A
型
A
型
A
型
X
型
A
型
A
型
A
型
X
Slide28実験対象と設定項目対象: Eclipse JDT(Java Development Tools)信頼度Cの閾値
:
0.8特別研究発表会
28
Slide29提案手法により期待できる効果(2/2)特別研究発表会
29
既存手法
a.
open
()
;
:
a.close();
a.open ();:a.close ();
提案手法・x.open(), x.close() をサブパターンと誤認識
⇒相関ルールの信頼度が低下⇒a.open(), a.close()
がパターン違反として検出されず, 検出漏れが起こる
・x.open(),x.close()
を別のパターンと認識⇒a.open(), a.close() をパターン違反として検出できる
a.
open()
;
:
a.
close()
;
a.
open()
;
:
a.
close()
;
a.
open()
;
a.
hoge()
;
a.
close()
;
a.
open
()
;
:
a.
close()
;
a.
open
()
;
:
a.
close()
;
a.
open
()
;
a.hoge()
;a.close()
;
a.
open()
;
:
a.
close()
;
a.
open()
;
:
a.
close()
;
x
.
open()
;
:
x.
close()
;
a.
open
()
;
:
a.close ();a.open ()
;:a.close ();x.open ()
;:x.close ();
Slide30パターン違反の検出手法相関ルール(association rule)の確信度Cを用いる相関ルール
P1
⇒P2パターンP1, P2について,
あるソースコード中でP1が出現するとき,P2も
存在するというルール確信度C: P1が出現するとき,
P2も出現する条件付確率確信度が
1.0でなく,任意の閾値以上であればパターン違反特別研究発表会30
open(); :read(); :close();
open(); :read(); : :
ソースコード1ソースコード2ソースコード99
ソースコード100
・・・
open();
:read(); :
close();
open();
:
read();
:
close();
P2
99
のソースコードで出現
P1
100
のソースコードで出現