Skip to content

Commit 9e1c895

Browse files
author
Enrico Steffinlongo
committed
Fix wrong shadow memory regression test
Fix shadow memory regression tests that was not aggregating correctly when the type of the element is a non-compound bit vector of size > 1 byte. Also added extra checks on the regression test.
1 parent 85d72be commit 9e1c895

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

regression/cbmc-shadow-memory/union-get-max1/main.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1723
int 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
}

regression/cbmc-shadow-memory/union-get-max1/test.desc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
CORE
22
main.c
3-
4-
^EXIT=0$
3+
--trace
4+
^EXIT=10$
55
^SIGNAL=0$
6-
^VERIFICATION SUCCESSFUL$
6+
^VERIFICATION FAILED$
7+
SM__&u!0@1__field2\.x2=\{ \.y1=1, \.\$pad1=1, \.y2=257, \.y3=0 \} \(\{ 00000001, 00000001, 00000001 00000001, 00000000 00000000 \}\)$
8+
SM__&u!0@1__field2\.x2=\{ \.y1=2, \.\$pad1=1, \.y2=257, \.y3=0 \} \(\{ 00000010, 00000001, 00000001 00000001, 00000000 00000000 \}\)$
9+
SM__&u!0@1__field2\.x2=\{ \.y1=2, \.\$pad1=1, \.y2=771, \.y3=0 \} \(\{ 00000010, 00000001, 00000011 00000011, 00000000 00000000 \}\)$
10+
SM__&u!0@1__field2\.x2=\{ \.y1=2, \.\$pad1=1, \.y2=771, \.y3=1028 \} \(\{ 00000010, 00000001, 00000011 00000011, 00000100 00000100 \}\)$
11+
SM__&u!0@1__field2\.x2=\{ \.y1=2, \.\$pad1=5, \.y2=771, \.y3=1028 \} \(\{ 00000010, 00000101, 00000011 00000011, 00000100 00000100 \}\)$
712
--
813
^warning: ignoring
914
--

0 commit comments

Comments
 (0)