Skip to content

Commit 11f1afc

Browse files
authored
Merge pull request #4122 from tautschnig/byte-op-3
byte_extract lowering: Fail when we _don't_ have a constant [blocks: #2068]
2 parents 58b5de0 + 864fa15 commit 11f1afc

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/solvers/lowering/byte_operators.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
312312
if(!size_bits.has_value())
313313
{
314314
auto op0_bits = pointer_offset_bits(unpacked.op().type(), ns);
315-
if(op0_bits.has_value())
315+
if(!op0_bits.has_value())
316316
{
317317
throw non_const_byte_extraction_sizet(unpacked);
318318
}

unit/solvers/lowering/byte_operators.cpp

+28
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,34 @@ SCENARIO("byte_extract_lowering", "[core][solvers][lowering][byte_extract]")
6262
}
6363
}
6464

65+
GIVEN("A an unbounded byte_extract over a bounded operand")
66+
{
67+
const exprt deadbeef = from_integer(0xdeadbeef, unsignedbv_typet(32));
68+
const byte_extract_exprt be1(
69+
ID_byte_extract_little_endian,
70+
deadbeef,
71+
from_integer(1, index_type()),
72+
struct_typet(
73+
{{"unbounded_array",
74+
array_typet(
75+
unsignedbv_typet(16), exprt(ID_infinity, size_type()))}}));
76+
77+
THEN("byte_extract lowering does not raise an exception")
78+
{
79+
const exprt lower_be1 = lower_byte_extract(be1, ns);
80+
81+
REQUIRE(!has_subexpr(lower_be1, ID_byte_extract_little_endian));
82+
REQUIRE(lower_be1.type() == be1.type());
83+
84+
byte_extract_exprt be2 = be1;
85+
be2.id(ID_byte_extract_big_endian);
86+
const exprt lower_be2 = lower_byte_extract(be2, ns);
87+
88+
REQUIRE(!has_subexpr(lower_be2, ID_byte_extract_big_endian));
89+
REQUIRE(lower_be2.type() == be2.type());
90+
}
91+
}
92+
6593
GIVEN("A collection of types")
6694
{
6795
unsignedbv_typet u8(8);

0 commit comments

Comments
 (0)