@@ -52,14 +52,16 @@ exprt string_constraint_generatort::add_axioms_for_set_length(
52
52
53
53
const symbol_exprt idx = fresh_univ_index (" QA_index_set_length" , index_type);
54
54
const string_constraintt a2 (
55
- idx, minimum (s1.length (), k), equal_exprt (s1[idx], res[idx]));
55
+ idx,
56
+ zero_if_negative (minimum (s1.length (), k)),
57
+ equal_exprt (s1[idx], res[idx]));
56
58
constraints.push_back (a2);
57
59
58
60
symbol_exprt idx2 = fresh_univ_index (" QA_index_set_length2" , index_type);
59
61
string_constraintt a3 (
60
62
idx2,
61
- s1.length (),
62
- res.length (),
63
+ zero_if_negative ( s1.length () ),
64
+ zero_if_negative ( res.length () ),
63
65
equal_exprt (res[idx2], constant_char (0 , char_type)));
64
66
constraints.push_back (a3);
65
67
@@ -131,7 +133,9 @@ exprt string_constraint_generatort::add_axioms_for_substring(
131
133
constraints.push_back ([&] {
132
134
const symbol_exprt idx = fresh_univ_index (" QA_index_substring" , index_type);
133
135
return string_constraintt (
134
- idx, res.length (), equal_exprt (res[idx], str[plus_exprt (start1, idx)]));
136
+ idx,
137
+ zero_if_negative (res.length ()),
138
+ equal_exprt (res[idx], str[plus_exprt (start1, idx)]));
135
139
}());
136
140
137
141
return from_integer (0 , signedbv_typet (32 ));
@@ -193,7 +197,7 @@ exprt string_constraint_generatort::add_axioms_for_trim(
193
197
194
198
symbol_exprt n=fresh_univ_index (" QA_index_trim" , index_type);
195
199
binary_relation_exprt non_print (str[n], ID_le, space_char);
196
- string_constraintt a6 (n, idx, non_print);
200
+ string_constraintt a6 (n, zero_if_negative ( idx) , non_print);
197
201
constraints.push_back (a6);
198
202
199
203
// Axiom 7.
@@ -202,12 +206,12 @@ exprt string_constraint_generatort::add_axioms_for_trim(
202
206
const minus_exprt bound (minus_exprt (str.length (), idx), res.length ());
203
207
const binary_relation_exprt eqn2 (
204
208
str[plus_exprt (idx, plus_exprt (res.length (), n2))], ID_le, space_char);
205
- return string_constraintt (n2, bound, eqn2);
209
+ return string_constraintt (n2, zero_if_negative ( bound) , eqn2);
206
210
}());
207
211
208
212
symbol_exprt n3=fresh_univ_index (" QA_index_trim3" , index_type);
209
213
equal_exprt eqn3 (res[n3], str[plus_exprt (n3, idx)]);
210
- string_constraintt a8 (n3, res.length (), eqn3);
214
+ string_constraintt a8 (n3, zero_if_negative ( res.length () ), eqn3);
211
215
constraints.push_back (a8);
212
216
213
217
// Axiom 9.
@@ -291,7 +295,8 @@ exprt string_constraint_generatort::add_axioms_for_to_lower_case(
291
295
binary_relation_exprt (str[idx], ID_lt, from_integer (0x100 , char_type)));
292
296
if_exprt conditional_convert (is_upper_case, converted, non_converted);
293
297
294
- string_constraintt a2 (idx, res.length (), conditional_convert);
298
+ string_constraintt a2 (
299
+ idx, zero_if_negative (res.length ()), conditional_convert);
295
300
constraints.push_back (a2);
296
301
297
302
return from_integer (0 , f.type ());
@@ -338,7 +343,7 @@ exprt string_constraint_generatort::add_axioms_for_to_upper_case(
338
343
minus_exprt diff (char_A, char_a);
339
344
equal_exprt convert (res[idx1], plus_exprt (str[idx1], diff));
340
345
implies_exprt body1 (is_lower_case, convert);
341
- string_constraintt a2 (idx1, res.length (), body1);
346
+ string_constraintt a2 (idx1, zero_if_negative ( res.length () ), body1);
342
347
constraints.push_back (a2);
343
348
344
349
symbol_exprt idx2=fresh_univ_index (" QA_upper_case2" , index_type);
@@ -348,7 +353,7 @@ exprt string_constraint_generatort::add_axioms_for_to_upper_case(
348
353
binary_relation_exprt (str[idx2], ID_le, char_z)));
349
354
equal_exprt eq (res[idx2], str[idx2]);
350
355
implies_exprt body2 (is_not_lower_case, eq);
351
- string_constraintt a3 (idx2, res.length (), body2);
356
+ string_constraintt a3 (idx2, zero_if_negative ( res.length () ), body2);
352
357
constraints.push_back (a3);
353
358
return from_integer (0 , signedbv_typet (32 ));
354
359
}
@@ -406,13 +411,15 @@ exprt string_constraint_generatort::add_axioms_for_char_set(
406
411
407
412
const symbol_exprt q = fresh_univ_index (" QA_char_set" , position.type ());
408
413
const equal_exprt a3_body (res[q], str[q]);
409
- const string_constraintt a3 (q, minimum (res.length (), position), a3_body);
414
+ const string_constraintt a3 (
415
+ q, minimum (zero_if_negative (res.length ()), position), a3_body);
410
416
constraints.push_back (a3);
411
417
412
418
const symbol_exprt q2 = fresh_univ_index (" QA_char_set2" , position.type ());
413
419
const plus_exprt lower_bound (position, from_integer (1 , position.type ()));
414
420
const equal_exprt a4_body (res[q2], str[q2]);
415
- const string_constraintt a4 (q2, lower_bound, res.length (), a4_body);
421
+ const string_constraintt a4 (
422
+ q2, lower_bound, zero_if_negative (res.length ()), a4_body);
416
423
constraints.push_back (a4);
417
424
418
425
return if_exprt (
@@ -489,7 +496,8 @@ exprt string_constraint_generatort::add_axioms_for_replace(
489
496
implies_exprt case2 (
490
497
not_exprt (equal_exprt (str[qvar], old_char)),
491
498
equal_exprt (res[qvar], str[qvar]));
492
- string_constraintt a2 (qvar, res.length (), and_exprt (case1, case2));
499
+ string_constraintt a2 (
500
+ qvar, zero_if_negative (res.length ()), and_exprt (case1, case2));
493
501
constraints.push_back (a2);
494
502
return from_integer (0 , f.type ());
495
503
}
0 commit comments