社団法人 電子情報通信学会
THE INSTITUTE OF ELECTRONICS,
INFORMATION AND COMMUNICATION ENGINEERS

信学技報
TECHNICAL REPORT OF IEICE.

シグネチャ情報と入出力情報を用いた Java メソッドの生成
下仲 健斗†

肥後 芳樹†

松本淳之介†

内藤圭吾†

楠本 真二†† 大阪大学大学院情報科学研究科，吹田市
E-mail: †{s-kento,higo,j-matumt,k-naitou,kusumoto}@ist.osaka-u.ac.jp
あらましソースコードを自動的に生成する，自動プログラミングと呼ばれる技術は古くから研究されている．これまでいくつかの手法が提案されてきているが，用途が限定的であるものや，数行程度の短いソースコードしか生成できないものなどがほとんどである．本研究では，生成の対象を Java メソッドに限定し，Java メソッドの仕様からソースコードを自動生成することを試みる．仕様は，シグネチャ情報（引数の型と返値の型，メソッド名）および入出力情報（引数の値と返値の組の集合）である．提案手法では，シグネチャ情報を用いて既存の Java ソースコードを探索し，生成する Java メソッドの基となりうるコードを発見する．そして，入出力情報を満たすように少しずつコードを加工する．提案手法を評価するために，4 つのオープンソースプロジェクトに対して本手法を適用した．その結果，18 個の Java メソッドを自動生成することに成功した．生成された Java メソッドの事例を紹介し，手法の改善策を述べる．
キーワード

自動プログラミング，自動プログラム修正

1. は じ め に自動プログラミングとは，開発者が作成したいソースコード
を自動的に生成する技術のことである．つまり，開発者が直接し，自動で文字列操作を行う．
このように，自動プログラミングの手法はこれまでいくつか提案されてきているが，次の 3 つの理由から実用化が困難といわれている [4]．

ソースコードを書くのではなく，欲しいソースコードの挙動や•ユーザの意図を入力として表現する難しさ

仕様を断片的に与えると，それを満たすソースコードを出力す•候補となるプログラムを抽出する難しさ

る技術である．自動プログラミングという技術は古くから研究•

大規模なプログラム作成の難しさされており，これまでいくつかの手法が提案されてきている．

本研究では，生成の対象を Java メソッドに限定し，Java メ

入力として，プログラムの概形を与え，細部を自動的に埋めソッドの仕様からソースコードを自動生成することを試みる．

てくれるスケッチングという手法が提案されている [1]．プログ

入力として与える Java メソッドの仕様は以下の 2 種類とする．

ラムの概形とは，コードの一部 (定数など) が欠けている状態のプログラムである．開発者は，コードを完全に書く必要がな•

シグネチャ情報 (引数の型，返値の型，およびメソッド名)•

入出力情報 (引数の値と返値の組の集合)

く，書かれていない部分が自動的に補われる．スケッチングをソフトウェア開発のプロセスでは，ソフトウェアの要件定義お用いる場合は，開発者はプログラムの概形と同時にテストケー

よび設計に始まり，コーディングとテストを行い，運用と保守スも与える必要がある．スケッチングは，そのテストケースをのフェーズに入る．このプロセスはウォーターフォールと呼ば満たすように SAT ソルバを用いて細部を補う．

れ，ソフトウェア工学における最も有名な開発モデルである．

また，自然言語を入力とする自動プログラミング手法も提案

本手法における入力は，ソフトウェアの設計により定まった仕されている．Gvero らは，関数呼び出しの自動補完ツールであ様であり，提案手法はその後のコーディングフェーズを自動化

る AnyCode を開発した [2]．AnyCode では，関数名を入力すする手法といえる．提案手法の流れとしては，シグネチャ情報

るのではなく，呼び出したい関数の処理内容を自然言語で入力を用いて既存の Java ソースコードを探索し，生成する Java メ

する．入力された自然言語を AnyCode が解析し，ユーザの意

ソッドの基となりうるコードを発見する．そして，入出力情報

図に適した関数の候補が提示される．

(以降テストケースと呼ぶ) を満たすように少しずつコードを加Galuwani らは，文字列操作の自動化ツールである Flash-

工する．提案手法が入力として必要とするシグネチャ情報はソ

Fill（注 1）を開発した [3]．FlashFill は Excel に実装されている機

フトウェアの設計フェーズで作成される情報であり，入出力情能であり，ユーザが与えた入出力例から，ユーザの意図を推量

報は単体テストのフェーズで作成される情報である．つまり，提案手法を用いるために開発者は追加の作業を行う必要はない．

（注 1）：https://goo.gl/PNLmfc

提案手法を評価するために，4 つのオープンソースプロジェ—1—

1 public boolean startsWith(final String str){2
if (str == null) {3
return false;
4}
5
final int len = str.length();6
if (len == 0) {7
return true;8}9if (len > (size)) {10
return false;
11 }12 for (int i = 0; i < len; i++) {13
if ((buffer[i]) != (str.charAt(i))) {14
return false;
15
}
16 }
17 return true;
18 }1 public boolean endsWith(final String str){
2 if (str == null){3
return false;
4 }5 final int len = str.length();
6 if (len == 0) {7
return true;
8 }9 if (len > (size)){10
return false;
11 }12 int pos = size - len;
13 for (int i = 0; i < len; i++ , pos++){14
if ((buffer[pos]) != (str.charAt(i))){15
return false;
16
}
17 }
18 return true;
19 }(a) startsWith メソッド(b) endsWith メソッド

図 1: startsWith メソッドと endsWith メソッド
クトに対して実験を行った．実験では，プロジェクトからあるメソッドを除外した際に，残りのメソッドを加工することで，除外したメソッドの自動生成を試みた．この処理を合計 1,244のメソッドに対して行った．実験の結果，18 個の Java メソッドを自動生成することに成功した．
以降，2. では研究の動機について述べ，3. で提案手法について説明する．4. で実装の準備として自動プログラム修正ツール

GenProg について述べる．5. では提案手法の実装について説明する．6. では，適用実験について述べ，7. では実験に対する考察を述べる．最後に 8. で本研究のまとめと今後の予定について述べる．

2. 研究の動機
オープンソースプロジェクトである apache-commons-text(以下 commons-text) 内に，処理内容が類似した 2 つのメソッ

1 public boolean startsWith(final String str){
2 if (str == null){3
return false;
4 }5 final int len = str.length();
6 if (len == 0) {7
return true;
8 }9 if (len > (size)){10
return false;
11 }12 -int pos = size - len;
12 +int pos = 0;
13 for (int i = 0; i < len; i++ , pos++){14 if ((buffer[pos]) != (str.charAt(i))){15
return false;
16 }
17 }
18 return true;19 }図 2: 生成された startsWith メソッド

ド，startsWith メ ソッド と endsWith メ ソッド が 存 在 す る ．

startsWith メソッドは，ある文字列 (文字列 1 とする) が入法の入力におけるシグネチャ情報を以下のように与える．

力となる文字列 (文字列 2 とする) で始まるかどうか判定する•

メソッド名：startsWith

メソッドであり，endsWith メソッドは文字列 1 が文字列 2 で•引数の型：String

終わるかどうか判定するメソッドである．図 1 に startsWith•

返値の型：boolean

メソッドと endsWith メソッドのソースコードを示す．図 1 か

また，入出力情報を以下のように与える．

ら，処理内容だけでなく，ソースコード自体も似通ったもので入出力例 1 文字列 1：abcd，文字列 2：ab，出力：true

あることがわかる．

入出力例 2 文字列 1：abcd，文字列 2：abcd，出力：true

ここで，startsWith メソッドが commons-text 内に存在して入出力例 3 文字列 1：abcd，文字列 2：cd，出力：false

いない状況を想定する．開発者は，文字列 1 が文字列 2 で始ま図 2 に，提案手法を用いて得られた startsWith メソッドを示るかどうか判定するようなメソッドを作成したい．もし開発者す．生成されたコードでは，12 行目で文の置換が行われているが，endsWith メソッドがプロジェクト内に既に存在していることがわかる．このように，処理内容が類似したメソッドを加ことを認識しているならば，コピーアンドペーストを行い，既工することによって，自動生成が可能であることがわかる．

存コードを少し書き換えることで startsWith メソッドを実装することができる．しかし，endsWith メソッドの存在を開発

3. 提 案 手 法

者が認識していない場合，上記の方法をとることはできない．

本研究では，Java メソッドの仕様からソースコードを自動

そこで本研究では，メソッドの仕様を入力として与えること生成する手法を提案する．提案手法の概要を図 3 に示す．提案

で，目的のメソッドを自動生成する手法を提案する．上述した手法の入力は Java メソッドのシグネチャ情報，およびテスト

状況において，startsWith メソッドを生成したい場合，提案手

ケースである．出力は，仕様を満たす Java メソッドである．

—2—

InputOutputメソッド情報の格納

データベースメソッド情報の収集

Javaファイル群

メソッドの生成

Step 1
データベース

Input

メソッド群
シグネチャ情報メソッドの抽出

入出力情報

Step 2

優先度：高

メソッド

Step 3

Outputメソッド
メソッドのランク付け

・
・
・
メソッド

メソッド
メソッドの加工

図 3: 提案手法の概要
提案手法は以下の 2 つの工程から構成される．

ケースを通過するまで繰り返し行う．プログラムの変更は，プ•

メソッド情報の収集

ログラム文単位で行われ，具体的な処理は以下の 3 つである．

•

メソッドの生成挿入 欠陥箇所にプログラム文の挿入を行う処理

メソッド情報の収集では，プロジェクト内の Java ファイル群

削除 欠陥箇所を削除する処理を解析し，各メソッドのシグネチャ情報をデータベースに格納

置換 削除処理と挿入処理を同時に行う処理

する．
メソッドの生成工程は，次の 3 ステップから構成される．

既存研究において，GenProg は 8 つのオープンソースソフ
トウェアに対して適用され，105 個中 55 個の欠陥の修正に成Step 1 メソッドの抽出功している [7]．しかし，GenProg は既存のプログラム文を用

Step 2 メソッドのランク付け

いて変更を行うため，プログラム中に存在しない文が必要な欠Step 3 メソッドの加工

陥は修正できないことや [8]，修正に要する時間が膨大であるとStep 1 では，入力されたシグネチャにおける引数と返値の型

いった課題もある [7]．

と一致するメソッドを，あらかじめ用意しておいたデータベー

GenProg は元々OCaml で開発されているが，Java で再実スから抽出する．そして Step 2 では，抽出したメソッド群を装された jGenProg（注 2） が公開されている．Martinez らは，3

優先度が高い順に並び替える．これは，抽出したメソッドの数

つの自動プログラム修正ツール (GenProg, Kali [9], MutRe-が多い場合に，ランダムに選択すると自動生成に必要な時間がpair [10]) を Java で再実装し，Astor というツールにまとめて膨大になる可能性があるからである．本手法では，入力されたいる [11]．本研究では Astor に内包されている jGenProg を用シグネチャにおけるメソッド名との類似度を優先度の基準とすいる．

る．Step 3 では，テストケースを満たすまで抽出したメソッド
を加工する．

4. GenProg

5. 実

装

提案手法の実装について述べる．ただし，対象とするプロ
ジェクトは以下の条件を満たすものである．

本章では，実装で使用するツール，GenProg について述べる．

•

Java で開発されている

GenProg は Weimer らが開発した自動プログラム修正ツールで•JUnit を用いたテストケースが存在する

ある [5]．自動プログラム修正ツールが担う主な機能は，欠陥箇提案手法の実装は，以下の 3 つの要素からなる．

所の限局と修正である．欠陥箇所の限局の手法として GenProg•

メソッド情報を格納するデータベース

は，テストケース毎の実行パスから算出した疑惑値に基づいて•メソッドのランク付け

順序付けを行う手法を用いている [6]．また，欠陥箇所の修正の•メソッドの加工手法として GenProg は，自動プログラム修正の手法の 1 つで以降，3 つの実装方法について述べる．

ある再利用に基づく手法を採用している．この手法では，修正

5. 1 データベース

対象プログラムに存在するプログラム文を用いて欠陥箇所を変データベースとして SQLite [12] を用いた．データベースに更したプログラムを生成する．GenProg は遺伝的プログラミ

格納する属性は，引数と返値の型，メソッド名，ファイルパス，

ングに基づき，この操作を変更したプログラムが全てのテスト（注 2）：https://goo.gl/9HzZbE—3—

シグネチャ情報

加工対象のメソッド• メソッド名：𝑚𝑒𝑡ℎ𝑜𝑑𝐴• 引数の型：𝑇𝑝• 返値の型：𝑇𝑟public 𝑇𝑟 methodB(𝑇𝑝 p){
methodBの処理}

自動生成したいメソッド
public 𝑇𝑟 methodA(𝑇𝑝 p){
methodBの処理実験には，以下の 4 つのオープンソースプロジェクトを用いた．

•

apache-commons-text•

apache-commons-lang•

apache-commons-io•

apache-commons-collections

上記のプロジェクトを選んだ理由は，Java で開発されており，}
処理1：中身の置換

加工対象メソッドの入れ替え

Junit を用いたテストケースも存在するからである．また，プロジェクト内に存在するメソッドのうち，実験対象となるのは以下の条件を満たすメソッドである．

処理2：コンパイル
失敗
成功

処理3：GenProg実行

図 4: メソッド加工の処理の流れ
クラス名，プロジェクト名，メソッドの開始行，ソースコード，
である．

5. 2 メソッドのランク付け
メソッドのランク付けの指標として，メソッド名における類似度を用いる．これは，メソッド名が類似していると，メソッドの処理内容も類似している可能性が高いという先行研究の調査結果に基づいている [13] [14]．入力されたメソッド名と，抽出されたメソッド群のメソッド名との類似度をレーベンシュタ
イン距離を用いて算出する．その値が小さいほど，優先度が高いと判断する．

5. 3 メソッドの加工
メソッドの加工には，自動プログラム修正ツールである Gen-

Prog [5] を用いた．図 4 に具体的なメソッドの加工の流れを示す．まず，自動生成したいメソッドと同じシグネチャのメソッ
ド (加工対象メソッドと呼ぶ) を取得する．その後の処理として，以下の 3 つに分かれる．
処理 1 自動生成したいメソッドの中身 (シグネチャ以外) を加工対象メソッドの中身と置き換える．
処理 2 コンパイルが成功すれば処理 3 に移行し，コンパイルが失敗すれば別の加工対象メソッドを用いて処理 1 に戻る．
処理 3 GenProg を実行し，テストケースをすべて通過するメ
ソッドが生成されれば，それを出力する．生成されなければ，別の加工対象メソッドを用いて処理 1 に戻る．

6. 適 用 実 験•

加工対象メソッドが 1 つ以上存在•

命令カバレッジとブランチカバレッジがともに 100%•

ステートメント数が 2 以上•

Junit を用いたテストケースが存在

カバレッジを用いる理由は 6. 2 で述べる．ステートメント数が2 以上のメソッドを用いる理由は，ステートメント数が１のメ
ソッドはセッターやゲッターであり，メソッドの自動生成という本手法のコンテキストとは合わないからである．テストケースが存在しないと，提案手法が適用できないためテストケースが必要となる．また，提案手法における Step 2 において，GenProg のタイムアウト時間を 30 分とした．
6. 2 テストケースの調査
プロジェクト内に存在するメソッドに対して提案手法を適用するためには，テストケースが必要である．一般的に，テスト
メソッドには，テスト対象のメソッド名の接頭に’test’ という文字列を付加するが，そうでない場合もある．したがって，テス
トメソッドの名前だけではテストケースが存在するかどうかの判別が困難である．そこで，各メソッドに対応するテストケースが存在するか調査するために，カバレッジを算出した．カバ
レッジの算出には，Eclipse のプラグインである EclEmma を用いた [15]．このツールでは，メソッドごとの命令カバレッジ
およびブランチカバレッジを算出することができる．算出したカバレッジの値が高いものを，実験対象とする．

6. 3 実 験 結 果
実験結果を表 1 に示す．加工可能なメソッド数とは，実験対象メソッドのうち，5. 3 で述べた処理 2 において，コンパイル
可能な加工対象メソッドが 1 つ以上存在するメソッドの数である．自動生成されたメソッド数とは，全てのテストケースを通過するソースコードを生成できたメソッドの数である．正しく自動生成されたメソッド数とは，自動生成されたメソッドから
オーバーフィッティングのメソッドを取り除いたものの数であ

本章では，4 つのオープンソースプロジェクトに対して行った適用実験の内容と，その結果について述べる．本実験の目的
は，2. で述べたようなメソッドの生成が，プロジェクト全体でどの程度成功するのか調査することである．

6. 1 実 験 手 順
実験対象のプロジェクトから，自動生成したいメソッドを 1つ選択する．その後，5. 3 で述べた処理を行い，自動生成を試みる．これを，プロジェクト内に存在する全ての実験対象メソッドに対して行う．

る．オーバーフィッティングとは，入力として与えられたテス
トケースは満たすが，それ以外は満たさない状態のことである．
ただし，自動生成されたメソッドがオーバーフィッティングかどうかの判断は，目視確認によるものである．
図 5 および図 6 に，自動生成されたメソッドのコード例を示す．図 5 はオーバーフィッティングの例，図 6 は正しく自動生成された例である．行番号の横の’-’ は，削除された加工対象
メソッドのコードを表す．’+’ は，既存のコードが挿入されたことを表す．図 5 の removeStart メソッドは，文字列 remove—4—

オリジナルコード

オリジナルコード
1 public static String removeStart(final String str,
2 final String remove) {3
if (isEmpty(str) || isEmpty(remove)) {4
return str;5}
6
if (str.startsWith(remove)){
7
return str.substring(remove.length());
8}9return str;
10 }

生成コード
1 public static String removeStart(final String str,
2 final String remove) {3if ((isEmpty(str)) || (isEmpty(remove))) {4
return str;
5 }
6if (str.endsWith(remove) {7return strstr.substring(0,((str.length()) - (remove.length())));
6+
if (startsWithIgnoreCase(str, remove)) {7+
return str.substring(remove.length());
8}9return str;10 }1 public static boolean isBlank(final CharSequence cs) {2
int strLen;3
if (cs == null || (strLen = cs.length()) == 0) {4
return true;5}
6
for (int i = 0; i < strLen; i++) {7
if (!isWhitespace(cs.charAt(i))) {8
return false;
9
}
10
}
11
return true;
12
}

生成コード
1 public static boolean isBlank(final CharSequence cs) {2
if (isEmpty(cs))
3return false;3+
return true;
4
final int sz = cs.length();5for (int i = 0; i < sz; i++) {6
if (!isWhitespace(cs.charAt(i))))7
return false;
8}9return true;10 }図 6: 自動生成が成功した例
100

図 5: オーバーフィッティングの例●

を文字列 str の接頭から取り除くメソッドである．オリジナル●

80

コードと生成コードの差異は 6 行目の if 文の条件式である．
生成コードは，6 行目で startsWithIgnoreCase メソッドを呼び出している．このメソッドは，startsWith メソッドの処理
Ratio

60

に，大文字小文字を区別しないという性質を加えたものである．

removeStart メソッドに対する既存テストケースには，大文字40

小文字の区別を考慮していないので，オーバーフィッティングとなっている．次に図 6 では，isBlank メソッドの自動生成を示している．isBlank メソッドは，与えられた文字列が空白かど
20

うか判定するメソッドである．オリジナルコードと生成コードで大きく異なる点は，2 行目の if 文の条件式である．生成コー

0ドにおける isEmpty メソッドはオリジナルコードの 3 行目の条件式と等価なメソッドである．したがって，オリジナルコー

text

ドと生成コードは等価な処理内容となっており，自動生成が成功していることがわかる．

7. 考

lang

collections

Projects

図 7: 自動生成に用いた加工対象メソッドの割合

察

かった commons-io 以外の 3 プロジェクトを示している．また
縦軸は，加工対象のメソッド数に対する加工に用いたメソッド

自動生成された各メソッドが，ランク付けされた加工対象の数の割合である．加工に用いたメソッド数はすなわち，5. 3 にメソッドのうち何番目を使用することで生成されたかを調べた．

おける処理 2 を行った回数である．図から，3 つのプロジェク

図 7 にその結果を箱ひげ図として示す．箱ひげ図における横トにおいて中央値が 50%を下回っていることがわかる．このこ軸は，対象プロジェクトのうち，自動生成されたメソッドがなとから，メソッドのランク付けの手法として，メソッド名の類

表 1: 実験結果
プロジェクト名

実験対象メソッド数 加工可能なメソッド数

自動生成されたメソッド数

正しく自動生成されたメソッド数

commons-text

98

66

7

5

commons-lang

512

415

18

10

commons-io

142

65

0

0

commons-collections

492

168

6

3

—5—

の取り組みとして，Nopol を用いて実験を行い，GenProg を●400用いた場合との比較を行っていきたいと考えている．
謝辞 本研究は，日本学術振興会科学研究費補助金基盤 研究(S)(課題番号：JP25220003) の助成を得て行われた．

Seconds

0

100

200

300

文

text

lang

collections

Projects

図 8: 自動生成に要した時間
似度は有用であると考えられる．
次に，自動生成に要した時間について考察する．自動生成されなかったメソッドは，30 分のタイムアウトによるものか，全ての加工のパターンを試したが最終的にテストケースを通過しなかったことが要因である．それらを除き，自動生成されたメ
ソッドに要した時間の結果を図 8 に示す．全てのメソッドが，タイムアウト時間よりも大幅に短い時間で生成されていることがわかる．このことから，自動生成の精度を改善するためには，
タイムアウト時間を延ばすのではなく，一世代あたりの個体数など，遺伝的アルゴリズムの設定を変更する必要があると考えらえる．

8. お わ り に本研究では，Java メソッドの仕様からソースコードを自動生成する手法を提案した．提案手法では，メソッドのシグネチャ
情報と入出力情報を与えることで，目的のメソッドを得ることができる．
提案手法をツールとして実装し，オープンソースソフトウェ
アに対して適用した．その結果，処理内容が類似したメソッドを加工することによって，自動生成が可能であることが分かった．
今後の取り組みとして，提案手法の評価実験をさらに行っていきたいと考えている．実験の流れとしては，まずプロジェク
トの開発履歴を解析する．そして，あるリビジョン r とリビ
ジョン r+1 間において，追加されたメソッドをテストデータとする．つまり，リビジョン r+1 に追加されたメソッドが，リビ
ジョン r 内のメソッドを加工することで自動生成できるかどうかを評価する．
また，GenProg 以外の自動プログラム修正ツールを用いた実装も行う．Xuan らは，プログラム意味論に基づく手法を用いた Nopol を開発した [16]．プログラム意味論に基づく手法は，既存のソースコード中に存在しない記述を用いた加工が可能であることが特徴である．この手法は，欠陥の箇所が満たすべき

献[1] Armando Solar-Lezama. Program sketching. International
Journal on Software Tools for Technology Transfer, Vol. 15,
No. 5-6, pp. 475–495, 2013.
[2] Tihomir Gvero and Viktor Kuncak. Synthesizing java expressions from free-form queries. Acm Sigplan Notices,Vol. 50, No. 10, pp. 416–432, 2015.
[3] Sumit Gulwani, William R Harris, and Rishabh Singh.
Spreadsheet data manipulation using examples. Communications of the ACM, Vol. 55, No. 8, pp. 97–105, 2012.
[4] 森畑明昌. プログラミングするプログラム-自動プログラム作成
最前線. 情報処理, Vol. 57, No. 6, pp. 544–549, 2016.
[5] Claire Le Goues, ThanhVu Nguyen, Stephanie Forrest, andWestley Weimer. Genprog: A generic method for automatic
software repair. IEEE Transactions on Software Engineering, Vol. 38, No. 1, pp. 54–72, 2012.
[6] Rui Abreu, Peter Zoeteweij, Rob Golsteijn, and Arjan JC
Van Gemund. A practical evaluation of spectrum-based
fault localization. Journal of Systems and Software, Vol. 82,
No. 11, pp. 1780–1792, 2009.
[7] Claire Le Goues, Michael Dewey-Vogt, Stephanie Forrest,
and Westley Weimer. A systematic study of automatedprogram repair: Fixing 55 out of 105 bugs for $8 each.
In Software Engineering (ICSE), 2012 34th International
Conference on, pp. 3–13. IEEE, 2012.
[8] Earl T Barr, Yuriy Brun, Premkumar Devanbu, Mark Harman, and Federica Sarro. The plastic surgery hypothesis.
In Proceedings of the 22nd ACM SIGSOFT International
Symposium on Foundations of Software Engineering, pp.
306–317. ACM, 2014.
[9] Zichao Qi, Fan Long, Sara Achour, and Martin Rinard. An
analysis of patch plausibility and correctness for generateand-validate patch generation systems. In Proceedings ofthe 2015 International Symposium on Software Testing andAnalysis, pp. 24–36. ACM, 2015.
[10] Vidroha Debroy and W Eric Wong. Using mutation to automatically suggest fixes for faulty programs. In Software
Testing, Verification and Validation (ICST), 2010 Third
International Conference on, pp. 65–74. IEEE, 2010.
[11] Matias Martinez and Martin Monperrus. Astor: a program
repair library for java. In Proceedings of the 25th International Symposium on Software Testing and Analysis, pp.
441–444. ACM, 2016.
[12] SQLite. https://www.sqlite.org/.
[13] Anna Corazza, Sergio Di Martino, Valerio Maggio, andGiuseppe Scanniello. Investigating the use of lexical information for software system clustering. In Software Maintenance and Reengineering (CSMR), 2011 15th European
Conference on, pp. 35–44. IEEE, 2011.
[14] Yoshiki Higo and Shinji Kusumoto. How should we measure functional sameness from program source code? an
exploratory study on java methods. In Proceedings of the
22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering, pp. 294–305. ACM, 2014.
[15] EclEmma. https://www.eclemma.org/.
[16] Jifeng Xuan, Matias Martinez, Favio Demarco, MaximeClÃľment, Sebastian Lamelas, Thomas Durieux, Daniel
Le Berre, Martin Monperrus. Nopol: Automatic repair ofconditional statement bugs in java programs. IEEE Transactions on Software Engineering, 2016.

論理式を導き，その論理式を SMT ソルバを用いて解く．今後—6—