Skip to content

Commit f0eb832

Browse files
committed
Unit test of byte operator lowering
1 parent 4606f58 commit f0eb832

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ SRC += analyses/ai/ai.cpp \
3131
path_strategies.cpp \
3232
pointer-analysis/value_set.cpp \
3333
solvers/floatbv/float_utils.cpp \
34+
solvers/lowering/byte_operators.cpp \
3435
solvers/miniBDD/miniBDD.cpp \
3536
solvers/refinement/array_pool/array_pool.cpp \
3637
solvers/refinement/string_constraint_generator_valueof/calculate_max_string_length.cpp \
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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+
unsignedbv_typet u8(8);
57+
unsignedbv_typet u32(32);
58+
unsignedbv_typet u64(64);
59+
60+
exprt size = from_integer(8, u32);
61+
62+
std::vector<typet> types = {
63+
struct_typet({ {"comp1", u32}, {"comp2", u64} }),
64+
struct_typet({ {"comp1", u32}, {"compX", c_bit_field_typet(u8, 4)}, {"pad", c_bit_field_typet(u8, 4)}, {"comp2", u8} }),
65+
union_typet({ {"compA", u32}, {"compB", u64} }),
66+
c_enum_typet(unsignedbv_typet(16)),
67+
array_typet(u8, size),
68+
array_typet(u64, size),
69+
unsignedbv_typet(24),
70+
signedbv_typet(128),
71+
ieee_float_spect::single_precision().to_type(),
72+
pointer_typet(u64, 64),
73+
vector_typet(u8, size),
74+
vector_typet(u64, size),
75+
complex_typet(u32)
76+
};
77+
78+
simplify_exprt simp(ns);
79+
for(const auto &t1 : types)
80+
{
81+
exprt s = simp.bits2expr(t1);
82+
for(const auto &t2 : types)
83+
{
84+
}
85+
}
86+
}
87+
88+
SCENARIO("byte_update_lowering", "[core][solvers][lowering][byte_update]")
89+
{
90+
const symbol_tablet symbol_table;
91+
const namespacet ns(symbol_table);
92+
93+
GIVEN("A byte_update of a POD")
94+
{
95+
const exprt deadbeef = from_integer(0xdeadbeef, unsignedbv_typet(32));
96+
const byte_update_exprt bu1(
97+
ID_byte_update_little_endian,
98+
deadbeef,
99+
from_integer(1, index_type()),
100+
from_integer(0x42, unsignedbv_typet(8)));
101+
102+
THEN("byte_update lowering yields the expected value")
103+
{
104+
const exprt lower_bu1 = lower_byte_operators(bu1, ns);
105+
const exprt lower_bu1_s = simplify_expr(lower_bu1, ns);
106+
107+
REQUIRE(!has_subexpr(lower_bu1, ID_byte_extract_little_endian));
108+
REQUIRE(!has_subexpr(lower_bu1, ID_byte_update_little_endian));
109+
REQUIRE(lower_bu1.type() == bu1.type());
110+
REQUIRE(lower_bu1_s == from_integer(0xdead42ef, unsignedbv_typet(32)));
111+
112+
#if 0
113+
// this is currently broken, #2058 will fix it
114+
byte_update_exprt bu2 = bu1;
115+
bu2.id(ID_byte_update_big_endian);
116+
const exprt lower_bu2 = lower_byte_operators(bu2, ns);
117+
const exprt lower_bu2_s = simplify_expr(lower_bu2, ns);
118+
119+
REQUIRE(!has_subexpr(lower_bu2, ID_byte_extract_big_endian));
120+
REQUIRE(!has_subexpr(lower_bu2, ID_byte_update_big_endian));
121+
REQUIRE(lower_bu2.type() == bu2.type());
122+
REQUIRE(lower_bu2_s == from_integer(0xde42beef, unsignedbv_typet(32)));
123+
#endif
124+
}
125+
}
126+
}

0 commit comments

Comments
 (0)