1+ #include <assert.h>
2+
3+ struct S
4+ {
5+ short x [3 ];
6+ char c ;
7+ };
8+
9+ int main (void )
10+ {
11+ __CPROVER_field_decl_local ("f" , (char )0 );
12+
13+ struct S s ;
14+
15+ // Setting the struct recursively set all its fields
16+ __CPROVER_set_field (& s , "f" , 1 );
17+
18+ assert (__CPROVER_get_field (& s .x [0 ], "f" ) == 1 );
19+ assert (__CPROVER_get_field (& s .x [1 ], "f" ) == 1 );
20+ assert (__CPROVER_get_field (& s .x [2 ], "f" ) == 1 );
21+ assert (__CPROVER_get_field (& s .c , "f" ) == 1 );
22+ assert (__CPROVER_get_field (& s , "f" ) == 1 );
23+
24+ // Setting the struct recursively set all its fields
25+ __CPROVER_set_field (& s , "f" , 0 );
26+
27+ assert (__CPROVER_get_field (& s .x [0 ], "f" ) == 0 );
28+ assert (__CPROVER_get_field (& s .x [1 ], "f" ) == 0 );
29+ assert (__CPROVER_get_field (& s .x [2 ], "f" ) == 0 );
30+ assert (__CPROVER_get_field (& s .c , "f" ) == 0 );
31+ assert (__CPROVER_get_field (& s , "f" ) == 0 );
32+
33+ // Setting a field of the struct changes its values ad after aggregation the whole struct value
34+ __CPROVER_set_field (& s .x [1 ], "f" , 2 );
35+
36+ assert (__CPROVER_get_field (& s .x [0 ], "f" ) == 0 );
37+ assert (__CPROVER_get_field (& s .x [1 ], "f" ) == 2 );
38+ assert (__CPROVER_get_field (& s .x [2 ], "f" ) == 0 );
39+ assert (__CPROVER_get_field (& s .c , "f" ) == 0 );
40+ assert (__CPROVER_get_field (& s , "f" ) == 2 );
41+
42+ // Rest shadow memory
43+ __CPROVER_set_field (& s , "f" , 0 );
44+
45+ // Changing ONLY first cell of S array at field x by using offset with pointer arithmetics
46+ short * p = ((short * )& s ) + 1 ;
47+ __CPROVER_set_field (p , "f" , 3 );
48+
49+ assert (__CPROVER_get_field (& s .x [0 ], "f" ) == 0 );
50+ assert (__CPROVER_get_field (& s .x [1 ], "f" ) == 3 );
51+ assert (__CPROVER_get_field (& s .x [2 ], "f" ) == 0 );
52+ assert (__CPROVER_get_field (& s .c , "f" ) == 0 );
53+ assert (__CPROVER_get_field (& s , "f" ) == 3 );
54+
55+ return 0 ;
56+ }
0 commit comments