【发布时间】:2015-08-19 20:05:14
【问题描述】:
我正在尝试证明将两个整数数组初始化为零的 C 循环规范,但我无法验证它。
代码如下:
int first[26];
int second[26];
int c;
/*@
loop assigns first[0..(c-1)];
loop assigns second[0..(c-1)];
loop assigns c;
loop invariant 0 <= c <= 26;
loop invariant \forall integer k; 0 <= k < c ==> second[k] == first[k];
loop invariant \forall integer k; 0 <= k < c ==> first[k] == 0 && second[k] == 0;
loop invariant \valid(first+(0..25)) && \valid(second+(0..25));
loop variant 26-c;
*/
for(c = 0; c < 26; c++)
{
first[c] = 0;
second[c] = 0;
}
我也尝试使用简写形式
int first[26] = {0}; 用于零初始化,但似乎 Frama-C 不支持这种形式。
我将 Frama-C Sodium-20150201 与 Alt-Ergo 证明器一起使用,它无法验证规范的前三个 不变量,即
loop invariant 0 <= c <= 26;
loop invariant \forall integer k; 0 <= k < c ==> second[k] == first[k];
loop invariant \forall integer k; 0 <= k < c ==> first[k] == 0 && second[k] == 0;
【问题讨论】:
-
你从 0 循环到 26 排他,所以
0 <= c < 26(0 <= c <= 25)。 -
不支持
memset之类的东西吗?在这种情况下,您可以简单地使用memset(first, 0, 26 * sizeof(int))。 -
@Kninnug 请参阅下面的第二条评论stackoverflow.com/questions/32144221/…