File tree 9 files changed +257
-71
lines changed 9 files changed +257
-71
lines changed Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+
3
+ #define N 16
4
+
5
+ void main ()
6
+ {
7
+ int a [N ];
8
+ a [10 ] = 0 ;
9
+
10
+ for (int i = 0 ; i < N ; ++ i )
11
+ // clang-format off
12
+ __CPROVER_loop_invariant (
13
+ (0 <= i ) && (i <= N ) &&
14
+ __CPROVER_forall {
15
+ int k ;
16
+ // constant bounds for explicit unrolling with SAT backend
17
+ (0 <= k && k <= N ) == > (
18
+ // the actual symbolic bound for `k`
19
+ k < i == > a [k ] == 1
20
+ )
21
+ }
22
+ )
23
+ // clang-format on
24
+ {
25
+ a [i ] = 1 ;
26
+ }
27
+
28
+ assert (a [10 ] == 1 );
29
+ }
Original file line number Diff line number Diff line change
1
+ CORE
2
+ main.c
3
+ --enforce-all-contracts
4
+ ^EXIT=0$
5
+ ^SIGNAL=0$
6
+ ^\[main.1\] line .* Check loop invariant before entry: SUCCESS
7
+ ^\[main.2\] line .* Check that loop invariant is preserved: SUCCESS
8
+ ^\[main.assertion.1\] line .* assertion a\[10\] == 1: SUCCESS
9
+ ^VERIFICATION SUCCESSFUL$
10
+ --
11
+ --
12
+ This test case checks the handling of a `forall` quantifier within a loop invariant.
13
+
14
+ This test case uses explicit constant bounds on the quantified variable,
15
+ so that it can be unrolled (to conjunctions) with the SAT backend.
Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+
3
+ void main ()
4
+ {
5
+ int N , a [64 ];
6
+ __CPROVER_assume (0 <= N && N < 64 );
7
+
8
+ for (int i = 0 ; i < N ; ++ i )
9
+ // clang-format off
10
+ __CPROVER_loop_invariant (
11
+ (0 <= i ) && (i <= N ) &&
12
+ __CPROVER_forall {
13
+ int k ;
14
+ (0 <= k && k < i ) == > a [k ] == 1
15
+ }
16
+ )
17
+ // clang-format on
18
+ {
19
+ a [i ] = 1 ;
20
+ }
21
+
22
+ // clang-format off
23
+ assert (__CPROVER_forall {
24
+ int k ;
25
+ (0 <= k && k < N ) == > a [k ] == 1
26
+ });
27
+ // clang-format on
28
+
29
+ int k ;
30
+ __CPROVER_assume (0 <= k && k < N );
31
+ assert (a [k ] == 1 );
32
+ }
Original file line number Diff line number Diff line change
1
+ KNOWNBUG smt-backend broken-cprover-smt-backend
2
+ main.c
3
+ --enforce-all-contracts
4
+ ^EXIT=0$
5
+ ^SIGNAL=0$
6
+ ^\[main.1\] line .* Check loop invariant before entry: SUCCESS
7
+ ^\[main.2\] line .* Check that loop invariant is preserved: SUCCESS
8
+ ^\[main.assertion.1\] line .* assertion .*: SUCCESS
9
+ ^VERIFICATION SUCCESSFUL$
10
+ --
11
+ --
12
+ This test case checks the handling of a universal quantifier, with a symbolic
13
+ upper bound, within a loop invariant.
14
+
15
+ The test is tagged:
16
+ - `smt-backend`:
17
+ because the SAT backend does not support (simply ignores) `forall` in negative (e.g. assume) contexts.
18
+ - `broken-cprover-smt-backend`:
19
+ because the CPROVER SMT2 solver cannot handle (errors out on) `forall` in negative (e.g. assume) contexts.
20
+
21
+ It has been tagged `KNOWNBUG` for now since `contracts` regression tests are not run with SMT backend yet.
Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+ #include <stdlib.h>
3
+
4
+ #define MAX_SIZE 64
5
+
6
+ void main ()
7
+ {
8
+ unsigned N ;
9
+ __CPROVER_assume (N <= MAX_SIZE );
10
+
11
+ int * a = malloc (N * sizeof (int ));
12
+
13
+ for (int i = 0 ; i < N ; ++ i )
14
+ // clang-format off
15
+ __CPROVER_loop_invariant (
16
+ (0 <= i ) && (i <= N ) &&
17
+ (i != 0 == > __CPROVER_exists {
18
+ int k ;
19
+ // constant bounds for explicit unrolling with SAT backend
20
+ (0 <= k && k <= MAX_SIZE ) && (
21
+ // the actual symbolic bound for `k`
22
+ k < i && a [k ] == 1
23
+ )
24
+ })
25
+ )
26
+ // clang-format on
27
+ {
28
+ a [i ] = 1 ;
29
+ }
30
+
31
+ // clang-format off
32
+ assert (
33
+ N != 0 == > __CPROVER_exists {
34
+ int k ;
35
+ // constant bounds for explicit unrolling with SAT backend
36
+ (0 <= k && k <= MAX_SIZE ) && (
37
+ // the actual symbolic bound for `k`
38
+ k < N && a [k ] == 1
39
+ )
40
+ });
41
+ // clang-format on
42
+ }
Original file line number Diff line number Diff line change
1
+ CORE
2
+ main.c
3
+ --enforce-all-contracts
4
+ ^EXIT=0$
5
+ ^SIGNAL=0$
6
+ ^\[main.1\] line .* Check loop invariant before entry: SUCCESS
7
+ ^\[main.2\] line .* Check that loop invariant is preserved: SUCCESS
8
+ ^\[main.assertion.1\] line .* assertion .*: SUCCESS
9
+ ^VERIFICATION SUCCESSFUL$
10
+ --
11
+ --
12
+ This test case checks the handling of an existential quantifier, with a symbolic
13
+ upper bound, within a loop invariant.
14
+
15
+ This test case uses explicit constant bounds on the quantified variable,
16
+ so that it can be unrolled (to conjunctions) with the SAT backend.
You can’t perform that action at this time.
0 commit comments