第 2 章 プログラム依存グラフの節点集約による スライス計算の効率化 13
3.3 エイリアスフローグラフを利用したエイリアス解析手法
3.3.1 方針
□解析の効率化に関する方針
方針1: メソッド,クラスといったモジュール単位で,モジュール内エイリアス関係を抽 出しておく.
方針2: モジュール間エイリアス関係はオンデマンド計算により抽出する.
この2つの方針を採用することでエイリアス解析のモジュール性及び独立性が満たされ,
解析の効率化が可能となる.
とりわけ,この方針はオブジェクト指向プログラミングにおいて有効である.オブジェ クト指向プログラムを解析する場合,対象プログラムはもちろんであるがそれが利用して るクラスライブラリも解析しなければならない.通常,クラスライブラリは膨大で,その 解析コストは非常に大きい.モジュール性を満たすアルゴリズムが利用できれば,これら のクラスライブラリを繰り返し解析する必要はなくなる.
□解析精度の向上に関する方針
プログラム中に存在するエイリアス関係を,内部エイリアス関係(Inner Alias Relation),
外部エイリアス関係(Outer Alias Relation)に分類する.それぞれの定義は以下のとお りである.
内部エイリアス関係: 同一クラスのインスタンス間で共通なエイリアス関係 外部エイリアス関係: 同一クラスのインスタンス間で独立なエイリアス関係
(外部エイリアス関係は外部オブジェクトの影響により生成される)
方針3: 同一クラスの異なるインスタンスの外部エイリアス関係を区別するため,内部エ イリアス関係のみ前もって抽出し,外部エイリアス関係はオンデマンド解析により 抽出する.
方針3により,インスタンスを区別した解析を効率的に行うことができる.
□オブジェクトコンテキスト
本手法では,インスタンス属性と同様,インスタンスメソッドの呼び出し情報もインス タンスごとに区別する.これをオブジェクトコンテキスト(Object Context)と定義し,
各インスタンスの外部エイリアス関係を抽出する際に利用される.
エイリアス集合Aに関するオブジェクトコンテキストOC(A)とは,Aに属するオブ ジェクトに関して,直接若しくは間接的に呼び出される可能性のあるメソッドの集合であ る.直接呼び出されるメソッドとは,式a.m(. . .)における参照変数aがAに含まれてい
たとき,a.m(. . .)により呼び出されるメソッドを指す1.間接的に呼び出されるメソッド
とは,直接呼び出されるメソッドがそのメソッド本体から呼び出される可能性のある同一 インスタンスのメソッドを指す.
また,オブジェクトコンテキストは,FSオブジェクトコンテキスト(Flow Sensitive Object Context),FIオブジェクトコンテキスト(Flow Insensitive Object Context)に 分けられる.前者はメソッド呼び出し順を考慮するが,後者は考慮しない.そのため,FS オブジェクトコンテキストを用いることで,FIオブジェクトコンテキストよりも正確なエ イリアス計算を行うことができる.
例として,図3.2においてCalc.Calc(),Calc.add(),Calc.result()が順に呼ばれ たときのエイリアス基準<13, return(i)>に対するエイリアス計算を挙げる.図3.2(b)
1メソッドのオーバーライドが行われた場合,Aの型が唯一に特定できなければ同一シグニチャに対して メソッドが複数存在する可能性がある
はメソッド呼び出し順を考慮しているため,図3.2(a)と比較してそのエイリアス集合は小 さく,Calc.Calc()メソッド内の2式i,newIntegerが除外されているのが分かる.
1: public class Calc{ 2: Integer i;
3: public Calc(){ 4: i =new Integer(0);
5: }
6: public void inc(){
7: i =new Integer(i.intValue() + 1);
8: }
9: public void add(intc){
10: i =new Integer(i.intValue() + c);
11: }
12: public Integer result() { 13: return(i);
14: } 15: }
(a) FIオブジェクトコンテキスト
1: public class Calc{ 2: Integer i;
3: public Calc(){ 4: i =new Integer(0);
5: }
6: public void inc(){
7: i =new Integer(i.intValue() + 1);
8: }
9: public void add(intc){
10: i =new Integer(i.intValue() + c);
11: }
12: public Integer result() { 13: return(i);
14: } 15: }
(b) FSオブジェクトコンテキスト
図 3.2: (例) オブジェクトコンテキスト
メソッド呼び出し順を考慮するには解析コストの増加が避けられず,解析精度と解析コ ストはトレードオフの関係である.なお,本論文ではFIオブジェクトコンテキストを採 用している.
□その他のオブジェクト指向言語特有の概念に対する方針
Javaなどのオブジェクト指向言語が持つ,クラス,オブジェクト以外の特性への対応 について簡単に述べる.
継承: 継承は,メソッドオーバーライド(Method Overriding),動的束縛など,他のオブ ジェクト指向言語の特性をもたらしている.また,仮想関数呼び出しを考慮するた め,継承関係に配慮しながらエイリアス解析を行わねばならない.この詳細は後述 する.
メソッドオーバーライド,動的束縛: メソッドオーバーライドは,あるクラス階層内に同 一シグニチャ(Signature)を持つ複数のメソッドの存在を認める.呼び出しメソッ ドの選択は,メッセージを受け取ったオブジェクトの参照型に依存するため,実際 に呼び出されるメソッドを静的に決定することは難しい.これは,オブジェクトの 型はプログラム実行時に決まることによる.しかし,エイリアス解析を利用するこ とで,そのオブジェクトの型をより正確に推測することができる.
例えば,a.b(· · ·)により呼び出されるメソッドを導出しなければならないとき,aの エイリアス情報を利用することで,aにより参照されているインスタンスの型を類 推できる.aの型が類推できれば,そのクラス内に存在するb(· · ·)と同一シグニチャ のメソッドを探すだけでよい.
スレッド,例外: 本章では,繰り返し文,分岐文,メソッド呼び出しなどの一般的な制御 フローのみ取り扱っており,スレッド(Thread)や例外(Exception)は扱っていな い.これらに関しては,後述する.