@@ -588,6 +588,8 @@ optionalt<cext> cegis_verifiert::verify()
588588 // 3. construct the formatted counterexample from the violated property and
589589 // its trace.
590590
591+ const namespacet ns (goto_model.symbol_table );
592+
591593 // Store the original functions. We will restore them after the verification.
592594 for (const auto &fun_entry : goto_model.goto_functions .function_map )
593595 {
@@ -600,11 +602,11 @@ optionalt<cext> cegis_verifiert::verify()
600602 // Annotate assigns
601603 annotate_assigns (assigns_map, goto_model);
602604
603- // Control verbosity.
604- // We allow non-error output message only when verbosity is set to at least 9 .
605+ // Control verbosity. We allow non-error output message only when verbosity
606+ // is set to larger than messaget::M_DEBUG .
605607 const unsigned original_verbosity = log.get_message_handler ().get_verbosity ();
606- if (original_verbosity < 9 )
607- log.get_message_handler ().set_verbosity (1 );
608+ if (original_verbosity < messaget::M_DEBUG )
609+ log.get_message_handler ().set_verbosity (messaget::M_ERROR );
608610
609611 // Apply loop contracts we annotated.
610612 code_contractst cont (goto_model, log);
@@ -630,7 +632,7 @@ optionalt<cext> cegis_verifiert::verify()
630632 // Run the checker to get the result.
631633 const resultt result = (*checker)();
632634
633- if (original_verbosity >= 9 )
635+ if (original_verbosity >= messaget::M_DEBUG )
634636 checker->report ();
635637
636638 // Restore the verbosity.
@@ -652,38 +654,48 @@ optionalt<cext> cegis_verifiert::verify()
652654 }
653655
654656 properties = checker->get_properties ();
655- bool target_violation_found = false ;
656- auto target_violation_info = properties.begin ()->second ;
657+ auto target_violation = properties.end ();
657658
658659 // Find target violation---the violation we want to fix next.
659660 // A target violation is an assignable violation or the first violation that
660661 // is not assignable violation.
661- for (const auto &property : properties)
662+ for (auto it_property = properties.begin (); it_property != properties.end ();
663+ it_property++)
662664 {
663- if (property. second .status != property_statust::FAIL)
665+ if (it_property-> second .status != property_statust::FAIL)
664666 continue ;
665667
666668 // assignable violation found
667- if (property. second .description .find (" assignable" ) != std::string::npos)
669+ if (it_property-> second .description .find (" assignable" ) != std::string::npos)
668670 {
669- target_violation = property.first ;
670- target_violation_info = property.second ;
671+ target_violation = it_property;
671672 break ;
672673 }
673674
674675 // Store the violation that we want to fix with synthesized
675676 // assigns/invariant.
676- if (!target_violation_found)
677+ // ignore ASSERT FALSE
678+ if (
679+ target_violation == properties.end () &&
680+ simplify_expr (it_property->second .pc ->condition (), ns) != false_exprt ())
677681 {
678- target_violation = property.first ;
679- target_violation_info = property.second ;
680- target_violation_found = true ;
682+ target_violation = it_property;
681683 }
682684 }
683685
686+ // All violations are
687+ // ASSERT FALSE
688+ if (target_violation == properties.end ())
689+ {
690+ restore_functions ();
691+ return optionalt<cext>();
692+ }
693+
694+ target_violation_id = target_violation->first ;
695+
684696 // Decide the violation type from the description of violation
685697 cext::violation_typet violation_type =
686- extract_violation_type (target_violation_info .description );
698+ extract_violation_type (target_violation-> second .description );
687699
688700 // Compute the cause loop---the loop for which we synthesize loop contracts,
689701 // and the counterexample.
@@ -698,15 +710,17 @@ optionalt<cext> cegis_verifiert::verify()
698710 // although there can be multiple ones.
699711
700712 log.debug () << " Start to compute cause loop ids." << messaget::eom;
713+ log.debug () << " Violation description: "
714+ << target_violation->second .description << messaget::eom;
701715
702- const auto &trace = checker->get_traces ()[target_violation];
716+ const auto &trace = checker->get_traces ()[target_violation-> first ];
703717 // Doing assigns-synthesis or invariant-synthesis
704718 if (violation_type == cext::violation_typet::cex_assignable)
705719 {
706720 cext result (violation_type);
707721 result.cause_loop_ids = get_cause_loop_id_for_assigns (trace);
708722 result.checked_pointer = static_cast <const exprt &>(
709- target_violation_info .pc ->condition ().find (ID_checked_assigns));
723+ target_violation-> second .pc ->condition ().find (ID_checked_assigns));
710724 restore_functions ();
711725 return result;
712726 }
@@ -717,7 +731,7 @@ optionalt<cext> cegis_verifiert::verify()
717731 // Although there can be multiple cause loop ids. We only synthesize
718732 // loop invariants for the first cause loop.
719733 const std::list<loop_idt> cause_loop_ids =
720- get_cause_loop_id (trace, target_violation_info .pc );
734+ get_cause_loop_id (trace, target_violation-> second .pc );
721735
722736 if (cause_loop_ids.empty ())
723737 {
@@ -741,7 +755,7 @@ optionalt<cext> cegis_verifiert::verify()
741755 violation_location = get_violation_location (
742756 cause_loop_ids.front (),
743757 goto_model.get_goto_function (cause_loop_ids.front ().function_id ),
744- target_violation_info .pc ->location_number );
758+ target_violation-> second .pc ->location_number );
745759 }
746760
747761 restore_functions ();
@@ -753,7 +767,7 @@ optionalt<cext> cegis_verifiert::verify()
753767 goto_model.goto_functions
754768 .function_map [cause_loop_ids.front ().function_id ])
755769 ->source_location ());
756- return_cex.violated_predicate = target_violation_info .pc ->condition ();
770+ return_cex.violated_predicate = target_violation-> second .pc ->condition ();
757771 return_cex.cause_loop_ids = cause_loop_ids;
758772 return_cex.violation_location = violation_location;
759773 return_cex.violation_type = violation_type;
@@ -762,7 +776,7 @@ optionalt<cext> cegis_verifiert::verify()
762776 if (violation_type == cext::violation_typet::cex_null_pointer)
763777 {
764778 return_cex.checked_pointer = get_checked_pointer_from_null_pointer_check (
765- target_violation_info .pc ->condition ());
779+ target_violation-> second .pc ->condition ());
766780 }
767781
768782 return return_cex;
0 commit comments