Skip to content

Commit 06887e8

Browse files
committed
Unit test of byte operator lowering
1 parent 16fb637 commit 06887e8

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ SRC += analyses/ai/ai.cpp \
3030
path_strategies.cpp \
3131
pointer-analysis/value_set.cpp \
3232
solvers/floatbv/float_utils.cpp \
33+
solvers/lowering/byte_operators.cpp \
3334
solvers/miniBDD/miniBDD.cpp \
3435
solvers/refinement/array_pool/array_pool.cpp \
3536
solvers/refinement/string_constraint_generator_valueof/calculate_max_string_length.cpp \
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests for byte_extract/byte_update lowering
4+
5+
Author: Michael Tautschnig
6+
7+
\*******************************************************************/
8+
9+
#include <testing-utils/catch.hpp>
10+
11+
#include <solvers/lowering/expr_lowering.h>
12+
13+
#include <util/arith_tools.h>
14+
#include <util/byte_operators.h>
15+
#include <util/c_types.h>
16+
#include <util/expr_util.h>
17+
#include <util/namespace.h>
18+
#include <util/simplify_expr.h>
19+
#include <util/std_types.h>
20+
#include <util/symbol_table.h>
21+
22+
SCENARIO("byte_extract_lowering", "[core][solvers][lowering][byte_extract]")
23+
{
24+
const symbol_tablet symbol_table;
25+
const namespacet ns(symbol_table);
26+
27+
GIVEN("A byte_extract over a POD")
28+
{
29+
const exprt deadbeef = from_integer(0xdeadbeef, unsignedbv_typet(32));
30+
const byte_extract_exprt be1(
31+
ID_byte_extract_little_endian,
32+
deadbeef,
33+
from_integer(1, index_type()),
34+
signedbv_typet(8));
35+
36+
THEN("byte_extract lowering yields the expected value")
37+
{
38+
const exprt lower_be1 = lower_byte_extract(be1, ns);
39+
const exprt lower_be1_s = simplify_expr(lower_be1, ns);
40+
41+
REQUIRE(!has_subexpr(lower_be1, ID_byte_extract_little_endian));
42+
REQUIRE(lower_be1.type() == be1.type());
43+
REQUIRE(lower_be1_s == from_integer(0xbe, signedbv_typet(8)));
44+
45+
byte_extract_exprt be2 = be1;
46+
be2.id(ID_byte_extract_big_endian);
47+
const exprt lower_be2 = lower_byte_extract(be2, ns);
48+
const exprt lower_be2_s = simplify_expr(lower_be2, ns);
49+
50+
REQUIRE(!has_subexpr(lower_be2, ID_byte_extract_big_endian));
51+
REQUIRE(lower_be2.type() == be2.type());
52+
REQUIRE(lower_be2_s == from_integer(0xad, signedbv_typet(8)));
53+
}
54+
}
55+
56+
std::vector<typet> types = {
57+
struct_typet().components() = { {"comp1", typet()}, {"comp2", typet()} },
58+
struct_typet().components() = { {"comp1", typet()}, {"compX", c_bit_field_typet(subtype, width)}, {"comp2", typet()} },
59+
union_typet().components() = { {"compA", typet()}, {"compB", typet()} },
60+
c_enum_typet(unsignedbv_typet(16)),
61+
array_typet(unsignedbv_typet(8), size),
62+
array_typet(unsignedbv_typet(64), size),
63+
unsignedbv_typet(24),
64+
signedbv_typet(128),
65+
floatbv_typet(),
66+
pointer_typet(subtype, width),
67+
vector_typet(unsignedbv_typet(8), size),
68+
vector_typet(unsignedbv_typet(64), size),
69+
complex_typet(subtype)
70+
}
71+
}
72+
73+
SCENARIO("byte_update_lowering", "[core][solvers][lowering][byte_update]")
74+
{
75+
const symbol_tablet symbol_table;
76+
const namespacet ns(symbol_table);
77+
78+
GIVEN("A byte_update of a POD")
79+
{
80+
const exprt deadbeef = from_integer(0xdeadbeef, unsignedbv_typet(32));
81+
const byte_update_exprt bu1(
82+
ID_byte_update_little_endian,
83+
deadbeef,
84+
from_integer(1, index_type()),
85+
from_integer(0x42, unsignedbv_typet(8)));
86+
87+
THEN("byte_update lowering yields the expected value")
88+
{
89+
const exprt lower_bu1 = lower_byte_operators(bu1, ns);
90+
const exprt lower_bu1_s = simplify_expr(lower_bu1, ns);
91+
92+
REQUIRE(!has_subexpr(lower_bu1, ID_byte_extract_little_endian));
93+
REQUIRE(!has_subexpr(lower_bu1, ID_byte_update_little_endian));
94+
REQUIRE(lower_bu1.type() == bu1.type());
95+
REQUIRE(lower_bu1_s == from_integer(0xdead42ef, unsignedbv_typet(32)));
96+
97+
#if 0
98+
// this is currently broken, #2058 will fix it
99+
byte_update_exprt bu2 = bu1;
100+
bu2.id(ID_byte_update_big_endian);
101+
const exprt lower_bu2 = lower_byte_operators(bu2, ns);
102+
const exprt lower_bu2_s = simplify_expr(lower_bu2, ns);
103+
104+
REQUIRE(!has_subexpr(lower_bu2, ID_byte_extract_big_endian));
105+
REQUIRE(!has_subexpr(lower_bu2, ID_byte_update_big_endian));
106+
REQUIRE(lower_bu2.type() == bu2.type());
107+
REQUIRE(lower_bu2_s == from_integer(0xde42beef, unsignedbv_typet(32)));
108+
#endif
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)