Skip to content

make_byte_{extract,update} to build byte_{extract,update} expressions #6056

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/ansi-c/c_typecheck_initializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -542,8 +542,8 @@ exprt::operandst::const_iterator c_typecheck_baset::do_designated_initializer(

if(current_symbol.is_static_lifetime)
{
byte_update_exprt byte_update{
byte_update_id(), *dest, from_integer(0, index_type()), *zero};
byte_update_exprt byte_update =
make_byte_update(*dest, from_integer(0, index_type()), *zero);
byte_update.add_source_location() = value.source_location();
*dest = std::move(byte_update);
dest = &(to_byte_update_expr(*dest).op2());
Expand Down
7 changes: 2 additions & 5 deletions src/goto-programs/rewrite_union.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,18 +84,15 @@ void rewrite_union(exprt &expr)
if(op.type().id() == ID_union_tag || op.type().id() == ID_union)
{
exprt offset=from_integer(0, index_type());
byte_extract_exprt tmp(byte_extract_id(), op, offset, expr.type());
expr=tmp;
expr = make_byte_extract(op, offset, expr.type());
}
}
else if(expr.id()==ID_union)
{
const union_exprt &union_expr=to_union_expr(expr);
exprt offset=from_integer(0, index_type());
side_effect_expr_nondett nondet(expr.type(), expr.source_location());
byte_update_exprt tmp(
byte_update_id(), nondet, offset, union_expr.op());
expr=tmp;
expr = make_byte_update(nondet, offset, union_expr.op());
}
}

Expand Down
13 changes: 3 additions & 10 deletions src/goto-symex/symex_clean_expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ process_array_expr(exprt &expr, bool do_simplify, const namespacet &ns)

if(if_expr.true_case() != if_expr.false_case())
{
byte_extract_exprt be(
byte_extract_id(),
byte_extract_exprt be = make_byte_extract(
if_expr.false_case(),
from_integer(0, index_type()),
if_expr.true_case().type());
Expand Down Expand Up @@ -91,8 +90,7 @@ process_array_expr(exprt &expr, bool do_simplify, const namespacet &ns)
CHECK_RETURN(array_size.has_value());
if(do_simplify)
simplify(array_size.value(), ns);
expr = byte_extract_exprt(
byte_extract_id(),
expr = make_byte_extract(
expr,
from_integer(0, index_type()),
array_typet(char_type(), array_size.value()));
Expand Down Expand Up @@ -123,12 +121,7 @@ process_array_expr(exprt &expr, bool do_simplify, const namespacet &ns)

array_typet new_array_type(subtype, new_size);

expr =
byte_extract_exprt(
byte_extract_id(),
expr,
ode.offset(),
new_array_type);
expr = make_byte_extract(expr, ode.offset(), new_array_type);
}
}
}
Expand Down
7 changes: 3 additions & 4 deletions src/goto-symex/symex_dereference.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ exprt goto_symext::address_arithmetic(
object_descriptor_exprt ode;
ode.build(expr, ns);

const byte_extract_exprt be(
byte_extract_id(), ode.root_object(), ode.offset(), expr.type());
const byte_extract_exprt be =
make_byte_extract(ode.root_object(), ode.offset(), expr.type());

// recursive call
result = address_arithmetic(be, state, keep_array);
Expand Down Expand Up @@ -151,8 +151,7 @@ exprt goto_symext::address_arithmetic(

if(offset>0)
{
const byte_extract_exprt be(
byte_extract_id(),
const byte_extract_exprt be = make_byte_extract(
to_ssa_expr(expr).get_l1_object(),
from_integer(offset, index_type()),
expr.type());
Expand Down
10 changes: 3 additions & 7 deletions src/goto-symex/symex_function_call.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,11 @@ void goto_symext::parameter_assignments(
rhs_type.id() == ID_pointer ||
rhs_type.id() == ID_union ||
rhs_type.id() == ID_union_tag))
// clang-format on
{
rhs=
byte_extract_exprt(
byte_extract_id(),
rhs,
from_integer(0, index_type()),
parameter_type);
rhs = make_byte_extract(
rhs, from_integer(0, index_type()), parameter_type);
}
// clang-format on
else
{
std::ostringstream error;
Expand Down
19 changes: 5 additions & 14 deletions src/goto-symex/symex_other.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,23 +144,15 @@ void goto_symext::symex_other(
{
if(statement==ID_array_copy)
{
byte_extract_exprt be(
byte_extract_id(),
src_array,
from_integer(0, index_type()),
dest_array.type());
src_array.swap(be);
src_array = make_byte_extract(
src_array, from_integer(0, index_type()), dest_array.type());
do_simplify(src_array);
}
else
{
// ID_array_replace
byte_extract_exprt be(
byte_extract_id(),
dest_array,
from_integer(0, index_type()),
src_array.type());
dest_array.swap(be);
dest_array = make_byte_extract(
dest_array, from_integer(0, index_type()), src_array.type());
do_simplify(dest_array);
}
}
Expand Down Expand Up @@ -196,8 +188,7 @@ void goto_symext::symex_other(
auto array_size = size_of_expr(array_expr.type(), ns);
CHECK_RETURN(array_size.has_value());
do_simplify(array_size.value());
array_expr = byte_extract_exprt(
byte_extract_id(),
array_expr = make_byte_extract(
array_expr,
from_integer(0, index_type()),
array_typet(char_type(), array_size.value()));
Expand Down
14 changes: 7 additions & 7 deletions src/pointer-analysis/value_set_dereference.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -530,11 +530,8 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
}
else
{
result.value = byte_extract_exprt(
byte_extract_id(),
symbol_expr,
pointer_offset(pointer_expr),
dereference_type);
result.value = make_byte_extract(
symbol_expr, pointer_offset(pointer_expr), dereference_type);
result.pointer = address_of_exprt{result.value};
}
}
Expand Down Expand Up @@ -627,7 +624,10 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
root_object_subexpression, o.offset(), dereference_type, ns);
if(subexpr.has_value())
simplify(subexpr.value(), ns);
if(subexpr.has_value() && subexpr.value().id() != byte_extract_id())
if(
subexpr.has_value() &&
subexpr.value().id() != ID_byte_extract_little_endian &&
subexpr.value().id() != ID_byte_extract_big_endian)
{
// Successfully found a member, array index, or combination thereof
// that matches the desired type and offset:
Expand Down Expand Up @@ -768,7 +768,7 @@ bool value_set_dereferencet::memory_model_bytes(
else
{
// no, use 'byte_extract'
result = byte_extract_exprt(byte_extract_id(), value, offset, to_type);
result = make_byte_extract(value, offset, to_type);
}

value=result;
Expand Down
4 changes: 2 additions & 2 deletions src/solvers/flattening/boolbv_index.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,8 +338,8 @@ bvt boolbvt::convert_index(
o.offset(), from_integer(index * (*subtype_bytes_opt), o.offset().type())),
ns);

byte_extract_exprt be(
byte_extract_id(), o.root_object(), new_offset, array_type.subtype());
byte_extract_exprt be =
make_byte_extract(o.root_object(), new_offset, array_type.subtype());

return convert_bv(be);
}
Expand Down
6 changes: 5 additions & 1 deletion src/solvers/flattening/pointer_logic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,13 @@ exprt pointer_logict::pointer_expr(
CHECK_RETURN(deep_object_opt.has_value());
exprt deep_object = deep_object_opt.value();
simplify(deep_object, ns);
if(deep_object.id() != byte_extract_id())
if(
deep_object.id() != ID_byte_extract_little_endian &&
deep_object.id() != ID_byte_extract_big_endian)
{
return typecast_exprt::conditional_cast(
address_of_exprt(deep_object), type);
}

const byte_extract_exprt &be = to_byte_extract_expr(deep_object);
const address_of_exprt base(be.op());
Expand Down
16 changes: 14 additions & 2 deletions src/util/byte_operators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Author: Daniel Kroening, kroening@kroening.com

#include "config.h"

irep_idt byte_extract_id()
static irep_idt byte_extract_id()
{
switch(config.ansi_c.endianness)
{
Expand All @@ -27,7 +27,7 @@ irep_idt byte_extract_id()
UNREACHABLE;
}

irep_idt byte_update_id()
static irep_idt byte_update_id()
{
switch(config.ansi_c.endianness)
{
Expand All @@ -43,3 +43,15 @@ irep_idt byte_update_id()

UNREACHABLE;
}

byte_extract_exprt
make_byte_extract(const exprt &_op, const exprt &_offset, const typet &_type)
{
return byte_extract_exprt{byte_extract_id(), _op, _offset, _type};
}

byte_update_exprt
make_byte_update(const exprt &_op, const exprt &_offset, const exprt &_value)
{
return byte_update_exprt{byte_update_id(), _op, _offset, _value};
}
13 changes: 10 additions & 3 deletions src/util/byte_operators.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,6 @@ inline void validate_expr(const byte_extract_exprt &value)
validate_operands(value, 2, "Byte extract must have two operands");
}

irep_idt byte_extract_id();
irep_idt byte_update_id();

/// Expression corresponding to \c op() where the bytes starting at
/// position \c offset (given in number of bytes) have been updated with
/// \c value.
Expand Down Expand Up @@ -129,4 +126,14 @@ inline byte_update_exprt &to_byte_update_expr(exprt &expr)
return static_cast<byte_update_exprt &>(expr);
}

/// Construct a byte_extract_exprt with endianness and byte width matching the
/// current configuration.
byte_extract_exprt
make_byte_extract(const exprt &_op, const exprt &_offset, const typet &_type);

/// Construct a byte_update_exprt with endianness and byte width matching the
/// current configuration.
byte_update_exprt
make_byte_update(const exprt &_op, const exprt &_offset, const exprt &_value);

#endif // CPROVER_UTIL_BYTE_OPERATORS_H
7 changes: 2 additions & 5 deletions src/util/pointer_offset_size.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -682,11 +682,8 @@ optionalt<exprt> get_subexpression_at_offset(
}
}

return byte_extract_exprt(
byte_extract_id(),
expr,
from_integer(offset_bytes, index_type()),
target_type_raw);
return make_byte_extract(
expr, from_integer(offset_bytes, index_type()), target_type_raw);
}

optionalt<exprt> get_subexpression_at_offset(
Expand Down
21 changes: 15 additions & 6 deletions src/util/simplify_expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,9 @@ simplify_exprt::resultt<>
simplify_exprt::simplify_clz(const count_leading_zeros_exprt &expr)
{
const auto const_bits_opt = expr2bits(
expr.op(), byte_extract_id() == ID_byte_extract_little_endian, ns);
expr.op(),
config.ansi_c.endianness == configt::ansi_ct::endiannesst::IS_LITTLE_ENDIAN,
ns);

if(!const_bits_opt.has_value())
return unchanged(expr);
Expand Down Expand Up @@ -1634,7 +1636,13 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)

// don't do any of the following if endianness doesn't match, as
// bytes need to be swapped
if(*offset == 0 && byte_extract_id() == expr.id())
if(
*offset == 0 && ((expr.id() == ID_byte_extract_little_endian &&
config.ansi_c.endianness ==
configt::ansi_ct::endiannesst::IS_LITTLE_ENDIAN) ||
(expr.id() == ID_byte_extract_big_endian &&
config.ansi_c.endianness ==
configt::ansi_ct::endiannesst::IS_BIG_ENDIAN)))
{
// byte extract of full object is object
if(expr.type() == expr.op().type())
Expand All @@ -1658,7 +1666,8 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
{
const auto const_bits_opt = expr2bits(
to_array_of_expr(expr.op()).op(),
byte_extract_id() == ID_byte_extract_little_endian,
config.ansi_c.endianness ==
configt::ansi_ct::endiannesst::IS_LITTLE_ENDIAN,
ns);

if(!const_bits_opt.has_value())
Expand Down Expand Up @@ -2023,11 +2032,11 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
bytes_req = (*val_size) / 8 - val_offset;

byte_extract_exprt new_val(
byte_extract_id(),
ID_byte_extract_little_endian,
value,
from_integer(val_offset, offset.type()),
array_typet(unsignedbv_typet(8),
from_integer(bytes_req, offset.type())));
array_typet(
unsignedbv_typet(8), from_integer(bytes_req, offset.type())));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this a refactor, but can we replace the 8 with something less magic?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#917, which this PR is supposed to make easier to merge :-)


*it = byte_update_exprt(
expr.id(),
Expand Down
14 changes: 5 additions & 9 deletions unit/util/pointer_offset_size.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,7 @@ TEST_CASE("Build subexpression to access element at offset into array")
const signedbv_typet small_t(8);
const auto result = get_subexpression_at_offset(a, 1, small_t, ns);
REQUIRE(
result.value() == byte_extract_exprt(
byte_extract_id(),
result.value() == make_byte_extract(
index_exprt(a, from_integer(0, index_type())),
from_integer(1, index_type()),
small_t));
Expand All @@ -74,8 +73,7 @@ TEST_CASE("Build subexpression to access element at offset into array")
// index_exprt.
REQUIRE(
result.value() ==
byte_extract_exprt(
byte_extract_id(), a, from_integer(3, index_type()), int16_t));
make_byte_extract(a, from_integer(3, index_type()), int16_t));
}
}

Expand Down Expand Up @@ -121,10 +119,8 @@ TEST_CASE("Build subexpression to access element at offset into struct")
const signedbv_typet small_t(8);
const auto result = get_subexpression_at_offset(s, 1, small_t, ns);
REQUIRE(
result.value() == byte_extract_exprt(
byte_extract_id(),
member_exprt(s, "foo", t),
from_integer(1, index_type()),
small_t));
result.value() ==
make_byte_extract(
member_exprt(s, "foo", t), from_integer(1, index_type()), small_t));
}
}
4 changes: 2 additions & 2 deletions unit/util/simplify_expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ TEST_CASE("Simplify byte extract", "[core][util]")
// byte-extracting type T at offset 0 from an object of type T yields the
// object
symbol_exprt s("foo", size_type());
byte_extract_exprt be(
byte_extract_id(), s, from_integer(0, index_type()), size_type());
byte_extract_exprt be =
make_byte_extract(s, from_integer(0, index_type()), size_type());

exprt simp = simplify_expr(be, ns);

Expand Down