Skip to content

Commit e7d8209

Browse files
committed
make_byte_{extract,update} to build byte_{extract,update} expressions
Remove byte_{extract,update}_id from the API (marking them static) and instead add factory functions make_byte_{extract,update} to construct the full expression. These functions will ensure that both endianness and byte width are consistently configured.
1 parent 4a7b064 commit e7d8209

15 files changed

+80
-79
lines changed

src/ansi-c/c_typecheck_initializer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -542,8 +542,8 @@ exprt::operandst::const_iterator c_typecheck_baset::do_designated_initializer(
542542

543543
if(current_symbol.is_static_lifetime)
544544
{
545-
byte_update_exprt byte_update{
546-
byte_update_id(), *dest, from_integer(0, index_type()), *zero};
545+
byte_update_exprt byte_update =
546+
make_byte_update(*dest, from_integer(0, index_type()), *zero);
547547
byte_update.add_source_location() = value.source_location();
548548
*dest = std::move(byte_update);
549549
dest = &(to_byte_update_expr(*dest).op2());

src/goto-programs/rewrite_union.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,15 @@ void rewrite_union(exprt &expr)
8484
if(op.type().id() == ID_union_tag || op.type().id() == ID_union)
8585
{
8686
exprt offset=from_integer(0, index_type());
87-
byte_extract_exprt tmp(byte_extract_id(), op, offset, expr.type());
88-
expr=tmp;
87+
expr = make_byte_extract(op, offset, expr.type());
8988
}
9089
}
9190
else if(expr.id()==ID_union)
9291
{
9392
const union_exprt &union_expr=to_union_expr(expr);
9493
exprt offset=from_integer(0, index_type());
9594
side_effect_expr_nondett nondet(expr.type(), expr.source_location());
96-
byte_update_exprt tmp(
97-
byte_update_id(), nondet, offset, union_expr.op());
98-
expr=tmp;
95+
expr = make_byte_update(nondet, offset, union_expr.op());
9996
}
10097
}
10198

src/goto-symex/symex_clean_expr.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ process_array_expr(exprt &expr, bool do_simplify, const namespacet &ns)
4242

4343
if(if_expr.true_case() != if_expr.false_case())
4444
{
45-
byte_extract_exprt be(
46-
byte_extract_id(),
45+
byte_extract_exprt be = make_byte_extract(
4746
if_expr.false_case(),
4847
from_integer(0, index_type()),
4948
if_expr.true_case().type());
@@ -91,8 +90,7 @@ process_array_expr(exprt &expr, bool do_simplify, const namespacet &ns)
9190
CHECK_RETURN(array_size.has_value());
9291
if(do_simplify)
9392
simplify(array_size.value(), ns);
94-
expr = byte_extract_exprt(
95-
byte_extract_id(),
93+
expr = make_byte_extract(
9694
expr,
9795
from_integer(0, index_type()),
9896
array_typet(char_type(), array_size.value()));
@@ -123,12 +121,7 @@ process_array_expr(exprt &expr, bool do_simplify, const namespacet &ns)
123121

124122
array_typet new_array_type(subtype, new_size);
125123

126-
expr =
127-
byte_extract_exprt(
128-
byte_extract_id(),
129-
expr,
130-
ode.offset(),
131-
new_array_type);
124+
expr = make_byte_extract(expr, ode.offset(), new_array_type);
132125
}
133126
}
134127
}

src/goto-symex/symex_dereference.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ exprt goto_symext::address_arithmetic(
9595
object_descriptor_exprt ode;
9696
ode.build(expr, ns);
9797

98-
const byte_extract_exprt be(
99-
byte_extract_id(), ode.root_object(), ode.offset(), expr.type());
98+
const byte_extract_exprt be =
99+
make_byte_extract(ode.root_object(), ode.offset(), expr.type());
100100

101101
// recursive call
102102
result = address_arithmetic(be, state, keep_array);
@@ -151,8 +151,7 @@ exprt goto_symext::address_arithmetic(
151151

152152
if(offset>0)
153153
{
154-
const byte_extract_exprt be(
155-
byte_extract_id(),
154+
const byte_extract_exprt be = make_byte_extract(
156155
to_ssa_expr(expr).get_l1_object(),
157156
from_integer(offset, index_type()),
158157
expr.type());

src/goto-symex/symex_function_call.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,11 @@ void goto_symext::parameter_assignments(
107107
rhs_type.id() == ID_pointer ||
108108
rhs_type.id() == ID_union ||
109109
rhs_type.id() == ID_union_tag))
110+
// clang-format on
110111
{
111-
rhs=
112-
byte_extract_exprt(
113-
byte_extract_id(),
114-
rhs,
115-
from_integer(0, index_type()),
116-
parameter_type);
112+
rhs = make_byte_extract(
113+
rhs, from_integer(0, index_type()), parameter_type);
117114
}
118-
// clang-format on
119115
else
120116
{
121117
std::ostringstream error;

src/goto-symex/symex_other.cpp

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,15 @@ void goto_symext::symex_other(
144144
{
145145
if(statement==ID_array_copy)
146146
{
147-
byte_extract_exprt be(
148-
byte_extract_id(),
149-
src_array,
150-
from_integer(0, index_type()),
151-
dest_array.type());
152-
src_array.swap(be);
147+
src_array = make_byte_extract(
148+
src_array, from_integer(0, index_type()), dest_array.type());
153149
do_simplify(src_array);
154150
}
155151
else
156152
{
157153
// ID_array_replace
158-
byte_extract_exprt be(
159-
byte_extract_id(),
160-
dest_array,
161-
from_integer(0, index_type()),
162-
src_array.type());
163-
dest_array.swap(be);
154+
dest_array = make_byte_extract(
155+
dest_array, from_integer(0, index_type()), src_array.type());
164156
do_simplify(dest_array);
165157
}
166158
}
@@ -196,8 +188,7 @@ void goto_symext::symex_other(
196188
auto array_size = size_of_expr(array_expr.type(), ns);
197189
CHECK_RETURN(array_size.has_value());
198190
do_simplify(array_size.value());
199-
array_expr = byte_extract_exprt(
200-
byte_extract_id(),
191+
array_expr = make_byte_extract(
201192
array_expr,
202193
from_integer(0, index_type()),
203194
array_typet(char_type(), array_size.value()));

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -530,11 +530,8 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
530530
}
531531
else
532532
{
533-
result.value = byte_extract_exprt(
534-
byte_extract_id(),
535-
symbol_expr,
536-
pointer_offset(pointer_expr),
537-
dereference_type);
533+
result.value = make_byte_extract(
534+
symbol_expr, pointer_offset(pointer_expr), dereference_type);
538535
result.pointer = address_of_exprt{result.value};
539536
}
540537
}
@@ -627,7 +624,10 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
627624
root_object_subexpression, o.offset(), dereference_type, ns);
628625
if(subexpr.has_value())
629626
simplify(subexpr.value(), ns);
630-
if(subexpr.has_value() && subexpr.value().id() != byte_extract_id())
627+
if(
628+
subexpr.has_value() &&
629+
subexpr.value().id() != ID_byte_extract_little_endian &&
630+
subexpr.value().id() != ID_byte_extract_big_endian)
631631
{
632632
// Successfully found a member, array index, or combination thereof
633633
// that matches the desired type and offset:
@@ -768,7 +768,7 @@ bool value_set_dereferencet::memory_model_bytes(
768768
else
769769
{
770770
// no, use 'byte_extract'
771-
result = byte_extract_exprt(byte_extract_id(), value, offset, to_type);
771+
result = make_byte_extract(value, offset, to_type);
772772
}
773773

774774
value=result;

src/solvers/flattening/boolbv_index.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,8 @@ bvt boolbvt::convert_index(
338338
o.offset(), from_integer(index * (*subtype_bytes_opt), o.offset().type())),
339339
ns);
340340

341-
byte_extract_exprt be(
342-
byte_extract_id(), o.root_object(), new_offset, array_type.subtype());
341+
byte_extract_exprt be =
342+
make_byte_extract(o.root_object(), new_offset, array_type.subtype());
343343

344344
return convert_bv(be);
345345
}

src/solvers/flattening/pointer_logic.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,13 @@ exprt pointer_logict::pointer_expr(
118118
CHECK_RETURN(deep_object_opt.has_value());
119119
exprt deep_object = deep_object_opt.value();
120120
simplify(deep_object, ns);
121-
if(deep_object.id() != byte_extract_id())
121+
if(
122+
deep_object.id() != ID_byte_extract_little_endian &&
123+
deep_object.id() != ID_byte_extract_big_endian)
124+
{
122125
return typecast_exprt::conditional_cast(
123126
address_of_exprt(deep_object), type);
127+
}
124128

125129
const byte_extract_exprt &be = to_byte_extract_expr(deep_object);
126130
const address_of_exprt base(be.op());

src/util/byte_operators.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Author: Daniel Kroening, [email protected]
1010

1111
#include "config.h"
1212

13-
irep_idt byte_extract_id()
13+
static irep_idt byte_extract_id()
1414
{
1515
switch(config.ansi_c.endianness)
1616
{
@@ -27,7 +27,7 @@ irep_idt byte_extract_id()
2727
UNREACHABLE;
2828
}
2929

30-
irep_idt byte_update_id()
30+
static irep_idt byte_update_id()
3131
{
3232
switch(config.ansi_c.endianness)
3333
{
@@ -43,3 +43,15 @@ irep_idt byte_update_id()
4343

4444
UNREACHABLE;
4545
}
46+
47+
byte_extract_exprt
48+
make_byte_extract(const exprt &_op, const exprt &_offset, const typet &_type)
49+
{
50+
return byte_extract_exprt{byte_extract_id(), _op, _offset, _type};
51+
}
52+
53+
byte_update_exprt
54+
make_byte_update(const exprt &_op, const exprt &_offset, const exprt &_value)
55+
{
56+
return byte_update_exprt{byte_update_id(), _op, _offset, _value};
57+
}

0 commit comments

Comments
 (0)