diff --git a/jbmc/src/janalyzer/janalyzer_parse_options.cpp b/jbmc/src/janalyzer/janalyzer_parse_options.cpp index fc5774dde5f..03585fe582f 100644 --- a/jbmc/src/janalyzer/janalyzer_parse_options.cpp +++ b/jbmc/src/janalyzer/janalyzer_parse_options.cpp @@ -703,13 +703,7 @@ void janalyzer_parse_optionst::process_goto_function( remove_returns(function, function_is_stub); - // add generic checks - goto_check( - function.get_function_id(), - function.get_goto_function(), - ns, - options, - ui_message_handler); + transform_assertions_assumptions(options, function.get_goto_function().body); } bool janalyzer_parse_optionst::can_generate_function_body(const irep_idt &name) diff --git a/jbmc/src/jbmc/jbmc_parse_options.cpp b/jbmc/src/jbmc/jbmc_parse_options.cpp index 60e1adc98a5..62a25f0b3a5 100644 --- a/jbmc/src/jbmc/jbmc_parse_options.cpp +++ b/jbmc/src/jbmc/jbmc_parse_options.cpp @@ -11,10 +11,6 @@ Author: Daniel Kroening, kroening@kroening.com #include "jbmc_parse_options.h" -#include // exit() -#include -#include - #include #include #include @@ -22,16 +18,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include - -#include - -#include -#include -#include -#include -#include - #include #include #include @@ -45,18 +31,17 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include +#include +#include +#include +#include +#include +#include #include #include #include - #include - -#include - -#include - -#include - #include #include #include @@ -69,6 +54,14 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include +#include +#include +#include + +#include // exit() +#include +#include jbmc_parse_optionst::jbmc_parse_optionst(int argc, const char **argv) : parse_options_baset( @@ -806,13 +799,7 @@ void jbmc_parse_optionst::process_goto_function( ui_message_handler); } - // add generic checks - goto_check_java( - function.get_function_id(), - function.get_goto_function(), - ns, - options, - ui_message_handler); + transform_assertions_assumptions(options, function.get_goto_function().body); // Replace Java new side effects remove_java_new( diff --git a/jbmc/src/jdiff/jdiff_parse_options.cpp b/jbmc/src/jdiff/jdiff_parse_options.cpp index 0261cca045e..ccc3f6fc326 100644 --- a/jbmc/src/jdiff/jdiff_parse_options.cpp +++ b/jbmc/src/jdiff/jdiff_parse_options.cpp @@ -11,9 +11,6 @@ Author: Peter Schrammel #include "jdiff_parse_options.h" -#include // exit() -#include - #include #include #include @@ -31,15 +28,18 @@ Author: Peter Schrammel #include #include +#include +#include +#include #include - #include #include #include #include "java_syntactic_diff.h" -#include -#include + +#include // exit() +#include jdiff_parse_optionst::jdiff_parse_optionst(int argc, const char **argv) : parse_options_baset( @@ -190,9 +190,7 @@ bool jdiff_parse_optionst::process_goto_program( // remove returns remove_returns(goto_model); - // add generic checks - log.status() << "Generic Property Instrumentation" << messaget::eom; - goto_check_java(options, goto_model, ui_message_handler); + transform_assertions_assumptions(options, goto_model); // checks don't know about adjusted float expressions adjust_float_expressions(goto_model); diff --git a/src/analyses/goto_check.cpp b/src/analyses/goto_check.cpp index 5300dfb26ab..4b25c5a49f7 100644 --- a/src/analyses/goto_check.cpp +++ b/src/analyses/goto_check.cpp @@ -11,10 +11,14 @@ Author: Daniel Kroening, kroening@kroening.com #include "goto_check.h" -#include "goto_check_c.h" - +#include #include +#include +#include + +#include "goto_check_c.h" + void goto_check( const irep_idt &function_identifier, goto_functionst::goto_functiont &goto_function, @@ -47,3 +51,84 @@ void goto_check( { goto_check_c(options, goto_model, message_handler); } + +static void transform_assertions_assumptions( + goto_programt &goto_program, + bool enable_assertions, + bool enable_built_in_assertions, + bool enable_assumptions) +{ + bool did_something = false; + + for(auto &instruction : goto_program.instructions) + { + if(instruction.is_assert()) + { + bool is_user_provided = + instruction.source_location().get_bool("user-provided"); + + if( + (is_user_provided && !enable_assertions && + instruction.source_location().get_property_class() != "error label") || + (!is_user_provided && !enable_built_in_assertions)) + { + instruction.turn_into_skip(); + did_something = true; + } + } + else if(instruction.is_assume()) + { + if(!enable_assumptions) + { + instruction.turn_into_skip(); + did_something = true; + } + } + } + + if(did_something) + remove_skip(goto_program); +} + +void transform_assertions_assumptions( + const optionst &options, + goto_modelt &goto_model) +{ + const bool enable_assertions = options.get_bool_option("assertions"); + const bool enable_built_in_assertions = + options.get_bool_option("built-in-assertions"); + const bool enable_assumptions = options.get_bool_option("assumptions"); + + // check whether there could possibly be anything to do + if(enable_assertions && enable_built_in_assertions && enable_assumptions) + return; + + for(auto &entry : goto_model.goto_functions.function_map) + { + transform_assertions_assumptions( + entry.second.body, + enable_assertions, + enable_built_in_assertions, + enable_assumptions); + } +} + +void transform_assertions_assumptions( + const optionst &options, + goto_programt &goto_program) +{ + const bool enable_assertions = options.get_bool_option("assertions"); + const bool enable_built_in_assertions = + options.get_bool_option("built-in-assertions"); + const bool enable_assumptions = options.get_bool_option("assumptions"); + + // check whether there could possibly be anything to do + if(enable_assertions && enable_built_in_assertions && enable_assumptions) + return; + + transform_assertions_assumptions( + goto_program, + enable_assertions, + enable_built_in_assertions, + enable_assumptions); +} diff --git a/src/analyses/goto_check.h b/src/analyses/goto_check.h index cef189d4663..568ee576b17 100644 --- a/src/analyses/goto_check.h +++ b/src/analyses/goto_check.h @@ -34,4 +34,18 @@ void goto_check( void goto_check(const optionst &, goto_modelt &, message_handlert &); +/// Handle the options "assertions", "built-in-assertions", "assumptions" to +/// remove assertions and assumptions in \p goto_model when these are set to +/// false in \p options. +void transform_assertions_assumptions( + const optionst &options, + goto_modelt &goto_model); + +/// Handle the options "assertions", "built-in-assertions", "assumptions" to +/// remove assertions and assumptions in \p goto_program when these are set to +/// false in \p options. +void transform_assertions_assumptions( + const optionst &options, + goto_programt &goto_program); + #endif // CPROVER_ANALYSES_GOTO_CHECK_H diff --git a/src/analyses/goto_check_c.cpp b/src/analyses/goto_check_c.cpp index d07bbbd7b34..a5ab87fedf6 100644 --- a/src/analyses/goto_check_c.cpp +++ b/src/analyses/goto_check_c.cpp @@ -74,10 +74,6 @@ class goto_check_ct enable_nan_check = _options.get_bool_option("nan-check"); retain_trivial = _options.get_bool_option("retain-trivial-checks"); enable_assert_to_assume = _options.get_bool_option("assert-to-assume"); - enable_assertions = _options.get_bool_option("assertions"); - enable_built_in_assertions = - _options.get_bool_option("built-in-assertions"); - enable_assumptions = _options.get_bool_option("assumptions"); error_labels = _options.get_list_option("error-label"); enable_pointer_primitive_check = _options.get_bool_option("pointer-primitive-check"); @@ -274,9 +270,6 @@ class goto_check_ct bool enable_nan_check; bool retain_trivial; bool enable_assert_to_assume; - bool enable_assertions; - bool enable_built_in_assertions; - bool enable_assumptions; bool enable_pointer_primitive_check; /// Maps a named-check name to the corresponding boolean flag. @@ -2194,27 +2187,6 @@ void goto_check_ct::goto_check( // this has no successor assertions.clear(); } - else if(i.is_assert()) - { - bool is_user_provided = i.source_location().get_bool("user-provided"); - - if( - (is_user_provided && !enable_assertions && - i.source_location().get_property_class() != "error label") || - (!is_user_provided && !enable_built_in_assertions)) - { - i.turn_into_skip(); - did_something = true; - } - } - else if(i.is_assume()) - { - if(!enable_assumptions) - { - i.turn_into_skip(); - did_something = true; - } - } else if(i.is_dead()) { if(enable_pointer_check || enable_pointer_primitive_check) diff --git a/src/goto-instrument/goto_instrument_parse_options.cpp b/src/goto-instrument/goto_instrument_parse_options.cpp index a99d5caa850..399d1c4b8b3 100644 --- a/src/goto-instrument/goto_instrument_parse_options.cpp +++ b/src/goto-instrument/goto_instrument_parse_options.cpp @@ -1328,6 +1328,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() // add generic checks, if needed goto_check(options, goto_model, ui_message_handler); + transform_assertions_assumptions(options, goto_model); // check for uninitalized local variables if(cmdline.isset("uninitialized-check")) diff --git a/src/goto-programs/process_goto_program.cpp b/src/goto-programs/process_goto_program.cpp index c8e533c7586..3baa95c9fa0 100644 --- a/src/goto-programs/process_goto_program.cpp +++ b/src/goto-programs/process_goto_program.cpp @@ -74,6 +74,7 @@ bool process_goto_program( // add generic checks log.status() << "Generic Property Instrumentation" << messaget::eom; goto_check(options, goto_model, log.get_message_handler()); + transform_assertions_assumptions(options, goto_model); // checks don't know about adjusted float expressions adjust_float_expressions(goto_model);