动态内存数据依赖程序的自动化分析
1. 堆操作基础
在对动态内存数据依赖程序进行分析时,堆操作是基础。对于一个堆 (h = (M, Succ, \lambda, Val)),我们定义 (h⊖m) 为从堆 (h) 中删除单元 (m) 后得到的堆 (h’)。具体定义如下:
- (M’ = M - {m})
- 若 (Succ(m’) \neq m),则 (Succ’(m’) = Succ(m’));否则 (Succ’(m’) = ),即指向 (m) 的单元的后继在 (h’) 中变为悬空状态。
- 若 (\lambda(x) = m),则 (\lambda’(x) = );否则 (\lambda’(x) = \lambda(x)),也就是在 (h) 中指向与 (x) 相同单元的变量在 (h’) 中变为悬空状态。
- 若 (m’ \in M’),则 (Val’(m’) = Val(m’)),即 (Val’) 是 (Val) 在 (M’) 上的限制。
对于转移 (t = (q_1, op, q_2)) 和配置 (c = (q, h))、(c’ = (q’, h’)),当 (q = q_1),(q’ = q_2) 且 (h \xrightarrow{op} h’) 时,记为 (c \xrightarrow{t} c’)。这里 (h \xrightarrow{op} h’) 表示通过对 (h) 执行操作 (op) 得到 (h’)。以下是三种常见操作的定义:
- (op) 为 (x := y.next) 形式,要求 (\lambda(y) \in M),(Succ(\lambda(y)) \neq ),且 (h’ = (h.\lamb
动态内存数据依赖分析方法
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



