@@ -372,24 +372,6 @@ irep_idt recursive_initializationt::build_constructor(const exprt &expr)
372372  return  type_constructor_names.at (key);
373373}
374374
375- symbol_exprt recursive_initializationt::get_malloc_function ()
376- {
377-   auto  malloc_sym = goto_model.symbol_table .lookup (" malloc" 
378-   if (malloc_sym == nullptr )
379-   {
380-     symbolt new_malloc_sym{
381-       " malloc" 
382-       code_typet{
383-         {code_typet::parametert{size_type ()}}, pointer_type (empty_typet{})},
384-       initialization_config.mode };
385-     new_malloc_sym.pretty_name  = " malloc" 
386-     new_malloc_sym.base_name  = " malloc" 
387-     goto_model.symbol_table .insert (new_malloc_sym);
388-     return  new_malloc_sym.symbol_expr ();
389-   }
390-   return  malloc_sym->symbol_expr ();
391- }
392- 
393375bool  recursive_initializationt::should_be_treated_as_array (
394376  const  irep_idt &array_name) const 
395377{
@@ -630,24 +612,6 @@ std::string recursive_initializationt::type2id(const typet &type) const
630612    return  " " 
631613}
632614
633- symbol_exprt recursive_initializationt::get_free_function ()
634- {
635-   auto  free_sym = goto_model.symbol_table .lookup (" free" 
636-   if (free_sym == nullptr )
637-   {
638-     symbolt new_free_sym{
639-       " free" 
640-       code_typet{
641-         {code_typet::parametert{pointer_type (empty_typet{})}}, empty_typet{}},
642-       initialization_config.mode };
643-     new_free_sym.pretty_name  = " free" 
644-     new_free_sym.base_name  = " free" 
645-     goto_model.symbol_table .insert (new_free_sym);
646-     return  new_free_sym.symbol_expr ();
647-   }
648-   return  free_sym->symbol_expr ();
649- }
650- 
651615code_blockt recursive_initializationt::build_pointer_constructor (
652616  const  exprt &depth,
653617  const  symbol_exprt &result)
@@ -724,10 +688,13 @@ code_blockt recursive_initializationt::build_pointer_constructor(
724688
725689  then_case.add (code_declt{local_result});
726690  const  namespacet ns{goto_model.symbol_table };
727-   then_case.add (code_function_callt {
691+   then_case.add (code_assignt {
728692    local_result,
729-     get_malloc_function (),
730-     {*size_of_expr (non_const_pointer_type.base_type (), ns)}});
693+     side_effect_exprt{
694+       ID_allocate,
695+       {*size_of_expr (non_const_pointer_type.base_type (), ns), false_exprt{}},
696+       non_const_pointer_type,
697+       source_locationt::nil ()}});
731698  initialize (
732699    dereference_exprt{local_result},
733700    plus_exprt{depth, from_integer (1 , depth.type ())},
@@ -869,10 +836,16 @@ code_blockt recursive_initializationt::build_dynamic_array_constructor(
869836  {
870837    body.add (code_ifthenelset{
871838      equal_exprt{nondet_size, from_integer (array_size, nondet_size.type ())},
872-       code_function_callt{local_result,
873-                           get_malloc_function (),
874-                           {mult_exprt{from_integer (array_size, size_type ()),
875-                                       *size_of_expr (element_type, ns)}}}});
839+       code_assignt{
840+         local_result,
841+         side_effect_exprt{
842+           ID_allocate,
843+           {mult_exprt{
844+              from_integer (array_size, size_type ()),
845+              *size_of_expr (element_type, ns)},
846+            false_exprt{}},
847+           mutable_dynamic_array_type,
848+           source_locationt::nil ()}}});
876849  }
877850
878851  const  symbol_exprt &index_iter = get_fresh_local_symexpr (" index" 
@@ -942,18 +915,35 @@ bool recursive_initializationt::needs_freeing(const exprt &expr) const
942915  return  true ;
943916}
944917
918+ code_blockt
919+ recursive_initializationt::deallocate_code (const  exprt &pointer) const 
920+ {
921+   code_blockt block;
922+   const  auto  should_track =
923+     get_fresh_local_typed_symexpr (" mark_deallocated" 
924+   block.add (code_declt{should_track});
925+   const  symbol_exprt deallocated = goto_model.get_symbol_table ()
926+                                      .lookup_ref (CPROVER_PREFIX " deallocated" 
927+                                      .symbol_expr ();
928+   block.add (code_ifthenelset{
929+     should_track,
930+     code_assignt{
931+       deallocated,
932+       typecast_exprt::conditional_cast (pointer, deallocated.type ())}});
933+   return  block;
934+ }
935+ 
945936void  recursive_initializationt::free_if_possible (
946937  const  exprt &expr,
947938  code_blockt &body)
948939{
949940  PRECONDITION (expr.id () == ID_symbol);
950941  const  auto  expr_id = to_symbol_expr (expr).get_identifier ();
951942  const  auto  maybe_cluster_index = find_equal_cluster (expr_id);
952-   const  auto  call_free = code_function_callt{get_free_function (), {expr}};
953943  if (!maybe_cluster_index.has_value ())
954944  {
955945    //  not in any equality cluster -> just free
956-     body.add (call_free );
946+     body.add (deallocate_code (expr) );
957947    return ;
958948  }
959949
@@ -965,7 +955,7 @@ void recursive_initializationt::free_if_possible(
965955    //  in equality cluster but not common origin -> free if not equal to origin
966956    const  auto  condition =
967957      notequal_exprt{expr, *common_arguments_origins[*maybe_cluster_index]};
968-     body.add (code_ifthenelset{condition, call_free });
958+     body.add (code_ifthenelset{condition, deallocate_code (expr) });
969959  }
970960  else 
971961  {
@@ -979,7 +969,7 @@ void recursive_initializationt::free_cluster_origins(code_blockt &body)
979969{
980970  for (auto  const  &origin : common_arguments_origins)
981971  {
982-     body.add (code_function_callt{ get_free_function (), { *origin}} );
972+     body.add (deallocate_code ( *origin) );
983973  }
984974}
985975
0 commit comments