低级别 C 语言重叠结构的形状分析
1. 粗粒度语义与分析
细粒度模型对堆有非常明确的视图,允许进行非常详细的建模。然而,逻辑结构中的个体数量是标准 TVLA 分析中个体数量的倍数,因为记录的每个组件都由一个单独的个体建模。此外,还需要确保属于同一记录的个体(如图 2 中最外层的框所示)保持在一起,而标准 TVLA 不支持这一点。
幸运的是,我们可以利用记录结构完全静态这一事实来弥补这些缺点。一旦分配,Sel 中谓词的解释就不会改变,只有 ∗ 谓词会改变。这表明可以将记录编码为单个节点,而不是像每个记录一个节点的范式那样通过一组链接的节点显式表示。不过,需要区分指向记录头部的指针和指向组件的指针。我们通过对 ∗ 谓词进行参数化来实现这一点。例如,如果 ∗[p, n] 对于两个个体 u 和 u′ 为真,则意味着由 u 建模的记录的 p 组件持有一个指向由 u′ 建模的记录的 n 组件的指针。类似地,我们对编码指针变量的一元谓词进行参数化:如果 x[n] 对于个体 u 成立,则意味着 x 持有一个指向由 u 建模的记录的 n 组件的指针。在指向记录头部的指针这种特殊情况(实际上是最常见的情况)下,我们写作 x[ε]。
变量的地址可以通过为每个变量添加一个个体来处理,就像在细粒度模型中一样。为了简化表示,我们在此省略指针变量的地址。与细粒度语义不同,一元谓词 x[ε] 现在对于指针 x 所指向的个体成立,而不是对于 x 本身的位置成立。因此,通过将谓词限制为 ∗[s, ε] 和 x[ε] 的形式,即所有指针都指向记录的头部,就可以从这种粗粒度模型的版本中获得标准 TVLA 模型。
| 语句 |
|---|
超级会员免费看
订阅专栏 解锁全文
14

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



