Skip to content

Commit f743b53

Browse files
Add tests for shadow memory for unions
More or less systematically checks that byte-based shadow memory access to unions works correctly.
1 parent 87f54ff commit f743b53

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <assert.h>
2+
3+
union UNIONNAME
4+
{
5+
int x1;
6+
struct
7+
{
8+
char y1;
9+
// char padding;
10+
short y2;
11+
short y3;
12+
} x2;
13+
char x3[3];
14+
};
15+
16+
int main()
17+
{
18+
__CPROVER_field_decl_local("field1", (_Bool)0);
19+
20+
union UNIONNAME u;
21+
22+
__CPROVER_set_field(&u, "field1", (_Bool)1);
23+
assert(__CPROVER_get_field(&u.x1, "field1"));
24+
assert(__CPROVER_get_field((((char *)&u.x1) + 1), "field1"));
25+
assert(__CPROVER_get_field((((char *)&u.x1) + 2), "field1"));
26+
assert(__CPROVER_get_field((((char *)&u.x1) + 3), "field1"));
27+
assert(__CPROVER_get_field(&u.x2, "field1"));
28+
assert(__CPROVER_get_field(&u.x2.y1, "field1"));
29+
assert(__CPROVER_get_field(&u.x2.y2, "field1"));
30+
assert(__CPROVER_get_field((((char *)&u.x2.y2) + 1), "field1"));
31+
assert(__CPROVER_get_field(&u.x2.y3, "field1"));
32+
assert(__CPROVER_get_field((((char *)&u.x2.y3) + 1), "field1"));
33+
assert(__CPROVER_get_field(&u.x3[0], "field1"));
34+
assert(__CPROVER_get_field(&u.x3[1], "field1"));
35+
assert(__CPROVER_get_field(&u.x3[2], "field1"));
36+
37+
__CPROVER_set_field(&u.x2, "field1", (_Bool)0);
38+
assert(!__CPROVER_get_field(&u.x1, "field1"));
39+
assert(!__CPROVER_get_field((((char *)&u.x1) + 1), "field1"));
40+
assert(!__CPROVER_get_field((((char *)&u.x1) + 2), "field1"));
41+
assert(!__CPROVER_get_field((((char *)&u.x1) + 3), "field1"));
42+
assert(!__CPROVER_get_field(&u.x2, "field1"));
43+
assert(!__CPROVER_get_field(&u.x2.y1, "field1"));
44+
assert(!__CPROVER_get_field(&u.x2.y2, "field1"));
45+
assert(!__CPROVER_get_field((((char *)&u.x2.y2) + 1), "field1"));
46+
assert(!__CPROVER_get_field(&u.x2.y3, "field1"));
47+
assert(!__CPROVER_get_field((((char *)&u.x2.y3) + 1), "field1"));
48+
assert(!__CPROVER_get_field(&u.x3[0], "field1"));
49+
assert(!__CPROVER_get_field(&u.x3[1], "field1"));
50+
assert(!__CPROVER_get_field(&u.x3[2], "field1"));
51+
return 0;
52+
}
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)