@@ -1238,11 +1238,18 @@ static smt_termt convert_expr_to_smt(
12381238
12391239static smt_termt convert_expr_to_smt (
12401240 const object_size_exprt &object_size,
1241- const sub_expression_mapt &converted)
1241+ const sub_expression_mapt &converted,
1242+ const smt_object_sizet::make_applicationt &call_object_size)
12421243{
1243- UNIMPLEMENTED_FEATURE (
1244- " Generation of SMT formula for object_size expression: " +
1245- object_size.pretty ());
1244+ const smt_termt &pointer = converted.at (object_size.pointer ());
1245+ const auto pointer_sort = pointer.get_sort ().cast <smt_bit_vector_sortt>();
1246+ INVARIANT (
1247+ pointer_sort, " Pointers should be encoded as bit vector sorted terms." );
1248+ const std::size_t pointer_width = pointer_sort->bit_width ();
1249+ return call_object_size (
1250+ std::vector<smt_termt>{smt_bit_vector_theoryt::extract (
1251+ pointer_width - 1 ,
1252+ pointer_width - config.bv_encoding .object_bits )(pointer)});
12461253}
12471254
12481255static smt_termt
@@ -1291,7 +1298,8 @@ static smt_termt convert_expr_to_smt(
12911298static smt_termt dispatch_expr_to_smt_conversion (
12921299 const exprt &expr,
12931300 const sub_expression_mapt &converted,
1294- const smt_object_mapt &object_map)
1301+ const smt_object_mapt &object_map,
1302+ const smt_object_sizet::make_applicationt &call_object_size)
12951303{
12961304 if (const auto symbol = expr_try_dynamic_cast<symbol_exprt>(expr))
12971305 {
@@ -1589,7 +1597,7 @@ static smt_termt dispatch_expr_to_smt_conversion(
15891597 }
15901598 if (const auto object_size = expr_try_dynamic_cast<object_size_exprt>(expr))
15911599 {
1592- return convert_expr_to_smt (*object_size, converted);
1600+ return convert_expr_to_smt (*object_size, converted, call_object_size );
15931601 }
15941602 if (const auto let = expr_try_dynamic_cast<let_exprt>(expr))
15951603 {
@@ -1647,8 +1655,10 @@ at_scope_exitt<functiont> at_scope_exit(functiont exit_function)
16471655}
16481656#endif
16491657
1650- smt_termt
1651- convert_expr_to_smt (const exprt &expr, const smt_object_mapt &object_map)
1658+ smt_termt convert_expr_to_smt (
1659+ const exprt &expr,
1660+ const smt_object_mapt &object_map,
1661+ const smt_object_sizet::make_applicationt &object_size)
16521662{
16531663#ifndef CPROVER_INVARIANT_DO_NOT_CHECK
16541664 static bool in_conversion = false ;
@@ -1665,8 +1675,8 @@ convert_expr_to_smt(const exprt &expr, const smt_object_mapt &object_map)
16651675 const auto find_result = sub_expression_map.find (expr);
16661676 if (find_result != sub_expression_map.cend ())
16671677 return ;
1668- smt_termt term =
1669- dispatch_expr_to_smt_conversion ( expr, sub_expression_map, object_map);
1678+ smt_termt term = dispatch_expr_to_smt_conversion (
1679+ expr, sub_expression_map, object_map, object_size );
16701680 sub_expression_map.emplace_hint (find_result, expr, std::move (term));
16711681 });
16721682 return std::move (sub_expression_map.at (expr));
0 commit comments