Go to the documentation of this file.
34 incr_loop_id(options.get_option(
"incremental-loop")),
36 options.is_set(
"unwind-max") ? options.get_signed_int_option(
"unwind-max")
37 : std::numeric_limits<unsigned>::max()),
39 options.is_set(
"unwind-min") ? options.get_signed_int_option(
"unwind-min")
59 tvt abort_unwind_decision;
60 unsigned this_loop_limit = std::numeric_limits<unsigned>::max();
69 abort_unwind_decision =
tvt(unwind >= this_loop_limit);
75 abort_unwind_decision =
76 handler(context, source.
pc->loop_number, unwind, this_loop_limit);
87 if(!limit.has_value())
88 abort_unwind_decision =
tvt(
false);
90 abort_unwind_decision =
tvt(unwind >= *limit);
95 abort_unwind_decision.
is_known(),
"unwind decision should be taken by now");
96 bool abort = abort_unwind_decision.
is_true();
99 log.
statistics() << (abort ?
"Not unwinding" :
"Unwinding") <<
" loop " <<
id
100 <<
" iteration " << unwind;
102 if(this_loop_limit != std::numeric_limits<unsigned>::max())
virtual void symex_with_state(statet &state, const get_goto_functiont &get_goto_functions, symbol_tablet &new_symbol_table)
Symbolically execute the entire program starting from entry point.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
static structured_data_entryt data_node(const jsont &data)
std::vector< loop_unwind_handlert > loop_unwind_handlers
Callbacks that may provide an unwind/do-not-unwind decision for a loop.
goto_programt::const_targett pc
Storage for symbolic execution paths to be resumed later.
bool ignore_assertions
If this flag is set to true then assertions will be temporarily ignored by the symbolic executions.
bool check_break(const irep_idt &loop_id, unsigned unwind) override
Defines condition for interrupting symbolic execution for incremental BMC.
symex_bmc_incremental_one_loopt(message_handlert &, const symbol_tablet &outer_symbol_table, symex_target_equationt &, const optionst &, path_storaget &, guard_managert &, unwindsett &, ui_message_handlert::uit output_ui)
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
std::unique_ptr< statet > initialize_entry_point_state(const get_goto_functiont &get_goto_function)
Initialize the symbolic execution and the given state with the beginning of the entry point function.
optionalt< unsigned > get_limit(const irep_idt &loop, unsigned thread_id) const
static irep_idt loop_id(const irep_idt &function_id, const instructiont &instruction)
Human-readable loop name.
messaget log
The messaget to write log messages to.
This is unused by this implementation of guards, but can be used by other implementations of the same...
std::unique_ptr< goto_symext::statet > state
const unsigned incr_max_unwind
A way of representing nested key/value data.
Inheriting the interface of symex_targett this class represents the SSA form of the input program as ...
bool should_stop_unwind(const symex_targett::sourcet &source, const call_stackt &context, unsigned unwind) override
Determine whether to unwind a loop.
bool get_bool_option(const std::string &option) const
static get_goto_functiont get_goto_function(abstract_goto_modelt &goto_model)
Return a function to get/load a goto function from the given goto model Create a default delegate to ...
const unsigned incr_min_unwind
const irep_idt incr_loop_id
bool resume(const get_goto_functiont &get_goto_function)
Return true if symex can be resumed.
std::function< const goto_functionst::goto_functiont &(const irep_idt &)> get_goto_functiont
The type of delegate functions that retrieve a goto_functiont for a particular function identifier.
void log_unwinding(unsigned unwind)
Identifies source in the context of symbolic execution.
bool from_entry_point_of(const get_goto_functiont &get_goto_function, symbol_tablet &new_symbol_table)
Return true if symex can be resumed.
mstreamt & statistics() const
bool should_pause_symex
Set when states are pushed onto the workqueue If this flag is set at the end of a symbolic execution ...