void show_loop_ids( ui_message_handlert::uit ui, const goto_functionst &goto_functions) { switch(ui) { case ui_message_handlert::PLAIN: case ui_message_handlert::XML_UI: forall_goto_functions(it, goto_functions) show_loop_ids(ui, it->second.body); break; case ui_message_handlert::JSON_UI: json_objectt json_result; json_arrayt &loops=json_result["loops"].make_array(); forall_goto_functions(it, goto_functions) show_loop_ids_json(ui, it->second.body, loops); std::cout << ",\n" << json_result; break; } }
bool symex_parseoptionst::process_goto_program( const optionst &options, goto_functionst &goto_functions) { try { namespacet ns(symbol_table); // do partial inlining status() << "Partial Inlining" << eom; goto_partial_inline(goto_functions, ns, ui_message_handler); // add generic checks status() << "Generic Property Instrumentation" << eom; goto_check(ns, options, goto_functions); // recalculate numbers, etc. goto_functions.update(); // add loop ids goto_functions.compute_loop_numbers(); // if we aim to cover, replace // all assertions by false to prevent simplification if(cmdline.isset("cover-assertions")) make_assertions_false(goto_functions); // show it? if(cmdline.isset("show-loops")) { show_loop_ids(get_ui(), goto_functions); return true; } // show it? if(cmdline.isset("show-goto-functions")) { goto_functions.output(ns, std::cout); return true; } } catch(const char *e) { error(e); return true; } catch(const std::string e) { error(e); return true; } catch(int) { return true; } catch(std::bad_alloc) { error() << "Out of memory" << eom; return true; } return false; }
bool symex_parse_optionst::process_goto_program(const optionst &options) { try { // we add the library status() << "Adding CPROVER library" << eom; link_to_library(goto_model, ui_message_handler); // do partial inlining status() << "Partial Inlining" << eom; goto_partial_inline(goto_model, ui_message_handler); // add generic checks status() << "Generic Property Instrumentation" << eom; goto_check(options, goto_model); // remove stuff remove_complex(goto_model); remove_vector(goto_model); remove_virtual_functions(goto_model); // recalculate numbers, etc. goto_model.goto_functions.update(); // add loop ids goto_model.goto_functions.compute_loop_numbers(); if(cmdline.isset("cover")) { std::string criterion=cmdline.get_value("cover"); coverage_criteriont c; if(criterion=="assertion" || criterion=="assertions") c=coverage_criteriont::ASSERTION; else if(criterion=="path" || criterion=="paths") c=coverage_criteriont::PATH; else if(criterion=="branch" || criterion=="branches") c=coverage_criteriont::BRANCH; else if(criterion=="location" || criterion=="locations") c=coverage_criteriont::LOCATION; else if(criterion=="decision" || criterion=="decisions") c=coverage_criteriont::DECISION; else if(criterion=="condition" || criterion=="conditions") c=coverage_criteriont::CONDITION; else if(criterion=="mcdc") c=coverage_criteriont::MCDC; else if(criterion=="cover") c=coverage_criteriont::COVER; else { error() << "unknown coverage criterion" << eom; return true; } status() << "Instrumenting coverge goals" << eom; instrument_cover_goals(symbol_table, goto_model.goto_functions, c); goto_model.goto_functions.update(); } // show it? if(cmdline.isset("show-loops")) { show_loop_ids(get_ui(), goto_model.goto_functions); return true; } // show it? if(cmdline.isset("show-goto-functions")) { const namespacet ns(goto_model.symbol_table); goto_model.goto_functions.output(ns, std::cout); return true; } } catch(const char *e) { error() << e << eom; return true; } catch(const std::string e) { error() << e << eom; return true; } catch(int) { return true; } catch(std::bad_alloc) { error() << "Out of memory" << eom; return true; } return false; }
void show_loop_ids( ui_message_handlert::uit ui, const goto_modelt &goto_model) { show_loop_ids(ui, goto_model.goto_functions); }
bool cbmc_parse_optionst::process_goto_program( const optionst &options, goto_functionst &goto_functions) { try { namespacet ns(symbol_table); // Remove inline assembler; this needs to happen before // adding the library. remove_asm(symbol_table, goto_functions); // add the library status() << "Adding CPROVER library (" << config.ansi_c.arch << ")" << eom; link_to_library(symbol_table, goto_functions, ui_message_handler); if(cmdline.isset("string-abstraction")) string_instrumentation( symbol_table, get_message_handler(), goto_functions); // remove function pointers status() << "Function Pointer Removal" << eom; remove_function_pointers(symbol_table, goto_functions, cmdline.isset("pointer-check")); // full slice? if(cmdline.isset("full-slice")) { status() << "Performing a full slice" << eom; full_slicer(goto_functions, ns); } // do partial inlining status() << "Partial Inlining" << eom; goto_partial_inline(goto_functions, ns, ui_message_handler); // remove returns, gcc vectors, complex remove_returns(symbol_table, goto_functions); remove_vector(symbol_table, goto_functions); remove_complex(symbol_table, goto_functions); // add generic checks status() << "Generic Property Instrumentation" << eom; goto_check(ns, options, goto_functions); if(cmdline.isset("string-abstraction")) { status() << "String Abstraction" << eom; string_abstraction(symbol_table, get_message_handler(), goto_functions); } // add failed symbols // needs to be done before pointer analysis add_failed_symbols(symbol_table); // recalculate numbers, etc. goto_functions.update(); // add loop ids goto_functions.compute_loop_numbers(); // if we aim to cover assertions, replace // all assertions by false to prevent simplification if(cmdline.isset("cover") && cmdline.get_value("cover")=="assertions") make_assertions_false(goto_functions); // show it? if(cmdline.isset("show-loops")) { show_loop_ids(get_ui(), goto_functions); return true; } // show it? if(cmdline.isset("show-goto-functions")) { goto_functions.output(ns, std::cout); return true; } } catch(const char *e) { error() << e << eom; return true; } catch(const std::string e) { error() << e << eom; return true; } catch(int) { return true; } catch(std::bad_alloc) { error() << "Out of memory" << eom; return true; } return false; }