@@ -1046,20 +1046,37 @@ static smt_termt convert_expr_to_smt(
10461046
10471047static 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
10561073static 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
10651082static 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 {
0 commit comments