Z3 SMT校准仪产量';未知';尽管有强有力的证明
假设我们有以下C注释代码:Z3 SMT校准仪产量';未知';尽管有强有力的证明,z3,verification,frama-c,alt-ergo,Z3,Verification,Frama C,Alt Ergo,假设我们有以下C注释代码: #define L 3 int a[L] = {0}; /*@ requires \valid(a+(0..(L - 1))); ensures \forall int j; 0 <= j < L ==> (a[j] == j); */ int main() { int i = 0; /*@ loop assigns i, a[0..(i-1)]; loop invariant inv
#define L 3
int a[L] = {0};
/*@ requires \valid(a+(0..(L - 1)));
ensures \forall int j; 0 <= j < L ==> (a[j] == j); */
int main() {
int i = 0;
/*@ loop assigns i, a[0..(i-1)];
loop invariant inv1: 0 <= i <= L;
loop invariant inv2:
\forall int k; 0 <= k < i ==> a[k] == k;
*/
while (i < L) {
a[i] = i;
i++;
}
/*@ assert final_progress:
\forall int k; 0 < k < L ==> a[k] == a[k-1] + 1;
assert final_c:
a[2] == a[1] - 1; */
return 0;
}
WP插件不支持将属性(前置条件、后置条件、用户断言)标记为无效。如本标准第2.2节所述,状态为:
\false
的技巧:
定义L 3
int a[L]={0};
/*@需要\有效(a+(0..(L-1));
确保\forall int j;0(a[j]==j)*/
int main()
{
int i=0;
/*@循环赋值i,a[0..(i-1)];
循环不变量inv1:0我将这个问题标记为已解决,但我仍然不明白为什么会这样。毕竟,SMT解算器可以生成sat/unsat/unknown。这可能是因为解算器必须通过所有可能的量化值来声明某个内容为“无效”,但我怀疑这是否是实际的做法。@Evgeniy:你说得对,这是可能的e、 只是WP插件不支持将属性标记为无效。例如,值分析插件支持将属性标记为无效。@Evgeniy:实际上,手册中似乎记录了一个
-WP unsat model
选项。但是,我在使用Frama-C钠尝试该选项时出错:[kernel]用户错误:选项“-wp unsat model”未知。
看起来它被隐藏或未实现。您在$(frama-c-wp help)中找不到它.据我从少量信息中了解,此选项提示底层SMT解算器在无法释放逻辑公式时生成反例。但如果WP没有首先将属性标记为无效,那么为什么需要此选项?
$ frama-c -wp -wp-rte -wp-prover z3 test2.c
..
[wp] [z3] Goal typed_main_assert_final_c : Unknown (455ms)
$ frama-c -wp -wp-rte -wp-prover alt-ergo test2.c
..
[wp] [Alt-Ergo] Goal typed_main_assert_final_c : Timeout
...
[wp] [Alt-Ergo] Goal typed_main_assert_false : Valid (114ms) (97)
...