Skip to content

Commit 7dab9d8

Browse files
committedOct 31, 2024
Detect loop locals with goto_rw in DFCC
1 parent 20a1ecf commit 7dab9d8

File tree

30 files changed

+172
-83
lines changed

30 files changed

+172
-83
lines changed
 

‎regression/contracts-dfcc/dont_skip_cprover_prefixed_vars_fail/main.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
void foo()
22
{
3-
int nondet_var;
4-
int __VERIFIER_var;
5-
int __CPROVER_var;
3+
int nondet_var = nondet_int();
4+
int __VERIFIER_var = nondet_int();
5+
int __CPROVER_var = nondet_int();
66
for(int i = 10; i > 0; i--)
77
// clang-format off
8-
__CPROVER_assigns(i)
8+
__CPROVER_assigns(i)
99
__CPROVER_loop_invariant(0 <= i && i <= 10)
1010
__CPROVER_decreases(i)
1111
// clang-format on

‎regression/contracts-dfcc/dont_skip_cprover_prefixed_vars_pass/main.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
void foo()
22
{
3-
int nondet_var;
4-
int __VERIFIER_var;
5-
int __CPROVER_var;
3+
int nondet_var = nondet_int();
4+
int __VERIFIER_var = nondet_int();
5+
int __CPROVER_var = nondet_int();
66
for(int i = 10; i > 0; i--)
77
// clang-format off
88
__CPROVER_assigns(i,nondet_var, __VERIFIER_var, __CPROVER_var)

‎regression/contracts-dfcc/invar_assigns_opt/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ int foo()
1717
}
1818
assert(r1 == 0);
1919

20-
int r2, s2 = 1;
20+
int r2 = nondet_int(), s2 = 1;
2121
__CPROVER_assume(r2 >= 0);
2222
while(r2 > 0)
2323
__CPROVER_assigns(r2, s2) __CPROVER_loop_invariant(r2 >= 0 && s2 == 1)

‎regression/contracts-dfcc/invar_check_break_fail/main.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
#include <assert.h>
2-
31
int main()
42
{
5-
int r;
3+
int r = nondet_int();
64
__CPROVER_assume(r >= 0);
75

86
while(r > 0)

‎regression/contracts-dfcc/invar_check_break_fail/test.desc

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ main.c
33
--dfcc main --apply-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
6-
^\[main.loop_invariant_base.\d+\] line 8 Check invariant before entry for loop .*: SUCCESS$
7-
^\[main.loop_invariant_step.\d+\] line 8 Check invariant after step for loop .*: SUCCESS$
8-
^\[main.loop_step_unwinding.\d+\] line 8 Check step was unwound for loop .*: SUCCESS$
6+
^\[main.loop_invariant_base.\d+\] line 6 Check invariant before entry for loop .*: SUCCESS$
7+
^\[main.loop_invariant_step.\d+\] line 6 Check invariant after step for loop .*: SUCCESS$
8+
^\[main.loop_step_unwinding.\d+\] line 6 Check step was unwound for loop .*: SUCCESS$
99
^\[main.assigns.\d+\] .* Check that r is assignable: SUCCESS$
1010
^\[main\.assertion\.\d+\] .* assertion r == 0: FAILURE$
1111
^VERIFICATION FAILED$

‎regression/contracts-dfcc/invar_check_break_pass/main.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
#include <assert.h>
2-
31
int main()
42
{
5-
int r;
3+
int r = nondet_int();
64
__CPROVER_assume(r >= 0);
75

86
while(r > 0)

‎regression/contracts-dfcc/invar_check_break_pass/test.desc

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ main.c
33
--dfcc main --apply-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
6-
^\[main.loop_invariant_base.\d+\] line 8 Check invariant before entry for loop .*: SUCCESS$
7-
^\[main.loop_invariant_step.\d+\] line 8 Check invariant after step for loop .*: SUCCESS$
8-
^\[main.loop_step_unwinding.\d+\] line 8 Check step was unwound for loop .*: SUCCESS$
9-
^\[main.loop_decreases.\d+\] line 8 Check variant decreases after step for loop .*: SUCCESS$
6+
^\[main.loop_invariant_base.\d+\] line 6 Check invariant before entry for loop .*: SUCCESS$
7+
^\[main.loop_invariant_step.\d+\] line 6 Check invariant after step for loop .*: SUCCESS$
8+
^\[main.loop_step_unwinding.\d+\] line 6 Check step was unwound for loop .*: SUCCESS$
9+
^\[main.loop_decreases.\d+\] line 6 Check variant decreases after step for loop .*: SUCCESS$
1010
^\[main.assigns.\d+\] .* Check that r is assignable: SUCCESS$
1111
^\[main\.assertion\.\d+\] .* assertion r == 0 || r == 1: SUCCESS$
1212
^VERIFICATION SUCCESSFUL$

‎regression/contracts-dfcc/invar_check_continue/main.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
#include <assert.h>
2-
31
int main()
42
{
5-
int r;
3+
int r = nondet_int();
64
__CPROVER_assume(r >= 0);
75

86
while(r > 0)

‎regression/contracts-dfcc/invar_check_continue/test.desc

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ main.c
33
--dfcc main --apply-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
6-
^\[main.loop_assigns.\d+\] line 8 Check assigns clause inclusion for loop .*: SUCCESS$
7-
^\[main.loop_invariant_base.\d+\] line 8 Check invariant before entry for loop .*: SUCCESS$
8-
^\[main.loop_invariant_step.\d+\] line 8 Check invariant after step for loop .*: SUCCESS$
9-
^\[main.loop_step_unwinding.\d+\] line 8 Check step was unwound for loop .*: SUCCESS$
10-
^\[main.loop_decreases.\d+\] line 8 Check variant decreases after step for loop .*: SUCCESS$
6+
^\[main.loop_assigns.\d+\] line 6 Check assigns clause inclusion for loop .*: SUCCESS$
7+
^\[main.loop_invariant_base.\d+\] line 6 Check invariant before entry for loop .*: SUCCESS$
8+
^\[main.loop_invariant_step.\d+\] line 6 Check invariant after step for loop .*: SUCCESS$
9+
^\[main.loop_step_unwinding.\d+\] line 6 Check step was unwound for loop .*: SUCCESS$
10+
^\[main.loop_decreases.\d+\] line 6 Check variant decreases after step for loop .*: SUCCESS$
1111
^\[main.assigns.\d+\] .* Check that r is assignable: SUCCESS$
1212
^\[main\.assertion\.\d+\] .* assertion r == 0: SUCCESS$
1313
^VERIFICATION SUCCESSFUL$

‎regression/contracts-dfcc/invar_check_multiple_loops/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
int main()
44
{
5-
int r, n, x, y;
5+
int r, n, x = nondet_int(), y = nondet_int();
66
__CPROVER_assume(n > 0 && x == y);
77

88
for(r = 0; r < n; ++r)

‎regression/contracts-dfcc/invar_check_nested_loops/main.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
int main()
44
{
5-
int n, s = 0;
5+
int n = nondet_int(), s = 0;
66
__CPROVER_assume(n >= 0);
77

88
for(int i = 0; i < n; ++i)
@@ -11,7 +11,7 @@ int main()
1111
__CPROVER_decreases(n - i)
1212
// clang-format on
1313
{
14-
int a, b;
14+
int a = nondet_int(), b = nondet_int();
1515
__CPROVER_assume(b >= 0 && a == b);
1616

1717
while(a > 0)

‎regression/contracts-dfcc/invar_check_pointer_modifies-01/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ void main()
66
char *data = malloc(1);
77
*data = 42;
88

9-
unsigned i;
9+
unsigned i = nondet_int();
1010
while(i > 0)
1111
// clang-format off
1212
__CPROVER_loop_invariant(*data == 42)

‎regression/contracts-dfcc/invar_check_pointer_modifies-02/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ void main()
88
copy = data;
99
*data = 42;
1010

11-
unsigned i;
11+
unsigned i = nondet_int();
1212
while(i > 0)
1313
// clang-format off
1414
__CPROVER_loop_invariant(*data == 42)

‎regression/contracts-dfcc/invar_check_sufficiency/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
int main()
44
{
5-
int r;
5+
int r = nondet_int();
66
__CPROVER_assume(r >= 0);
77

88
while(r > 0)

‎regression/contracts-dfcc/invar_loop-entry_check/main.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ typedef struct
88

99
void main()
1010
{
11-
int *x1, y1, z1;
11+
int *x1, y1 = nondet_int(), z1;
1212
x1 = &z1;
1313

1414
while(y1 > 0)
@@ -20,7 +20,7 @@ void main()
2020
}
2121
assert(*x1 == z1);
2222

23-
int x2, y2, z2;
23+
int x2, y2 = nondet_int(), z2;
2424
x2 = z2;
2525

2626
while(y2 > 0)
@@ -32,8 +32,9 @@ void main()
3232
}
3333
assert(x2 == z2);
3434

35-
int y3;
35+
int y3 = nondet_int();
3636
s s0, s1, *s2 = &s0;
37+
s0.n = nondet_int();
3738
s2->n = malloc(sizeof(int));
3839
s1.n = s2->n;
3940

‎regression/contracts-dfcc/invar_loop-entry_check/test.desc

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ main.c
1111
^\[main.loop_invariant_base.\d+] line 26 Check invariant before entry for loop .*: SUCCESS$
1212
^\[main.loop_invariant_step.\d+] line 26 Check invariant after step for loop .*: SUCCESS$
1313
^\[main.loop_step_unwinding.\d+] line 26 Check step was unwound for loop .*: SUCCESS$
14-
^\[main.loop_assigns.\d+] line 40 Check assigns clause inclusion for loop .*: SUCCESS$
15-
^\[main.loop_invariant_base.\d+] line 40 Check invariant before entry for loop .*: SUCCESS$
16-
^\[main.loop_invariant_step.\d+] line 40 Check invariant after step for loop .*: SUCCESS$
17-
^\[main.loop_step_unwinding.\d+] line 40 Check step was unwound for loop .*: SUCCESS$
14+
^\[main.loop_assigns.\d+] line 41 Check assigns clause inclusion for loop .*: SUCCESS$
15+
^\[main.loop_invariant_base.\d+] line 41 Check invariant before entry for loop .*: SUCCESS$
16+
^\[main.loop_invariant_step.\d+] line 41 Check invariant after step for loop .*: SUCCESS$
17+
^\[main.loop_step_unwinding.\d+] line 41 Check step was unwound for loop .*: SUCCESS$
1818
^\[main\.assertion\.\d+\] .* assertion \*x1 == z1: SUCCESS$
1919
^\[main\.assertion\.\d+\] .* assertion x2 == z2: SUCCESS$
2020
^\[main.assigns.\d+\] .* Check that y1 is assignable: SUCCESS$

‎regression/contracts-dfcc/invar_loop-entry_fail/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
void main()
44
{
5-
int x, y, z;
5+
int x = nondet_int(), y = nondet_int(), z = nondet_int();
66
x = z;
77

88
while(y > 0)

‎regression/contracts-dfcc/invar_loop_constant_fail/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
int main()
44
{
5-
int r;
5+
int r = nondet_int();
66
int s = 1;
77
__CPROVER_assume(r >= 0);
88
while(r > 0)

‎regression/contracts-dfcc/invar_loop_constant_no_modify/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
int main()
44
{
5-
int r;
5+
int r = nondet_int();
66
int s = 1;
77
__CPROVER_assume(r >= 0);
88
while(r > 0)

‎regression/contracts-dfcc/invar_loop_constant_pass/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
int main()
44
{
5-
int r, s = 1;
5+
int r = nondet_int(), s = 1;
66
__CPROVER_assume(r >= 0);
77
while(r > 0)
88
// clang-format off

‎regression/contracts-dfcc/loop_assigns_inference-02/main.c

+3
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ void main()
1010
void foo()
1111
{
1212
int *b = malloc(SIZE * sizeof(int));
13+
int *j;
1314
for(unsigned i = 0; i < SIZE; i++)
1415
// clang-format off
1516
__CPROVER_loop_invariant(i <= SIZE)
1617
// clang-format on
1718
{
19+
j = malloc(SIZE * sizeof(int));
1820
b[i] = 1;
21+
free(j);
1922
}
2023
}

‎regression/contracts-dfcc/loop_assigns_inference-02/test.desc

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ main.c
33
--no-malloc-may-fail --dfcc main --apply-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
6-
^\[foo.loop_assigns.\d+\] line 13 Check assigns clause inclusion for loop .*: SUCCESS$
7-
^\[foo.loop_assigns.\d+\] line 13 Check assigns clause inclusion for loop .*: SUCCESS$
8-
^\[foo.loop_invariant_base.\d+\] line 13 Check invariant before entry for loop .*: SUCCESS$
9-
^\[foo.loop_invariant_base.\d+\] line 13 Check invariant before entry for loop .*: SUCCESS$
10-
^\[foo.loop_invariant_step.\d+\] line 13 Check invariant after step for loop .*: SUCCESS$
11-
^\[foo.loop_step_unwinding.\d+\] line 13 Check step was unwound for loop .*: SUCCESS$
6+
^\[foo.loop_assigns.\d+\] line 14 Check assigns clause inclusion for loop .*: SUCCESS$
7+
^\[foo.loop_assigns.\d+\] line 14 Check assigns clause inclusion for loop .*: SUCCESS$
8+
^\[foo.loop_invariant_base.\d+\] line 14 Check invariant before entry for loop .*: SUCCESS$
9+
^\[foo.loop_invariant_base.\d+\] line 14 Check invariant before entry for loop .*: SUCCESS$
10+
^\[foo.loop_invariant_step.\d+\] line 14 Check invariant after step for loop .*: SUCCESS$
11+
^\[foo.loop_step_unwinding.\d+\] line 14 Check step was unwound for loop .*: SUCCESS$
1212
^\[foo.assigns.\d+\] .* Check that i is assignable: SUCCESS$
1313
^\[foo.assigns.\d+\] .* Check that b\[(.*)i\] is assignable: SUCCESS$
1414
^VERIFICATION SUCCESSFUL$

‎regression/contracts-dfcc/loop_assigns_inference-03/main.c

+1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ void main()
1212
{
1313
b[i] = 1;
1414
}
15+
assert(b[0] = 1);
1516
}

‎regression/contracts-dfcc/loop_assigns_target_base_idents/main.c

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ int foo() __CPROVER_assigns()
66
char buf1[SIZE];
77
char buf2[SIZE];
88
char buf3[SIZE];
9+
buf1[0] = 0;
10+
buf2[0] = 0;
11+
buf3[0] = 0;
912
size_t i = 0;
1013
while(i < SIZE)
1114
// clang-format off

‎regression/contracts-dfcc/quantifiers-loop-02/main.c

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
void main()
55
{
66
int N, a[MAX_ARRAY_SIZE];
7+
a[0] = nondet_int();
78
__CPROVER_assume(0 <= N && N < MAX_ARRAY_SIZE);
89

910
for(int i = 0; i < N; ++i)

‎regression/contracts-dfcc/quantifiers-loop-02/test.desc

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ main.c
33
--dfcc main --apply-loop-contracts _ --z3
44
^EXIT=0$
55
^SIGNAL=0$
6-
^\[main.loop_assigns.\d+\] line 9 Check assigns clause inclusion for loop .*: SUCCESS$
7-
^\[main.loop_assigns.\d+\] line 9 Check assigns clause inclusion for loop .*: SUCCESS$
8-
^\[main.loop_invariant_base.\d+\] line 9 Check invariant before entry for loop .*: SUCCESS$
9-
^\[main.loop_invariant_base.\d+\] line 9 Check invariant before entry for loop .*: SUCCESS$
10-
^\[main.loop_invariant_step.\d+\] line 9 Check invariant after step for loop .*: SUCCESS$
11-
^\[main.loop_step_unwinding.\d+\] line 9 Check step was unwound for loop .*: SUCCESS$
6+
^\[main.loop_assigns.\d+\] line 10 Check assigns clause inclusion for loop .*: SUCCESS$
7+
^\[main.loop_assigns.\d+\] line 10 Check assigns clause inclusion for loop .*: SUCCESS$
8+
^\[main.loop_invariant_base.\d+\] line 10 Check invariant before entry for loop .*: SUCCESS$
9+
^\[main.loop_invariant_base.\d+\] line 10 Check invariant before entry for loop .*: SUCCESS$
10+
^\[main.loop_invariant_step.\d+\] line 10 Check invariant after step for loop .*: SUCCESS$
11+
^\[main.loop_step_unwinding.\d+\] line 10 Check step was unwound for loop .*: SUCCESS$
1212
^\[main.assigns.\d+\] line .* Check that i is assignable: SUCCESS$
1313
^\[main.assigns.\d+\] line .* Check that a\[(\(signed (long (long )?)?int\))?i\] is assignable: SUCCESS$
1414
^\[main.assertion.\d+\] line .* assertion .*: SUCCESS$

0 commit comments

Comments
 (0)