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