Program Analysis via Graph Reachability
Thomas Reps |
[(e[])eee[e]]
を解析し、構文木を書け。
L: matched → matched matched | ( matched ) | [ matched ] | e | ε (空列)
while (true) { for e2,e2 in 隣りあったエッジ { if (規則 A → e2 e3 がある) { 新しいエッジ A を追加。 } } if (これ以上追加できない) { break; } }
matched → matched matched | (i matched )i | e | ε realizable → matched realizable | (i realizable | ε
e e (1 e
e e (1 e e )1
e e (1 e e )2
main
から実際に呼ばれうる経路のみを考慮)
unbalanced-right → unbalanced-right matched | unbalanced-right )i | ε slice → unbalanced-right realizable
printf i
に到達する(nop) | x=nil; | z=cons(x,y); | x=y; | x=car(y); | x=cdr(y); |
id_path → id_path id_path | hd id_path hd-1 | tl id_path tl-1 | id | ε
hd_path → id_path hd id_path tl_path → id_path tl id_path
empty
atom
,empty
)
p=&q; p=q; p=*q; *p=q;
malloc()
はつねに同じアドレスを返すとする。
p = malloc(); → p = &malloc_s;
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 = &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). |
pointsTo → assignAddr |
pointsTo → assignAddr |
pointsTo → assign pointsTo |
pointsTo → pointsTo assign |
pointsTo → assignStar pointsTo pointsTo |
pointsTo → pointsTo pointsTo assignStar |
pointsTo → pointsTo starAssign pointsTo |
pointsTo → pointsTo starAssign pointsTo |
f
が b
および c
を
指しうることを示せ。
新山の 研究テーマについて |
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); }