低级别C语言中重叠结构的形状分析
在低级别C语言编程中,处理重叠结构的形状分析是一个具有挑战性但又十分重要的任务。下面我们将深入探讨相关的模型、分析方法以及实际应用。
粗粒度语义与分析
之前提到的细粒度模型对堆有非常明确的视图,能够进行详细的建模。然而,其逻辑结构中的个体数量是标准TVLA分析中个体数量的倍数,因为记录的每个组件都由单独的个体建模。而且,标准TVLA不支持将属于同一记录的个体(如图2中最外层框所编码的)保持在一起。
幸运的是,由于记录的结构是完全静态的,一旦分配,Sel中谓词的解释就不会改变,只有 ∗ 谓词会改变。基于此,我们可以将记录编码为单个节点,而不是像每个记录一个节点的范式那样通过一组链接节点明确表示。为了区分指向记录头部的指针和指向组件的指针,我们对 ∗ 谓词进行参数化。例如,如果 ∗[p, n] 对于两个个体 u 和 u′ 为真,意味着由 u 建模的记录的 p 组件持有一个指向由 u′ 建模的记录的 n 组件的指针。同样,我们对编码指针变量的一元谓词进行参数化:如果 x[n] 对于个体 u 成立,意味着 x 持有一个指向由 u 建模的记录的 n 组件的指针。在指向记录头部的特殊情况下(实际上这是最常见的情况),我们写作 x[ε]。
变量的地址可以像细粒度模型一样,为每个变量添加一个个体来处理。为了简化表示,这里省略指针变量的地址。与细粒度语义不同,一元谓词 x[ε] 现在对于指针 x 所指向的个体成立,而不是对于 x 本身的位置成立。通过将谓词限制为 ∗[s, ε] 和 x[ε] 的形式,即所有指针都指向记录的头部,就可以从这种粗粒度模型得到标准TVLA模型。
粗粒度状态被定义为基于以下签名 D 的逻辑结构,D
超级会员免费看
订阅专栏 解锁全文

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



