3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-19 20:33:38 +00:00

hardening model checker code against cancellations'

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2016-03-21 15:04:20 -07:00
parent 3dc2028925
commit 701f32471e
3 changed files with 8 additions and 3 deletions

View file

@ -595,6 +595,9 @@ void rewriter_tpl<Config>::set_inv_bindings(unsigned num_bindings, expr * const
template<typename Config> template<typename Config>
template<bool ProofGen> template<bool ProofGen>
void rewriter_tpl<Config>::main_loop(expr * t, expr_ref & result, proof_ref & result_pr) { void rewriter_tpl<Config>::main_loop(expr * t, expr_ref & result, proof_ref & result_pr) {
if (m().canceled()) {
throw rewriter_exception(m().limit().get_cancel_msg());
}
SASSERT(!ProofGen || result_stack().size() == result_pr_stack().size()); SASSERT(!ProofGen || result_stack().size() == result_pr_stack().size());
SASSERT(not_rewriting()); SASSERT(not_rewriting());
m_root = t; m_root = t;

View file

@ -420,14 +420,14 @@ namespace smt {
case l_undef: case l_undef:
break; break;
case l_true: case l_true:
m_proto_model->eval(n, res, false); if (!m_proto_model->eval(n, res, false)) return true;
CTRACE("mbqi_bug", !m.is_true(res), tout << n << " evaluates to " << res << "\n";); CTRACE("mbqi_bug", !m.is_true(res), tout << n << " evaluates to " << res << "\n";);
if (m.is_false(res)) { if (m.is_false(res)) {
return false; return false;
} }
break; break;
case l_false: case l_false:
m_proto_model->eval(n, res, false); if (!m_proto_model->eval(n, res, false)) return true;
CTRACE("mbqi_bug", !m.is_false(res), tout << n << " evaluates to " << res << "\n";); CTRACE("mbqi_bug", !m.is_false(res), tout << n << " evaluates to " << res << "\n";);
if (m.is_true(res)) { if (m.is_true(res)) {
return false; return false;

View file

@ -149,6 +149,7 @@ namespace smt {
SASSERT(!contains_model_value(t)); SASSERT(!contains_model_value(t));
unsigned gen = (*it).m_value; unsigned gen = (*it).m_value;
expr * t_val = ev.eval(t, true); expr * t_val = ev.eval(t, true);
if (!t_val) break;
TRACE("model_finder", tout << mk_pp(t, m_manager) << " " << mk_pp(t_val, m_manager) << "\n";); TRACE("model_finder", tout << mk_pp(t, m_manager) << " " << mk_pp(t_val, m_manager) << "\n";);
expr * old_t = 0; expr * old_t = 0;
@ -828,7 +829,7 @@ namespace smt {
for (; it != end; ++it) { for (; it != end; ++it) {
expr * t = (*it).m_key; expr * t = (*it).m_key;
expr * t_val = eval(t, true); expr * t_val = eval(t, true);
if (!already_found.contains(t_val)) { if (t_val && !already_found.contains(t_val)) {
values.push_back(t_val); values.push_back(t_val);
already_found.insert(t_val); already_found.insert(t_val);
} }
@ -891,6 +892,7 @@ namespace smt {
add_mono_exceptions(n); add_mono_exceptions(n);
ptr_buffer<expr> values; ptr_buffer<expr> values;
get_instantiation_set_values(n, values); get_instantiation_set_values(n, values);
if (values.empty()) return;
sort_values(n, values); sort_values(n, values);
sort * s = n->get_sort(); sort * s = n->get_sort();
arith_simplifier_plugin * as = get_arith_simp(); arith_simplifier_plugin * as = get_arith_simp();