我试图证明数组的量化断言并遇到了一些问题。考虑以下小程序:
int a[4] = {1,2,3,4};
/*@ requires p == a;
assigns \nothing;
*/
void test(int *p)
{
p++;
//@ assert \forall int i; 0 <= i < 3 ==> p[i] < 10;
//@ assert \exists int i; p[i] == 3;
}
我正在使用“类型化”内存模型:
frama-c-gui -wp -wp-qed -wp-byreference -wp-model 'Typed' -main test Test.c
由于某种原因,“要求”不成立,因此可以证明所有断言,即使是 1==2。为了克服这个问题,我直接在函数体中分配了全局变量:
int a[4] = {1,2,3,4};
/*@ assigns \nothing;
*/
void test(int *p)
{
p = a;
p++;
//@ assert \forall int i; 0 <= i < 3 ==> p[i] < 10;
//@ assert \exists int i; p[i] == 3;
}
这里 forall 成立,但存在不成立。只有当我在它之前添加断言“p [1] == 3”时,存在才成立。证明这种存在数组属性缺少什么?我需要这个来表达数组条目上搜索循环的循环不变量。
谢谢,哈拉尔