@@ -14,11 +14,18 @@ union UNIONNAME
1414 char x3 [3 ];
1515};
1616
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+
1723int main ()
1824{
1925 __CPROVER_field_decl_local ("field2" , (__CPROVER_bitvector [6 ])0 );
2026
2127 union UNIONNAME u ;
28+ // u = [0x00 0x00 0x00 0x00 0x00 0x00]
2229
2330 assert (__CPROVER_get_field (& u , "field2" ) == 0 );
2431 assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 0 );
@@ -32,6 +39,7 @@ int main()
3239 assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 0 );
3340
3441 __CPROVER_set_field (& (u .x1 ), "field2" , 1 );
42+ // u = [0x02 0x01 0x01 0x01 0x00 0x00]
3543 assert (__CPROVER_get_field (& u , "field2" ) == 1 );
3644 assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 1 );
3745 assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 1 );
@@ -44,6 +52,7 @@ int main()
4452 assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 1 );
4553
4654 __CPROVER_set_field (& (u .x2 .y1 ), "field2" , 2 );
55+ // u = [0x02 0x01 0x01 0x01 0x00 0x00]
4756 assert (__CPROVER_get_field (& u , "field2" ) == 2 );
4857 assert (__CPROVER_get_field (& (u .x1 ), "field2" ) == 2 );
4958 assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 2 );
@@ -56,8 +65,9 @@ int main()
5665 assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 1 );
5766
5867 __CPROVER_set_field (& (u .x2 .y2 ), "field2" , 3 );
68+ // u = [0x02 0x01 0x03 0x03 0x00 0x00]
5969 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 );
6171 assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 3 );
6272 assert (__CPROVER_get_field (& (u .x2 .y1 ), "field2" ) == 2 );
6373 assert (__CPROVER_get_field (& (u .x2 .y2 ), "field2" ) == 3 );
@@ -68,8 +78,9 @@ int main()
6878 assert (__CPROVER_get_field (& (u .x3 [2 ]), "field2" ) == 3 );
6979
7080 __CPROVER_set_field (& (u .x2 .y3 ), "field2" , 4 );
81+ // u = [0x02 0x01 0x03 0x03 0x04 0x04]
7182 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 );
7384 assert (__CPROVER_get_field (& (u .x2 ), "field2" ) == 4 );
7485 assert (__CPROVER_get_field (& (u .x2 .y1 ), "field2" ) == 2 );
7586 assert (__CPROVER_get_field (& (u .x2 .y2 ), "field2" ) == 3 );
@@ -78,4 +89,21 @@ int main()
7889 assert (__CPROVER_get_field (& (u .x3 [0 ]), "field2" ) == 2 );
7990 assert (__CPROVER_get_field (& (u .x3 [1 ]), "field2" ) == 1 );
8091 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 );
81109}
0 commit comments