@@ -230,6 +230,15 @@ void recursive_initializationt::initialize(
230230 {depth, address_of_exprt{lhs}}});
231231}
232232
233+ code_blockt build_null_pointer (const symbol_exprt &result_symbol)
234+ {
235+ const typet &type_to_construct = result_symbol.type ().subtype ();
236+ const null_pointer_exprt nullptr_expr{to_pointer_type (type_to_construct)};
237+ const code_assignt assign_null{dereference_exprt{result_symbol},
238+ nullptr_expr};
239+ return code_blockt{{assign_null, code_returnt{}}};
240+ }
241+
233242code_blockt recursive_initializationt::build_constructor_body (
234243 const exprt &depth_symbol,
235244 const symbol_exprt &result_symbol,
@@ -249,6 +258,11 @@ code_blockt recursive_initializationt::build_constructor_body(
249258 {
250259 return build_function_pointer_constructor (result_symbol, is_nullable);
251260 }
261+ if (type.subtype ().id () == ID_empty)
262+ {
263+ // always initalize void* pointers as NULL
264+ return build_null_pointer (result_symbol);
265+ }
252266 if (lhs_name.has_value ())
253267 {
254268 if (should_be_treated_as_cstring (*lhs_name) && type == char_type ())
@@ -620,15 +634,7 @@ code_blockt recursive_initializationt::build_pointer_constructor(
620634 PRECONDITION (result.type ().id () == ID_pointer);
621635 const typet &type = result.type ().subtype ();
622636 PRECONDITION (type.id () == ID_pointer);
623-
624- null_pointer_exprt nullptr_expr{pointer_type (type.subtype ())};
625- const code_assignt assign_null{dereference_exprt{result}, nullptr_expr};
626-
627- // always initalize void* pointers as NULL
628- if (type.subtype ().id () == ID_empty)
629- {
630- return code_blockt{{assign_null, code_returnt{}}};
631- }
637+ PRECONDITION (type.subtype ().id () != ID_empty);
632638
633639 code_blockt body{};
634640 // build:
@@ -663,6 +669,8 @@ code_blockt recursive_initializationt::build_pointer_constructor(
663669 should_not_recurse.push_back (has_seen_expr);
664670 }
665671
672+ null_pointer_exprt nullptr_expr{pointer_type (type.subtype ())};
673+ const code_assignt assign_null{dereference_exprt{result}, nullptr_expr};
666674 code_blockt null_and_return{{assign_null, code_returnt{}}};
667675 body.add (code_ifthenelset{conjunction (should_not_recurse), null_and_return});
668676
@@ -792,15 +800,7 @@ code_blockt recursive_initializationt::build_dynamic_array_constructor(
792800 const typet &pointer_type = result.type ().subtype ();
793801 PRECONDITION (pointer_type.id () == ID_pointer);
794802 const typet &element_type = pointer_type.subtype ();
795-
796- null_pointer_exprt nullptr_expr{::pointer_type (element_type)};
797- const code_assignt assign_null{dereference_exprt{result}, nullptr_expr};
798-
799- // always initalize void* pointers as NULL
800- if (element_type.id () == ID_empty)
801- {
802- return code_blockt{{assign_null, code_returnt{}}};
803- }
803+ PRECONDITION (element_type.id () != ID_empty);
804804
805805 // builds:
806806 // void type_constructor_ptr_T(int depth, T** result, int* size)
0 commit comments