Skip to content

Commit 784b692

Browse files
authored
Merge pull request #2940 from danpoe/refactor/error-handling-solvers-flattening-from-boolbv-with
Error handling cleanup in solvers/flattening 6
2 parents 7f621c8 + aa5de1c commit 784b692

File tree

5 files changed

+127
-97
lines changed

5 files changed

+127
-97
lines changed

src/solvers/flattening/bv_minimize.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ Author: Georg Weissenbacher, [email protected]
88

99
#include "bv_minimize.h"
1010

11-
#include <cassert>
12-
1311
#include <solvers/prop/minimize.h>
1412

1513
void bv_minimizet::add_objective(

src/solvers/flattening/bv_pointers.cpp

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ Author: Daniel Kroening, [email protected]
1111
#include <util/arith_tools.h>
1212
#include <util/c_types.h>
1313
#include <util/config.h>
14+
#include <util/exception_utils.h>
1415
#include <util/pointer_offset_size.h>
1516

1617
literalt bv_pointerst::convert_rest(const exprt &expr)
1718
{
18-
if(expr.type().id()!=ID_bool)
19-
throw "bv_pointerst::convert_rest got non-boolean operand";
19+
PRECONDITION(expr.type().id() == ID_bool);
2020

2121
const exprt::operandst &operands=expr.operands();
2222

@@ -112,9 +112,6 @@ bool bv_pointerst::convert_address_of_rec(
112112
}
113113
else if(expr.id()==ID_index)
114114
{
115-
if(expr.operands().size()!=2)
116-
throw "index takes two operands";
117-
118115
const index_exprt &index_expr=to_index_expr(expr);
119116
const exprt &array=index_expr.array();
120117
const exprt &index=index_expr.index();
@@ -182,12 +179,13 @@ bool bv_pointerst::convert_address_of_rec(
182179
// add offset
183180
offset_arithmetic(bv, offset);
184181
}
185-
else if(struct_op_type.id()==ID_union)
182+
else
186183
{
184+
INVARIANT(
185+
struct_op_type.id() == ID_union,
186+
"member expression should operate on struct or union");
187187
// nothing to do, all members have offset 0
188188
}
189-
else
190-
throw "member takes struct or union operand";
191189

192190
return false;
193191
}
@@ -222,8 +220,7 @@ bool bv_pointerst::convert_address_of_rec(
222220

223221
bvt bv_pointerst::convert_pointer_type(const exprt &expr)
224222
{
225-
if(expr.type().id()!=ID_pointer)
226-
throw "convert_pointer_type got non-pointer type";
223+
PRECONDITION(expr.type().id() == ID_pointer);
227224

228225
// make sure the config hasn't been changed
229226
PRECONDITION(bits==boolbv_width(expr.type()));
@@ -252,10 +249,9 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
252249
}
253250
else if(expr.id()==ID_typecast)
254251
{
255-
if(expr.operands().size()!=1)
256-
throw "typecast takes one operand";
252+
const typecast_exprt &typecast_expr = to_typecast_expr(expr);
257253

258-
const exprt &op=expr.op0();
254+
const exprt &op = typecast_expr.op();
259255
const typet &op_type=ns.follow(op.type());
260256

261257
if(op_type.id()==ID_pointer)
@@ -288,15 +284,14 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
288284
}
289285
else if(expr.id()==ID_address_of)
290286
{
291-
if(expr.operands().size()!=1)
292-
throw expr.id_string()+" takes one operand";
287+
const address_of_exprt &address_of_expr = to_address_of_expr(expr);
293288

294289
bvt bv;
295290
bv.resize(bits);
296291

297-
if(convert_address_of_rec(expr.op0(), bv))
292+
if(convert_address_of_rec(address_of_expr.op(), bv))
298293
{
299-
conversion_failed(expr, bv);
294+
conversion_failed(address_of_expr, bv);
300295
return bv;
301296
}
302297

@@ -324,15 +319,14 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
324319
{
325320
// this has to be pointer plus integer
326321

327-
if(expr.operands().size()<2)
328-
throw "operator + takes at least two operands";
322+
const plus_exprt &plus_expr = to_plus_expr(expr);
329323

330324
bvt bv;
331325

332326
mp_integer size=0;
333327
std::size_t count=0;
334328

335-
forall_operands(it, expr)
329+
forall_operands(it, plus_expr)
336330
{
337331
if(it->type().id()==ID_pointer)
338332
{
@@ -356,14 +350,13 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
356350
}
357351
}
358352

359-
if(count==0)
360-
throw "found no pointer in pointer-type sum";
361-
else if(count!=1)
362-
throw "found more than one pointer in sum";
353+
INVARIANT(
354+
count == 1,
355+
"there should be exactly one pointer-type operand in a pointer-type sum");
363356

364357
bvt sum=bv_utils.build_constant(0, bits);
365358

366-
forall_operands(it, expr)
359+
forall_operands(it, plus_expr)
367360
{
368361
if(it->type().id()==ID_pointer)
369362
continue;
@@ -372,7 +365,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
372365
it->type().id()!=ID_signedbv)
373366
{
374367
bvt bv;
375-
conversion_failed(expr, bv);
368+
conversion_failed(plus_expr, bv);
376369
return bv;
377370
}
378371

@@ -381,9 +374,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
381374
bv_utilst::representationt::UNSIGNED;
382375

383376
bvt op=convert_bv(*it);
384-
385-
if(op.empty())
386-
throw "unexpected pointer arithmetic operand width";
377+
CHECK_RETURN(!op.empty());
387378

388379
// we cut any extra bits off
389380

@@ -403,27 +394,28 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
403394
{
404395
// this is pointer-integer
405396

406-
if(expr.operands().size()!=2)
407-
throw "operator "+expr.id_string()+" takes two operands";
397+
const minus_exprt &minus_expr = to_minus_expr(expr);
408398

409-
if(expr.op0().type().id()!=ID_pointer)
410-
throw "found no pointer in pointer type in difference";
399+
INVARIANT(
400+
minus_expr.op0().type().id() == ID_pointer,
401+
"first operand should be of pointer type");
411402

412403
bvt bv;
413404

414-
if(expr.op1().type().id()!=ID_unsignedbv &&
415-
expr.op1().type().id()!=ID_signedbv)
405+
if(
406+
minus_expr.op1().type().id() != ID_unsignedbv &&
407+
minus_expr.op1().type().id() != ID_signedbv)
416408
{
417409
bvt bv;
418-
conversion_failed(expr, bv);
410+
conversion_failed(minus_expr, bv);
419411
return bv;
420412
}
421413

422-
const unary_minus_exprt neg_op1(expr.op1());
414+
const unary_minus_exprt neg_op1(minus_expr.op1());
423415

424-
bv=convert_bv(expr.op0());
416+
bv = convert_bv(minus_expr.op0());
425417

426-
typet pointer_sub_type=expr.op0().type().subtype();
418+
typet pointer_sub_type = minus_expr.op0().type().subtype();
427419
mp_integer element_size;
428420

429421
if(pointer_sub_type.id()==ID_empty)
@@ -462,11 +454,15 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
462454
{
463455
return SUB::convert_byte_extract(to_byte_extract_expr(expr));
464456
}
465-
else if(
466-
expr.id() == ID_byte_update_little_endian ||
467-
expr.id() == ID_byte_update_big_endian)
457+
else
468458
{
469-
throw "byte-wise updates of pointers are unsupported";
459+
INVARIANT(
460+
expr.id() != ID_byte_update_little_endian,
461+
"byte-wise pointer updates are unsupported");
462+
463+
INVARIANT(
464+
expr.id() != ID_byte_update_big_endian,
465+
"byte-wise pointer updates are unsupported");
470466
}
471467

472468
return conversion_failed(expr);
@@ -723,11 +719,13 @@ void bv_pointerst::add_addr(const exprt &expr, bvt &bv)
723719
std::size_t a=pointer_logic.add_object(expr);
724720

725721
const std::size_t max_objects=std::size_t(1)<<object_bits;
722+
726723
if(a==max_objects)
727-
throw
728-
"too many addressed objects: maximum number of objects is set to 2^n="+
729-
std::to_string(max_objects)+" (with n="+std::to_string(object_bits)+"); "+
730-
"use the `--object-bits n` option to increase the maximum number";
724+
throw analysis_exceptiont(
725+
"too many addressed objects: maximum number of objects is set to 2^n=" +
726+
std::to_string(max_objects) + " (with n=" + std::to_string(object_bits) +
727+
"); " +
728+
"use the `--object-bits n` option to increase the maximum number");
731729

732730
encode(a, bv);
733731
}

0 commit comments

Comments
 (0)