基于具体内存模型的 CompCert 编译器前端验证
1. 内存注入基础
在内存操作中,存在一个空指针比较的代码示例:
int main(){
int i=0, *p = &i;
for (i=0; i < INTMAX; i++)
if (p++ == 0) return 1;
return 0;
}
这里涉及到 val inject 关系,它区分了三种情况:
1. 对于具体值(如整数或浮点数),该关系是自反的,例如 int(i) 与 int(i) 相关。
2. 当 f(b) = ⌊(b′, δ)⌋ 时, ptr(b, i) 与 ptr(b′, i + δ) 相关。
3. undef 与任何值(包括 undef )相关。
注入的目的有两个:一是使用函数 f 建立指针之间的关系,二是用定义的值特化 undef 。
在 CompCert 中,通用内存注入要求内存 m1 中的每个有效位置通过函数 f 映射到内存 m2 中的有效位置, m2 中的对应位置必须相对于块的大小正确对齐,并
超级会员免费看
订阅专栏 解锁全文
16

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



