Java メソッドの実行状況の自動抽出に向けて石 尾隆†1悠†1

鹿 島

プログラムのあるメソッドの振舞いを理解するには，そのメソッドが，どのような状況で実行されるかを知る必要がある．本研究では，データフロー解析を用いて，Java メソッドの実行中に使用されるデータの集合を計算し，そのメソッドが依存するシステムの状態として示す手法を提案する．本
稿では，研究の基本アイディアと，実現に向けた課題を解説する．

Towards Automatic Extraction of
Execution Condition of Java Method
Takashi Ishio†1 and Yu Kashima†1
To understand the behavior of a Java method, developers need to understand how themethod interacts with the other methods in the system. In this research, we propose a dataflow analysis to automatically extract input data used by a Java method for understanding
the behavior of the method. This position paper explains our basic idea and challenges.

1. は じ め にきが，プログラムの状態にどのように依存しているかを提示する手法を提案する．具体的には，１つのメソッ

情報システムの仕組みを理解するには，その構造をドの実行開始から終了までに使用される（そのメソッ分析し，構成要素それぞれの振舞いの概要を理解するドで使用される他のメソッドまで含めた）入力データことが重要である．Java で記述されたソフトウェアを収集，整理することで，１つのメソッドとして表現の場合，構造の理解にはパッケージ構造やクラス階層された機能を実行する際の前提条件として抽出する．の情報を用いる．また，振舞いを理解するために利用できる道具には，ソースコード上でのメソッド間の呼2. アプローチ

び出し関係を表したコールグラフ，設計時に作られる本研究では，Java プログラムを対象として，1 つのシーケンス図，そして実行時情報を分析するデバッガメソッドが指定されたとき，その実行に関係する入力などがある．

データを自動抽出する．

システム全体の振舞いを理解することが困難な理由

Java における手続き間のデータフローは，メソッの１つに，構成要素であるメソッドの役割を知る方法

ド呼び出しの引数と戻り値，例外，そしてフィールドがないことが挙げられる．システムの主要な機能を実の 4 種類のみである．そのため，1 つのメソッドの実装するメソッドを特定したとしても，その機能がいつ，行に必要なデータの集合は，そのメソッド自身の引数どのような状況で実行されるのかを知ることができなと，メソッドの実行中に参照するフィールドの集合にい．コールグラフやシーケンス図を用いると，他のメよって表現できる．メソッドが内部で他のメソッドをソッド群との実行順序の関係を知ることはできるが，呼ぶ場合は，呼び出し先のメソッドに関しても，参照その時点でのプログラムの状態が直接示されることはするフィールドの集合を取得すればよい．そこで，メない．デバッガを使えば実行時の具体的な変数の内容

ソッド m の実行に必要なデータの集合 R(m) を次のを知ることはできるが，システム全体の状態を，あるように定義する．

時刻の個々の変数の値のみから推測することは困難である．
そこで，本研究では，開発者が注目する１つの手続†1 大阪大学
Osaka University

R(m) = P arams(m) ∪ F ields(m)∪∪R(m′ )m′ ∈Calls(m)ここで，P arams(m) はメソッド m の引数の集合，

F ields(m) はメソッド m が読み出すフィールドの集合，Calls(m) はメソッド m からの呼び出しで実行

class Student {double averageScore;
List<Integer> scores = new ArrayList<>();

される可能性があるメソッドの集合を指す．
public boolean qualified() {/* computeAverage の定義は省略 */averageScore = computeAverage(scores);return (averageScore >= 60);}
public void addScore(int score) {scores.add(score);}public String getGrade() {if (!qualified()) return "F";else if (averageScore > 90) return "A";else if (averageScore > 70) return "B";else return "C";}

この定義で求めた R(m) には， m の実行中に作成されるデータも含まれている．そのため，メソッド mの実行中に作成されるデータを W (m) として，m が参照する入力データ I(m) を次のように定義する．

I(m) = R(m) − W (m)W (m) の要素は，R(m) の部分集合である．R(m) の要素となっている各フィールド，引数について，m の実行中に出現するすべての参照位置を取り出し，その参照される値を定義しているプログラム文を特定する．
すべての定義文が m の実行に含まれていれば，その}変数は W (m) の要素となる．

図 1 サンプルコード
Fig. 1 An Example Code

図 1 のサンプルコードを用いて，計算の例を示
す，getGrade メソッドは，一見すると averageScoreフィールドに依存しているように見える．しかし，

本研究はデータの値域についての情報を抽出するわ

averageScore の値は，１行目で呼び出す qualified

けではないが，入力データが存在することは，メソッメソッドの中で代入された値のみが使われるため，ドの事前条件の一種と考えられる．メソッド m の事

R(getGrade) = {averageScore, scores}

前条件は，通常，所属するオブジェクトの状態についW (getGrade) = {averageScore}てのみ言及する1) が，本研究では，m の実行に関係I(getGrade) = {scores}するすべての状態を収集することを目指している．となる．つまり，getGrade メソッドは，scores フィー
ルドの値さえあれば動作することが分かる．

4. まとめと今後の課題

I(m) は，m の実行よりも前に定義され，m の実行

本稿では，あるメソッドの実行状況を理解するため，中に使用される引数，フィールドの集合となる．このその実行に必要となる入力データを抽出する手法を情報を開発者に示すことで，メソッドが間接的に依存提案した．実現に向けた課題としては，解析結果としするシステムの状態を提示することができる．また，て得られた I(m) の情報を適切な形式で可視化するシステムの主要な機能に対応する各メソッドについて，方法が挙げられる．たとえば１つのクラスのすべての更新されるデータに関する情報を合わせて収集するこフィールドが入力データとして使用される場合には，とで，機能間の依存関係を示すことも可能であると考クラス自体を入力データの代表として提示するといっえている．

たように，データフローのまとまりを自動的に認識す3. 研究の位置付ける技術を構築することを計画している．

本研究は，データフロー解析の１つであり，プログものである．

ラムスライシング3) を応用した手法である．W (m)を求める計算は，プログラムスライシングにおいて，フィールドに関するデータ依存関係を辿る操作に対応する．スライシングでは，m の実行に影響を与えるプログラム文の集合を求めるが，本研究では，m の実行よりも前に定義されていなければならないデータの集合を求めることを目指している．副作用解析2) と比べた場合，メソッドが行う書き込み処理を調査するかわりに，メソッドが行う読み込み処理を調査する手法となっている．

謝辞 本研究は科研費（23680001）の助成を受けた

参考文

献1) Meyer, B.: Object-Oriented Software Construction, Prentice Hall, 2nd edition (2000).
2) Rountev, A.: Precise Identiﬁcation of SideEﬀect-Free Methods in Java, Proceedings of the20th IEEE International Conference on Software Maintenance, pp.82–91 (2004).
3) Weiser, M.: Program Slicing, IEEE Transactions on Software Engineering, Vol. 10, No. 4,pp.352–357 (1984).