Skip to content

Commit be2046d

Browse files
Replace throws and asserts with invariants in boolbv_index
Also use the expected_width parameter to move one check into convert_bv
1 parent af1d428 commit be2046d

File tree

1 file changed

+13
-17
lines changed

1 file changed

+13
-17
lines changed

src/solvers/flattening/boolbv_index.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ bvt boolbvt::convert_index(const index_exprt &expr)
6262

6363
// Must have a finite size
6464
mp_integer array_size = numeric_cast_v<mp_integer>(array_type.size());
65-
65+
PRECONDITION(array_size.is_ulong());
6666
{
6767
// see if the index address is constant
6868
// many of these are compacted by simplify_expr
@@ -117,12 +117,10 @@ bvt boolbvt::convert_index(const index_exprt &expr)
117117

118118
binary_relation_exprt lower_bound(
119119
from_integer(0, index.type()), ID_le, index);
120+
CHECK_RETURN(lower_bound.lhs().is_not_nil());
120121
binary_relation_exprt upper_bound(
121122
index, ID_lt, from_integer(array_size, index.type()));
122-
123-
if(lower_bound.lhs().is_nil() ||
124-
upper_bound.rhs().is_nil())
125-
throw "number conversion failed (2)";
123+
CHECK_RETURN(upper_bound.rhs().is_not_nil());
126124

127125
and_exprt range_condition(lower_bound, upper_bound);
128126
implies_exprt implication(range_condition, value_equality);
@@ -174,11 +172,12 @@ bvt boolbvt::convert_index(const index_exprt &expr)
174172
for(mp_integer i=0; i<array_size; i=i+1)
175173
{
176174
index_equality.rhs()=from_integer(i, index_equality.lhs().type());
175+
CHECK_RETURN(index_equality.rhs().is_not_nil());
177176

178-
if(index_equality.rhs().is_nil())
179-
throw "number conversion failed (1)";
180-
181-
assert(it != array.operands().end());
177+
INVARIANT(
178+
it != array.operands().end(),
179+
"this loop iterates over the array, so `it` shouldn't be increased "
180+
"past the array's end");
182181

183182
value_equality.rhs()=*it++;
184183

@@ -200,10 +199,7 @@ bvt boolbvt::convert_index(const index_exprt &expr)
200199

201200
// get literals for the whole array
202201

203-
const bvt &array_bv=convert_bv(array);
204-
205-
if(array_size*width!=array_bv.size())
206-
throw "unexpected array size";
202+
const bvt &array_bv = convert_bv(array, array_size.to_ulong() * width);
207203

208204
// TODO: maybe a shifter-like construction would be better
209205
// Would be a lot more compact but propagate worse
@@ -231,9 +227,7 @@ bvt boolbvt::convert_index(const index_exprt &expr)
231227
for(mp_integer i=0; i<array_size; i=i+1)
232228
{
233229
index_equality.rhs()=from_integer(i, index_equality.lhs().type());
234-
235-
if(index_equality.rhs().is_nil())
236-
throw "number conversion failed (1)";
230+
CHECK_RETURN(index_equality.rhs().is_not_nil());
237231

238232
mp_integer offset=i*width;
239233

@@ -258,7 +252,9 @@ bvt boolbvt::convert_index(const index_exprt &expr)
258252

259253
typet constant_type=index.type(); // type of index operand
260254

261-
assert(array_size>0);
255+
DATA_INVARIANT(
256+
array_size > 0,
257+
"non-positive array sizes are forbidden by the C standard");
262258

263259
for(mp_integer i=0; i<array_size; i=i+1)
264260
{

0 commit comments

Comments
 (0)