CBMC
function_call_harness_generator.cpp
Go to the documentation of this file.
1 /******************************************************************\
2 
3 Module: harness generator for functions
4 
5 Author: Diffblue Ltd.
6 
7 \******************************************************************/
8 
10 
11 #include <util/arith_tools.h>
12 #include <util/c_types.h>
13 #include <util/exception_utils.h>
14 #include <util/make_unique.h>
15 #include <util/prefix.h>
16 #include <util/std_code.h>
17 #include <util/string_utils.h>
18 #include <util/ui_message.h>
19 
23 
24 #include <algorithm>
25 #include <iterator>
26 #include <set>
27 
31 
35 /* NOLINTNEXTLINE(readability/identifier_spacing) */
37 {
39  irep_idt function;
43  bool nondet_globals = false;
44 
46  std::unique_ptr<recursive_initializationt> recursive_initialization;
47 
50 
51  std::vector<std::set<irep_idt>> function_parameters_to_treat_equal;
52  std::vector<std::set<irep_idt>> function_arguments_to_treat_equal;
53 
56 
57  std::map<irep_idt, irep_idt> function_argument_to_associated_array_size;
58  std::map<irep_idt, irep_idt> function_parameter_to_associated_array_size;
59 
60  std::set<symbol_exprt> global_pointers;
61 
63  void generate(goto_modelt &goto_model, const irep_idt &harness_function_name);
66  void generate_nondet_globals(code_blockt &function_body);
70  void generate_initialisation_code_for(code_blockt &block, const exprt &lhs);
80  void call_function(
81  const code_function_callt::argumentst &arguments,
82  code_blockt &function_body);
91  std::unordered_set<irep_idt>
93 };
94 
96  ui_message_handlert &message_handler)
97  : goto_harness_generatort{}, p_impl(util_make_unique<implt>())
98 {
99  p_impl->message_handler = &message_handler;
100 }
101 
103 
105  const std::string &option,
106  const std::list<std::string> &values)
107 {
110 
111  if(p_impl->recursive_initialization_config.handle_option(option, values))
112  {
113  // the option belongs to recursive initialization
114  }
115  else if(option == FUNCTION_HARNESS_GENERATOR_FUNCTION_OPT)
116  {
117  p_impl->function = require_exactly_one_value(option, values);
118  }
120  {
121  p_impl->nondet_globals = true;
122  }
124  {
125  p_impl->function_parameters_to_treat_as_arrays.insert(
126  values.begin(), values.end());
127  }
129  {
130  for(auto const &value : values)
131  {
132  for(auto const &param_cluster : split_string(value, ';'))
133  {
134  std::set<irep_idt> equal_param_set;
135  for(auto const &param_id : split_string(param_cluster, ','))
136  {
137  equal_param_set.insert(param_id);
138  }
139  p_impl->function_parameters_to_treat_equal.push_back(equal_param_set);
140  }
141  }
142  }
144  {
145  for(auto const &array_size_pair : values)
146  {
147  try
148  {
149  std::string array;
150  std::string size;
151  split_string(array_size_pair, ':', array, size);
152  // --associated-array-size implies --treat-pointer-as-array
153  // but it is not an error to specify both, so we don't check
154  // for duplicates here
155  p_impl->function_parameters_to_treat_as_arrays.insert(array);
156  auto const inserted =
157  p_impl->function_parameter_to_associated_array_size.emplace(
158  array, size);
159  if(!inserted.second)
160  {
162  "can not have two associated array sizes for one array",
164  }
165  }
166  catch(const deserialization_exceptiont &)
167  {
169  "'" + array_size_pair +
170  "' is in an invalid format for array size pair",
172  "array_name:size_name, where both are the names of function "
173  "parameters"};
174  }
175  }
176  }
178  {
179  p_impl->function_parameters_to_treat_as_cstrings.insert(
180  values.begin(), values.end());
181  }
183  {
184  p_impl->recursive_initialization_config.arguments_may_be_equal = true;
185  }
187  {
189  values.begin(),
190  values.end(),
191  std::inserter(
192  p_impl->recursive_initialization_config
193  .potential_null_function_pointers,
194  p_impl->recursive_initialization_config.potential_null_function_pointers
195  .end()),
196  [](const std::string &opt) -> irep_idt { return irep_idt{opt}; });
197  }
199  {
201  values.begin(),
202  values.end(),
203  std::inserter(
204  p_impl->recursive_initialization_config
205  .potential_null_function_pointers,
206  p_impl->recursive_initialization_config.potential_null_function_pointers
207  .end()),
208  [](const std::string &opt) -> irep_idt { return irep_idt{opt}; });
209  }
210  else
211  {
213  "function harness generator cannot handle this option", "--" + option};
214  }
215 }
216 
218  goto_modelt &goto_model,
219  const irep_idt &harness_function_name)
220 {
221  p_impl->generate(goto_model, harness_function_name);
222 }
223 
225  goto_modelt &goto_model,
226  const irep_idt &harness_function_name)
227 {
228  symbol_table = &goto_model.symbol_table;
229  goto_functions = &goto_model.goto_functions;
230  this->harness_function_name = harness_function_name;
233 
234  // create body for the function
235  code_blockt function_body{};
236  auto const arguments = declare_arguments(function_body);
237 
238  // configure and create recursive initialisation object
246  for(const auto &pair : function_argument_to_associated_array_size)
247  {
249  pair.second);
250  }
255  recursive_initialization = util_make_unique<recursive_initializationt>(
256  recursive_initialization_config, goto_model);
257 
258  generate_nondet_globals(function_body);
259  call_function(arguments, function_body);
260  for(const auto &global_pointer : global_pointers)
261  {
262  recursive_initialization->free_if_possible(global_pointer, function_body);
263  }
264  recursive_initialization->free_cluster_origins(function_body);
265  add_harness_function_to_goto_model(std::move(function_body));
266 }
267 
269  code_blockt &function_body)
270 {
271  if(nondet_globals)
272  {
273  // generating initialisation code may introduce new globals
274  // i.e. modify the symbol table.
275  // Modifying the symbol table while iterating over it is not
276  // a good idea, therefore we just collect the names of globals
277  // we need to initialise first and then generate the
278  // initialisation code for all of them.
279  auto globals = std::vector<symbol_exprt>{};
280  for(const auto &symbol_table_entry : *symbol_table)
281  {
282  const auto &symbol = symbol_table_entry.second;
284  {
285  globals.push_back(symbol.symbol_expr());
286  }
287  }
288  for(auto const &global : globals)
289  {
290  generate_initialisation_code_for(function_body, global);
291  }
292  }
293 }
294 
296  code_blockt &block,
297  const exprt &lhs)
298 {
299  recursive_initialization->initialize(
300  lhs, from_integer(0, signed_int_type()), block);
301  if(recursive_initialization->needs_freeing(lhs))
302  global_pointers.insert(to_symbol_expr(lhs));
303 }
304 
306  const goto_modelt &goto_model)
307 {
308  if(p_impl->function == ID_empty_string)
310  "required parameter entry function not set",
312  if(
313  p_impl->recursive_initialization_config.min_dynamic_array_size >
314  p_impl->recursive_initialization_config.max_dynamic_array_size)
315  {
317  "min dynamic array size cannot be greater than max dynamic array size",
320  }
321 
322  const auto function_to_call_pointer =
323  goto_model.symbol_table.lookup(p_impl->function);
324  if(function_to_call_pointer == nullptr)
325  {
327  "entry function `" + id2string(p_impl->function) +
328  "' does not exist in the symbol table",
330  }
331  const auto &function_to_call = *function_to_call_pointer;
332  const auto &ftype = to_code_type(function_to_call.type);
333  for(auto const &equal_cluster : p_impl->function_parameters_to_treat_equal)
334  {
335  for(auto const &pointer_id : equal_cluster)
336  {
337  std::string decorated_pointer_id =
338  id2string(p_impl->function) + "::" + id2string(pointer_id);
339  bool is_a_param = false;
340  typet common_type = empty_typet{};
341  for(auto const &formal_param : ftype.parameters())
342  {
343  if(formal_param.get_identifier() == decorated_pointer_id)
344  {
345  is_a_param = true;
346  if(formal_param.type().id() != ID_pointer)
347  {
349  id2string(pointer_id) + " is not a pointer parameter",
351  }
352  if(common_type.id() != ID_empty)
353  {
354  if(common_type != formal_param.type())
355  {
357  "pointer arguments of conflicting type",
359  }
360  }
361  else
362  common_type = formal_param.type();
363  }
364  }
365  if(!is_a_param)
366  {
368  id2string(pointer_id) + " is not a parameter",
370  }
371  }
372  }
373 
374  const namespacet ns{goto_model.symbol_table};
375 
376  // Make sure all function pointers that the user asks are nullable are
377  // present in the symbol table.
378  for(const auto &nullable :
379  p_impl->recursive_initialization_config.potential_null_function_pointers)
380  {
381  const auto &function_pointer_symbol_pointer =
382  goto_model.symbol_table.lookup(nullable);
383 
384  if(function_pointer_symbol_pointer == nullptr)
385  {
387  "nullable function pointer `" + id2string(nullable) +
388  "' not found in symbol table",
390  }
391 
392  const auto &function_pointer_type =
393  ns.follow(function_pointer_symbol_pointer->type);
394 
395  if(!can_cast_type<pointer_typet>(function_pointer_type))
396  {
398  "`" + id2string(nullable) + "' is not a pointer",
400  }
401 
403  to_pointer_type(function_pointer_type).base_type()))
404  {
406  "`" + id2string(nullable) + "' is not pointing to a function",
408  }
409  }
410 }
411 
412 const symbolt &
414 {
415  auto function_found = symbol_table->lookup(function);
416 
417  if(function_found == nullptr)
418  {
420  "function that should be harnessed is not found " + id2string(function),
422  }
423 
424  return *function_found;
425 }
426 
429 {
430  if(symbol_table->lookup(harness_function_name))
431  {
433  "harness function already exists in the symbol table",
435  }
436 }
437 
440 {
441  const auto &function_to_call = lookup_function_to_call();
442 
443  // create the function symbol
444  symbolt harness_function_symbol{};
445  harness_function_symbol.name = harness_function_symbol.base_name =
446  harness_function_symbol.pretty_name = harness_function_name;
447 
448  harness_function_symbol.is_lvalue = true;
449  harness_function_symbol.mode = function_to_call.mode;
450  harness_function_symbol.type = code_typet{{}, empty_typet{}};
451  harness_function_symbol.value = std::move(function_body);
452 
453  symbol_table->insert(harness_function_symbol);
454 
455  goto_convert(*symbol_table, *goto_functions, *message_handler);
456 }
457 
460  code_blockt &function_body)
461 {
462  const auto &function_to_call = lookup_function_to_call();
463  const auto &function_type = to_code_type(function_to_call.type);
464  const auto &parameters = function_type.parameters();
465 
466  code_function_callt::operandst arguments{};
467 
468  auto allocate_objects = allocate_objectst{function_to_call.mode,
469  function_to_call.location,
470  "__goto_harness",
471  *symbol_table};
472  std::map<irep_idt, irep_idt> parameter_name_to_argument_name;
473  for(const auto &parameter : parameters)
474  {
475  auto argument = allocate_objects.allocate_automatic_local_object(
476  remove_const(parameter.type()), parameter.get_base_name());
477  parameter_name_to_argument_name.insert(
478  {parameter.get_base_name(), argument.get_identifier()});
479  arguments.push_back(argument);
480  }
481 
482  for(const auto &pair : parameter_name_to_argument_name)
483  {
484  auto const &parameter_name = pair.first;
485  auto const &argument_name = pair.second;
486  if(function_parameters_to_treat_as_arrays.count(parameter_name) != 0)
487  {
488  function_arguments_to_treat_as_arrays.insert(argument_name);
489  }
490 
491  if(function_parameters_to_treat_as_cstrings.count(parameter_name) != 0)
492  {
493  function_arguments_to_treat_as_cstrings.insert(argument_name);
494  }
495 
496  auto it = function_parameter_to_associated_array_size.find(parameter_name);
497  if(it != function_parameter_to_associated_array_size.end())
498  {
499  auto const &associated_array_size_parameter = it->second;
500  auto associated_array_size_argument =
501  parameter_name_to_argument_name.find(associated_array_size_parameter);
502  if(
503  associated_array_size_argument == parameter_name_to_argument_name.end())
504  {
506  "could not find parameter to associate the array size of array \"" +
507  id2string(parameter_name) + "\" (Expected parameter: \"" +
508  id2string(associated_array_size_parameter) + "\" on function \"" +
509  id2string(function_to_call.display_name()) + "\" in " +
510  function_to_call.location.as_string() + ")",
512  }
513  function_argument_to_associated_array_size.insert(
514  {argument_name, associated_array_size_argument->second});
515  }
516  }
517 
518  // translate the parameter to argument also in the equality clusters
519  for(auto const &equal_cluster : function_parameters_to_treat_equal)
520  {
521  std::set<irep_idt> cluster_argument_names;
522  for(auto const &parameter_name : equal_cluster)
523  {
524  INVARIANT(
525  parameter_name_to_argument_name.count(parameter_name) != 0,
526  id2string(parameter_name) + " is not a parameter");
527  cluster_argument_names.insert(
528  parameter_name_to_argument_name[parameter_name]);
529  }
530  function_arguments_to_treat_equal.push_back(cluster_argument_names);
531  }
532 
533  allocate_objects.declare_created_symbols(function_body);
534  return arguments;
535 }
536 
538  const code_function_callt::argumentst &arguments,
539  code_blockt &function_body)
540 {
541  auto const &function_to_call = lookup_function_to_call();
542  for(auto const &argument : arguments)
543  {
544  generate_initialisation_code_for(function_body, argument);
545  if(recursive_initialization->needs_freeing(argument))
546  global_pointers.insert(to_symbol_expr(argument));
547  }
548  code_function_callt function_call{function_to_call.symbol_expr(),
549  std::move(arguments)};
550  function_call.add_source_location() = function_to_call.location;
551 
552  function_body.add(std::move(function_call));
553 }
554 
555 std::unordered_set<irep_idt> function_call_harness_generatort::implt::
557 {
558  std::unordered_set<irep_idt> nullables;
559  for(const auto &nullable :
560  recursive_initialization_config.potential_null_function_pointers)
561  {
562  const auto &nullable_name = id2string(nullable);
563  const auto &function_prefix = id2string(function) + "::";
564  if(has_prefix(nullable_name, function_prefix))
565  {
566  nullables.insert(
567  "__goto_harness::" + nullable_name.substr(function_prefix.size()));
568  }
569  else
570  {
571  nullables.insert(nullable_name);
572  }
573  }
574  return nullables;
575 }
exception_utils.h
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
recursive_initialization_configt::pointers_to_treat_as_cstrings
std::set< irep_idt > pointers_to_treat_as_cstrings
Definition: recursive_initialization.h:41
GOTO_HARNESS_GENERATOR_HARNESS_FUNCTION_NAME_OPT
#define GOTO_HARNESS_GENERATOR_HARNESS_FUNCTION_NAME_OPT
Definition: goto_harness_generator_factory.h:22
function_call_harness_generatort::implt::global_pointers
std::set< symbol_exprt > global_pointers
Definition: function_call_harness_generator.cpp:60
code_blockt
A codet representing sequential composition of program statements.
Definition: std_code.h:129
COMMON_HARNESS_GENERATOR_FUNCTION_POINTER_CAN_BE_NULL_OPT
#define COMMON_HARNESS_GENERATOR_FUNCTION_POINTER_CAN_BE_NULL_OPT
Definition: common_harness_generator_options.h:17
function_call_harness_generatort::implt::recursive_initialization
std::unique_ptr< recursive_initializationt > recursive_initialization
Definition: function_call_harness_generator.cpp:46
symbol_tablet
The symbol table.
Definition: symbol_table.h:13
function_call_harness_generatort::implt::lookup_function_to_call
const symbolt & lookup_function_to_call()
Return a reference to the entry function or throw if it doesn't exist.
Definition: function_call_harness_generator.cpp:413
function_call_harness_generatort::validate_options
void validate_options(const goto_modelt &goto_model) override
Check if options are in a sane state, throw otherwise.
Definition: function_call_harness_generator.cpp:305
ui_message_handlert
Definition: ui_message.h:21
arith_tools.h
function_call_harness_generatort::function_call_harness_generatort
function_call_harness_generatort(ui_message_handlert &message_handler)
Definition: function_call_harness_generator.cpp:95
string_utils.h
typet
The type of an expression, extends irept.
Definition: type.h:28
recursive_initialization.h
transform
static abstract_object_pointert transform(const exprt &expr, const std::vector< abstract_object_pointert > &operands, const abstract_environmentt &environment, const namespacet &ns)
Definition: abstract_value_object.cpp:159
deserialization_exceptiont
Thrown when failing to deserialize a value from some low level format, like JSON or raw bytes.
Definition: exception_utils.h:79
function_call_harness_generator.h
goto_harness_generator_factory.h
prefix.h
goto_model.h
recursive_initialization_configt::array_name_to_associated_array_size_variable
std::map< irep_idt, irep_idt > array_name_to_associated_array_size_variable
Definition: recursive_initialization.h:39
exprt
Base class for all expressions.
Definition: expr.h:55
goto_modelt
Definition: goto_model.h:25
function_harness_generator_options.h
function_call_harness_generatort::implt::harness_function_name
irep_idt harness_function_name
Definition: function_call_harness_generator.cpp:40
harness_options_parser::require_exactly_one_value
std::string require_exactly_one_value(const std::string &option, const std::list< std::string > &values)
Returns the only value of a single element list, throws an exception if not passed a single element l...
Definition: goto_harness_generator.cpp:21
recursive_initialization_configt::mode
irep_idt mode
Definition: recursive_initialization.h:30
goto_harness_generatort
Definition: goto_harness_generator.h:41
function_call_harness_generatort::implt::declare_arguments
code_function_callt::argumentst declare_arguments(code_blockt &function_body)
Declare local variables for each of the parameters of the entry function and return them.
Definition: function_call_harness_generator.cpp:459
can_cast_type< pointer_typet >
bool can_cast_type< pointer_typet >(const typet &type)
Check whether a reference to a typet is a pointer_typet.
Definition: pointer_expr.h:66
function_call_harness_generatort::implt::symbol_table
symbol_tablet * symbol_table
Definition: function_call_harness_generator.cpp:41
FUNCTION_HARNESS_GENERATOR_TREAT_POINTER_AS_ARRAY_OPT
#define FUNCTION_HARNESS_GENERATOR_TREAT_POINTER_AS_ARRAY_OPT
Definition: function_harness_generator_options.h:16
goto_convert
void goto_convert(const codet &code, symbol_table_baset &symbol_table, goto_programt &dest, message_handlert &message_handler, const irep_idt &mode)
Definition: goto_convert.cpp:1905
recursive_initialization_configt::pointers_to_treat_as_arrays
std::set< irep_idt > pointers_to_treat_as_arrays
Definition: recursive_initialization.h:37
remove_const
typet remove_const(typet type)
Remove const qualifier from type (if any).
Definition: type.cpp:32
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
function_call_harness_generatort::implt::function_parameters_to_treat_as_arrays
std::set< irep_idt > function_parameters_to_treat_as_arrays
Definition: function_call_harness_generator.cpp:48
FUNCTION_HARNESS_GENERATOR_TREAT_POINTER_AS_CSTRING
#define FUNCTION_HARNESS_GENERATOR_TREAT_POINTER_AS_CSTRING
Definition: function_harness_generator_options.h:22
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
code_function_callt
goto_instruction_codet representation of a function call statement.
Definition: goto_instruction_code.h:271
split_string
void split_string(const std::string &s, char delim, std::vector< std::string > &result, bool strip, bool remove_empty)
Definition: string_utils.cpp:39
can_cast_type< code_typet >
bool can_cast_type< code_typet >(const typet &type)
Check whether a reference to a typet is a code_typet.
Definition: std_types.h:731
to_code_type
const code_typet & to_code_type(const typet &type)
Cast a typet to a code_typet.
Definition: std_types.h:744
make_unique.h
FUNCTION_HARNESS_GENERATOR_TREAT_POINTERS_EQUAL_MAYBE_OPT
#define FUNCTION_HARNESS_GENERATOR_TREAT_POINTERS_EQUAL_MAYBE_OPT
Definition: function_harness_generator_options.h:24
empty_typet
The empty type.
Definition: std_types.h:50
function_call_harness_generatort::implt::generate
void generate(goto_modelt &goto_model, const irep_idt &harness_function_name)
Definition: function_call_harness_generator.cpp:224
signed_int_type
signedbv_typet signed_int_type()
Definition: c_types.cpp:40
has_prefix
bool has_prefix(const std::string &s, const std::string &prefix)
Definition: converter.cpp:13
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
recursive_initialization_configt::potential_null_function_pointers
std::unordered_set< irep_idt > potential_null_function_pointers
Definition: recursive_initialization.h:31
function_call_harness_generatort::implt::map_function_parameters_to_function_argument_names
std::unordered_set< irep_idt > map_function_parameters_to_function_argument_names()
For function parameters that are pointers to functions we want to be able to specify whether or not t...
Definition: function_call_harness_generator.cpp:556
FUNCTION_HARNESS_GENERATOR_NONDET_GLOBALS_OPT
#define FUNCTION_HARNESS_GENERATOR_NONDET_GLOBALS_OPT
Definition: function_harness_generator_options.h:15
function_to_call
code_function_callt function_to_call(symbol_tablet &symbol_table, const irep_idt &id, const irep_idt &argument)
Definition: function.cpp:25
FUNCTION_HARNESS_GENERATOR_ASSOCIATED_ARRAY_SIZE_OPT
#define FUNCTION_HARNESS_GENERATOR_ASSOCIATED_ARRAY_SIZE_OPT
Definition: function_harness_generator_options.h:20
function_call_harness_generatort::implt::message_handler
ui_message_handlert * message_handler
Definition: function_call_harness_generator.cpp:38
function_call_harness_generatort::implt::recursive_initialization_config
recursive_initialization_configt recursive_initialization_config
Definition: function_call_harness_generator.cpp:45
to_pointer_type
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Definition: pointer_expr.h:79
function_call_harness_generatort::~function_call_harness_generatort
~function_call_harness_generatort() override
to_symbol_expr
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition: std_expr.h:222
code_typet
Base type of functions.
Definition: std_types.h:538
function_call_harness_generatort::implt::function_parameter_to_associated_array_size
std::map< irep_idt, irep_idt > function_parameter_to_associated_array_size
Definition: function_call_harness_generator.cpp:58
irept::id
const irep_idt & id() const
Definition: irep.h:396
exprt::operandst
std::vector< exprt > operandst
Definition: expr.h:58
code_function_callt::argumentst
exprt::operandst argumentst
Definition: goto_instruction_code.h:281
code_blockt::add
void add(const codet &code)
Definition: std_code.h:168
function_call_harness_generatort::p_impl
std::unique_ptr< implt > p_impl
Definition: function_call_harness_generator.h:42
std_code.h
function_call_harness_generatort::implt::function_parameters_to_treat_equal
std::vector< std::set< irep_idt > > function_parameters_to_treat_equal
Definition: function_call_harness_generator.cpp:51
function_call_harness_generatort::handle_option
void handle_option(const std::string &option, const std::list< std::string > &values) override
Handle a command line argument.
Definition: function_call_harness_generator.cpp:104
recursive_initialization_configt::variables_that_hold_array_sizes
std::set< irep_idt > variables_that_hold_array_sizes
Definition: recursive_initialization.h:38
FUNCTION_HARNESS_GENERATOR_FUNCTION_OPT
#define FUNCTION_HARNESS_GENERATOR_FUNCTION_OPT
Definition: function_harness_generator_options.h:14
goto_functionst
A collection of goto functions.
Definition: goto_functions.h:24
function_call_harness_generatort::implt::function_arguments_to_treat_as_cstrings
std::set< irep_idt > function_arguments_to_treat_as_cstrings
Definition: function_call_harness_generator.cpp:55
function_call_harness_generatort::implt::function_parameters_to_treat_as_cstrings
std::set< irep_idt > function_parameters_to_treat_as_cstrings
Definition: function_call_harness_generator.cpp:54
goto_modelt::goto_functions
goto_functionst goto_functions
GOTO functions.
Definition: goto_model.h:33
function_call_harness_generatort::implt
This contains implementation details of function call harness generator to avoid leaking them out int...
Definition: function_call_harness_generator.cpp:36
COMMON_HARNESS_GENERATOR_MIN_ARRAY_SIZE_OPT
#define COMMON_HARNESS_GENERATOR_MIN_ARRAY_SIZE_OPT
Definition: common_harness_generator_options.h:15
symbolt
Symbol table entry.
Definition: symbol.h:27
from_integer
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
Definition: arith_tools.cpp:100
function_call_harness_generatort::implt::goto_functions
goto_functionst * goto_functions
Definition: function_call_harness_generator.cpp:42
function_call_harness_generatort::implt::generate_nondet_globals
void generate_nondet_globals(code_blockt &function_body)
Iterate over the symbol table and generate initialisation code for globals into the function body.
Definition: function_call_harness_generator.cpp:268
function_call_harness_generatort::implt::function_arguments_to_treat_equal
std::vector< std::set< irep_idt > > function_arguments_to_treat_equal
Definition: function_call_harness_generator.cpp:52
recursive_initialization_configt
Definition: recursive_initialization.h:26
symbol_table_baset::lookup
const symbolt * lookup(const irep_idt &name) const
Find a symbol in the symbol table for read-only access.
Definition: symbol_table_base.h:95
allocate_objectst
Definition: allocate_objects.h:26
function_call_harness_generatort::implt::nondet_globals
bool nondet_globals
Definition: function_call_harness_generator.cpp:43
goto_convert_functions.h
function_call_harness_generatort::generate
void generate(goto_modelt &goto_model, const irep_idt &harness_function_name) override
Generate a harness according to the set options.
Definition: function_call_harness_generator.cpp:217
exprt::add_source_location
source_locationt & add_source_location()
Definition: expr.h:216
function_call_harness_generatort::implt::ensure_harness_does_not_already_exist
void ensure_harness_does_not_already_exist()
Throw if the harness function already exists in the symbol table.
Definition: function_call_harness_generator.cpp:428
COMMON_HARNESS_GENERATOR_MAX_ARRAY_SIZE_OPT
#define COMMON_HARNESS_GENERATOR_MAX_ARRAY_SIZE_OPT
Definition: common_harness_generator_options.h:16
function_call_harness_generatort::implt::function_argument_to_associated_array_size
std::map< irep_idt, irep_idt > function_argument_to_associated_array_size
Definition: function_call_harness_generator.cpp:57
recursive_initializationt::is_initialization_allowed
static bool is_initialization_allowed(const symbolt &symbol)
Definition: recursive_initialization.h:106
invalid_command_line_argument_exceptiont
Thrown when users pass incorrect command line arguments, for example passing no files to analysis or ...
Definition: exception_utils.h:50
goto_modelt::symbol_table
symbol_tablet symbol_table
Symbol table.
Definition: goto_model.h:30
allocate_objects.h
c_types.h
symbolt::name
irep_idt name
The unique identifier.
Definition: symbol.h:40
function_call_harness_generatort::implt::generate_initialisation_code_for
void generate_initialisation_code_for(code_blockt &block, const exprt &lhs)
Generate initialisation code for one lvalue inside block.
Definition: function_call_harness_generator.cpp:295
validation_modet::INVARIANT
@ INVARIANT
FUNCTION_HARNESS_GENERATOR_TREAT_POINTERS_EQUAL_OPT
#define FUNCTION_HARNESS_GENERATOR_TREAT_POINTERS_EQUAL_OPT
Definition: function_harness_generator_options.h:18
function_call_harness_generatort::implt::add_harness_function_to_goto_model
void add_harness_function_to_goto_model(code_blockt function_body)
Update the goto-model with the new harness function.
Definition: function_call_harness_generator.cpp:439
recursive_initialization_configt::pointers_to_treat_equal
std::vector< std::set< irep_idt > > pointers_to_treat_equal
Definition: recursive_initialization.h:42
function_call_harness_generatort::implt::function_arguments_to_treat_as_arrays
std::set< irep_idt > function_arguments_to_treat_as_arrays
Definition: function_call_harness_generator.cpp:49
function_call_harness_generatort::implt::call_function
void call_function(const code_function_callt::argumentst &arguments, code_blockt &function_body)
Write initialisation code for each of the arguments into function_body, then insert a call to the ent...
Definition: function_call_harness_generator.cpp:537
ui_message.h