Skip to content

Commit 98f8c57

Browse files
authored
Merge pull request #6009 from tautschnig/byte-operator-bits-per-byte
Configure bits_per_byte in byte_extract/byte_update expression
2 parents a347a63 + a8631c5 commit 98f8c57

File tree

12 files changed

+359
-168
lines changed

12 files changed

+359
-168
lines changed

jbmc/unit/java_bytecode/java_trace_validation/java_trace_validation.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@ Author: Diffblue Ltd.
66
77
\*******************************************************************/
88

9+
#include <util/byte_operators.h>
10+
#include <util/pointer_expr.h>
11+
#include <util/symbol_table.h>
12+
913
#include <goto-programs/goto_trace.h>
1014

1115
#include <java_bytecode/java_trace_validation.h>
1216
#include <java_bytecode/java_types.h>
13-
1417
#include <testing-utils/message.h>
1518
#include <testing-utils/use_catch.h>
1619

17-
#include <util/byte_operators.h>
18-
#include <util/pointer_expr.h>
19-
#include <util/symbol_table.h>
20+
#include <climits>
2021

2122
TEST_CASE("java trace validation", "[core][java_trace_validation]")
2223
{
@@ -36,9 +37,9 @@ TEST_CASE("java trace validation", "[core][java_trace_validation]")
3637
const index_exprt index_plain =
3738
index_exprt(exprt(ID_nil, array_typet(typet(), nil_exprt())), exprt());
3839
const byte_extract_exprt byte_little_endian = byte_extract_exprt(
39-
ID_byte_extract_little_endian, exprt(), exprt(), typet());
40-
const byte_extract_exprt byte_big_endian =
41-
byte_extract_exprt(ID_byte_extract_big_endian, exprt(), exprt(), typet());
40+
ID_byte_extract_little_endian, exprt(), exprt(), CHAR_BIT, typet());
41+
const byte_extract_exprt byte_big_endian = byte_extract_exprt(
42+
ID_byte_extract_big_endian, exprt(), exprt(), CHAR_BIT, typet());
4243
const address_of_exprt valid_address = address_of_exprt(valid_symbol_expr);
4344
const address_of_exprt invalid_address = address_of_exprt(exprt());
4445
const struct_exprt struct_plain =

src/analyses/goto_rw.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ void rw_range_sett::get_objects_byte_extract(
161161
}
162162
else
163163
{
164-
*index *= 8;
164+
*index *= be.get_bits_per_byte();
165165
if(*index >= *object_size_bits_opt)
166166
return;
167167

src/goto-symex/symex_assign.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,8 @@ void symex_assignt::assign_byte_extract(
383383
else
384384
UNREACHABLE;
385385

386-
const byte_update_exprt new_rhs{byte_update_id, lhs.op(), lhs.offset(), rhs};
386+
const byte_update_exprt new_rhs{
387+
byte_update_id, lhs.op(), lhs.offset(), rhs, lhs.get_bits_per_byte()};
387388
const expr_skeletont new_skeleton =
388389
full_lhs.compose(expr_skeletont::remove_op0(lhs));
389390
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;
@@ -83,6 +84,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
8384
expr.id(),
8485
o.root_object(),
8586
plus_exprt(o.offset(), expr.offset()),
87+
expr.get_bits_per_byte(),
8688
expr.type());
8789

8890
return convert_bv(be);
@@ -104,11 +106,9 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
104106
bv.resize(width);
105107

106108
// see if the byte number is constant
107-
unsigned byte_width=8;
108-
109109
if(index.has_value())
110110
{
111-
const mp_integer offset = *index * byte_width;
111+
const mp_integer offset = *index * expr.get_bits_per_byte();
112112

113113
for(std::size_t i=0; i<width; i++)
114114
// out of bounds?
@@ -119,7 +119,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
119119
}
120120
else
121121
{
122-
std::size_t bytes=op_bv.size()/byte_width;
122+
std::size_t bytes = op_bv.size() / expr.get_bits_per_byte();
123123

124124
if(prop.has_set_to())
125125
{
@@ -136,7 +136,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
136136

137137
for(std::size_t i=0; i<bytes; i++)
138138
{
139-
std::size_t offset=i*byte_width;
139+
std::size_t offset = i * expr.get_bits_per_byte();
140140

141141
for(std::size_t j=0; j<width; j++)
142142
if(offset+j<op_bv.size())
@@ -159,7 +159,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
159159
literalt e =
160160
convert(equal_exprt(expr.offset(), from_integer(i, constant_type)));
161161

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

164164
for(std::size_t j=0; j<width; j++)
165165
{

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)