Skip to content

Commit 3f0adb8

Browse files
author
Enrico Steffinlongo
committed
Add is_invalid_pointer_exprt to SMT2 conversion
1 parent 6e5969c commit 3f0adb8

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,20 +1046,37 @@ static smt_termt convert_expr_to_smt(
10461046

10471047
static smt_termt convert_expr_to_smt(
10481048
const is_invalid_pointer_exprt &is_invalid_pointer,
1049+
const smt_object_mapt &object_map,
10491050
const sub_expression_mapt &converted)
10501051
{
1051-
UNIMPLEMENTED_FEATURE(
1052-
"Generation of SMT formula for is invalid pointer expression: " +
1053-
is_invalid_pointer.pretty());
1052+
const exprt &pointer_expr(to_unary_expr(is_invalid_pointer).op());
1053+
const bitvector_typet *pointer_type =
1054+
type_try_dynamic_cast<bitvector_typet>(pointer_expr.type());
1055+
INVARIANT(pointer_type, "Pointer object should have a bitvector-based type.");
1056+
const std::size_t object_bits = config.bv_encoding.object_bits;
1057+
const std::size_t width = pointer_type->get_width();
1058+
INVARIANT(
1059+
width >= object_bits,
1060+
"Width should be at least as big as the number of object bits.");
1061+
1062+
const auto extract_op = smt_bit_vector_theoryt::extract(
1063+
width - 1, width - object_bits)(converted.at(pointer_expr));
1064+
1065+
const auto &invalid_pointer = object_map.at(make_invalid_pointer_expr());
1066+
1067+
const smt_termt invalid_pointer_address = smt_bit_vector_constant_termt(
1068+
invalid_pointer.unique_id, config.bv_encoding.object_bits);
1069+
1070+
return smt_core_theoryt::equal(invalid_pointer_address, extract_op);
10541071
}
10551072

10561073
static smt_termt convert_expr_to_smt(
1057-
const string_constantt &is_invalid_pointer,
1074+
const string_constantt &string_constant,
10581075
const sub_expression_mapt &converted)
10591076
{
10601077
UNIMPLEMENTED_FEATURE(
1061-
"Generation of SMT formula for is invalid pointer expression: " +
1062-
is_invalid_pointer.pretty());
1078+
"Generation of SMT formula for string constant expression: " +
1079+
string_constant.pretty());
10631080
}
10641081

10651082
static smt_termt convert_expr_to_smt(
@@ -1643,7 +1660,7 @@ static smt_termt dispatch_expr_to_smt_conversion(
16431660
const auto is_invalid_pointer =
16441661
expr_try_dynamic_cast<is_invalid_pointer_exprt>(expr))
16451662
{
1646-
return convert_expr_to_smt(*is_invalid_pointer, converted);
1663+
return convert_expr_to_smt(*is_invalid_pointer, object_map, converted);
16471664
}
16481665
if(const auto string_constant = expr_try_dynamic_cast<string_constantt>(expr))
16491666
{

unit/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,27 @@ TEST_CASE(
222222
REQUIRE_THROWS(test.convert(or_exprt{{true_exprt{}}}));
223223
}
224224

225+
TEST_CASE(
226+
"expr to smt conversion for \"is_invalid_pointer\" operator",
227+
"[core][smt2_incremental]")
228+
{
229+
const std::size_t object_bits = config.bv_encoding.object_bits;
230+
const auto test =
231+
expr_to_smt_conversion_test_environmentt::make(test_archt::x86_64);
232+
const pointer_typet pointer_type = ::pointer_type(void_type());
233+
const std::size_t pointer_width = pointer_type.get_width();
234+
const constant_exprt invalid_ptr{
235+
integer2bvrep(1ul << (pointer_width - object_bits), pointer_width),
236+
pointer_type};
237+
const is_invalid_pointer_exprt is_invalid_ptr{invalid_ptr};
238+
const smt_termt expected_smt_term = smt_core_theoryt::equal(
239+
smt_bit_vector_constant_termt{1, config.bv_encoding.object_bits},
240+
smt_bit_vector_theoryt::extract(
241+
pointer_width - 1,
242+
pointer_width - object_bits)(test.convert(invalid_ptr)));
243+
CHECK(test.convert(is_invalid_ptr) == expected_smt_term);
244+
}
245+
225246
TEST_CASE(
226247
"expr to smt conversion for \"xor\" operator",
227248
"[core][smt2_incremental]")

0 commit comments

Comments
 (0)