39 std::pair<irep_idt, std::pair<dfcc_contract_modet, loop_contract_configt>>>
47 std::set<irep_idt> &function_pointer_contracts,
48 bool allow_recursive_calls)
50 auto pair =
cache.insert(
51 {function_id, {contract_id, {contract_mode, loop_contract_config}}});
52 auto inserted = pair.second;
56 irep_idt old_contract_id = pair.first->second.first;
59 pair.first->second.second.second;
63 old_contract_id != contract_id || old_contract_mode != contract_mode ||
64 old_loop_contract_config != loop_contract_config)
66 std::ostringstream err_msg;
67 err_msg <<
"DFCC: multiple attempts to swap and wrap function '"
68 << function_id <<
"':\n";
69 err_msg <<
"- with '" << old_contract_id <<
"' in "
71 << old_loop_contract_config.
to_string() <<
"\n";
72 err_msg <<
"- with '" << contract_id <<
"' in "
74 << loop_contract_config.
to_string() <<
"\n";
90 function_pointer_contracts,
91 allow_recursive_calls);
106 dest.insert(it.first);
138 std::set<irep_idt> &function_pointer_contracts,
139 bool allow_recursive_calls)
142 const irep_idt &wrapper_id = function_id;
144 id2string(wrapper_id) +
"_wrapped_for_contract_checking";
150 const auto &wrapper_symbol =
157 "__contract_check_in_progress",
158 wrapper_symbol.location,
160 wrapper_symbol.module,
168 "__contract_checked_once",
169 wrapper_symbol.location,
171 wrapper_symbol.module,
176 check_started, wrapper_symbol.location));
188 "Only a single top-level call to function " +
id2string(function_id) +
189 " when checking contract " +
id2string(contract_id));
192 check_started,
true_exprt(), wrapper_symbol.location));
197 "__write_set_to_check",
207 function_pointer_contracts);
210 check_completed,
true_exprt(), wrapper_symbol.location));
212 check_started,
false_exprt(), wrapper_symbol.location));
215 auto goto_end_function =
219 auto contract_replacement_label =
221 check_started_goto->complete_goto(contract_replacement_label);
223 if(allow_recursive_calls)
232 function_pointer_contracts);
240 "No recursive call to function " +
id2string(function_id) +
241 " when checking contract " +
id2string(contract_id));
247 auto end_function_label =
249 goto_end_function->complete_goto(end_function_label);
252 goto_model.goto_functions.function_map.at(function_id).body.swap(body);
257 goto_model.goto_functions.function_map.at(wrapper_id).make_hidden();
261 wrapped_id, wrapper_id, loop_contract_config, function_pointer_contracts);
269 std::set<irep_idt> &function_pointer_contracts)
271 const irep_idt &wrapper_id = function_id;
273 id2string(function_id) +
"_wrapped_for_replacement_with_contract";
279 "__write_set_to_check",
291 function_pointer_contracts);
297 goto_model.goto_functions.function_map.at(wrapper_id).make_hidden();
300 goto_model.goto_functions.function_map.at(function_id).body.swap(body);
A contract is represented by a function declaration or definition with contract clauses attached to i...
This class instruments GOTO functions or instruction sequences for frame condition checking and loop ...
Class interface to library types and functions defined in cprover_contracts.c.
This class rewrites GOTO functions that use the built-ins:
void check_contract(const loop_contract_configt &loop_contract_config, const irep_idt &function_id, const irep_idt &contract_id, std::set< irep_idt > &function_pointer_contracts, bool allow_recursive_calls)
Swaps-and-wraps the given function_id in a wrapper function that checks the given contract_id.
message_handlert & message_handler
dfcc_spec_functionst & spec_functions
dfcc_swap_and_wrapt(goto_modelt &goto_model, message_handlert &message_handler, dfcc_libraryt &library, dfcc_instrumentt &instrument, dfcc_spec_functionst &spec_functions, dfcc_contract_handlert &contract_handler)
void get_swapped_functions(std::set< irep_idt > &dest) const
Adds the set of swapped functions to dest.
static std::map< irep_idt, std::pair< irep_idt, std::pair< dfcc_contract_modet, loop_contract_configt > > > cache
remember all functions that were swapped/wrapped and in which mode
dfcc_instrumentt & instrument
dfcc_contract_handlert & contract_handler
void replace_with_contract(const irep_idt &function_id, const irep_idt &contract_id, std::set< irep_idt > &function_pointer_contracts)
Swaps-and-wraps the given function_id in a wrapper function that models the abstract behaviour of con...
void swap_and_wrap(const dfcc_contract_modet contract_mode, const loop_contract_configt &loop_contract_config, const irep_idt &function_id, const irep_idt &contract_id, std::set< irep_idt > &function_pointer_contracts, bool allow_recursive_calls)
The Boolean constant false.
A generic container class for the GOTO intermediate representation of one function.
static instructiont make_assumption(const exprt &g, const source_locationt &l=source_locationt::nil())
static instructiont make_end_function(const source_locationt &l=source_locationt::nil())
static instructiont make_assignment(const code_assignt &_code, const source_locationt &l=source_locationt::nil())
Create an assignment instruction.
static instructiont make_skip(const source_locationt &l=source_locationt::nil())
targett add(instructiont &&instruction)
Adds a given instruction at the end.
static instructiont make_assertion(const exprt &g, const source_locationt &l=source_locationt::nil())
static instructiont make_incomplete_goto(const exprt &_cond, const source_locationt &l=source_locationt::nil())
void set_comment(const irep_idt &comment)
void set_property_class(const irep_idt &property_class)
void set_function(const irep_idt &function)
class symbol_exprt symbol_expr() const
Produces a symbol_exprt for a symbol.
The Boolean constant true.
Specialisation of dfcc_contract_handlert for contracts.
std::string dfcc_contract_mode_to_string(const dfcc_contract_modet mode)
dfcc_contract_modet
Enum type representing the contract checking and replacement modes.
Add instrumentation to a goto program to perform frame condition checks.
Dynamic frame condition checking library loading.
@ CAR_SET_PTR
type of pointers to sets of CAR
Given a function_id and contract_id, swaps its body to a function with a fresh mangled name,...
Dynamic frame condition checking utility functions.
const std::string & id2string(const irep_idt &d)
static symbolt & get_function_symbol(symbol_table_baset &, const irep_idt &function_id)
Returns the symbolt for function_id.
static const symbolt & create_new_parameter_symbol(symbol_table_baset &, const irep_idt &function_id, const std::string &base_name, const typet &type)
Creates a new parameter symbol for the given function_id.
static void wrap_function(goto_modelt &goto_model, const irep_idt &function_id, const irep_idt &wrapped_function_id)
Given a function to wrap foo and a new name wrapped_foo.
static const symbolt & create_static_symbol(symbol_table_baset &, const typet &type, const std::string &prefix, const std::string &base_name, const source_locationt &source_location, const irep_idt &mode, const irep_idt &module, const exprt &initial_value, const bool no_nondet_initialization=true)
Adds a new static symbol named prefix::base_name of type type with value initial_value in the symbol ...
static void add_parameter(goto_modelt &, const symbolt &symbol, const irep_idt &function_id)
Adds the given symbol as parameter to the function symbol's code_type.
Loop contract configurations.
std::string to_string() const