@@ -10,15 +10,15 @@ Author: Diffblue Ltd.
1010
1111#include < util/allocate_objects.h>
1212#include < util/arith_tools.h>
13+ #include < util/c_types.h>
1314#include < util/exception_utils.h>
14- #include < util/prefix.h>
1515#include < util/std_code.h>
1616#include < util/std_expr.h>
1717#include < util/string2int.h>
1818#include < util/string_utils.h>
1919#include < util/ui_message.h>
2020
21- #include < goto-programs/goto_convert .h>
21+ #include < goto-programs/goto_convert_functions .h>
2222#include < goto-programs/goto_model.h>
2323
2424#include < algorithm>
@@ -54,6 +54,8 @@ struct function_call_harness_generatort::implt
5454 std::map<irep_idt, irep_idt> function_argument_to_associated_array_size;
5555 std::map<irep_idt, irep_idt> function_parameter_to_associated_array_size;
5656
57+ std::set<symbol_exprt> global_pointers;
58+
5759 // / \see goto_harness_generatort::generate
5860 void generate (goto_modelt &goto_model, const irep_idt &harness_function_name);
5961 // / Iterate over the symbol table and generate initialisation code for
@@ -195,6 +197,11 @@ void function_call_harness_generatort::implt::generate(
195197
196198 generate_nondet_globals (function_body);
197199 call_function (arguments, function_body);
200+ for (const auto &global_pointer : global_pointers)
201+ {
202+ function_body.add (code_function_callt{
203+ recursive_initialization->get_free_function (), {global_pointer}});
204+ }
198205 add_harness_function_to_goto_model (std::move (function_body));
199206}
200207
@@ -213,10 +220,7 @@ void function_call_harness_generatort::implt::generate_nondet_globals(
213220 for (const auto &symbol_table_entry : *symbol_table)
214221 {
215222 const auto &symbol = symbol_table_entry.second ;
216- if (
217- symbol.is_static_lifetime && symbol.is_lvalue &&
218- symbol.type .id () != ID_code &&
219- !has_prefix (id2string (symbol.name ), CPROVER_PREFIX))
223+ if (recursive_initialization->is_initialization_allowed (symbol))
220224 {
221225 globals.push_back (symbol.symbol_expr ());
222226 }
@@ -232,7 +236,10 @@ void function_call_harness_generatort::implt::generate_initialisation_code_for(
232236 code_blockt &block,
233237 const exprt &lhs)
234238{
235- recursive_initialization->initialize (lhs, 0 , {}, block);
239+ recursive_initialization->initialize (
240+ lhs, from_integer (0 , signed_int_type ()), block);
241+ if (lhs.type ().id () == ID_pointer)
242+ global_pointers.insert (to_symbol_expr (lhs));
236243}
237244
238245void function_call_harness_generatort::validate_options (
@@ -300,14 +307,7 @@ void function_call_harness_generatort::implt::
300307 symbol_table->lookup_ref (harness_function_name);
301308 goto_functions->function_map [harness_function_name].type =
302309 to_code_type (generated_harness.type );
303- auto &body = goto_functions->function_map [harness_function_name].body ;
304- goto_convert (
305- static_cast <const codet &>(generated_harness.value ),
306- *symbol_table,
307- body,
308- *message_handler,
309- function_to_call.mode );
310- body.add (goto_programt::make_end_function ());
310+ goto_convert (*symbol_table, *goto_functions, *message_handler);
311311}
312312
313313code_function_callt::argumentst
@@ -377,6 +377,8 @@ void function_call_harness_generatort::implt::call_function(
377377 for (auto const &argument : arguments)
378378 {
379379 generate_initialisation_code_for (function_body, argument);
380+ if (argument.type ().id () == ID_pointer)
381+ global_pointers.insert (to_symbol_expr (argument));
380382 }
381383 code_function_callt function_call{function_to_call.symbol_expr (),
382384 std::move (arguments)};
0 commit comments