Z3 SMT校准仪产量';未知';尽管有强有力的证明

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

假设我们有以下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 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节所述,状态为:

  • -没有试图证明
  • -该属性尚未验证

    此状态意味着找不到证据。这可能是因为该属性实际上无效

  • -属性有效,但具有依赖项

    如果WP插件能够证明一个或多个属性是完全有效的,那么您将看到此状态应用于属性

  • -属性及其所有依赖项完全有效

  • 虽然WP插件不支持将属性标记为无效,但您可以在函数末尾使用断言
    \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) ...