論

学生論文特集文Java プロジェクトに含まれる振る舞いを変えない変更の検出
前島

葵† a)

肥後 芳樹†

松本淳之介†

楠本 真二†

Detecting Non-Behavioral Changes in Java Projects
Aoi MAEJIMA† a) , Yoshiki HIGO† , Junnosuke MATSUMOTO† , and Shinji KUSUMOTO†

あらまし ソースコードの変更には，プログラムの振る舞いを変える変更がある一方，振る舞いを変えない変更も存在する．既存研究による調査の結果，最大で 15.5% の変更が振る舞いを変えない変更であるという結果が報告された．しかし，調査された変更は 12 種類だけである．そのため，他にも振る舞いを変えない変更は存在す
るのではないかと著者らは考えた．本研究では，Java プロジェクトを対象とし，バイトコードを利用した振る舞
いを変えない変更の検出方法を提案する．提案手法では，バイトコードを逆アセンブリした結果が変わらない変
更を振る舞いを変えない変更とした．六つのオープンソース Java プロジェクトに対して振る舞いを変えない変更の検出を行った．その結果，Java ファイルが変更されたコミットのうち，8.6% ∼ 22.4% は振る舞いを変えないコ
ミットであった．また，今回の調査では先行研究と比較し新たに 25 種類の振る舞いを変えない変更を検出した．
キーワード

ソフトウェアリポジトリマイニング，ソフトウェア変更分析，開発履歴，Gitている [9], [10]．抽象構文木を利用した分析では，コ

1. ま え が き

メントやフォーマットの変更は無視される．この戦略

ソフトウェアの開発において，変更の理解は重要での背後には，これらの変更は単純な開発作業であり，ある．Git に代表されるバージョン管理システムを利用

ソースコードの理解や分析に意味のある情報を生み出したオープンソースソフトウェア開発が広がり，ソーす可能性が低いという仮定がある．

スコードの様々なバージョンが記録され，バージョン

Kawrykow らは，更に多くの種類の変更が意味のあ間の変更が追跡されている．ソフトウェアリポジトリ

る情報を生み出す可能性が低く，変更分析を誤る原因

マイニングとは，開発履歴が蓄積されたソフトウェアにもなることを明らかにした [11]．例えば，開発者がリポジトリに対するデータマイニングである．ソフト

ある変数名の変更を行うと，その変数名への参照を含

ウェア開発における有用な情報を抽出することを目指

む全ての行も変更される．しかし，この変更は単純なし，近年多くの研究が行われている [1]〜[8]．リポジ

開発作業を行ったにもかかわらず変更が何行ものコー

トリに蓄積されたソースコードの開発履歴を理解する

ドや複数のメソッド，ファイルに渡っていることがあことで，いつバグが混入したのか，なぜ変更が行われる．そのため，変更がバグを発生している可能性が高たのか，変更はプログラムにどのような影響を与えたいと推測されたり [12]，コードの劣化であると推測さかなどの分析が行われている [1]〜[4]．

れたりする可能性がある [13]．また，コード間の依存

バージョン管理システムを用いた開発において，コー関係を誤って検出してしまうかもしれない [14]．このドレビューや変更が競合した場合にソースコードの差ように変更を誤って分析してしまう可能性がある．

分を理解する必要がある．このような場合に開発者に

ソースコードの変更には，新たな機能の実装や既存

ソースコードの変更をわかりやすく表現することが目の機能の修正などプログラムの振る舞いを変える変更

指され，抽象構文木を用いた変更理解の研究が行われが存在する一方で，コメントの変更やフォーマットの変更，変数名の変更などプログラムの振る舞いを変え† 大阪大学，吹田市

Osaka University, Suita-shi, 565–0871 Japana) E-mail: a-maejim@ist.osaka-u.ac.jp
DOI:10.14923/transinfj.2020PDP0031

266

電子情報通信学会論文誌 D Vol. J104–D

ない変更も存在する．これらの変更は可読性や保守性などの品質向上のために行われることが多い [15]．

Kawrykow らによって，振る舞いを変えない変更に
No. 4 pp. 266–274 © 一般社団法人電子情報通信学会 2021

論文／Java プロジェクトに含まれる振る舞いを変えない変更の検出

ついての調査が行われた [11]．
彼らは振る舞いを変えない変更として，コメントの変更や変数名の変更など 12 種類の変更を検出対象に選び調査を行った．Java プロジェクトリポジトリに対する調査の結果，最大で 15.5% の変更が振る舞いを変えない変更であるという結果が報告された．
しかしながら，調査された変更は 12 種類のみであり，彼らの調査で発見されていない振る舞いを変えな
い変更が存在するのではないかと著者らは考えた．

図 1 if 文の統合（先行研究で網羅されていない
振る舞いを変えない変更例）
Fig. 1 If-Condition Consolidation (not covered in previous studies).

C3c メソッド名の変更

本研究では，Java プロジェクトを対象とし，バイト

C3d パラメータ名の変更

コードを利用した振る舞いを変えない変更の検出方法

C4a this の挿入，削除

（注 1）

を提案する

．先行研究に対し別の手法で検出を行

C4b オペランドをもたない return 文

い，振る舞いを変えない変更の検出数の増減を議論

C4c 引数なし親コンストラクタの呼び出しする．

C5 ローカル変数名の変更

本研究では以下に示す三つの Research Question に答えることを目的とする．

RQ 1 先行研究に比べ本研究における振る舞いを変えない変更の検出数は増加するか

RQ 2 先行研究が網羅できていなかった振る舞いを変えない変更はどのような変更だったか

RQ 3 先行研究と比較しどの程度振る舞いを変えな
い変更の種類が増加するか

C6a コメントの変更
C6b フォーマットの変更
しかしながら，振る舞いを変えない変更とされたのはこれらの 12 種類だけである．そのため，彼らの調査で発見されていない振る舞いを変えない変更が存在するのではないかと著者らは考えた．そこで本研究では，先行研究とは別の手法を用いて振る舞いを変えな
い変更の検出を行う．

六つの Java プロジェクトのオープンソースリポジト

図 1 は if 文を統合した変更を示す．この変更は，本リに対して調査を行った．その結果，Java ファイルの研究において検出された実際の振る舞いを変えない変

変更がなされたコミットのうち，8.6% ∼ 22.4% はプロ更である．また，この変更は先行研究では網羅されてグラムの振る舞いを変えないコミットであった．また，いなかった．

今回の調査では先行研究と比較し新たに 25 種類の振る舞いを変えない変更を検出した．新たに発見された

3. 振る舞いを変えない変更の調査方法

振る舞いを変えない変更は，先行研究では見落とされ3. 1 振る舞いを変えない変更の検出方法ていた出現回数の少ないマイナーな変更が多かった．

本研究では，先行研究と別の解法を用いて振る舞い

2. 研 究 背 景を変えない変更の検出を行う．本研究では，振る舞いを変えない変更をバイトコードを利用して検出する．

Kawrykow らは Java プロジェクトリポジトリを対象

バイトコードとは，ソースコードがコンパイルされたに調査を行い，最大で 15.5% の変更が振る舞いを変えときに生成される中間コードのことである．変更が行ない変更であるという結果を報告した [11]．

われる前のソースコードのバイトコードと変更が行わ彼らは以下に示す 12 種類の変更を検出対象の振る舞いを変えない変更とした．

れた後のバイトコードを逆アセンブリした結果を比較し，その変化の有無に注目することで，振る舞いを変C1 完全限定名から単純名への変更

えない変更を検出する．ソースコードの変更にともな

C2 一時変数の導入

いバイトコードも変化する変更はプログラムの振る舞

C3a クラス名の変更

いを変える変更とし，ソースコードが変化したにもかC3b フィールド変数名の変更

かわらずバイトコードが変化しなかった変更は振る舞
いを変えない変更とする．コンパイルによって失われ（注 1）：本論文は文献 [11] で行われた振る舞いの変わらない変更の検出を別の解法で解いた論文である．

るコメントやフォーマットなどの情報はプログラムの振る舞いに変化を与えないとみなすことができる．
267

電子情報通信学会論文誌 2021/4 Vol. J104–D No. 4

図 2 Sample.java
Fig. 2 Sample.java.

図 3 javap Sample.java コマンドの実行結果
Fig. 3 Result of javap Sample.java.
図4

javap -p -c Sample.java コマンドの実行結果
Fig. 4 Result of javap -p -c Sample.java.

3. 2 rJava ファイル
本研究では，バイトコードを逆アセンブルした結果得られるファイルを rJava ファイルと呼ぶ．逆アセン

クラスファイルの作成を行う．本研究ではプロジェク

ブルには，javap -p -c [file] コマンドを用いた．

トのビルドに Gradle 及び Ant を用いた．Step 3 では

javap コマンドは，Java ファイルのコンパイルによクラスファイルを逆アセンブルする．その結果，rJava

り生成されるクラスファイルを逆アセンブルするコ

ファイルが作成される．Step 4 では Java ファイルとマンドである．javap コマンドはオプションを使用し

rJava ファイルをリポジトリに追加する．

ない場合，指定されたファイルに含まれるクラスの3. 4 調 査 方 法

protected 及び public 修飾子が付いたフィールドとメ

git log —name-stats コマンドを用いて 3. 3 で作

ソッドの一覧を出力する．本研究において javap コ

成したリポジトリの変更履歴を調査する．Java ファ

マンドのオプションには-p -c を指定した．-p オプ

イルが変更されたが rJava ファイルが変更されていな

ションにより，private 修飾子も含め全てのメソッド，

いコミットを検出することで，振る舞いを変えないコフィールドを逆アセンブルの対象に指定する．-c オ

ミットを検出できる．振る舞いを変えないコミットとプションにより，逆アセンブルされた各メソッドのバ

は，コミットで行われた全ての Java ファイルの変更に

イトコード命令列を出力する．

対して，rJava ファイルの変更が一切行われていないコ

Java ソースコードを図 2 に示し，それに対する javap
Sample.java コマンドの実行結果を図 3 に示す．同様に，javap -p -c Sample.java コマンドの実行結果を図 4 に示す．

3. 3 変換リポジトリの作成
調査を行うにあたって，前準備として調査対象のJava プロジェクトリポジトリから，Java ファイルと
rJava ファイルをもつリポジトリを作成する．

ミットである．

4. Research Question
調査を行うにあたり以下に示す三つの Research Ques-

tion を設定した．
RQ1 : 先行研究に比べ本研究における振る舞いを変えない変更の検出数は増加するかJava プロジェクトリポジトリに存在するコミットのStep 1 コミットの状態を復元

どの程度が振る舞いを変えないコミットであるか調査

Step 2 コンパイルを行い，検出数を先行研究と比較する．

Step 3 逆アセンブル

RQ2 : 先行研究が網羅できていなかった振る舞いを

Step 4 Java, rJava ファイルをコミット

変えない変更はどのような変更だったか

以降，各 Step について説明する．

先行研究においては 12 種類の変更が調査対象とな

Step 1 では git reset —hard <commit>コマンド

る振る舞いを変えない変更とされていた．それに対し，を用いてリポジトリを対象のコミットの状態に復元す

本研究ではバイトコードを用いた検出を行う．先行研

る．Step 2 ではコンパイルを行いバイトコードである

究が網羅できていなかった振る舞いを変えない変更は268

論文／Java プロジェクトに含まれる振る舞いを変えない変更の検出

どのような変更だったか調査を行う．

RQ3 : 先行研究と比較しどの程度振る舞いを変えな
い変更の種類が増加するか
バイトコードによる検出法を用いることで振る舞いを変えない変更の種類が先行研究と比較しどの程度増加するのか調査する．

表 1 調査対象プロジェクト，調査対象期間
Table 1 Target projects and target periods.
プロジェクト名 対象コミット数
kGenProg
808
Ant
323
Spring851
Hibernate
1,253
Tomcat
1,800
POI
255

調査開始
2018-04-09
2017-01-01
2016-08-15
2016-12-16
2017-07-04
2018-01-26

調査終了
2019-11-04
2019-05-22
2020-01-24
2020-01-31
2020-01-15
2020-01-13

5. Research Question の調査
表 2 RQ1 の調査結果
Table 2 Results of RQ1.

5. 1 調 査 対 象
調査対象は Java プロジェクトの Git リポジトリである．本研究では，著者らの所属している研究室で開発されている Java プロジェクトである kGen-

Prog [16]，先 行 研 究 [11] で 調 査 対 象 と さ れ て い た
Apache Ant, Hibernate ORM Core, Spring Framework
Core, 更に MSR の調査対象として頻繁に利用されている Apache プロジェクトである Apache Tomcat, Apache

POI を加えた六つのプロジェクトを対象に調査を行った．先行研究では七つのプロジェクトが調査対象とさプロジェクト名Java ファイルの変更コミット数

kGenProgAnt
SpringHibernate
Tomcat
POI
Total

808
323
851
1,253
1,800
255
5,287

rJava ファイルの変更のないコミット数(振る舞いを変えない
コミットの割合)
157 (19.4%)
64 (19.8%)
191 (22.4%)
114 ( 9.1%)
278 (15.4%)
22 ( 8.6%)
826 (15.6%)

れていたが，本研究においてビルドが必須のため Javaやビルドツールのバージョンの違いでビルドに失敗しないコミットであり，振る舞いを変えない変更の検出たプロジェクトを除外した．また，古くから開発が続

数は先行研究に比べ増加している」といえる．

くプロジェクトについては現在の環境でビルドできな
い期間があったため対象期間を制限した．
調査対象のプロジェクト，調査の対象期間，調査対5. 3 RQ2: 先行研究が網羅できていなかった振る
舞いを変えない変更はどのような変更だったかの調査結果象とする Java ファイルが変更されたコミット数を表 1

六つのプロジェクトから検出された振る舞いを変えに示す．ただし，テストコードは対象となるソフト

ないコミット全てに対して目視調査を行い，実際にどウェアを構成しないため，調査対象に含まない．全てのような変更が行われているのか確認した．表 4 は，のプロジェクトにおいて Java ファイルが変更された

振る舞いを変えない変更をその変更が検出されたココミットが 200 コミット以上であり，1,800 コミット

ミット数とともに示している．また，括弧内に示す数におよぶプロジェクトも存在した．

値は全調査対象プロジェクトまたは各プロジェクトの5. 2 RQ1: 先行研究に比べ本研究における振る舞

検出総数に占めるその割合である．例えば，コメント

いを変えない変更の検出数は増加するかの調の変更が検出された割合は六つの調査対象プロジェ

査結果
六つのオープンソース Java プロジェクトリポジト

クト全体の中では 46.7% を占め，kGenProg の中では34.1% を占める．

リに対する調査結果を表 2 に示す．表 2 には，対象プ

全調査対象プロジェクトから見つかった振る舞いを

ロジェクト名と Java ファイルが変更されたコミット，

変えない変更について Jaccard 係数の分析を行った．

Java ファイルが変更されたが rJava ファイルの変更のJaccard 係数とは，ある二つのプロジェクトで検出されないコミットを示している．括弧内に示す数値がプロた振る舞いを変えない変更全体のなかで，共通して検グラムの振る舞いを変えないコミットの割合である．

出された振る舞いを変えない変更の割合を指す．

先行研究では，Java プロジェクトリポジトリに存在

例として，kGenProg と Ant から検出された変更はする変更の中で，2.6% ∼ 15.5% は振る舞いを変えない

全部で 15 種類であり，その中で共通し検出された変変更であると調査された．

更はコメントやフォーマットの変更など 7 種類存在し

RQ1 への回答として，「Java ファイルの変更が行わた．よって，Jaccard 係数は 7/15 = 0.47 となる．表 3

れたコミットの中で，8.6% ∼ 22.4% は振る舞いを変えには各二つのプロジェクト間の Jaccard 係数を示す．
269

電子情報通信学会論文誌 2021/4 Vol. J104–D No. 4

舞いを変えない変更には，表 4 に示す 33 種類の変更

表 3 Jaccard 係数
Table 3 Jaccard index.
kGenProg
kGenProgAnt
SpringHibernate
Tomcat
POI

Ant
0.47

Spring0.50
0.40

Hibernate
0.62
0.36
0.35

Tomcat
0.39
0.48
0.46
0.38

POI
0.56
0.44
0.53
0.47
0.43

がある．表 4 の上部に示す 8 種類の変更（注 2）は先行研
究 [11] においても振る舞いを変えない変更と分類されていたが，表の残り 25 種類は提案手法で新しく検出された振る舞いを変えない変更である．
図 7 は先行研究，本研究のそれぞれから若しくはその両方から振る舞いを変えない変更と定義や検出された変更についてベン図で示している．先行研究でのみ振る舞いを変えないと定義された変更は 4 種類であり，本研究でのみ振る舞いを変えないと検出された変
更は 25 種類である．また，先行研究と本研究で共に振る舞いを変えないと定義や検出された変更は 8 種類
である．
先行研究と本研究では共通した定義の振る舞いを変えない変更の検出を行った．しかし，検出法の違いにより先行研究で検出された 4 種類は本研究では検出

図 5 Jaccard 係数の箱ひげ図
Fig. 5 Box plot of Jaccard index.

できなかった．これら 4 種類はクラス名，フィールド
変数名，メソッド名の変更と一時変数の導入である．
図 6 に一時変数の導入の例を示す．これらの変更は，

図 5 には表 3 の結果を箱ひげ図で示す．Jaccard 係数

本研究の検出方法においてバイトコードの逆アセンブの最大値は 0.62 であり，中央値は 0.46 であり，最小リ後の結果が変化するため振る舞いを変える変更と判値は 0.35 であり，平均値は 0.46 である．この結果か定される．このように，手法の違いによって検出され

ら，どの二つのプロジェクト間においても共通して検る変更数の減少も生じた．

出された振る舞いを変えない変更の種類数は約半分に更に，表 5 に振る舞いを変えない変更の検出数につしか及ばず，片方のプロジェクトのみから検出された

いて先行研究と本研究の比較を示す．表 5 には，対象変更も多く存在することがわかる．

プロジェクト名と，各プロジェクトの振る舞いを変えそのため，各プロジェクトでは異なる種類の振る舞ない変更の検出数，本研究でのみ検出可能な振る舞い

いを変えない変更が行われていることがわかる．本研を変えない変更の数を示している．括弧内の数値は，究では六つのプロジェクトを対象としたが，プロジェ

本研究でのみ検出可能な振る舞いを変えない変更の割

クトの数を増加を行っても，追加されたプロジェクト

合を示す．

に応じた結果が得られ，新たな振る舞いを変えない変更が検出される可能性があるといえる．

六つのプロジェクトの合計数に注目すると，振る舞
いを変えない変更全体の 26.4% を本研究で新たに検出

RQ2 への回答として，「開発者は表 4 に示す振る舞

された変更が占めた．表 4 に示したとおり，振る舞い

いを変えない変更を行う．先行研究では網羅されておを変えない変更の中では先行研究において挙げられてらず本研究で新しく検出された振る舞いを変えない変いたコメントの変更やフォーマットの変更が大部分を

更は，表 4 の上部に示す 8 種類の変更を除いた残り 25

占める．対して，本研究で新たに検出された変更され種類の変更である．アノテーションの変更やド・モル

た変更は出現回数の少ないマイナーな変更であり全体ガンの法則による条件式の書き換えなどが含まれる．

に占める割合も低くなっている．

先行研究で網羅されておらず本研究で新たに検出可能

RQ3 への回答として，「先行研究では検出対象とさとなった変更は，先行研究では見落とされていた出現

れた振る舞いを変えない変更は 12 種類のみであった．

回数の少ない変更である」といえる．

5. 4 RQ3: 先行研究と比較しどの程度振る舞いを変えない変更の種類数が増加するかの調査結果
六つの調査対象プロジェクトから検出された振る
270（注 2）：オペランドをもたない return 文と引数なし親コンストラクタの呼び出しについては調査対象プロジェクトからは検出されなかったが，著者が手元で確認したところ逆アセンブリ結果を変化させなかった．そのため本研究で検出可能な変更に含める．

論文／Java プロジェクトに含まれる振る舞いを変えない変更の検出
表 4 振る舞いを変えない変更一覧
Table 4 Patterns of Non-behavioral Changes.
振る舞いを変えない変更
C6a コメント
C6b フォーマット
C1 完全限定名，単純名間の変更
C5 ローカル変数名
C3d パラメータ名
C4a this の挿入，削除
C4b オペランドをもたない
return 文
C5c 引数なし
親コンストラクタの呼び出し
final 修飾子
import 文
アノテーション
インターフェース中のメソッドのpublic 修飾子の削除
キャスト
ラムダ式の引数の型
空文
ドモルガンの法則による条件式の書き換え
括弧ブロック
if 文の統合
else if 文から if 文への書き換え
else 文の削除
総称型
ダイヤモンド演算子
配列宣言
修飾子の並び替え
空文字列
static イニシャライザ
Iterator の使用から
拡張 for 文の使用への変更
オートボクシング，アンボクシング
整数型リテラル
定数
Enum クラスの修飾子
Enum 定数列挙末尾の
セミコロン

Total
457 (46.7%)
212 (21.7%)
11 ( 1.1%)
22 ( 2.2%)
12 ( 1.2%)
7 ( 0.7%)

kGenProg
56 (34.1%)
26 (15.9%)
2 ( 1.2%)
10 ( 6.1%)
3 ( 1.8%)2 ( 1.2%)Ant
42 (56.0%)
15 (20.0%)
1 ( 1.3%)
1 ( 1.3%)
1 ( 1.3%)

Spring133 (55.1%)
30 (12.4%)
4 ( 1.7%)
5 ( 2.1%)
2 ( 0.8%)
4 ( 1.7%)

Hibernate
61 (43.9%)40 (28.8%)1( 0.7%)

Tomcat150 (46.3%)
93 (28.7%)
3 ( 0.9%)5 ( 1.5%)
4 ( 1.2%)

POI
15 (42.9%)
8 (22.9%)1 ( 2.9%)1 ( 2.9%)1 ( 2.9%)1 ( 2.9%)

1 ( 0.4%)
14 ( 5.8%)
31 (12.9%)

1 ( 0.7%)
9 ( 6.5%)
22 (15.8%)

1 ( 0.3%)
8 ( 2.5%)
16 ( 4.9%)

2 ( 5.7%)
1 ( 2.9%)

1 ( 0.7%)

1 ( 0.3%)

1 ( 2.9%)2 ( 1.4%)

3 ( 0.9%)8 ( 2.5%)

1 ( 2.9%)1 ( 2.9%)0 ( 0.0%)0 ( 0.0%)22 ( 2.2%)
56 ( 5.7%)
100 (10.2%)
3 ( 0.3%)
1 ( 0.1%)
1 ( 0.1%)
5 ( 0.5%)

19 (11.6%)
18 (11.0%)
25 (15.2%)

5 ( 6.7%)
5 ( 6.7%)

1 ( 0.6%)
1 ( 0.6%)

2 ( 1.4%)
1 ( 0.4%)
1 ( 0.4%)

1 ( 0.6%)

1 ( 0.1%)
11 ( 1.1%)
11 ( 1.1%)
1 ( 0.1%)
1 ( 0.1%)
1 ( 0.1%)
8 ( 0.8%)
4 ( 0.4%)
1 ( 0.1%)
2 ( 0.2%)
1 ( 0.1%)
1 ( 0.1%)

1 ( 0.4%)
7 ( 2.9%)1 ( 1.3%)

3 ( 4.0%)
1 ( 1.3%)

1 ( 0.4%)
1 ( 0.4%)
3 ( 1.2%)
1 ( 0.4%)
1 ( 0.4%)

1 ( 0.1%)
19 ( 1.9%)
1 ( 0.1%)
1 ( 0.1%)
3 ( 0.3%)

2 ( 0.6%)
3 ( 0.9%)
1 ( 0.3%)
1 ( 0.3%)
1 ( 0.3%)
1 ( 0.3%)
19 ( 5.9%)
1 ( 2.9%)
1 ( 0.3%)
3 ( 0.9%)

1 ( 0.1%)

1 ( 2.9%)

図 6 一時変数の導入
Fig. 6 Local Variable Extractions.

対して本研究の手法では全部で 33 種類の振る舞いを変えない変更が検出可能となった．このことから，本研究のバイトコードを用いた手法では検出可能な振る舞いを変えない変更の種類数を大きく増加させられる」といえる．
Fig. 7図 7 検出種類数のベン図
Venn diagram of the number of patterns.

271

電子情報通信学会論文誌 2021/4 Vol. J104–D No. 4
表 5 新たに検出された振る舞いを変えない変更の割合
Table 5 Ratio of newly-detected non-behavioral changes.
プロジェクト名 検出数全体 本研究でのみ検出
kGenProg164
65 (39.6%)
Ant
15 (20.0%)75
Spring245
67 (27.3%)
Hibernate139
37 (26.6%)
Tomcat324
69 (21.3%)
POI35
8 (22.9%)
Total
979
258 (26.4%)

Fig. 10

図 10 if 文の統合
If-Condition Consolidation.

図 8 アノテーション
Fig. 8 Annotation.

図9

ド・モルガンの法則による条件式の書き換え
Fig. 9 De Morgan in Expressions.

6. 振る舞いを変えない変更
本章では，提案手法で新たに検出された振る舞いを変えない変更の幾つかを紹介する．

図 11 総 称 型
Fig. 11 Generics.

アノテーション
アノテーションには，コンパイル時に情報が残るア

変更と検出した．総称型の挿入を図 11 (a) に，総称型

ノテーションと残らないアノテーションが存在する．

のワイルドカードの挿入を図 11 (b) に，総称型から振る舞いを変えないと検出されたアノテーションの一Object 型への変更を図 11 (c) に示す．

部を図 8 に載せる．また，図に示す以外にも振る舞いを変えないプロジェクト独自のアノテーションも存在した．

修飾子の並び替え
フィールド変数宣言やメソッド宣言における修飾子の並び替えを振る舞いを変えない変更と検出した．

ド・モルガンの法則による条件式の書き換え

Spring Framework Core において検出されたフィール

実際の変更を図 9 に示す．調査対象の Spring Frame-

ド変数宣言の final 修飾子と static 修飾子の並び替えを

work Core において，ド・モルガンの法則に従った OR

図 12 (a) に示す．また，Apache Tomcat において検出演算子から AND 演算子の書き換えが振る舞いを変えされたメソッド宣言の public 修飾子と synchronized 修

ない変更であると検出された．

飾子の並び替えを図 12 (b) に示す．

if 文の統合

Iterator の使用から拡張 for 文の使用への変更

実際の変更を図 10 に示す．調査対象の Apache Ant

実際の変更を図 13 に示す．拡張 for 文は J2SE 5.0

において if 文の統合が振る舞いを変えない変更と検出で導入された記述であり，コレクションの全ての要素

された．if 文の中で二重に if 文を記述する形式から二にアクセスするために用いられる．Iterator を使用しつの条件を AND 演算子で統合し一つの if 文で記述すた記述から拡張 for 文を使用した記述への変更を振るる形式への変更は振る舞いを変えない．

舞いを変えない変更と検出した．

総

称 型

総称型の型宣言の挿入，削除を振る舞いを変えない
272

論文／Java プロジェクトに含まれる振る舞いを変えない変更の検出めである．振る舞いを変えない変更とみなすべきである変数名などの変更が，-v オプションを用いると振る舞
いを変える変更であると判定されてしまう．そのため，
著者らは-v オプションは使用すべきでないと考えた．

8. 妥当性への脅威
本研究の提案手法ではソースコードが変更されてもバイトコードの逆アセンブリ後の結果が変化しない変図 12 修飾子の入れ替え
Fig. 12 Reorder Modifiers.

更を振る舞いを変えない変更とした．しかし，バイトコードが変化するがプログラムの振る舞いを変えない変更も存在する．先行研究において振る舞いを変えな
い変更とされていたクラス名やフィールド変数名，メ
ソッド名の変更などがあたる．これらは本研究の検出

図 13 Iterator の使用から拡張 for 文の使用への変更
Fig. 13 Iterator to Enhanced For-Block.

方法ではバイトコードが変化するため振る舞いを変える変更と判定されてしまう．このように，現時点ではプログラムの振る舞いを変えない変更全てを提案手法
において正しく検出することはできない．
また，本研究の調査では一つのコンパイラを用いた

図 14 誤検出：メソッド参照におけるメソッド名の変更
Fig. 14 False Positive: a Change in Method Reference.

調査しか行っていない．違うコンパイラを使用することで本研究の結果とは違うバイトコードが得られ，調査結果が変化する可能性がある．例えば，本研究では

7. 誤 検 出
本章では，本研究の提案手法において誤検出された変更とその理由について述べる．

ド・モルガンの法則に従った AND 演算子から OR 演
算子の書き換えは振る舞いを変えない変更と検出された．これは，AND 演算子から OR 演算子への変更前
後で同じバイトコードが生成されたためである．しか誤検出された変更はメソッド参照におけるメソッド

し，コンパイラによっては AND 演算子，OR 演算子

名の変更である．実際の変更を図 14 に示す．メソッの記述によってそれぞれ違うバイトコードを生成する

ド参照とは JavaSE 8 で導入された構文である．「クラ可能性がある．そのため，振る舞いを変える変更と検ス名::メソッド名」と記述し，メソッドを引数なしで出される可能性がある．

呼び出す処理が行われる．
図 14 において，呼び出されるメソッド名が new-

9. む す び

Factory から newInstance に変更されている．メソッド

本研究では，バイトコードを利用した振る舞いを変

名が変更され，変更前とは別のメソッドの処理が行わえない変更を検出する手法を提案し，調査を行った．

れるためプログラムの振る舞いを変える変更である．

調査の結果，六つの Java プロジェクトにおいて，Java

しかし，本研究の手法では振る舞いを変えない変更とファイルの変更が行われたコミットのうち，8.6% ∼誤検出された．その理由は，バイトコードを逆アセン

22.4% は振る舞いを変えないコミットであった．また，ブルする javap コマンドのオプションに-p -c のみ

今回の調査では先行研究と比較し新たに 25 種類の振を指定し，-v を指定していないためである．-v オプ

る舞いを変えない変更を検出した [11]．

ション使用時に逆アセンブルされる定数プールの情報

今後の課題としては，Java 以外の VM 言語での実験を提案手法では無視していた．しかし，メソッド参照を行い，振る舞いを変えない変更の言語による違いはにおいて呼び出されるメソッドの情報は定数プールにあるのかを調査をしていきたい．優れたコンパイラが保存されるため，誤検出された．

設計されている言語の場合，Java に比べプログラムの提案手法において，-v オプションを指定しなかった理由は，定数プールに変数名などの情報が載ってしまうた振る舞いを変えない変更がより発生しにくいと考えられる．
273

電子情報通信学会論文誌 2021/4 Vol. J104–D No. 4

文
[1]

[2]

献

前島

葵

B. Fluri and H.C. Gall, “Classifying change types for qualifying

令 2 大阪大学基礎工学部情報科学科卒．

change couplings,” Proc. IEEE Int. Conf. Program Comprehen-

現在，大阪大学大学院情報科学研究科博士

sion, pp.35–45, 2006.

前期課程在学中．リポジトリマイニングにR. Purushothaman and D.E. Perry, “Toward understanding the

関する研究に従事．

rhetoric of small source code changes,” IEEE Trans. Softw. Eng.,
vol.31, no.6, pp.511–526, 2005.
[3]

A. Hindle, D.M. German, and R. Holt, “What do large commits
tell us? a taxonomical study of large commits,” Proc. Int. Working

肥後 芳樹

Conf. Mining Software Repositories, pp.99–108, 2008.
[4]
[5]

[6]

[7]

S. Rastkar and G.C. Murphy, “Why did this code change?,” Proc.

（正員）

2002 大阪大学基礎工学部情報科学科中退．

Int. Conf. Software Engineering, pp.1193–1196, 2013.

2006 同大学大学院博士後期課程了．2007 同

T. Baum, S. Herbold, and K. Schneider, “An industrial case study

大学大学院情報科学研究科コンピュータサ

on shrinking code review changesets through remark prediction,”

イエンス専攻助教．2015 同准教授．博士

Dec. 2018.

（情報科学）．ソースコード分析，特にコー

H. Gall, M. Jazayeri, and J. Krajewski, “Cvs release history data

ドクローン分析，リファクタリング支援，

for detecting logical couplings,” Proc. Int. Workshop Principles of

ソフトウェアリポジトリマイニング及び自動プログラム修正にSoftware Evolution, pp.13–23, 2003.

関する研究に従事．情報処理学会，日本ソフトウェア科学会，

A.T.T. Ying, G.C. Murphy, R. Ng, and M.C. Chu-Carroll, “Predict-IEEE 各会員．

ing source code changes by mining change history,” IEEE Trans.
Softw. Eng., vol.30, no.9, pp.574–586, 2004.
[8]

M. Wen, R. Wu, and S. Cheung, “Locus: Locating bugs from software changes,” Proc. Int. Conf. Automated Software Engineering,

[9]

松本淳之介
平 30 大阪大学基礎工学部情報科学科卒．

pp.262–273, 2016.

令 2 大阪大学大学院情報科学研究科博士前

B. Fluri, M. Wursch, M. PInzger, and H. Gall, “Change distill-

期課程卒．リポジトリマイニングに関する

ing:tree diﬀerencing for fine-grained source code change extrac-

研究に従事．

tion,” IEEE Trans. Softw. Eng., vol.33, no.11, pp.725–743, 2007.
[10]

J. Falleri, F. Morandat, X. Blanc, M. Martinez, and M. Monperrus,“Fine-grained and accurate source code diﬀerencing,” ACM/IEEE
Int. Conf. Automated Software Engineering, ASE ’14, Vasteras,
Sweden - Sept. 15 - 19, 2014, pp.313–324, 2014.

[11]

[12]

1988 大阪大学基礎工学部卒．1991 同大

sion histories,” Proc. Int. Conf. Software Engineering, pp.351–

学大学院博士課程中退．同年同大学基礎360, 2011.

工学部助手．1996 同講師．1999 同助教授．

N. Nagappan and T. Ball, “Use of relative code churn measures to2002 同大学大学院情報科学研究科助教授．

predict system defect density,” Proc. Int. Conf. Software Engineer-

2005 同教授．博士（工学）．ソフトウェア

S.G. Eick, T.L. Graves, A.F. Karr, J.S. Marron, and A. Mockus,“Does code decay? Assessing the evidence from change management data,” IEEE Trans. Softw. Eng., vol.27, no.1, pp.1–12,
2001.

[14]

T. Zimmermann, A. Zeller, P. Weissgerber, and S. Diehl, “Mining
version histories to guide software changes,” IEEE Trans. Softw.
Eng., vol.31, no.6, pp.429–445, 2005.

[15]

X. Wang, L. Pollock, and K. Vijay-Shanker, “Automatic segmentation of method code into meaningful blocks to improve readability,” Proc. Working Conference on Reverse Engineering, pp.35–44,
2011.

[16]

Y. Higo, S. Matsumoto, R. Arima, A. Tanikado, K. Naitou, J.
Matsumoto, Y. Tomida, and S. Kusumoto, “kGenProg: A highperformance, high-extensibility and high-portability apr system,”
Proc. Asia-Pacific Software Engineering Conference, pp.697–698,
2018.

（2020 年 5 月 29 日受付，9 月 30 日再受付，
12 月 2 日早期公開）

274

（正員）

D. Kawrykow and M.P. Robillard, “Non-essential changes in ver-ing, pp.284–292, 2005.
[13]

楠本 真二

の生産性や品質の定量的評価に関する研究に従事．情報処理学会，IEEE，IFPUG 各会員．