Skip to content

Commit 05ffc71

Browse files
Setting bound in if_exprt for constant arrays
Characters arrays used for strings are either infinite length or constant array with fixed length (ID_array). In this latter case we need to set up the bound of axioms accordingly.
1 parent cc201f7 commit 05ffc71

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

src/solvers/refinement/string_constraint_generator_main.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,12 +294,21 @@ void string_constraint_generatort::add_axioms_for_if_array(
294294
// a1 : forall qvar2<max_length, !cond => lhs[qvar] = f[qvar]
295295
symbol_exprt qvar=fresh_univ_index("QA_array_if_true", index_type);
296296
equal_exprt qequal(index_exprt(lhs, qvar), index_exprt(t, qvar));
297-
string_constraintt a1(qvar, max_length, expr.cond(), qequal);
297+
298+
// In case t is a constant array of fixed length is does not make sense
299+
// to talk about indexes exceeding this length
300+
exprt upper_bound_t=
301+
(t.id()==ID_array)?from_integer(t.operands().size(), index_type):max_length;
302+
string_constraintt a1(qvar, upper_bound_t, expr.cond(), qequal);
298303
axioms.push_back(a1);
299304

300305
symbol_exprt qvar2=fresh_univ_index("QA_array_if_false", index_type);
301306
equal_exprt qequal2(index_exprt(lhs, qvar2), index_exprt(f, qvar2));
302-
string_constraintt a2(qvar2, max_length, not_exprt(expr.cond()), qequal2);
307+
// In case f is a constant array of fixed length is does not make sense
308+
// to talk about indexes exceeding this length
309+
exprt upper_bound_f=
310+
(f.id()==ID_array)?from_integer(f.operands().size(), index_type):max_length;
311+
string_constraintt a2(qvar2, upper_bound_f, not_exprt(expr.cond()), qequal2);
303312
axioms.push_back(a2);
304313
}
305314

0 commit comments

Comments
 (0)