我正在验证使用数组存储异构数据的 ac 程序 - 特别是,该程序使用数组来实现 cons 单元,其中数组的第一个元素是整数值,第二个元素是指向下一个 cons 单元的指针.
例如,此列表的自由操作将是:
void listfree(void * x) {
if((x == 0)) {
return;
} else {
void * n = *((void **)x + 1);
listfree(n);
free(x);
return;
}
}
注意:此处未显示,但其他代码部分将读取数组的值并将其视为整数。
虽然我知道表达这一点的自然方式是某种结构,但程序本身是使用数组编写的,我无法更改这一点。
我应该如何在 VST 中指定内存的结构?
我定义了一个lseg
谓词如下:
Fixpoint lseg (x: val) (s: (list val)) (self_card: lseg_card) : mpred := match self_card with
| lseg_card_0 => !!(x = nullval) && !!(s = []) && emp
| lseg_card_1 _alpha_513 =>
EX v : Z,
EX s1 : (list val),
EX nxt : val,
!!(~ (x = nullval)) &&
!!(s = ([(Vint (Int.repr v))] ++ s1)) &&
(data_at Tsh (tarray tint 2) [(Vint (Int.repr v)); nxt] x) *
(lseg nxt s1 _alpha_513)
end.
但是,我在尝试评估时遇到了麻烦,void *n = *(void **)x;
大概是因为规范声明内存包含整数数组而不是指针。