File tree 6 files changed +142
-0
lines changed
invar_havoc_dynamic_multi-dim_array
invar_havoc_dynamic_multi-dim_array_all_const_idx
invar_havoc_dynamic_multi-dim_array_partial_const_idx 6 files changed +142
-0
lines changed Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+ #include <stdlib.h>
3
+
4
+ #define SIZE 8
5
+
6
+ void main ()
7
+ {
8
+ char * * * data = malloc (SIZE * sizeof (char * * ));
9
+ for (unsigned i = 0 ; i < SIZE ; i ++ )
10
+ {
11
+ data [i ] = malloc (SIZE * sizeof (char * ));
12
+ for (unsigned j = 0 ; j < SIZE ; j ++ )
13
+ data [i ][j ] = malloc (SIZE * sizeof (char ));
14
+ }
15
+
16
+ data [1 ][2 ][3 ] = 0 ;
17
+ char * old_data123 = & (data [1 ][2 ][3 ]);
18
+
19
+ for (unsigned i = 0 ; i < SIZE ; i ++ )
20
+ __CPROVER_loop_invariant (i <= SIZE )
21
+ {
22
+ data [i ][(i + 1 ) % SIZE ][(i + 2 ) % SIZE ] = 1 ;
23
+ }
24
+
25
+ assert (__CPROVER_same_object (old_data123 , & (data [1 ][2 ][3 ])));
26
+ assert (data [1 ][2 ][3 ] == 0 );
27
+ }
Original file line number Diff line number Diff line change
1
+ KNOWNBUG
2
+ main.c
3
+ --enforce-all-contracts
4
+ ^EXIT=10$
5
+ ^SIGNAL=0$
6
+ ^\[main.1\] .* Check loop invariant before entry: SUCCESS$
7
+ ^\[main.2\] .* Check that loop invariant is preserved: SUCCESS$
8
+ ^\[main.assertion.1\] .* assertion __CPROVER_same_object(old_data123, &(data\[1\]\[2\]\[3\])): SUCCESS$
9
+ ^\[main.assertion.2\] .* assertion data\[1\]\[2\]\[3\] == 0: FAILURE$
10
+ ^VERIFICATION FAILED$
11
+ --
12
+ --
13
+ Test case related to issue #6020: it checks that arrays are correctly havoced
14
+ when enforcing loop invariant contracts.
15
+ The `__CPROVER_same_object(old_data123, &(data[1][2][3]))` assertion is expected
16
+ to pass -- we should not mistakenly havoc the allocations, just their values.
17
+ However, the `data[1][2][3] == 0` assertion is expected to fail since `data`
18
+ is havoced.
19
+
20
+ Blocked on issue #6021.
Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+ #include <stdlib.h>
3
+
4
+ #define SIZE 8
5
+
6
+ void main ()
7
+ {
8
+ char * * * data = malloc (SIZE * sizeof (char * * ));
9
+ for (unsigned i = 0 ; i < SIZE ; i ++ )
10
+ {
11
+ data [i ] = malloc (SIZE * sizeof (char * ));
12
+ for (unsigned j = 0 ; j < SIZE ; j ++ )
13
+ data [i ][j ] = malloc (SIZE * sizeof (char ));
14
+ }
15
+
16
+ data [1 ][2 ][3 ] = 0 ;
17
+ data [4 ][5 ][6 ] = 0 ;
18
+
19
+ for (unsigned i = 0 ; i < SIZE ; i ++ )
20
+ __CPROVER_loop_invariant (i <= SIZE )
21
+ {
22
+ data [4 ][5 ][6 ] = 1 ;
23
+ }
24
+
25
+ assert (data [4 ][5 ][6 ] == 0 );
26
+ assert (data [1 ][2 ][3 ] == 0 );
27
+ }
Original file line number Diff line number Diff line change
1
+ KNOWNBUG
2
+ main.c
3
+ --enforce-all-contracts
4
+ ^EXIT=10$
5
+ ^SIGNAL=0$
6
+ ^\[main.1\] .* Check loop invariant before entry: SUCCESS$
7
+ ^\[main.2\] .* Check that loop invariant is preserved: SUCCESS$
8
+ ^\[main.assertion.1\] .* assertion data\[4\]\[5\]\[6\] == 0: FAILURE$
9
+ ^\[main.assertion.2\] .* assertion data\[1\]\[2\]\[3\] == 0: SUCCESS$
10
+ ^VERIFICATION FAILED$
11
+ --
12
+ --
13
+ Test case related to issue #6020: it checks that arrays are correctly havoced
14
+ when enforcing loop invariant contracts.
15
+ The `data[4][5][6] == 0` assertion is expected to fail since `data[4][5][6]`
16
+ is havoced and the invariant does not reestablish its value.
17
+ However, the `data[1][2][3] == 0` assertion is expected to pass -- we should
18
+ not havoc the entire `data` array, if only a constant index if being modified.
19
+
20
+ Blocked on issue #6021.
Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+ #include <stdlib.h>
3
+
4
+ #define SIZE 8
5
+
6
+ void main ()
7
+ {
8
+ char * * * data = malloc (SIZE * sizeof (char * * ));
9
+ for (unsigned i = 0 ; i < SIZE ; i ++ )
10
+ {
11
+ data [i ] = malloc (SIZE * sizeof (char * ));
12
+ for (unsigned j = 0 ; j < SIZE ; j ++ )
13
+ data [i ][j ] = malloc (SIZE * sizeof (char ));
14
+ }
15
+
16
+ data [1 ][2 ][3 ] = 0 ;
17
+ data [4 ][5 ][6 ] = 0 ;
18
+
19
+ for (unsigned i = 0 ; i < SIZE ; i ++ )
20
+ __CPROVER_loop_invariant (i <= SIZE )
21
+ {
22
+ data [4 ][i ][6 ] = 1 ;
23
+ }
24
+
25
+ assert (data [1 ][2 ][3 ] == 0 );
26
+ assert (data [4 ][5 ][6 ] == 0 );
27
+ }
Original file line number Diff line number Diff line change
1
+ KNOWNBUG
2
+ main.c
3
+ --enforce-all-contracts
4
+ ^EXIT=10$
5
+ ^SIGNAL=0$
6
+ ^\[main.1\] .* Check loop invariant before entry: SUCCESS$
7
+ ^\[main.2\] .* Check that loop invariant is preserved: SUCCESS$
8
+ ^\[main.assertion.1\] .* assertion data\[1\]\[2\]\[3\] == 0: FAILURE$
9
+ ^\[main.assertion.2\] .* assertion data\[4\]\[5\]\[6\] == 0: FAILURE$
10
+ ^VERIFICATION FAILED$
11
+ --
12
+ --
13
+ Test case related to issue #6020: it checks that arrays are correctly havoced
14
+ when enforcing loop invariant contracts.
15
+ Here, both assertions are expected to fail -- the entire `data` array should
16
+ be havoced since we are assigning to a non-constant index.
17
+ We _could_ do a more precise analysis in future where we only havoc
18
+ `data[4][5][6]` but not `data[1][2][3]` since the latter clearly cannot be
19
+ modified in the given loop.
20
+
21
+ Blocked on issue #6021.
You can’t perform that action at this time.
0 commit comments