@@ -14,11 +14,18 @@ union UNIONNAME
14
14
char x3 [3 ];
15
15
};
16
16
17
+ // [Shadow] Memory layout (PP is padding)
18
+ // u = [ byte1 byte2 byte3 byte4 byte5 byte6 ]
19
+ // u.x1 = [ X1 X1 X1 X1 PP PP ]
20
+ // u.x2 = [ Y1 PP Y2 Y2 Y3 Y3 ]
21
+ // u.x3 = [ X3[0] X3[1] X3[2] PP PP PP ]
22
+
17
23
int main ()
18
24
{
19
25
__CPROVER_field_decl_local ("field2" , (__CPROVER_bitvector [6 ])0 );
20
26
21
27
union UNIONNAME u ;
28
+ // u = [0x00 0x00 0x00 0x00 0x00 0x00]
22
29
23
30
assert (__CPROVER_get_field (& u , "field2" ) == 0 );
24
31
assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 0 );
@@ -32,6 +39,7 @@ int main()
32
39
assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 0 );
33
40
34
41
__CPROVER_set_field (& (u .x1 ), "field2" , 1 );
42
+ // u = [0x02 0x01 0x01 0x01 0x00 0x00]
35
43
assert (__CPROVER_get_field (& u , "field2" ) == 1 );
36
44
assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 1 );
37
45
assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 1 );
@@ -44,6 +52,7 @@ int main()
44
52
assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 1 );
45
53
46
54
__CPROVER_set_field (& (u .x2 .y1 ), "field2" , 2 );
55
+ // u = [0x02 0x01 0x01 0x01 0x00 0x00]
47
56
assert (__CPROVER_get_field (& u , "field2" ) == 2 );
48
57
assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 2 );
49
58
assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 2 );
@@ -56,8 +65,9 @@ int main()
56
65
assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 1 );
57
66
58
67
__CPROVER_set_field (& (u .x2 .y2 ), "field2" , 3 );
68
+ // u = [0x02 0x01 0x03 0x03 0x00 0x00]
59
69
assert (__CPROVER_get_field (& u , "field2" ) == 3 );
60
- assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 2 );
70
+ assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 3 );
61
71
assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 3 );
62
72
assert (__CPROVER_get_field (& (u .x2 .y1 ), "field2" ) == 2 );
63
73
assert (__CPROVER_get_field (& (u .x2 .y2 ), "field2" ) == 3 );
@@ -68,8 +78,9 @@ int main()
68
78
assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 3 );
69
79
70
80
__CPROVER_set_field (& (u .x2 .y3 ), "field2" , 4 );
81
+ // u = [0x02 0x01 0x03 0x03 0x04 0x04]
71
82
assert (__CPROVER_get_field (& u , "field2" ) == 4 );
72
- assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 2 );
83
+ assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 3 );
73
84
assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 4 );
74
85
assert (__CPROVER_get_field (& (u .x2 .y1 ), "field2" ) == 2 );
75
86
assert (__CPROVER_get_field (& (u .x2 .y2 ), "field2" ) == 3 );
@@ -78,4 +89,21 @@ int main()
78
89
assert (__CPROVER_get_field (& (u .x3 [0 ]), "field2" ) == 2 );
79
90
assert (__CPROVER_get_field (& (u .x3 [1 ]), "field2" ) == 1 );
80
91
assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 3 );
92
+
93
+ __CPROVER_set_field (& (u .x3 [1 ]), "field2" , 5 );
94
+ // u = [0x02 0x05 0x03 0x03 0x04 0x04]
95
+ assert (__CPROVER_get_field (& u , "field2" ) == 5 );
96
+ assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 5 );
97
+ assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 5 );
98
+ assert (__CPROVER_get_field (& (u .x2 .y1 ), "field2" ) == 2 );
99
+ assert (__CPROVER_get_field (& (u .x2 .y2 ), "field2" ) == 3 );
100
+ assert (__CPROVER_get_field (& (u .x2 .y3 ), "field2" ) == 4 );
101
+ // Not allowed: assert(__CPROVER_get_field(u.x3, "field2") == 5);
102
+ assert (__CPROVER_get_field (& (u .x3 [0 ]), "field2" ) == 2 );
103
+ assert (__CPROVER_get_field (& (u .x3 [1 ]), "field2" ) == 5 );
104
+ assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 3 );
105
+
106
+ // Failing assertion added to get trace and to test what the inner
107
+ // representation is.
108
+ assert (__CPROVER_get_field (& u , "field2" ) == 42 );
81
109
}
0 commit comments