Skip to content

Commit 2317524

Browse files
committed
Switch to a more aggressive loop-assigns widening strategy for DFCC
1 parent 37dc87d commit 2317524

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

regression/contracts-dfcc/invar_havoc_dynamic_array_const_idx/main.c

+1-1
Original file line numberDiff line numberDiff 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 numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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+
^\[main.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.

src/goto-instrument/contracts/dynamic-frames/dfcc_infer_loop_assigns.cpp

+3-1
Original file line numberDiff line numberDiff 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));

0 commit comments

Comments
 (0)