Skip to content

Commit 285c6ca

Browse files
Add tests for shadow memory for nondet-size arrays
Checks that variables-sized arrrays are handled correctly.
1 parent 632e76d commit 285c6ca

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#include <assert.h>
2+
#include <stdlib.h>
3+
4+
int main()
5+
{
6+
__CPROVER_field_decl_local("field1", (char)0);
7+
__CPROVER_field_decl_local("field2", (__CPROVER_bitvector[6])0);
8+
__CPROVER_field_decl_global("field1", (char)0);
9+
__CPROVER_field_decl_global("field2", (__CPROVER_bitvector[6])0);
10+
11+
/***********************
12+
* Variable-size arrays
13+
***********************/
14+
15+
int n;
16+
__CPROVER_assume(5 <= n && n < 10);
17+
int A[n];
18+
19+
int *z = &(A[4]);
20+
21+
assert(__CPROVER_get_field(z, "field1") == 0);
22+
assert(__CPROVER_get_field(z, "field2") == 0);
23+
24+
__CPROVER_set_field(&(A[3]), "field1", 13);
25+
__CPROVER_set_field(&(A[3]), "field2", 14);
26+
__CPROVER_set_field(z, "field1", 15);
27+
__CPROVER_set_field(z, "field2", 16);
28+
29+
z = A;
30+
31+
assert(__CPROVER_get_field(z + 3, "field1") == 13);
32+
assert(__CPROVER_get_field(z + 3, "field2") == 14);
33+
assert(__CPROVER_get_field(z + 4, "field1") == 15);
34+
assert(__CPROVER_get_field(z + 4, "field2") == 16);
35+
36+
int i;
37+
__CPROVER_assume(0 <= i && i < n);
38+
__CPROVER_set_field(&(A[i]), "field1", 42);
39+
assert(__CPROVER_get_field(&(A[i]), "field1") == 42);
40+
41+
z = &(A[i]);
42+
__CPROVER_set_field(z, "field1", 43);
43+
assert(__CPROVER_get_field(z, "field1") == 43);
44+
45+
/***********************
46+
* Variable-size arrays with malloc
47+
***********************/
48+
49+
int *B = malloc(n * sizeof(int));
50+
51+
z = &(B[4]);
52+
53+
assert(__CPROVER_get_field(z, "field1") == 0);
54+
assert(__CPROVER_get_field(z, "field2") == 0);
55+
56+
__CPROVER_set_field(&(B[3]), "field1", 13);
57+
__CPROVER_set_field(&(B[3]), "field2", 14);
58+
__CPROVER_set_field(z, "field1", 15);
59+
__CPROVER_set_field(z, "field2", 16);
60+
61+
z = B;
62+
63+
assert(__CPROVER_get_field(z + 3, "field1") == 13);
64+
assert(__CPROVER_get_field(z + 3, "field2") == 14);
65+
assert(__CPROVER_get_field(z + 4, "field1") == 15);
66+
assert(__CPROVER_get_field(z + 4, "field2") == 16);
67+
68+
int i;
69+
__CPROVER_assume(0 <= i && i < n);
70+
__CPROVER_set_field(&(B[i]), "field1", 42);
71+
assert(__CPROVER_get_field(&(B[i]), "field1") == 42);
72+
73+
z = &(B[i]);
74+
__CPROVER_set_field(z, "field1", 43);
75+
assert(__CPROVER_get_field(z, "field1") == 43);
76+
77+
/***********************
78+
* Variable-size arrays with alloca
79+
***********************/
80+
81+
int *C = alloca(n * sizeof(int));
82+
83+
z = &(C[4]);
84+
85+
assert(__CPROVER_get_field(z, "field1") == 0);
86+
assert(__CPROVER_get_field(z, "field2") == 0);
87+
88+
__CPROVER_set_field(&(C[3]), "field1", 13);
89+
__CPROVER_set_field(&(C[3]), "field2", 14);
90+
__CPROVER_set_field(z, "field1", 15);
91+
__CPROVER_set_field(z, "field2", 16);
92+
93+
z = C;
94+
95+
assert(__CPROVER_get_field(z + 3, "field1") == 13);
96+
assert(__CPROVER_get_field(z + 3, "field2") == 14);
97+
assert(__CPROVER_get_field(z + 4, "field1") == 15);
98+
assert(__CPROVER_get_field(z + 4, "field2") == 16);
99+
100+
int i;
101+
__CPROVER_assume(0 <= i && i < n);
102+
__CPROVER_set_field(&(C[i]), "field1", 42);
103+
assert(__CPROVER_get_field(&(C[i]), "field1") == 42);
104+
105+
z = &(C[i]);
106+
__CPROVER_set_field(z, "field1", 43);
107+
assert(__CPROVER_get_field(z, "field1") == 43);
108+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FUTURE
2+
main.c
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^VERIFICATION SUCCESSFUL$
7+
--
8+
^warning: ignoring

0 commit comments

Comments
 (0)