Program Analysis
via Graph Reachability

Thomas Reps
University of Wisconsin

新山 祐介 2017/06/06 輪講資料

本論文の要旨

本論文の構成

  1. はじめに
  2. CFL-Reachability とは何か?
  3. CFL-Reachability のアルゴリズム解説
  4. 実際の使用例
  5. "Demand"解析について
  6. CFL-Reachability + α を使った解析
  7. 関連研究

1. はじめに

なぜグラフ解析?

本論文で扱う例

  1. 関数をまたぐデータフロー解析
  2. 関数をまたぐスライス解析
  3. シェイプ解析 (Shape Analysis)
  4. 実行順序を考慮しない Points-To解析

2. CFL-Reachability って何?

演習

アルゴリズム

アルゴリズム

CFL-Reachability 問題の種類

  1. すべてのノード → すべてのノード
    に対する経路を発見。(all-pairs L-path)
  2. 単一の開始点 → すべてのノード
    に到達する経路を発見。(single-source L-path)
  3. すべてのノード → 単一の終点
    に到達する経路を発見。(single-target L-path)
  4. 特定のノード → ノード
    に経路が存在するか判定。 (single-source/single-target L-path)

4. 実際の例

CFL を使った制約

演習

以下の言語を満たす
経路を求めよ。
  1. e e (1 e
  2. e e (1 e e )1
  3. e e (1 e e )2

答え

以下の言語を満たす
経路を求めよ。
  1. e e (1 e
    (realizable && !matched)
  2. e e (1 e e )1
    (matched && realizable)
  3. e e (1 e e )2
    (!matched && !realizable)

4.1. 関数をまたぐデータフロー解析

IFDS 問題とは?

実際のグラフ

計算方法

演習

始点から終点-gまでの
L(realizable) な
経路を求めよ。

4.2. 関数をまたぐスライス解析

実際のグラフ

影響を与えるノードが → で示されている。

計算方法

演習

printf i に到達する
L(slice) な経路を
すべて求めよ。

4.3. シェイプ解析

本論文での例

実際のグラフ

計算方法

x x x x x y z hd tl y x y x hd -1 y x tl -1
(nop) x=nil; z=cons(x,y); x=y; x=car(y); x=cdr(y);

制約条件

演習

右のグラフ中の
n12, y に対して
L(id_path),
L(hd_path),
L(tl_path)
を満たす経路を
それぞれ求めよ。

結果の解釈

4.4. 実行順序なし Points-To解析

問題定義

p = &q; assignAddr(p, q).
p = q; assign(p, q).
p = *q; assignStar(p, q).
*p = q; starAssign(p, q).

推論規則

演習

右の推論規則を使って
以下の操作を実行したときの
グラフを作成せよ:
a = &b;
d = &c;
d = a;
e = &a;
*e = d;
f = *e;

回答

グラフ解析を使って解くには

小手先のトリック

P R Q S pointsTo starAssn pointsTo P R Q S pointsTo starAssn pointsTo pointsTo
P R Q S pointsTo starAssn pointsTo

計算方法

p = &q; assignAddr(p, q). assignAddr(q, p).
p = q; assign(p, q). assign(q, p).
p = *q; assignStar(p, q). assignStar(q, p).
*p = q; starAssign(p, q). starAssign(q, p).

推論規則その2

pointsTo → assignAddr
pointsToassignAddr
pointsTo → assign pointsTo
pointsTopointsTo assign
pointsTo → assignStar pointsTo pointsTo
pointsTopointsTo pointsTo assignStar
pointsTo → pointsTo starAssign pointsTo
pointsTopointsTo starAssign pointsTo

演習

以下の処理を実行したとき、fb および c を 指しうることを示せ。

"Demand"解析としてのグラフ解析

CFL-Reachability + α 解析

まとめ

感想

新山の
研究テーマについて
新山 祐介 2017/06/06 輪講資料

研究テーマ

研究の背景

これは何をするコード?

f(X) {
    y ← +∞
    for each x in X {
        if x < y {
            y ← x
        }
    }
    return y
}

じゃあ、これは?

class Range {
  int vMin;
  int vMax;
}

f(int v) {
  a = v - vMax;
  b = vMin - v;
  return max(max(a, b), 0);
}

研究の方針

現在できている例

int pow(int x, int y) {
    int z = 1;
    while (0 < y) {
        z *= x;
        y -= 1;
    }
    return z;
}

アイデア

今後の計画