Records the call stack Care must be taken when using this on recursive code; it will need the domain to be capable of limiting the recursion.
More...
#include <call_stack_history.h>
Records the call stack Care must be taken when using this on recursive code; it will need the domain to be capable of limiting the recursion.
Definition at line 20 of file call_stack_history.h.
◆ cse_ptrt
◆ call_stack_historyt() [1/4]
call_stack_historyt::call_stack_historyt |
( |
cse_ptrt |
cur_stack, |
|
|
unsigned int |
rec_lim |
|
) |
| |
|
inlineprotected |
◆ call_stack_historyt() [2/4]
call_stack_historyt::call_stack_historyt |
( |
locationt |
l | ) |
|
|
inlineexplicit |
◆ call_stack_historyt() [3/4]
call_stack_historyt::call_stack_historyt |
( |
locationt |
l, |
|
|
unsigned int |
rec_lim |
|
) |
| |
|
inline |
◆ call_stack_historyt() [4/4]
◆ current_location()
const locationt& call_stack_historyt::current_location |
( |
void |
| ) |
const |
|
inlineoverridevirtual |
◆ has_recursion_limit()
bool call_stack_historyt::has_recursion_limit |
( |
void |
| ) |
const |
|
inlineprotected |
◆ operator<()
◆ operator==()
◆ output()
void call_stack_historyt::output |
( |
std::ostream & |
out | ) |
const |
|
overridevirtual |
◆ should_widen()
Domains with a substantial height may need to widen when merging this method allows the history to provide a hint on when to do this The suggested use of this is for domains merge operation to check this and then widen in a domain specific way.
However it could be used in other ways (such as the transformer). The key idea is that the history tracks / should know when to widen and when to continue.
Reimplemented from ai_history_baset.
Definition at line 100 of file call_stack_history.h.
◆ step()
Step creates a new history by advancing the current one to location "to" It is given the set of all other histories that have reached this point.
In the case of function call return it is also given the full history of the caller. This allows function-local histories as they can "pick up" the state from before the call when computing the return edge.
PRECONDITION(to.id_dereferenceable()); PRECONDITION(to in goto_program.get_successors(current_location()) || current_location()->is_function_call() || current_location()->is_end_function()); PRECONDITION(caller_hist == no_caller_history || current_location()->is_end_function);
Step may do one of three things :
- Create a new history object and return a pointer to it This will force the analyser to continue regardless of domain changes POSTCONDITION(IMPLIES(result.first == step_statust::NEW, result.second.use_count() == 1 ));
- Merge with an existing history This means the analyser will only continue if the domain is updated POSTCONDITION(IMPLIES(result.first == step_statust::MERGED, result.second is an element of others));
- Block this flow of execution This indicates the transition is impossible (returning to a location other than the call location) or undesireable (omitting some traces) POSTCONDITION(IMPLIES(result.first == BLOCKED, result.second == nullptr()));
Implements ai_history_baset.
Definition at line 14 of file call_stack_history.cpp.
◆ current_stack
cse_ptrt call_stack_historyt::current_stack |
|
protected |
◆ recursion_limit
unsigned int call_stack_historyt::recursion_limit |
|
protected |
The documentation for this class was generated from the following files: