Skip to content

Commit 6a24c2c

Browse files
Petr BauchPetr Bauch
authored andcommitted
Cleanup error handling in solvers/qbf
1 parent 5d8326f commit 6a24c2c

File tree

10 files changed

+58
-43
lines changed

10 files changed

+58
-43
lines changed

src/solvers/qbf/qbf_bdd_core.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ Author: CM Wintersteiger
88

99
#include <solvers/prop/literal.h>
1010

11-
#include <cassert>
1211
#include <fstream>
1312

1413
#include <util/arith_tools.h>
14+
#include <util/invariant.h>
1515
#include <util/std_expr.h>
1616

1717
#include <cuddObj.hh> // CUDD Library
@@ -80,7 +80,7 @@ qbf_bdd_coret::~qbf_bdd_coret()
8080

8181
tvt qbf_bdd_coret::l_get(literalt a) const
8282
{
83-
assert(false);
83+
UNREACHABLE;
8484
return tvt(false);
8585
}
8686

@@ -122,17 +122,18 @@ propt::resultt qbf_bdd_coret::prop_solve()
122122

123123
*matrix=matrix->ExistAbstract(*bdd_variable_map[var]);
124124
}
125-
else if(it->type==quantifiert::UNIVERSAL)
125+
else
126126
{
127+
INVARIANT(
128+
it->type == quantifiert::UNIVERSAL,
129+
"Only handles quantified variables.");
127130
#if 0
128131
std::cout << "BDD A: " << var << ", " <<
129132
matrix->nodeCount() << " nodes\n";
130133
#endif
131134

132135
*matrix=matrix->UnivAbstract(*bdd_variable_map[var]);
133136
}
134-
else
135-
throw "unquantified variable";
136137
}
137138

138139
if(*matrix==bdd_manager->bddOne())
@@ -151,12 +152,12 @@ propt::resultt qbf_bdd_coret::prop_solve()
151152

152153
bool qbf_bdd_coret::is_in_core(literalt l) const
153154
{
154-
throw "nyi";
155+
UNIMPLEMENTED;
155156
}
156157

157158
qdimacs_coret::modeltypet qbf_bdd_coret::m_get(literalt a) const
158159
{
159-
throw "nyi";
160+
UNIMPLEMENTED;
160161
}
161162

162163
literalt qbf_bdd_coret::new_variable()
@@ -268,17 +269,17 @@ void qbf_bdd_coret::compress_certificate(void)
268269
const exprt qbf_bdd_certificatet::f_get(literalt l)
269270
{
270271
quantifiert q;
271-
if(!find_quantifier(l, q))
272-
throw "no model for unquantified variable";
272+
PRECONDITION_WITH_DIAGNOSTICS(
273+
!find_quantifier(l, q), "No model for unquantified variables.");
273274

274275
// universal?
275276
if(q.type==quantifiert::UNIVERSAL)
276277
{
277-
assert(l.var_no()!=0);
278+
INVARIANT(l.var_no() != 0, "Input literal wasn't properly initialized.");
278279
variable_mapt::const_iterator it=variable_map.find(l.var_no());
279280

280-
if(it==variable_map.end())
281-
throw "variable map error";
281+
INVARIANT(
282+
it != variable_map.end(), "Variable not found in the variable map.");
282283

283284
const exprt &sym=it->second.first;
284285
unsigned index=it->second.second;
@@ -293,7 +294,9 @@ const exprt qbf_bdd_certificatet::f_get(literalt l)
293294
else
294295
{
295296
// skolem functions for existentials
296-
assert(q.type==quantifiert::EXISTENTIAL);
297+
INVARIANT(
298+
q.type == quantifiert::EXISTENTIAL,
299+
"Only quantified literals are supported.");
297300

298301
function_cachet::const_iterator it=function_cache.find(l.var_no());
299302
if(it!=function_cache.end())
@@ -310,7 +313,9 @@ const exprt qbf_bdd_certificatet::f_get(literalt l)
310313

311314
// no cached function, so construct one
312315

313-
assert(model_bdds[l.var_no()]!=NULL);
316+
INVARIANT(
317+
model_bdds[l.var_no()] != NULL,
318+
"There must be a model BDD for the literal.");
314319
BDD &model=*model_bdds[l.var_no()];
315320

316321
#if 0

src/solvers/qbf/qbf_quantor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ Author: Daniel Kroening, kroening@kroening.com
88

99
#include "qbf_quantor.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
1312
#include <fstream>
13+
#include <util/invariant.h>
1414

1515
qbf_quantort::qbf_quantort()
1616
{
@@ -22,7 +22,7 @@ qbf_quantort::~qbf_quantort()
2222

2323
tvt qbf_quantort::l_get(literalt) const
2424
{
25-
assert(false);
25+
UNREACHABLE;
2626
return tvt::unknown();
2727
}
2828

src/solvers/qbf/qbf_qube.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ Author: CM Wintersteiger
88

99
#include "qbf_qube.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
1312
#include <fstream>
13+
#include <util/invariant.h>
1414

1515
qbf_qubet::qbf_qubet()
1616
{
@@ -24,7 +24,7 @@ qbf_qubet::~qbf_qubet()
2424

2525
tvt qbf_qubet::l_get(literalt) const
2626
{
27-
assert(false);
27+
UNREACHABLE;
2828
return tvt(false);
2929
}
3030

src/solvers/qbf/qbf_qube_core.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ Author: CM Wintersteiger
88

99
#include "qbf_qube_core.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
13-
#include <fstream>
1412
#include <cstring>
13+
#include <fstream>
14+
#include <util/invariant.h>
1515

1616
#include <util/mp_arith.h>
1717

@@ -131,10 +131,10 @@ propt::resultt qbf_qube_coret::prop_solve()
131131

132132
bool qbf_qube_coret::is_in_core(literalt) const
133133
{
134-
throw "not supported";
134+
UNIMPLEMENTED;
135135
}
136136

137137
qdimacs_coret::modeltypet qbf_qube_coret::m_get(literalt) const
138138
{
139-
throw "not supported";
139+
UNIMPLEMENTED;
140140
}

src/solvers/qbf/qbf_qube_core.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Author: CM Wintersteiger
1111
#define CPROVER_SOLVERS_QBF_QBF_QUBE_CORE_H
1212

1313
#include "qdimacs_core.h"
14+
#include <util/invariant.h>
1415

1516
class qbf_qube_coret:public qdimacs_coret
1617
{
@@ -51,7 +52,7 @@ class qbf_qube_coret:public qdimacs_coret
5152

5253
virtual const exprt f_get(literalt)
5354
{
54-
throw "qube does not support full certificates.";
55+
INVARIANT(false, "qube does not support full certificates.");
5556
}
5657
};
5758

src/solvers/qbf/qbf_skizzo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ Author: Daniel Kroening, kroening@kroening.com
88

99
#include "qbf_skizzo.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
1312
#include <fstream>
13+
#include <util/invariant.h>
1414

1515
qbf_skizzot::qbf_skizzot()
1616
{
@@ -24,7 +24,7 @@ qbf_skizzot::~qbf_skizzot()
2424

2525
tvt qbf_skizzot::l_get(literalt) const
2626
{
27-
assert(false);
27+
UNREACHABLE;
2828
return tvt(false);
2929
}
3030

src/solvers/qbf/qbf_skizzo_core.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ Author: CM Wintersteiger
66
77
\*******************************************************************/
88

9-
10-
#include <cassert>
119
#include <fstream>
10+
#include <util/invariant.h>
1211

1312
#include <util/string2int.h>
1413

@@ -132,12 +131,12 @@ propt::resultt qbf_skizzo_coret::prop_solve()
132131

133132
bool qbf_skizzo_coret::is_in_core(literalt l) const
134133
{
135-
throw "nyi";
134+
UNIMPLEMENTED;
136135
}
137136

138137
qdimacs_coret::modeltypet qbf_skizzo_coret::m_get(literalt a) const
139138
{
140-
throw "nyi";
139+
UNIMPLEMENTED;
141140
}
142141

143142
bool qbf_skizzo_coret::get_certificate(void)
@@ -196,7 +195,10 @@ bool qbf_skizzo_coret::get_certificate(void)
196195
std::string line;
197196
std::getline(in, line);
198197

199-
assert(line=="# QBM file, 1.3");
198+
INVARIANT_WITH_DIAGNOSTICS(
199+
line == "# QBM file, 1.3",
200+
"A QBM file has to start with this exact string: ",
201+
"# QBM file, 1.3");
200202

201203
while(in)
202204
{
@@ -215,7 +217,7 @@ bool qbf_skizzo_coret::get_certificate(void)
215217
size_t ob=line.find('[');
216218
std::string n_es=line.substr(ob+1, line.find(']')-ob-1);
217219
n_e=unsafe_string2int(n_es);
218-
assert(n_e!=0);
220+
INVARIANT(n_e != 0, "There has to be at least one existential variable.");
219221

220222
e_list.resize(n_e);
221223
std::string e_lists=line.substr(line.find(':')+2);
@@ -225,7 +227,7 @@ bool qbf_skizzo_coret::get_certificate(void)
225227
size_t space=e_lists.find(' ');
226228

227229
int cur=unsafe_string2int(e_lists.substr(0, space));
228-
assert(cur!=0);
230+
INVARIANT(cur != 0, "Variable numbering starts with 1.");
229231

230232
e_list[i]=cur;
231233
if(cur>e_max)
@@ -234,8 +236,7 @@ bool qbf_skizzo_coret::get_certificate(void)
234236
e_lists=e_lists.substr(space+1);
235237
}
236238

237-
if(!result)
238-
throw "existential mapping from sKizzo missing";
239+
INVARIANT(!result, "Existential mapping from sKizzo missing.");
239240

240241
in.close();
241242

@@ -270,7 +271,10 @@ bool qbf_skizzo_coret::get_certificate(void)
270271
NULL,
271272
&bdds);
272273

273-
assert(nroots=2*n_e); // ozziKs documentation guarantees that.
274+
INVARIANT(
275+
nroots == 2 * n_e,
276+
"Valid QBM certificate should have twice as much roots as the "
277+
"existential variables.");
274278

275279
model_bdds.resize(e_max+1, NULL);
276280

src/solvers/qbf/qbf_squolem.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ qbf_squolemt::~qbf_squolemt()
2323

2424
tvt qbf_squolemt::l_get(literalt a) const
2525
{
26-
assert(false);
26+
UNREACHABLE;
27+
return tvt(false);
2728
}
2829

2930
const std::string qbf_squolemt::solver_text()

src/solvers/qbf/qbf_squolem_core.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,12 @@ const exprt qbf_squolem_coret::f_get(literalt l)
189189
{
190190
if(squolem->isUniversal(l.var_no()))
191191
{
192-
assert(l.var_no()!=0);
192+
INVARIANT_WITH_DIAGNOSTICS(
193+
l.var_no() != 0, "Unknown variable: ", std::to_string(l.var_no()));
193194
variable_mapt::const_iterator it=variable_map.find(l.var_no());
194195

195-
if(it==variable_map.end())
196-
throw "variable map error";
196+
INVARIANT(
197+
it != variable_map.end(), "Variable not found in the variable map.");
197198

198199
const exprt &sym=it->second.first;
199200
unsigned index=it->second.second;

src/solvers/qbf/qdimacs_cnf.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Author: Daniel Kroening, kroening@kroening.com
99
#include "qdimacs_cnf.h"
1010

1111
#include <iostream>
12-
#include <cassert>
12+
#include <util/invariant.h>
1313

1414
void qdimacs_cnft::write_qdimacs_cnf(std::ostream &out)
1515
{
@@ -31,9 +31,12 @@ void qdimacs_cnft::write_prefix(std::ostream &out) const
3131
{
3232
const quantifiert &quantifier=*it;
3333

34-
assert(quantifier.var_no<no_variables());
34+
INVARIANT_WITH_DIAGNOSTICS(
35+
quantifier.var_no < no_variables(),
36+
"Unknown variable: ",
37+
std::to_string(quantifier.var_no));
3538
// double quantification?
36-
assert(!quantified[quantifier.var_no]);
39+
INVARIANT(!quantified[quantifier.var_no], "No double quantification.");
3740
quantified[quantifier.var_no]=true;
3841

3942
switch(quantifier.type)
@@ -47,7 +50,7 @@ void qdimacs_cnft::write_prefix(std::ostream &out) const
4750
break;
4851

4952
default:
50-
assert(false);
53+
UNREACHABLE;
5154
}
5255

5356
out << " " << quantifier.var_no << " 0\n";

0 commit comments

Comments
 (0)