diff --git a/src/solvers/qbf/qbf_bdd_core.cpp b/src/solvers/qbf/qbf_bdd_core.cpp index da4b0013461..bb91a594538 100644 --- a/src/solvers/qbf/qbf_bdd_core.cpp +++ b/src/solvers/qbf/qbf_bdd_core.cpp @@ -8,10 +8,10 @@ Author: CM Wintersteiger #include -#include #include #include +#include #include #include // CUDD Library @@ -80,8 +80,7 @@ qbf_bdd_coret::~qbf_bdd_coret() tvt qbf_bdd_coret::l_get(literalt a) const { - assert(false); - return tvt(false); + UNREACHABLE; } const std::string qbf_bdd_coret::solver_text() @@ -122,8 +121,11 @@ propt::resultt qbf_bdd_coret::prop_solve() *matrix=matrix->ExistAbstract(*bdd_variable_map[var]); } - else if(it->type==quantifiert::UNIVERSAL) + else { + INVARIANT( + it->type == quantifiert::UNIVERSAL, + "only handles quantified variables"); #if 0 std::cout << "BDD A: " << var << ", " << matrix->nodeCount() << " nodes\n"; @@ -131,8 +133,6 @@ propt::resultt qbf_bdd_coret::prop_solve() *matrix=matrix->UnivAbstract(*bdd_variable_map[var]); } - else - throw "unquantified variable"; } if(*matrix==bdd_manager->bddOne()) @@ -151,12 +151,12 @@ propt::resultt qbf_bdd_coret::prop_solve() bool qbf_bdd_coret::is_in_core(literalt l) const { - throw "nyi"; + UNIMPLEMENTED; } qdimacs_coret::modeltypet qbf_bdd_coret::m_get(literalt a) const { - throw "nyi"; + UNIMPLEMENTED; } literalt qbf_bdd_coret::new_variable() @@ -268,17 +268,17 @@ void qbf_bdd_coret::compress_certificate(void) const exprt qbf_bdd_certificatet::f_get(literalt l) { quantifiert q; - if(!find_quantifier(l, q)) - throw "no model for unquantified variable"; + PRECONDITION_WITH_DIAGNOSTICS( + !find_quantifier(l, q), "no model for unquantified variables"); // universal? if(q.type==quantifiert::UNIVERSAL) { - assert(l.var_no()!=0); + INVARIANT(l.var_no() != 0, "input literal wasn't properly initialized"); variable_mapt::const_iterator it=variable_map.find(l.var_no()); - if(it==variable_map.end()) - throw "variable map error"; + INVARIANT( + it != variable_map.end(), "variable not found in the variable map"); const exprt &sym=it->second.first; unsigned index=it->second.second; @@ -293,7 +293,9 @@ const exprt qbf_bdd_certificatet::f_get(literalt l) else { // skolem functions for existentials - assert(q.type==quantifiert::EXISTENTIAL); + INVARIANT( + q.type == quantifiert::EXISTENTIAL, + "only quantified literals are supported"); function_cachet::const_iterator it=function_cache.find(l.var_no()); if(it!=function_cache.end()) @@ -310,7 +312,9 @@ const exprt qbf_bdd_certificatet::f_get(literalt l) // no cached function, so construct one - assert(model_bdds[l.var_no()]!=NULL); + INVARIANT( + model_bdds[l.var_no()] != nullptr, + "there must be a model BDD for the literal"); BDD &model=*model_bdds[l.var_no()]; #if 0 diff --git a/src/solvers/qbf/qbf_quantor.cpp b/src/solvers/qbf/qbf_quantor.cpp index 5f5890e5a1b..b592eac7940 100644 --- a/src/solvers/qbf/qbf_quantor.cpp +++ b/src/solvers/qbf/qbf_quantor.cpp @@ -8,10 +8,11 @@ Author: Daniel Kroening, kroening@kroening.com #include "qbf_quantor.h" -#include #include #include +#include + qbf_quantort::qbf_quantort() { } @@ -22,8 +23,7 @@ qbf_quantort::~qbf_quantort() tvt qbf_quantort::l_get(literalt) const { - assert(false); - return tvt::unknown(); + UNREACHABLE; } const std::string qbf_quantort::solver_text() diff --git a/src/solvers/qbf/qbf_qube.cpp b/src/solvers/qbf/qbf_qube.cpp index 4057801afca..28921d4fadb 100644 --- a/src/solvers/qbf/qbf_qube.cpp +++ b/src/solvers/qbf/qbf_qube.cpp @@ -8,10 +8,11 @@ Author: CM Wintersteiger #include "qbf_qube.h" -#include #include #include +#include + qbf_qubet::qbf_qubet() { // skizzo crashes on broken lines @@ -24,8 +25,7 @@ qbf_qubet::~qbf_qubet() tvt qbf_qubet::l_get(literalt) const { - assert(false); - return tvt(false); + UNREACHABLE; } const std::string qbf_qubet::solver_text() diff --git a/src/solvers/qbf/qbf_qube_core.cpp b/src/solvers/qbf/qbf_qube_core.cpp index b92b0393ea1..a9307b1c7a9 100644 --- a/src/solvers/qbf/qbf_qube_core.cpp +++ b/src/solvers/qbf/qbf_qube_core.cpp @@ -8,11 +8,11 @@ Author: CM Wintersteiger #include "qbf_qube_core.h" -#include #include -#include #include +#include +#include #include qbf_qube_coret::qbf_qube_coret() : qdimacs_coret() @@ -131,10 +131,10 @@ propt::resultt qbf_qube_coret::prop_solve() bool qbf_qube_coret::is_in_core(literalt) const { - throw "not supported"; + UNIMPLEMENTED; } qdimacs_coret::modeltypet qbf_qube_coret::m_get(literalt) const { - throw "not supported"; + UNIMPLEMENTED; } diff --git a/src/solvers/qbf/qbf_qube_core.h b/src/solvers/qbf/qbf_qube_core.h index f1f31589035..21d295b5308 100644 --- a/src/solvers/qbf/qbf_qube_core.h +++ b/src/solvers/qbf/qbf_qube_core.h @@ -12,6 +12,8 @@ Author: CM Wintersteiger #include "qdimacs_core.h" +#include + class qbf_qube_coret:public qdimacs_coret { protected: @@ -51,7 +53,7 @@ class qbf_qube_coret:public qdimacs_coret virtual const exprt f_get(literalt) { - throw "qube does not support full certificates."; + INVARIANT(false, "qube does not support full certificates."); } }; diff --git a/src/solvers/qbf/qbf_skizzo.cpp b/src/solvers/qbf/qbf_skizzo.cpp index be5850ae6ed..cb7f7dc8750 100644 --- a/src/solvers/qbf/qbf_skizzo.cpp +++ b/src/solvers/qbf/qbf_skizzo.cpp @@ -8,10 +8,11 @@ Author: Daniel Kroening, kroening@kroening.com #include "qbf_skizzo.h" -#include #include #include +#include + qbf_skizzot::qbf_skizzot() { // skizzo crashes on broken lines @@ -24,8 +25,7 @@ qbf_skizzot::~qbf_skizzot() tvt qbf_skizzot::l_get(literalt) const { - assert(false); - return tvt(false); + UNREACHABLE; } const std::string qbf_skizzot::solver_text() diff --git a/src/solvers/qbf/qbf_skizzo_core.cpp b/src/solvers/qbf/qbf_skizzo_core.cpp index 5940347d43a..b1cb2ac4626 100644 --- a/src/solvers/qbf/qbf_skizzo_core.cpp +++ b/src/solvers/qbf/qbf_skizzo_core.cpp @@ -6,10 +6,10 @@ Author: CM Wintersteiger \*******************************************************************/ - -#include #include +#include + #include #include // CUDD Library @@ -132,12 +132,12 @@ propt::resultt qbf_skizzo_coret::prop_solve() bool qbf_skizzo_coret::is_in_core(literalt l) const { - throw "nyi"; + UNIMPLEMENTED; } qdimacs_coret::modeltypet qbf_skizzo_coret::m_get(literalt a) const { - throw "nyi"; + UNIMPLEMENTED; } bool qbf_skizzo_coret::get_certificate(void) @@ -196,7 +196,10 @@ bool qbf_skizzo_coret::get_certificate(void) std::string line; std::getline(in, line); - assert(line=="# QBM file, 1.3"); + INVARIANT_WITH_DIAGNOSTICS( + line == "# QBM file, 1.3", + "QBM file has to start with this exact string: ", + "# QBM file, 1.3"); while(in) { @@ -215,7 +218,7 @@ bool qbf_skizzo_coret::get_certificate(void) size_t ob=line.find('['); std::string n_es=line.substr(ob+1, line.find(']')-ob-1); n_e=unsafe_string2int(n_es); - assert(n_e!=0); + INVARIANT(n_e != 0, "there has to be at least one existential variable"); e_list.resize(n_e); std::string e_lists=line.substr(line.find(':')+2); @@ -225,7 +228,7 @@ bool qbf_skizzo_coret::get_certificate(void) size_t space=e_lists.find(' '); int cur=unsafe_string2int(e_lists.substr(0, space)); - assert(cur!=0); + INVARIANT(cur != 0, "variable numbering starts with 1"); e_list[i]=cur; if(cur>e_max) @@ -234,8 +237,7 @@ bool qbf_skizzo_coret::get_certificate(void) e_lists=e_lists.substr(space+1); } - if(!result) - throw "existential mapping from sKizzo missing"; + INVARIANT(result, "existential mapping from sKizzo missing"); in.close(); @@ -270,7 +272,10 @@ bool qbf_skizzo_coret::get_certificate(void) NULL, &bdds); - assert(nroots=2*n_e); // ozziKs documentation guarantees that. + INVARIANT( + nroots == 2 * n_e, + "valid QBM certificate should have twice as much roots as the " + "existential variables"); model_bdds.resize(e_max+1, NULL); diff --git a/src/solvers/qbf/qbf_squolem.cpp b/src/solvers/qbf/qbf_squolem.cpp index 97ab3ebb5ed..836b384019f 100644 --- a/src/solvers/qbf/qbf_squolem.cpp +++ b/src/solvers/qbf/qbf_squolem.cpp @@ -23,7 +23,7 @@ qbf_squolemt::~qbf_squolemt() tvt qbf_squolemt::l_get(literalt a) const { - assert(false); + UNREACHABLE; } const std::string qbf_squolemt::solver_text() diff --git a/src/solvers/qbf/qbf_squolem_core.cpp b/src/solvers/qbf/qbf_squolem_core.cpp index fd2106711ce..61fde2052e5 100644 --- a/src/solvers/qbf/qbf_squolem_core.cpp +++ b/src/solvers/qbf/qbf_squolem_core.cpp @@ -189,11 +189,12 @@ const exprt qbf_squolem_coret::f_get(literalt l) { if(squolem->isUniversal(l.var_no())) { - assert(l.var_no()!=0); + INVARIANT_WITH_DIAGNOSTICS( + l.var_no() != 0, "unknown variable: ", std::to_string(l.var_no())); variable_mapt::const_iterator it=variable_map.find(l.var_no()); - if(it==variable_map.end()) - throw "variable map error"; + INVARIANT( + it != variable_map.end(), "variable not found in the variable map"); const exprt &sym=it->second.first; unsigned index=it->second.second; diff --git a/src/solvers/qbf/qdimacs_cnf.cpp b/src/solvers/qbf/qdimacs_cnf.cpp index 11638606d65..ac4897e1c76 100644 --- a/src/solvers/qbf/qdimacs_cnf.cpp +++ b/src/solvers/qbf/qdimacs_cnf.cpp @@ -9,7 +9,8 @@ Author: Daniel Kroening, kroening@kroening.com #include "qdimacs_cnf.h" #include -#include + +#include void qdimacs_cnft::write_qdimacs_cnf(std::ostream &out) { @@ -31,9 +32,12 @@ void qdimacs_cnft::write_prefix(std::ostream &out) const { const quantifiert &quantifier=*it; - assert(quantifier.var_no