void summarizer_fwt::inline_summaries(const function_namet &function_name, local_SSAt &SSA, const exprt &precondition, bool context_sensitive) { for(local_SSAt::nodest::const_iterator n_it = SSA.nodes.begin(); n_it != SSA.nodes.end(); n_it++) { for(local_SSAt::nodet::function_callst::const_iterator f_it = n_it->function_calls.begin(); f_it != n_it->function_calls.end(); f_it++) { assert(f_it->function().id()==ID_symbol); //no function pointers if(!check_call_reachable(function_name,SSA,n_it,f_it,precondition,true)) { continue; } if(!check_precondition(function_name,SSA,n_it,f_it, precondition,context_sensitive)) { exprt precondition_call = true_exprt(); if(context_sensitive) precondition_call = compute_calling_context( function_name,SSA,n_it,f_it,precondition,true); irep_idt fname = to_symbol_expr(f_it->function()).get_identifier(); status() << "Recursively summarizing function " << fname << eom; compute_summary_rec(fname,precondition_call,context_sensitive); summaries_used++; } } } }
void summarizer_fw_termt::inline_summaries( const function_namet &function_name, local_SSAt &SSA, exprt precondition, bool context_sensitive, threevalt &calls_terminate, bool &has_function_calls) { for(local_SSAt::nodest::iterator n_it=SSA.nodes.begin(); n_it!=SSA.nodes.end(); n_it++) { for(local_SSAt::nodet::function_callst::iterator f_it= n_it->function_calls.begin(); f_it!=n_it->function_calls.end(); f_it++) { assert(f_it->function().id()==ID_symbol); // no function pointers exprt::operandst c; c.push_back(precondition); get_assertions(SSA, c); // assertions as assumptions precondition=conjunction(c); if(!options.get_bool_option("competition-mode") && !check_call_reachable( function_name, SSA, n_it, f_it, precondition, true)) continue; has_function_calls=true; irep_idt fname=to_symbol_expr(f_it->function()).get_identifier(); if(!check_precondition( function_name, SSA, n_it, f_it, precondition, context_sensitive)) { exprt precondition_call=true_exprt(); if(context_sensitive) precondition_call=compute_calling_context( function_name, SSA, n_it, f_it, precondition, true); status() << "Recursively summarizing function " << fname << eom; compute_summary_rec(fname, precondition_call, context_sensitive); summaries_used++; } // get information about callee termination if(summary_db.exists(fname) && summary_db.get(fname).terminates!=YES) { // cannot propagate NO // because call reachability might be over-approximating calls_terminate=UNKNOWN; break; } } } }
void summarizer_bwt::summarize(const function_namet &function_name) { status() << "\nBackward analysis..." << eom; exprt postcondition = true_exprt(); //initial calling context status() << "\nSummarizing function " << function_name << eom; if(summary_db.exists(function_name)) { compute_summary_rec(function_name,postcondition,true); } else status() << "Skipping function " << function_name << eom; }
void summarizer_bwt::summarize() { status() << "\nBackward analysis..." << eom; exprt postcondition = true_exprt(); //initial calling context for(functionst::const_iterator it = ssa_db.functions().begin(); it!=ssa_db.functions().end(); it++) { status() << "\nSummarizing function " << it->first << eom; if(summary_db.exists(it->first) && summary_db.get(it->first).bw_precondition.is_nil()) compute_summary_rec(it->first,postcondition,false); else status() << "Skipping function " << it->first << eom; } }