|
| exploded_graph (const supergraph &sg, logger *logger, const extrinsic_state &ext_state, const state_purge_map *purge_map, const analysis_plan &plan, int verbosity) |
|
| ~exploded_graph () |
|
logger * | get_logger () const |
|
const supergraph & | get_supergraph () const |
|
const extrinsic_state & | get_ext_state () const |
|
engine * | get_engine () const |
|
const state_purge_map * | get_purge_map () const |
|
const analysis_plan & | get_analysis_plan () const |
|
exploded_node * | get_origin () const |
|
exploded_node * | add_function_entry (const function &fun) |
|
void | build_initial_worklist () |
|
void | process_worklist () |
|
bool | maybe_process_run_of_before_supernode_enodes (exploded_node *node) |
|
void | process_node (exploded_node *node) |
|
bool | maybe_create_dynamic_call (const gcall *call, tree fn_decl, exploded_node *node, program_state next_state, program_point &next_point, uncertainty_t *uncertainty, logger *logger) |
|
exploded_node * | get_or_create_node (const program_point &point, const program_state &state, exploded_node *enode_for_diag) |
|
exploded_edge * | add_edge (exploded_node *src, exploded_node *dest, const superedge *sedge, bool could_do_work, std::unique_ptr< custom_edge_info > custom=NULL) |
|
per_program_point_data * | get_or_create_per_program_point_data (const program_point &) |
|
per_program_point_data * | get_per_program_point_data (const program_point &) const |
|
per_call_string_data * | get_or_create_per_call_string_data (const call_string &) |
|
per_function_data * | get_or_create_per_function_data (function *) |
|
per_function_data * | get_per_function_data (function *) const |
|
void | save_diagnostic (const state_machine &sm, const exploded_node *enode, const supernode *node, const gimple *stmt, stmt_finder *finder, tree var, state_machine::state_t state, pending_diagnostic *d) |
|
diagnostic_manager & | get_diagnostic_manager () |
|
const diagnostic_manager & | get_diagnostic_manager () const |
|
stats * | get_global_stats () |
|
stats * | get_or_create_function_stats (function *fn) |
|
void | log_stats () const |
|
void | dump_stats (FILE *) const |
|
void | dump_states_for_supernode (FILE *, const supernode *snode) const |
|
void | dump_exploded_nodes () const |
|
std::unique_ptr< json::object > | to_json () const |
|
exploded_node * | get_node_by_index (int idx) const |
|
const call_string_data_map_t * | get_per_call_string_data () const |
|
int | get_scc_id (const supernode &node) const |
|
void | on_escaped_function (tree fndecl) |
|
void | detect_infinite_loops () |
|
void | detect_infinite_recursion (exploded_node *enode) |
|
exploded_node * | find_previous_entry_to (function *top_of_stack_fun, exploded_node *enode) const |
|
void | dump_dot_to_pp (pretty_printer *pp, cluster_t *root_cluster, const dump_args_t &args) const |
|
void | dump_dot_to_file (FILE *fp, cluster_t *root_cluster, const dump_args_t &args) const |
|
void | dump_dot (const char *path, cluster_t *root_cluster, const dump_args_t &args) const |
|
void | add_node (node_t *node) |
|
void | add_edge (edge_t *edge) |
|
An exploded_graph is a directed graph of unique <point, state> pairs.
It also has a worklist of nodes that are waiting for their successors
to be added to the graph.
void exploded_graph::detect_infinite_recursion |
( |
exploded_node * | enode | ) |
|
Implementation of -Wanalyzer-infinite-recursion.
Called when adding ENODE to the graph, after adding its first in-edge.
For function entrypoints, see if recursion has occurred, and, if so,
check if the state of memory changed between the recursion levels,
which would suggest some kind of decreasing variant that leads to
termination.
For recursive calls where the state of memory is effectively unchanged
between recursion levels, warn with -Wanalyzer-infinite-recursion.
References ana::diagnostic_manager::add_diagnostic(), ana::call_string::count_occurrences_of_function(), function::decl, find_previous_entry_to(), gcc_assert, ana::program_point::get_call_string(), get_diagnostic_manager(), ana::exploded_node::get_function(), get_logger(), ana::exploded_node::get_point(), ana::exploded_node::get_supernode(), ana::call_string::get_top_of_stack(), is_entrypoint_p(), ana::logger::log(), ana::call_string::element_t::m_caller, ana::exploded_node::m_index, ana::supernode::m_returning_call, make_unique(), and sufficiently_different_p().