Skip to content

Commit 33eb105

Browse files
committed
Configure bits_per_byte in byte_extract/byte_update expression
Semantically evaluating a byte_extract/byte_update expression requires knowledge of the number of bits that a byte is composed of. This, however, is a configuration parameter known to the front-end that created the expression in the first place. The back-end should not need to consult configuration information to evaluate the expression.
1 parent dc12603 commit 33eb105

File tree

12 files changed

+320
-146
lines changed

12 files changed

+320
-146
lines changed

jbmc/unit/java_bytecode/java_trace_validation/java_trace_validation.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ Author: Diffblue Ltd.
1717
#include <util/byte_operators.h>
1818
#include <util/pointer_expr.h>
1919

20+
#include <climits>
21+
2022
TEST_CASE("java trace validation", "[core][java_trace_validation]")
2123
{
2224
const exprt plain_expr = exprt();
@@ -33,9 +35,9 @@ TEST_CASE("java trace validation", "[core][java_trace_validation]")
3335
index_exprt(valid_symbol_expr, valid_constant);
3436
const index_exprt index_plain = index_exprt(exprt(), exprt());
3537
const byte_extract_exprt byte_little_endian = byte_extract_exprt(
36-
ID_byte_extract_little_endian, exprt(), exprt(), typet());
37-
const byte_extract_exprt byte_big_endian =
38-
byte_extract_exprt(ID_byte_extract_big_endian, exprt(), exprt(), typet());
38+
ID_byte_extract_little_endian, exprt(), exprt(), CHAR_BIT, typet());
39+
const byte_extract_exprt byte_big_endian = byte_extract_exprt(
40+
ID_byte_extract_big_endian, exprt(), exprt(), CHAR_BIT, typet());
3941
const address_of_exprt valid_address = address_of_exprt(valid_symbol_expr);
4042
const address_of_exprt invalid_address = address_of_exprt(exprt());
4143
const struct_exprt struct_plain =

src/analyses/goto_rw.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ void rw_range_sett::get_objects_byte_extract(
154154
get_objects_rec(mode, be.op(), -1, size);
155155
else
156156
{
157-
*index *= 8;
157+
*index *= be.get_bits_per_byte();
158158
if(*index >= *pointer_offset_bits(be.op().type(), ns))
159159
return;
160160

src/goto-symex/symex_assign.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ void symex_assignt::assign_byte_extract(
378378
else
379379
UNREACHABLE;
380380

381-
const byte_update_exprt new_rhs{byte_update_id, lhs.op(), lhs.offset(), rhs};
381+
const byte_update_exprt new_rhs{
382+
byte_update_id, lhs.op(), lhs.offset(), rhs, lhs.get_bits_per_byte()};
382383
const expr_skeletont new_skeleton =
383384
full_lhs.compose(expr_skeletont::remove_op0(lhs));
384385
assign_rec(lhs.op(), new_skeleton, new_rhs, guard);

src/solvers/flattening/boolbv_byte_extract.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
4848
#if 0
4949
if(expr.id()==ID_byte_extract_big_endian &&
5050
expr.type().id()==ID_c_bit_field &&
51-
(width%8)!=0)
51+
(width%expr.get_bits_per_byte())!=0)
5252
{
5353
byte_extract_exprt tmp=expr;
5454
// round up
55-
to_c_bit_field_type(tmp.type()).set_width(width+8-width%8);
55+
to_c_bit_field_type(tmp.type()).set_width(
56+
width+expr.get_bits_per_byte()-width%expr.get_bits_per_byte());
5657
convert_byte_extract(tmp, bv);
5758
bv.resize(width); // chop down
5859
return;
@@ -86,6 +87,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
8687
expr.id(),
8788
o.root_object(),
8889
plus_exprt(o.offset(), expr.offset()),
90+
expr.get_bits_per_byte(),
8991
expr.type());
9092

9193
return convert_bv(be);
@@ -107,11 +109,9 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
107109
bv.resize(width);
108110

109111
// see if the byte number is constant
110-
unsigned byte_width=8;
111-
112112
if(index.has_value())
113113
{
114-
const mp_integer offset = *index * byte_width;
114+
const mp_integer offset = *index * expr.get_bits_per_byte();
115115

116116
for(std::size_t i=0; i<width; i++)
117117
// out of bounds?
@@ -122,7 +122,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
122122
}
123123
else
124124
{
125-
std::size_t bytes=op_bv.size()/byte_width;
125+
std::size_t bytes = op_bv.size() / expr.get_bits_per_byte();
126126

127127
if(prop.has_set_to())
128128
{
@@ -139,7 +139,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
139139

140140
for(std::size_t i=0; i<bytes; i++)
141141
{
142-
std::size_t offset=i*byte_width;
142+
std::size_t offset = i * expr.get_bits_per_byte();
143143

144144
for(std::size_t j=0; j<width; j++)
145145
if(offset+j<op_bv.size())
@@ -162,7 +162,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
162162
literalt e =
163163
convert(equal_exprt(expr.offset(), from_integer(i, constant_type)));
164164

165-
std::size_t offset=i*byte_width;
165+
std::size_t offset = i * expr.get_bits_per_byte();
166166

167167
for(std::size_t j=0; j<width; j++)
168168
{

src/solvers/flattening/boolbv_byte_update.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ bvt boolbvt::convert_byte_update(const byte_update_exprt &expr)
3838

3939
const bvt &value_bv=convert_bv(value);
4040
std::size_t update_width=value_bv.size();
41-
std::size_t byte_width=8;
41+
std::size_t byte_width = expr.get_bits_per_byte();
4242

4343
if(update_width>bv.size())
4444
update_width=bv.size();
@@ -49,7 +49,7 @@ bvt boolbvt::convert_byte_update(const byte_update_exprt &expr)
4949
if(index.has_value())
5050
{
5151
// yes!
52-
const mp_integer offset = *index * 8;
52+
const mp_integer offset = *index * byte_width;
5353

5454
if(offset+update_width>mp_integer(bv.size()) || offset<0)
5555
{

0 commit comments

Comments
 (0)