@@ -1042,11 +1042,18 @@ static smt_termt convert_expr_to_smt(
10421042
10431043static smt_termt convert_expr_to_smt (
10441044 const is_dynamic_object_exprt &is_dynamic_object,
1045- const sub_expression_mapt &converted)
1045+ const sub_expression_mapt &converted,
1046+ const smt_is_dynamic_objectt::make_applicationt &apply_is_dynamic_object)
10461047{
1047- UNIMPLEMENTED_FEATURE (
1048- " Generation of SMT formula for is dynamic object expression: " +
1049- is_dynamic_object.pretty ());
1048+ const smt_termt &pointer = converted.at (is_dynamic_object.address ());
1049+ const auto pointer_sort = pointer.get_sort ().cast <smt_bit_vector_sortt>();
1050+ INVARIANT (
1051+ pointer_sort, " Pointers should be encoded as bit vector sorted terms." );
1052+ const std::size_t pointer_width = pointer_sort->bit_width ();
1053+ return apply_is_dynamic_object (
1054+ std::vector<smt_termt>{smt_bit_vector_theoryt::extract (
1055+ pointer_width - 1 ,
1056+ pointer_width - config.bv_encoding .object_bits )(pointer)});
10501057}
10511058
10521059static smt_termt convert_expr_to_smt (
@@ -1458,7 +1465,8 @@ static smt_termt dispatch_expr_to_smt_conversion(
14581465 const sub_expression_mapt &converted,
14591466 const smt_object_mapt &object_map,
14601467 const type_size_mapt &pointer_sizes,
1461- const smt_object_sizet::make_applicationt &call_object_size)
1468+ const smt_object_sizet::make_applicationt &call_object_size,
1469+ const smt_is_dynamic_objectt::make_applicationt &apply_is_dynamic_object)
14621470{
14631471 if (const auto symbol = expr_try_dynamic_cast<symbol_exprt>(expr))
14641472 {
@@ -1660,7 +1668,8 @@ static smt_termt dispatch_expr_to_smt_conversion(
16601668 const auto is_dynamic_object =
16611669 expr_try_dynamic_cast<is_dynamic_object_exprt>(expr))
16621670 {
1663- return convert_expr_to_smt (*is_dynamic_object, converted);
1671+ return convert_expr_to_smt (
1672+ *is_dynamic_object, converted, apply_is_dynamic_object);
16641673 }
16651674 if (
16661675 const auto is_invalid_pointer =
@@ -1837,7 +1846,8 @@ smt_termt convert_expr_to_smt(
18371846 const exprt &expr,
18381847 const smt_object_mapt &object_map,
18391848 const type_size_mapt &pointer_sizes,
1840- const smt_object_sizet::make_applicationt &object_size)
1849+ const smt_object_sizet::make_applicationt &object_size,
1850+ const smt_is_dynamic_objectt::make_applicationt &is_dynamic_object)
18411851{
18421852#ifndef CPROVER_INVARIANT_DO_NOT_CHECK
18431853 static bool in_conversion = false ;
@@ -1856,7 +1866,12 @@ smt_termt convert_expr_to_smt(
18561866 if (find_result != sub_expression_map.cend ())
18571867 return ;
18581868 smt_termt term = dispatch_expr_to_smt_conversion (
1859- expr, sub_expression_map, object_map, pointer_sizes, object_size);
1869+ expr,
1870+ sub_expression_map,
1871+ object_map,
1872+ pointer_sizes,
1873+ object_size,
1874+ is_dynamic_object);
18601875 sub_expression_map.emplace_hint (find_result, expr, std::move (term));
18611876 });
18621877 return std::move (sub_expression_map.at (lowered_expr));
0 commit comments