ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)

ソースコード記述に着目した
Fault Localization に対する適合性の提案
佐々木 唯1,2,a)

肥後 芳樹1,b)

柗本 真佑1,c)

楠本 真二1,d)

概要：ソフトウェア開発におけるデバッグ作業支援として，Spectrum-Based Fault Localization（SBFL）
に関する研究が盛んに行われている．SBFL は，テストケースごとの成否と，どの文が実行されたかという実行経路情報を用いて，プログラム中の欠陥箇所を推測する手法である．高水準言語にはさまざまな記
述方法が用意されており，ある機能を実現するためのソースコードの記述方法は幾通りも存在する．そのため，その記述方法の違いが SBFL の精度に差を生じさせている可能性があると著者らは考えた．そこで
本論文では，プログラム自体が SBFL にどの程度適しているかという特性（SBFL 適合性）を持つと考え，
SBFL 適合性の計測手法を提案する．提案手法は，欠陥を含まないプログラムに対し，ミューテーション
テスト技術を活用して疑似的な欠陥を発生させ，SBFL によってその疑似的な欠陥をどの程度正確に検出できたかを計測する．プログラム構造の違いによる SBFL 適合性の違いについて，リファクタリングを題材に確認したところ，SBFL 適合性を向上させるプログラム構造の特徴を発見した．

1. はじめにISO/IEC 25010*1 で定義されているソフトウェア製品の品質モデルでは，8 つの品質特性，及び各特性から派生

ソフトウェア開発において，デバッグは多大な労力とコする副特性が定義されている*2 ．品質特性の 1 つである

ストを必要とする作業である．デバッグ作業がソフトウェ

Maintainability（保守性）の副特性に Analysability（解析ア開発コストの過半数を占めるという報告もある [1,2]．こ性）がある．解析性とは，ソフトウェアの不具合の原因をのため，デバッグ支援に関する研究が盛んに行われている．

診断することや，修正すべき箇所を識別することに対する

デバッグ支援の研究分野の 1 つに欠陥限局技術があ

有効性や効率の程度を示す*3 ．

る．欠陥限局とは，欠陥が含まれている箇所を推測する技

高水準言語にはさまざまな記述方法が用意されており，術である．中でも近年，実行経路情報を用いた欠陥限局

開発者は自身の好みや組織の方針に従って，必要な機能の（Spectrum-Based Fault Localization，以降，SBFL）に関

実装方法を決定する．実装方法が変わるとテストケース毎する研究が盛んに行われている [3]．SBFL は，失敗するテの実行経路情報が変わる可能性があり，更に文の疑惑値やストケースによって実行される文は欠陥を含む可能性が高

その順位も変わる可能性がある．従って，プログラム自体いという考えに基づき，テストケースごとの成否と，プロが SBFL を用いた欠陥箇所の特定にどの程度適しているか

グラム中で実行される文の情報（以下，実行経路情報）をという特性を持っていると考えることができる．

用いて，欠陥を含む文を推測する技術である．SBFL 技術

そこで本論文では，あるプログラムに対する SBFL をでは，プログラム中の各文に対して欠陥を含む可能性（以用いた欠陥限局の結果がどの程度正確かを，プログラムの降，疑惑値）を数値化する．欠陥を含む文の疑惑値が他のSBFL 適合性と定義する．これは，あるプログラムに対す文と比べてより高い値であるほど，SBFL 結果がより正確*1であると言える．
ソフトウェアには様々な品質の観点が存在する．

1
2
a)
b)
c)
d)

大阪大学大学院情報科学研究科 大阪府吹田市
株式会社日本総合研究所 東京都品川区
s-yui@ist.osaka-u.ac.jp
higo@ist.osaka-u.ac.jp
shinsuke@ist.osaka-u.ac.jp
kusumoto@ist.osaka-u.ac.jp

c 2020 Information Processing Society of Japan
⃝

*2

*3

ISO/IEC 25010:2011 Systems and software engineering ―Systems and software Quality Requirements and Evaluation(SQuaRE) ― System and software quality models
ISO/IEC 25010 に準ずる JIS X 25010 では，8 つの品質特性
を機能適合性・性能効率性・互換性・使用性・信頼性・セキュリ
ティ・保守性・移植性と定義している．
ISO/IEC 25010 における Analysability の定義は以下の通り．
Degree of eﬀectiveness and eﬃciency with which it is possible
to assess the impact on a product or system of an intended
change to one or more of its parts, or to diagnose a productfor deﬁciencies or causes of failures, or to identify parts tobe modiﬁed.

184ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)

る SBFL 適用技術との親和性の一種であり，品質特性であテストケースの内容に結果が左右される．失敗するテスト

る保守性，及びその副特性である解析性に含まれる 1 つのケースを元に他のテストケースを生成することで，より効観点とみなすことができる．ソフトウェアの品質特性の 1

率的に SBFL を行う研究が行われている [10, 11]．

つの観点として SBFL 適合性を扱うことにより，下記の活動が可能になる．

また，テストスイートの欠陥検出能力を評価する方法として，ミューテーションテストに関する研究が行われてい• 現在のプログラムに対する SBFL 結果がどの程度信頼る [4]．ミューテーションテストでは，欠陥を含まない正常できるかを事前に把握する．信頼できると判断されたなプログラムに対して意図的に変更を加えた大量のプログ

場合は，SBFL 技術を利用することにより欠陥限局をラムが生成される．変更が加えられたプログラムをミュー行い，その結果を利用して開発者がデバッグ作業を行

タントと呼ぶ．各ミュータントに対してテストを実行した

えば良い．

際，テストが失敗すれば，そのテストはミュータントの変• SBFL 適合性が低いプログラムに対し，SBFL 適合性が向上するようなプログラム変換を行う．
本論文では，SBFL 適合性の計測方法も提案する．具体的には，欠陥を含まない正常なプログラムに対して，ミュー

更箇所，すなわち疑似的な欠陥を検出する能力があると判断できる．ミューテーションテストには様々なツールが提案されており [12–14]，企業のソフトウェアに対するミューテーションテストの実用性も報告されている [15]．

テーションテスト [4] の技術を活用し，様々な箇所に疑似

ミューテーションテストを SBFL に応用する研究も行わ的な欠陥を発生させ，SBFL を実行する．SBFL によってれている．ミューテーションテストでは意図的に変更が加

どの程度正確に疑似的な欠陥箇所を特定できたかを計測すえられるため，その変更箇所，すなわち欠陥の混入箇所はることにより，元のプログラムの SBFL 適合性を示す値

明らかである．欠陥の箇所が未知であるプログラムと，そ（以降，SBFL スコア）を計測する．

のプログラムから生成された特定のミュータントが，共通

本論文ではリファクタリングを題材に，プログラム構造のテストケースで失敗する場合，欠陥の箇所も共通であるの違いによる SBFL スコアの計測結果を比較した．その可能性が高い．この考えに基づき，欠陥限局の精度を向上

結果，同じ条件分岐先で実行される文の数が少ないほどさせる手法が提案されている [16, 17]．

SBFL スコアが向上することを確認し，SBFL スコアを向上させるプログラム構造の変換例を発見した．
本論文による貢献は以下の点である．

3. SBFL 適合性
著者らは，プログラム自体が SBFL にどの程度適してい• プログラムに対する SBFL 適合性を定義るかという特性を持っていると考える．本論文では，この• ミューテーションテストを用いた SBFL 適合性の計測

特性を SBFL 適合性と定義する．プログラムの機能やテス手法を提案• リファクタリングを題材として，プログラム構造の違いによって SBFL 適合性が異なる事例を確認• SBFL 適合性を向上させるプログラム構造の特徴と変換例を発見

2. 関連研究

トスイートが共通であっても，構造が異なることで SBFLを用いた欠陥限局の精度に違いが生じることがある．本章
では，プログラム構造の違いによる SBFL 適合性の違いについて，具体的事例を用いて説明する．
図 1 は，2 つの入力値を受け取り，少なくとも一方が正の数であれば true を，そうでなければ false を返す処理を，

2 通りの記述で表している．図 1(a) では結果を変数 result

プログラム中の欠陥箇所を推測する手法の 1 つとして，に代入して，最後にまとめて結果を返しているが，図 1(b)実行経路情報を用いた欠陥限局（以降，SBFL）に関するでは結果が確定したタイミングで逐次返している．図 1(b)研究が盛んに行われている [3]．SBFL は，各テストケー

は図 1(a) に対して，リファクタリングが適用された状態でスの成否と実行経路情報を用いて，文ごとの疑惑値，すな

ある．このように return 文によって早く処理を抜ける書

わち欠陥である可能性を示す値を算出する．実行経路情報

き方は early return と呼ばれる [18]．

とは，各テストケースがプログラム中のどの文を実行した

このプログラムのテストスイートには図 1(c) を用意しかという情報である．直感的には，失敗するテストケース

た．図 1 の各プログラムは同じ条件式に欠陥を含んでいが多く通過する文は，成功するテストケースが多く通過する．図 1(a) の s4 と図 1(b) の s′4 は変数 b が 0 である場合

る文より欠陥を含む可能性が高いと考えることができる．

も true を返してしまうため，テストケース t4 は失敗する．

これまでに多くの SBFL 手法が提案されている [5–7] が，

図 1(a), 1(b) の右側には，各テストケースの結果（P: 通Abreu らは複数の SBFL 手法を比較した結果，Ochiai [8]過（成功），F: 失敗）と実行経路情報，及び Ochiai の計算の手法が最も優れていると結論づけている [9]．

式により算出した文の疑惑値（suspiciousness，図では susp

SBFL はテストケース毎の実行経路情報に基づくため，

c 2020 Information Processing Society of Japan
⃝185

ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)
プログラム (入力: a, b)

susp

t1

t2

t3

t4

0.50
0.50
0.00
0.50
0.50
0.50

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓
✓
✓

✓
✓
✓

✓
✓
✓

✓
✓
✓

テスト結果：PPPF

s 1 : boolean result = false;s 2 : if (0 < a)s 3 : result = true;🕷 s 4 : if (0 <= b) // correct: 0 < bs 5 : result = true;s 6 : return result;(a)リファクタリング前
susp

t1

t2

t3

t4

s' 2 : if (0 < a)s' 3 : return true;
🕷 s' 4 : if (0 <= b) // correct: 0 < bs' 5 : return true;s' 6 : return false;

0.50
0.00

✓
✓

✓
✓

✓

✓

入力 (a, b)t1:(1, 1)
t2:(1, 0)
t3:(0, 1)
t4:(0, 0)

0.71
0.71
-

期待値
true
true
true
false

1.ミュータント⽣成

…

✓

×

×

ミュータント⽣成器 G
2. ミュータントにSBFL実⾏

PP

rScoreT(m1) … rScoreT(mn)

SBFLScoreT,G(p)3. プログラムpのSBFLスコア算出

図 2: SBFL スコア算出の流れ
✓
✓

✓
✓

P

F

の程度正確に識別できるかを計測する．

4.1 SBFL 適合性を構成する要素(b)リファクタリング後テストケース

疑似⽋陥

テストスイート T

プログラム (入力: a, b)

テスト結果：

ミュータントmn

ミュータントm1

プログラム p

実際の値
true
true
true
true

(c) テストスイート
図 1: 構造の異なる 2 つのプログラムの SBFL 結果

SBFL 適合性はプログラム p 以外に次の２つの要素から構成される．

• テストスイート T• ミュータント生成器 G
テストスイートに含まれるテストケースの内容によって

SBFL の精度に違いが生じる可能性がある．例として，図1(b) においてテストケースが t3 , t4 のみである場合を考える．この 2 つのテストケースの実行経路情報は同一であると記載）も記載している*4 ．疑惑値の取りうる値は 0 以上

ため，実行経路情報から計算される疑惑値は，少なくとも1 以下であり，1 が最も疑惑が強いことを示す．図 1 より，実行される文 s′2 , s′4 , s′5 において同じ値となる．元のテス

欠陥を含む文 s4 , s′4 は異なる疑惑値であると確認できる．
欠陥箇所が未知である状態において，SBFL 結果を元にトスイートによる SBFL 結果であれば，文 s′2 より文 s′4 , s′5の方に欠陥が含まれている可能性が高いと判断できる．

欠陥の箇所を特定しようとする作業を考える．文ごとの疑ミューテーションテストにおいて，ミュータントを生成

惑値が算出されているため，作業者は疑惑値の高い順に文するためのプログラムの変換ルールをミューテーション演を確認する．図 1(a) の場合，欠陥を含む文の疑惑値は最も算子と表現する．本論文では，ミュータント生成のために高いものの，同じ疑惑値を持つ文が計 5 つ存在するため，用いるミューテーション演算子の集合をミュータント生成

最大で 5 つの文を確認しなければ発見できない．一方で，器と呼ぶ．SBFL 適合性はミュータント生成器に依存する．

図 1(b) であれば，2 つの文を確認すれば欠陥箇所を発見することができる．従って，図 1(a) に比べて図 1(b) の方が4.2 算出方法

SBFL 結果の精度が高いと言える．

SBFL 適 合 性 を 示 す 値 を SBFL ス コ アと 定 義 す る ．

4. SBFL 適合性の計測方法

SBFL スコアは 0 以上 1 以下の値をとり，値が高いほ

本章では，プログラムの SBFL 適合性の計測方法について述べる．SBFL 適合性を計測するための基本的なアイ
デアは，与えられたプログラムに対して意図的に変更を加ど SBFL 適合性が高いものとする．プログラム p の SBFL
スコアは，テストスイート T ，ミュータント生成器 G に依存するとして，SBFLScore T,G (p) と定義する．

SBFL スコアの算出の流れを図 2 に示す．SBFL スコア

えたプログラムを複数生成し，その変更箇所を欠陥とみなは次の 3 つのステップによって算出される．

して，SBFL でどの程度正確に特定できるか計測すること( 1 ) プログラム p から複数のミュータントを生成である．プログラムに意図的に変更を加える方法として，( 2 ) 各ミュータントに SBFL を実行し，変更箇所（疑似欠ミューテーションテストを活用する．本来ミューテーショ
ンテストとは，テストスイートがミュータントをどの程度正確に欠陥として検出できるかを計測するが，本手法は，

陥）の疑惑値の順位を算出( 3 ) 各ミュータントに含まれる疑似欠陥の疑惑値の順位から，SBFL スコアを算出

ミュータントに含まれる疑似的な欠陥箇所を，SBFL がど*4用意したテストスイートでは図 1(b) の文 s′6 は実行されないため，文 s′6 の疑惑値の情報は存在しない．

c 2020 Information Processing Society of Japan⃝

ステップ 1. ミュータント生成
プログラム p にミュータント生成器 G を用いて，ミュー186ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)

タントを生成する．このとき，各ミュータントは元のプロプログラム (入力: a, b)

susp

rank

rScoreグラムに対して一文だけが変更されるよう生成する．このs 1 : boolean result = false;s 2 : if (0 < a)s 3 : result = true;🕷 s 4 : if (0 <= b) // correct: 0 < bs 5 : result = true;s 6 : return result;

0.50
0.50
0.00
0.50
0.50
0.50

5
5
6
5
5
5

0.20
0.20
0.00
0.20
0.20
0.20

変更が加えられた箇所を欠陥として扱うが，この時点ではテストを実行していないため，変更箇所が本当に欠陥となるかどうかは分からない．
ステップ 2. ミュータントに SBFL を実行(a)リファクタリング前生成された各ミュータントに対して，テストスイート T
を用いて SBFL を実行する．T に含まれる全てのテスト

プログラム (入力: a, b)

susp

rank

rScore

ケースを通過したミュータントは，欠陥を含まないミューs' 2 : if (0 < a)s' 3 : return true;
🕷 s' 4 : if (0 <= b) // correct: 0 < bs' 5 : return true;s' 6 : return false;

0.50
0.00

3
4

0.33
0.00

0.71
0.71
-

2
2
-

0.67
0.67
-

タントであるとして対象から除外し，残ったミュータント
の集合を M G (p) とする．M G (p) に含まれる各ミュータン
トに対し，文ごとの疑惑値を算出し，順位付けを行う．ここで，あるミュータント m ∈ M G (p) に含まれる各文 s について，以下を定義する．

(b)リファクタリング後
図 3: ミュータントへの SBFL 実行結果

• susp T (s): 文 s の疑惑値
規化順位である．

• rank T (s): 文 s の疑惑値の順位• rScore (s): 文 s の疑惑値の正規化順位
T

疑惑値の算出には Ochiai の計算式を用いる．テストス

rScore T (m) = rScore T (sm fault )イート T を実行したときのある文 s の疑惑値 susp T (s) は，

ミュータントの rScore が高いほど，そのミュータント

Ochiai の計算式によって以下の通り定義される．以下のの SBFL 結果の精度が高い，すなわち欠陥箇所を正確に特T式において，fail (s) は文 s を実行した失敗テストケース
Tの数，pass (s) は文 s を実行した成功テストケースの数，

totalFail T は失敗テストケースの総数である．
fail T (s)susp T (s) = √totalFail T ∗ (fail T (s) + pass T (s))

り，リファクタリング後の方が SBFL 結果の精度が高いという事実を，rScore によって示すことができている．

値の順位は，疑惑値の高い順に文を並べた際最大で確認しなければならない文の総数とする．例えば，疑惑値 1.0 の文が 2 つ，0.9 の文が 1 つ存在する場合は，疑惑値 1.0 の文はどちらも 2 位と扱い，疑惑値 0.9 の文は 3 位とする．
疑惑値の順位は，順位の母集団となる文の総数により異なる価値を持つ．例えば，10 個の文のうちの 10 位と，100個の文のうちの 10 位とでは，後者の方が順位としての価値が高い．そこで，各文が文全体の中でどの程度上位に登場するかを示すため，順位を 0 以上 1 以下の範囲に線形に正規化する．文 s の正規化順位 rScore T (s) は以下の通り定義する．1 が最も順位が高く，0 が最も順位が低いことを示している．以下の式において，totalStatements T はテ
ストスイート T によって実行される文の数である．

rank T (s) − 1
rScore (s) = 1 −totalStatements T − 1

欠陥を含む文 s4 , s′4 の rScore ，及びこのミュータント自体の rScore はそれぞれ 0.20 と 0.67 である．3 章で述べた通(1)

次に疑惑値の順位 rank T (s) を算出する．ある文の疑惑

T

定できることを意味する．例として，図 1 のプログラムを
ミュータントと見立てた場合の SBFL 結果を図 3 に示す．

ステップ 3. SBFL スコアの算出
プログラム p から生成された各ミュータントの rScoreの平均値を SBFL スコアとし，以下の式で定義する．
∑
1
SBFLScore T,G (p) =rScore T (m)G|M (p)|Gm∈M (p)

5. 実験
Java を対象として提案手法を実装し，プログラム構造の違いにより SBFL 適合性がどのように変化するか確認するための実験を行った．

5.1 準備
本実験で用いるミューテーション演算子は，オープン
ソースのミューテーションテストツールである PIT [19] を(2)

参考とした．PIT の Web サイトではミューテーション演
算子のカテゴリと内容が公開されている．PIT 自体はバイ

また，ミュータント m に含まれる欠陥の疑惑値の正規

トコードとしてのミュータントしか生成しないため，ソー化順位を rScore T (m) と定義する．各ミュータントに含まスコードとしてミュータントを生成するよう，PIT のデれる欠陥はただ 1 つの文であるため，この値はミュータ

フォルトカテゴリに含まれる 11 種類のミューテーション

ント毎に一意である．ミュータント m の欠陥を含む文を演算子を本実験のために実装した．本実験で用いるミューmsfault とすると，rScoreTm(m) は文 s

fault の疑惑値の正c 2020 Information Processing Society of Japan⃝

テーション演算子を表 1 に示す．本論文では表 1 の括弧内

187

ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)

表 1: 実験で用いるミューテーション演算子
ミューテーション演算子

変換例

説明

変換前

変換後

(CB)

Conditional Boundary

関係演算子の境界を変更する

a<b

a<=b

(INC)

Increments

インクリメントとデクリメントを入れ替える

n++

n--

(INV)

Invert Negatives

負の数を正の数に置き換える

-n

n

(MA)

Math

算術演算子を置き換える

a+b

a-b

(NC)

Negate Conditionals

関係演算子を置き換える

a<b

a>=b

(VM)

Void Method Calls

何の値も返さないメソッド呼び出しを削除する

method();;(PR)

Primitive Returns

プリミティブ型の戻り値を 0 に置き換える

return 5;

return 0;(ER)

Empty Returns

戻り値の型に応じて空を表す値に置き換える

return "str";

return "";(FR)

False Returns

戻り値を false に置き換える

return true;

return false;(TR)

True Returns

戻り値を true に置き換える

return false;

return true;(NR)

Null Returns

戻り値を null に置き換える

return object;return null;の表記を各ミューテーション演算子の略称として使用する．
本論文では，プログラム構造の違いとしてリファクタリ
ングを題材とした．リファクタリングには様々なパターン

す．ケース 1〜3 はリファクタリング前の SBFL スコアが高く，ケース 4, 5 ではリファクタリング後の SBFL スコアが高いという結果となった．

が存在する [20] が，今回は，「条件式の簡素化」に分類され例としてケース 5, 1, 3 のプログラムと生成されたミュー

る 8 種類のリファクタリングの中から表 2 に示す 5 種類のタントに関する情報を図 4, 5, 6 に示す．(a) がリファクタ

リファクタリングパターンを選定した．このカテゴリから

リング前，(b) がリファクタリング後であり，それぞれの選定した理由は，条件式の分岐によってテストケース毎の左側にプログラム，右側に各ミュータントにおける各文の実行経路情報が変化するため，リファクタリングによって

rScore を表示している．rScore は数値と棒グラフで表示

SBFL 結果が変化しやすいと考えたためである．また，本されており，各ミュータントのうち元のプログラムから変論文では SBFL を Java メソッド単位で実行し，対象とな更された文，すなわち欠陥を含む文の rScore は太字で表現

るメソッド内で文の順位を計算している．そのため，複数されている．この値は 4.2 節で述べた通りミュータントののメソッドにまたがるリファクタリングは対象外とした．

rScore でもある．例えば，図 4(a) のミュータント m1 は，実験対象プログラムは，Fowler の書籍 [20] における各

文 s2 に対して NC 演算子が適用されたミュータントであリファクタリングパターンのサンプルプログラムを参考に

り，ミュータントの rScore が 0.67 であることを示してい手作業で作成した．この際，ミューテーション演算子がなる．太字で表現しているミュータントの rScore の平均値

るべく多く適用されるよう配慮して作成した．例えば，条が SBFLScore である．

件式に boolean 型の変数だけを書くとミューテーション演

図 4 の文 s2 と s′2 のようにリファクタリング前後で互い算子が適用されないため，var == true のように関係演算に対応する文は同じ数字を添字として付与している．例え子を用いて NC 演算子が適用されるようにしている．テス

ば図 4 の文 s2 と s′2 はリファクタリング前後で変化は無く，

トスイートは，プログラムから生成された全てのミュータ

図 5 の文 s′1a と s′1b はリファクタリングによって文 s1 からントに対して，C2 カバレッジ（条件網羅）が満たされるよ分割されたことを示している．また，図 6 の文 s′{5,7} は，う手作業で作成した．

文 s5 ，s7 がリファクタリングによって 1 つの文に集約さ対象プログラムを図 4〜8 に示す．このうち，図 4〜6 はれたことを示している．

以降の節にて詳細を述べるため，生成されたミュータント

また，図 4 の m1 と m′1 のように，互いに対応する文，すに関する情報も掲載している．図 7, 8 は参考として本論文

なわち同じ数字を添字に持つ文に同じミューテーション演の末尾に掲載している．

5.2 結果と考察
5 種類の実験対象プログラムについて，リファクタリン

表 2: 対象リファクタリングと SBFL スコアの計測結果
ケース リファクタリングパターン

SBFL スコア
前

後

1 条件記述の分解

0.81

0.53

2 条件式の統合

0.95

0.72

3 重複した条件記述断片の統合

0.69

0.53

のテストケースに失敗する，すなわち欠陥を含むミュータ

4 制御フラグの削除

0.61

0.67

ントであった．SBFL スコアの計測結果を表 2 の右側に示

5 ガード節による入れ子条件記述の書き換え 0.83

0.95

グ前後それぞれのプログラムに対して提案手法を適用し，SBFL スコアを算出した．なお，いずれのプログラムにおいても，生成されたミュータントは少なくとも 1 つ以上

c 2020 Information Processing Society of Japan⃝188

ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)

ミュータント: m 1
ミューテーション演算子:

NC

rScorem2 m3 m4 m5 m6 m7 m8
CB INV NC

タントにおいて，文 s1 , s2 , s7 は同じ rScore であることに着目する．この文が欠陥箇所であるミュータントは m1 ,CB INV INV PR

m2 , m8 であり，リファクタリング後に rScore が向上した

s 1 : int result = 0; 0.67 0.50 0.50 0.33 0.33 0.33 0.33 0.67
s 2 : if (x > 0)0.67 0.50 0.50 0.33 0.33 0.33 0.33 0.67
s 3 : result = -10; 0.50 1.00 1.00 0.00 0.00 0.00 0.00 0.17
s 4 : else if (y > 0) 0.33 0.00 0.00 1.00 0.83 0.83 0.83 0.50
s 5 : result = -20; 0.00 0.00 0.00 0.83 1.00 1.00 0.00 0.00
else
s 6 : result = -30; 0.17 0.00 0.00 0.17 0.00 0.00 1.00 0.33
s 7 : return result; 0.67 0.50 0.50 0.33 0.33 0.33 0.33 0.67

ミュータントのペアに含まれる．rScore の計算過程を確認したところ，これらの文の疑惑値もまた互いに同じ値であった．4.2 節で述べた通り，提案手法では同じ疑惑値を持つ文が多いほど，その文の順位が下がるような順位付けを行っている．文 s1 , s2 , s7 はどのテストケースにおいても必ず実行される文であるため同じ疑惑値であったが，リ(a)リファクタリング前 (SBFLScore =0.83)
rScorem '5 m '6 m '7 m '8 m '9 m '10

ミュータント: m '1 m '2 m '3 m '4
ミューテーション演算子: NC CB INV NC CB INV INV PR

s' 2 : if (x > 0)s' 3 : return -10;
s' 4 : if (y > 0)s' 5 : return -20;
s '6 : return -30;

PR

PR

1.00 0.75 0.75 0.50 0.50 0.50 0.50 0.50 0.75 0.50
0.75 1.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00
0.50 0.00 0.00 1.00 0.75 0.75 0.75 0.75 0.00 0.75
0.00 0.00 0.00 0.75 1.00 1.00 0.00 0.00 0.00 1.00
0.25 0.00 0.00 0.25 0.00 0.00 1.00 1.00 0.00 0.00(b)リファクタリング後 (SBFLScore =0.95)

図 4: ケース 5: ガード節による入れ子条件記述の書き換え

ファクタリング後は return 文が挿入されたことで，必ず実行される文が s′2 のみとなったため，順位及び rScore が向上したと考えられる．
式 (1) において，実行されるテストケースが共通である
文，すなわち同じ条件分岐先*5 で実行される文は，常に同じ疑惑値を持つ．同じ条件分岐先で実行される文を明確にするため，条件分岐先ごとに文を分類した．その結果を表3 に示す．この表において，C(s2 , s4 ) は文 s2 と s4 にそれぞれ含まれる条件式の結果に応じた条件分岐先を意味する．条件式の結果のとりうる値は，{T, F, ∗} の 3 通りであ算子が適用されて生成されたミュータントを，ミュータントのペアと呼び，⟨m1 , m′1 ⟩ と表現する．ペアとなるミュー

り，それぞれ真，偽，影響なしを示す．例えば C(*, *) は，いずれの条件式にも影響を受けない条件分岐先であり，リタントの rScore を比較することで，同じ記述箇所に発生

ファクタリング前は文 s1 , s2 , s7 が，リファクタリング後した欠陥の正規化順位，すなわちその欠陥箇所の特定のしは s′2 が該当する．表 3 より，C(*, *) に該当する文の数はやすさが，リファクタリング前後でどれだけ変化するかをリファクタリングによって 3 から 1 に減っており，それ以確認することができる．

外は数に変わりはない．同じ条件分岐先の文が少ないこと

5.2.1 SBFL スコアが向上した例

は，同じ疑惑値を持つ文が少ないことを意味しているため，

例としてケース 5 について考察する．ケース 5 で適用し同じ条件分岐先の文が少ないほど，SBFL 適合性が向上す

た「ガード節による入れ子条件記述の書き換え」とは，後ると考えることができる．

続処理の対象外となる条件が満たされれば return する処

5.2.2 SBFL スコアが低下した例

理を先頭に記述することで，早く処理を終了させるよう書例としてケース 1, 3 について考察する．ケース 1 で適用

き換えるリファクタリングである．3 章で用いたリファク

した「条件記述の分解」とは，条件文中の記述をメソッド

タリング例と同様，このような書き方は early return ともに切り出すリファクタリングである．本手法はメソッド単呼ばれる．これらはソースコードのネストが深くなること

位で SBFL を行うことを前提としているため，条件式をメを抑制する効果がある．

ソッドではなく変数に切り出すリファクタリングを実験対

図 4 よりミュータントのペアを比較すると，⟨m1 , m′1 ⟩,⟨m2 , m′2 ⟩, ⟨m8 , m′8 ⟩ はリファクタリング後に rScore が向上，⟨m5 , m′5 ⟩ はリファクタリング後に rScore が低下，それ以外は変わらなかった．リファクタリング前の各ミュー象とした．条件分岐先ごとに文を分類したところ，表 4 の通り，C(*, *) に該当する文の数が増加していることが確認できた．図 5 より，C(*, *) に該当する文が欠陥箇所であるミュータントのペアにおいては，リファクタリング後のミュータントの方が，rScore が低いことが読み取れる．条

表 3: 条件分岐先ごとの文の分類（ケース 5）(a) リファクタリング前
条件分岐先

C(s2 , s4 )C(*, *)

該当文{s1 , s2 , s7 }(b) リファクタリング後
条件分岐先

C(s′2 , s′4 )該当文{s′2 }{s′3 }{s′4 }{s′5 }{s′6 }{s3 }C(T, *)C(F, *){s4 }C(F, *)C(F, T){s5 }C(F, T)

C(F, F){s6 }C(F, F)c 2020 Information Processing Society of Japan⃝れる文の数が増え，SBFL スコアが低下したと考えられる．
ケース 3 で適用した「重複した条件記述断片の統合」は，C(*, *)C(T, *)

件式を別の文に切り出したことで同一条件分岐先で実行さif-else の両方で実行される文を if 文の外に切り出すリファ
クタリングである．条件分岐先ごとに文を分類した結果を
表 5 に示す．C(*) に該当する文の数は増加し，C(T), C(F)に該当する文の数は減少しており，ケース 5 と 1 の両方*5

ここでは，文 s1 , s2 , s7 のように必ず実行される文も，条件分岐に影響を受けない１つの条件分岐先とみなしている．

189

ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)

ミュータント: m 1
ミューテーション演算子: NCs 1 : if (0 < n)s 2 : n--;s 3 : else if (n < 0)s 4 : n++;s 5 : return n;

rScorem2 m3 m4 m5 m6
CB INC NC

m7

ミュータント: m 1

CB INC PR

ミューテーション演算子: NC

0.67 0.50 0.50 0.50 0.25 0.25 0.75
0.33 1.00 1.00 0.00 0.00 0.00 0.25
0.00 0.00 0.00 1.00 0.75 0.75 0.00
0.00 0.00 0.25 0.75 1.00 0.25
0.67 0.50 0.50 0.50 0.25 0.25 0.75

s 1 : int result = 0;
s 2 : int tmp = 0;
s 3 : if (x > 0) {s 4 : tmp = y * 2;s 5 : result = y + tmp;
} else {s 6 : tmp = y * 3;s 7 : resut = y + tmp;}s 8 : return result;(a)リファクタリング前 (SBFLScore =0.81)
ミュータント: m '1 m '2
ミューテーション演算子: NC

s' 1a : boolean f1 = (0 < n);s' 3a : boolean f2 = (n < 0);s' 1b : if (f1)s' 2 : n--;s' 3b : else if (f2)s' 4 : n++;s' 5 : return n;

rScorem '3 m '4 m '5 m '6 m '7

CB INC NC

CB INC PR

0.40 0.33 0.33 0.33 0.17 0.17 0.50
0.40 0.33 0.33 0.33 0.17 0.17 0.50
0.40 0.33 0.33 0.33 0.17 0.17 0.50
0.20 1.00 1.00 0.00 0.00 0.00 0.17
0.00 0.00 0.00 1.00 0.83 0.83 0.00
0.00 0.00 0.17 0.83 1.00 0.17
0.40 0.33 0.33 0.33 0.17 0.17 0.50(b)リファクタリング後 (SBFLScore =0.53)

図 5: ケース 1: 条件記述の分解の事象が起こっている．図 6 よりミュータントのペアを比較すると，リファクタリングによって rScore が低下し

rScorem4 m5 m6

m7

CB MA MA MA MA

PR

m2

m3

0.57 0.29 0.29 0.29 0.29 0.29 0.57
0.57 0.29 0.29 0.29 0.29 0.29 0.57
0.57 0.29 0.29 0.29 0.29 0.29 0.57
0.29 0.86 0.86 0.00 0.86 0.00 0.00
0.29 0.86 0.86 0.00 0.86 0.00 0.00
0.00 0.00 0.00 0.86 0.00 0.86 0.29
0.00 0.00 0.00 0.86 0.00 0.86 0.29
0.57 0.29 0.29 0.29 0.29 0.29 0.57(a)リファクタリング前 (SBFLScore =0.69)
rScoreミュータント: m '1 m '2 m '3 m '4 m '{5,6}
ミューテーション演算子: NC

s' 1
s' 2
s' 3
s' 4

: int result = 0;
: int tmp = 0;
: if (x > 0)
: tmp = y * 2;elses' 6 : tmp = y * 3;
s' {5,7} : result = y + tmp;
s' 8 : return result;m '7

CB MA MA MA

PR

0.33 0.17 0.17 0.17 0.33
0.33 0.17 0.17 0.17 0.33
0.33 0.17 0.17 0.17 0.33
0.17 1.00 1.00 0.00 0.00

0.33
0.33
0.33
0.00

0.00 0.00 0.00 1.00 0.17
0.33 0.17 0.17 0.17 0.33
0.33 0.17 0.17 0.17 0.33

0.17
0.33
0.33

たミュータントのペアの方が，増加したミュータントのペ(b)リファクタリング後 (SBFLScore =0.53)

アよりも多い．これは，リファクタリング後に文の数が増

図 6: ケース 3: 重複した条件記述断片の統合

加した C(*) に多くの文が該当していることが理由である′と考えられる．また，⟨m5 , m{5,6}⟩ と ⟨m6 , m′{5,6} ⟩ のペア

は，他のペアと比べてリファクタリング前後の rScore の差が大きい．これは，このミュータントの欠陥を含む文が該当する条件分岐先が，リファクタリングによって C(T),C(F) から C(*) に変更となり，それらの分岐先で実行されて，以下の手段が有効であると考えられる．

• early return を用いて条件分岐を早く終了させる• 同一の条件分岐先の文の数が多い方から少ない方へ文を移動する

6. 妥当性への脅威る文の数が 2 から 5 に大きく増えたことが理由であると考えられる．このことから，条件分岐先の文の数が少ない方

本論文では表 2 に記載の 5 種類のリファクタリングを対から多い方へ文が移動したことが，SBFL スコアが低下し象とした．リファクタリングパターンは数多く存在するたた原因と考えることができる．逆に，図 6(b) から 6(a) へめ，他のパターンで検証することで，新たな傾向を発見しの変換のように，多い方から少ない方へ文の移動を行うこたり，今回発見した傾向を否定する例が現れたりする可能とで，SBFL スコアを向上させることができると言える．

性がある．また，本論文では表 1 に記載の 11 種類のミューテーション演算子を提案手法の実装に用いて，これらのミューテーション演算子が適用されるよう考慮して実験対

5.3 まとめ
実験結果より，同一の条件分岐先で実行される文の数が象プログラムを作成した．より多くのミューテーション演

少ないほど，SBFL 適合性が向上することを確認した．ま算子が適用できれば，異なる結果が得られる可能性がある．

た，これを実現するためのプログラム構造の変換方法とし本実験の対象としたプログラムは，リファクタリングパ
ターンを再現するために手作業で作成した非常に簡素なプ

表 4: 条件分岐先ごとの文の分類（ケース 1）(a) リファクタリング前
条件分岐先

C(s1 , s3 )該当文

表 5: 条件分岐先ごとの文の分類（ケース 3）(b) リファクタリング後
条件分岐先

C(s′1b , s′3b )C(*, *){s1 , s5 }C(*, *)C(T, *){s2 }C(T, *)C(F, *){s3 }C(F, *)C(F, F){s4 }C(F, F)(a) リファクタリング前
該当文{s′1a , s′3a , s′1b , s′5 }{s′2 }{s′3b }
{s′4 }

c 2020 Information Processing Society of Japan
⃝

条件分岐先

C(s3 )

該当文(b) リファクタリング後
条件分岐先

C(s′3 )

該当文C(*)

{s1 , s2 , s3 , s8 }C(*)

{s′1 , s′2 , s′3 , s′{5,7} , s′8 }C(T){s4 , s5 }C(T){s′4 }C(F){s6 , s7 }C(F){s′6 }

190

ソフトウェアエンジニアリングシンポジウム 2020
IPSJ/SIGSE Software Engineering Symposium (SES2020)

題番号：20H04166）の助成を得て行われた．

s 1 : if (x > 0)s 2 : return 10;
s 3 : if (y < 0)s 4 : return 10;s 5 : if (z == 0)s 6 : return 10;
s 7 : return 20;(a)リファクタリング前

s' {1,3,5} : if( (x>0)|| (y<0)|| (z==0))s' {2,4,6} : return 10;
s' 7: return 20;(b)リファクタリング後

参考文献
[1]

[2]

図 7: ケース 2：条件式の統合[3]
s 1 : int r = 0;
s 2 : boolean found = false;s 3 : for (int i : array) {s 4 : if (found != true) {s 5:
if (i == 0)s 6:
found = true;s 7:
result = result + i;}}
s 8 : return result;s' 1 : int r = 0;s' 3 : for (int i : array) {s' 5 :
if (i == 0)s' 9 :
break;
s' 7 :
result = result + i;}s' 8 : return result;(a)リファクタリング前(b)リファクタリング後

図 8: ケース 4：制御フラグの削除

ログラムであった．そのため，実在するプログラムや規模

[4]

[5]

[6]

[7]

[8]

の大きいプログラムを対象とした場合，異なる結果が得られたり，提案手法に対する課題を発見したりする可能性がある．また，テストスイートは，実験対象のプログラムと全てのミュータントの C2 カバレッジを満たすよう手作業[9]で作成した．このため，あるミュータントへのテスト実行
時に全く同じ実行経路を取るような無駄なテストケースが[10]

多く存在してしまっている．テストスイートは SBFL 結果に影響を及ぼす要素であるため，テストスイートの作成方[11]

法次第で，今回と異なる結果が得られる可能性がある．

7. おわりに
本論文では，プログラム自体が SBFL にどの程度適して

[12]
[13]

いるかという特性を持っていると考え，その特性を SBFL
適合性と定義した．また，ミューテーションテストを活用[14]

した SBFL 適合性の計測手法を提案した．リファクタリン
グを題材に，プログラム構造の違いによる SBFL 適合性[15]の違いを確認した結果，同じ機能，同じテストスイートであっても，プログラム構造の違いにより SBFL 適合性が変化することを確認した．また，SBFL 適合性を向上させる[16]プログラム構造の特徴を発見した．
今後の課題として，実在するプログラムに対して同様の[17]検証を行うことで，結果の一般化を図る必要がある．また，元のプログラムを SBFL 適合性の高いプログラムに変換する提案を今後は検討する．SBFL を実行する前に，SBFL[18]

適合性が高いプログラム構造に変換することで，欠陥限局の精度を向上させることができる可能性がある．
謝辞 本論文の一部は，日本学術振興会科学研究費補助
金基盤研究（B）（課題番号：18H03222），基盤研究（B）（課

c 2020 Information Processing Society of Japan
⃝

[19]
[20]

Hailpern, B. and Santhanam, P.: Software debugging,testing, and veriﬁcation, IBM Systems Journal, Vol. 41,
No. 1, pp. 4–12 (2002).
Britton, T., Jeng, L., Carver, G. and Cheak, P.: Reversible Debugging Software Quantify the time and costsaved using reversible debuggers (2013).
Wong, W. E., Gao, R., Li, Y., Abreu, R. and Wotawa,
F.: A survey on software fault localization, IEEE TSE,
Vol. 42, No. 8, pp. 707–740 (2016).
Jia, Y. and Harman, M.: An Analysis and Survey of theDevelopment of Mutation Testing, IEEE TSE, Vol. 37,
No. 5, pp. 649–678 (2011).
Jones, J. A., Harrold, M. J. and Stasko, J.: Visualization of test information to assist fault localization, Proc.
ICSE, pp. 467–477 (2002).
Chen, M. Y., Kiciman, E., Fratkin, E., Fox, A. andBrewer, E.: Pinpoint: Problem determination in large,
dynamic Internet services, Proc. DSN, pp. 595–604(2002).
Dallmeier, V., Lindig, C. and Zeller, A.: Lightweight Defect Localization for Java, Proc. ECOOP, pp. 528–550(2005).
da Silva Meyer, A., Garcia, A. A. F., de Souza, A. P. andde Souza Jr., C. L.: Comparison of similarity coeﬃcientsused for cluster analysis with dominant markers in maize(Zea mays L), Genetics and Molecular Biology, Vol. 27,
No. 1, pp. 83–91 (2004).
Abreu, R., Zoeteweij, P. and van Gemund, A. J. C.:
On the Accuracy of Spectrum-based Fault Localization,
Proc. TAIC PART, pp. 89–98 (2007).
Wang, T. and Roychoudhury, A.: Automated Path Generation for Software Fault Localization, Proc. ASE, pp.
347–351 (2005).
Lu, H., Gao, R., Huang, S. and Wong, W. E.: SpectrumBase Fault Localization by Exploiting the Failure Path,
Proc. ASE, pp. 252–257 (2016).
Ma, Y.-S., Oﬀutt, J. and Kwon, Y.-R.: MuJava: A Mutation System for Java, Proc. ICSE, pp. 827–830 (2006).
Just, R.: The Major Mutation Framework: Eﬃcient andScalable Mutation Analysis for Java, Proc. ISSTA, pp.
433–436 (2014).
Coles, H., Laurent, T., Henard, C., Papadakis, M. and
Ventresque, A.: PIT: A Practical Mutation Testing Tool
for Java (Demo), Proc. ISSTA, pp. 449–452 (2016).
Ramler, R., Wetzlmaier, T. and Klammer, C.: An Empirical Study on the Application of Mutation Testing fora Safety-Critical Industrial Software System, Proc. SAC,
pp. 1401–1408 (2017).
Moon, S., Kim, Y., Kim, M. and Yoo, S.: Ask the Mutants: Mutating Faulty Programs for Fault Localization,
Proc. ICST, pp. 153–162 (2014).
Papadakis, M. and Le Traon, Y.: Metallaxis-FL:
Mutation-Based Fault Localization, Journal of STVR,
Vol. 25, No. 5–7, pp. 605–628 (2015).
Boswell, D. and Foucher, T.: The Art of Readable Code:
Simple and Practical Techniques for Writing Better
Code, O’Reilly Media (2011).
Coles, H.: PIT, , available from ⟨https://pitest.org/⟩ (accessed 2020).
Fowler, M.: Refactoring: Improving the Design of Existing Code, Addison-Wesley (1999).

191