我试图在这个例子中证明返回值将是 0(如果 8 不在数组中)或 1(如果 8 在数组中)。
int fi8(int *array, int size) {
int fi8 = 0;
int i = 0;
for(i = 0; i < length; ++i)
{
if(array[i] == 8)
fi8 = 1;
}
return fi8;
}
我创建了前置和后置条件:
/*@ requires 0 <= size <= 100;
@ requires \valid(array+(0..size-1));
@ assigns \nothing;
@ ensures (\forall integer i; 0<= i < size && array[i] != 8) ==> (\result == 0);
@ ensures (\exists integer i; (0<= i < size && array[i] == 8)) && (\result == 1);
@*/
和循环不变量,因为 Frama-C 基于 Hoare Logic:
/*@ loop invariant 0 <= i <= length;
@ loop invariant fi8 == 0 || fi8 == 1;
@ loop invariant (\forall integer i; 0<= i < size && array[i] != 8)
==> (fi8 == 0);
@ loop invariant (\exists integer i; (0<= i < size && array[i] == 8))
&& (fi8 == 1);
@ loop assigns i, fi8;
@*/
我很确定我在尝试使用 forall 并存在的地方遗漏了一些东西。我花了几个小时试图理解,如何正确检查,是否在数组上分配了任何值,但我觉得我被困在这里。我真的很感谢你的帮助:)