File tree Expand file tree Collapse file tree 4 files changed +36
-2
lines changed
regression/contracts-dfcc
invar_havoc_dynamic_array_const_idx
loop_assigns_inference-05
src/goto-instrument/contracts/dynamic-frames Expand file tree Collapse file tree 4 files changed +36
-2
lines changed Original file line number Diff line number Diff line change @@ -10,7 +10,7 @@ void main()
1010 data [4 ] = 0 ;
1111
1212 for (unsigned i = 0 ; i < SIZE ; i ++ )
13- __CPROVER_loop_invariant (i <= SIZE )
13+ __CPROVER_assigns ( data [ 1 ], i ) __CPROVER_loop_invariant (i <= SIZE )
1414 {
1515 data [1 ] = i ;
1616 }
Original file line number Diff line number Diff line change 1+ #include <stdlib.h>
2+
3+ #define SIZE 8
4+
5+ int main ()
6+ {
7+ int i = 0 ;
8+ int * j = malloc (SIZE * sizeof (int ));
9+ for (i = 0 ; i < SIZE ; i ++ )
10+ // __CPROVER_assigns(h.pos, i)
11+ __CPROVER_loop_invariant (0 <= i && i <= SIZE )
12+ {
13+ int * k ;
14+ k = j + i ;
15+ * k = 1 ;
16+ }
17+ }
Original file line number Diff line number Diff line change 1+ CORE dfcc-only
2+ main.c
3+ --no-malloc-may-fail --dfcc main --apply-loop-contracts
4+ ^EXIT=0$
5+ ^SIGNAL=0$
6+ ^\[main.loop_invariant_base.\d+\] line \d+ Check invariant before entry for loop .*: SUCCESS$
7+ ^\[main.loop_invariant_base.\d+\] line \d+ Check invariant before entry for loop .*: SUCCESS$
8+ ^\[main.loop_invariant_step.\d+\] line \d+ Check invariant after step for loop .*: SUCCESS$
9+ ^\[main.loop_step_unwinding.\d+\] line \d+ Check step was unwound for loop .*: SUCCESS$
10+ ^\[set_len.assigns.\d+\] line \d+ Check that \*k is assignable: SUCCESS
11+ ^VERIFICATION SUCCESSFUL$
12+ --
13+ --
14+ This test checks assigns __CPROVER_object_whole(k) is inferred correctly,
15+ which requires widening *k to the whole object.
Original file line number Diff line number Diff line change @@ -262,7 +262,9 @@ static assignst dfcc_infer_loop_assigns_for_loop(
262262 {
263263 address_of_exprt address_of_expr (expr);
264264 address_of_expr.add_source_location () = expr.source_location ();
265- if (!is_constant (address_of_expr))
265+ // Widen assigns targets to object_whole if `expr` is a dereference or
266+ // with constant address.
267+ if (expr.id () == ID_dereference || !is_constant (address_of_expr))
266268 {
267269 // Target address is not constant, widening to the whole object
268270 result.emplace (make_object_whole_call_expr (address_of_expr, ns));
You can’t perform that action at this time.
0 commit comments