Skip to content

Commit dd8eddf

Browse files
author
Joel Allred
committed
Propagate array_pool to constraint generation
Argument will be required to query string lengths.
1 parent 7e41ab2 commit dd8eddf

14 files changed

+302
-170
lines changed

jbmc/unit/solvers/strings/string_constraint_instantiation/instantiate_not_contains.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,21 @@ exprt get_data_pointer(const array_string_exprt &arr)
8888

8989
/// Creates a `string_exprt` of the proper string type.
9090
/// \param [in] str: string to convert
91+
/// \param array_pool: pool of arrays representing strings
9192
/// \return corresponding `string_exprt`
92-
refined_string_exprt make_refined_string_exprt(const array_string_exprt &arr)
93+
refined_string_exprt make_refined_string_exprt(
94+
const array_string_exprt &arr,
95+
array_poolt &array_pool)
9396
{
9497
return refined_string_exprt(arr.length(), get_data_pointer(arr));
9598
}
9699

97100
/// For a constant `string_exprt`, creates a full index set.
98101
/// \param [in] s: `string_exprt` to create index set for
102+
/// \param array_pool: pool of arrays representing strings
99103
/// \return the corresponding index set
100-
std::set<exprt> full_index_set(const array_string_exprt &s)
104+
std::set<exprt>
105+
full_index_set(const array_string_exprt &s, array_poolt &array_pool)
101106
{
102107
const mp_integer n = numeric_cast_v<mp_integer>(to_constant_expr(s.length()));
103108
std::set<exprt> ret;
@@ -179,17 +184,20 @@ SCENARIO(
179184
// initialize architecture with sensible default values
180185
config.set_arch("none");
181186

187+
symbol_generatort symbol_generator;
188+
array_poolt array_pool(symbol_generator);
189+
182190
// Creating strings
183191
const auto ab_array = make_string_exprt("ab");
184192
const auto b_array = make_string_exprt("b");
185193
const auto a_array = make_string_exprt("a");
186194
const auto empty_array = make_string_exprt("");
187195
const auto cd_array = make_string_exprt("cd");
188-
const auto ab = make_refined_string_exprt(ab_array);
189-
const auto b = make_refined_string_exprt(b_array);
190-
const auto a = make_refined_string_exprt(a_array);
191-
const auto empty = make_refined_string_exprt(empty_array);
192-
const auto cd = make_refined_string_exprt(cd_array);
196+
const auto ab = make_refined_string_exprt(ab_array, array_pool);
197+
const auto b = make_refined_string_exprt(b_array, array_pool);
198+
const auto a = make_refined_string_exprt(a_array, array_pool);
199+
const auto empty = make_refined_string_exprt(empty_array, array_pool);
200+
const auto cd = make_refined_string_exprt(cd_array, array_pool);
193201

194202
GIVEN("The not_contains axioms of String.lastIndexOf(String, Int)")
195203
{
@@ -247,8 +255,8 @@ SCENARIO(
247255
WHEN("we instantiate and simplify")
248256
{
249257
// Making index sets
250-
const std::set<exprt> index_set_ab = full_index_set(ab_array);
251-
const std::set<exprt> index_set_b = full_index_set(b_array);
258+
const std::set<exprt> index_set_ab = full_index_set(ab_array, array_pool);
259+
const std::set<exprt> index_set_b = full_index_set(b_array, array_pool);
252260

253261
// List of new lemmas to be returned
254262
std::vector<exprt> lemmas;
@@ -305,7 +313,7 @@ SCENARIO(
305313
WHEN("we instantiate and simplify")
306314
{
307315
// Making index sets
308-
const std::set<exprt> index_set_a = full_index_set(a_array);
316+
const std::set<exprt> index_set_a = full_index_set(a_array, array_pool);
309317

310318
// Instantiate the lemmas
311319
std::vector<exprt> lemmas = instantiate_not_contains(
@@ -355,8 +363,8 @@ SCENARIO(
355363
WHEN("we instantiate and simplify")
356364
{
357365
// Making index sets
358-
const std::set<exprt> index_set_a = full_index_set(a_array);
359-
const std::set<exprt> index_set_b = full_index_set(b_array);
366+
const std::set<exprt> index_set_a = full_index_set(a_array, array_pool);
367+
const std::set<exprt> index_set_b = full_index_set(b_array, array_pool);
360368

361369
// Instantiate the lemmas
362370
std::vector<exprt> lemmas = instantiate_not_contains(
@@ -406,7 +414,7 @@ SCENARIO(
406414
WHEN("we instantiate and simplify")
407415
{
408416
// Making index sets
409-
const std::set<exprt> index_set_a = full_index_set(a_array);
417+
const std::set<exprt> index_set_a = full_index_set(a_array, array_pool);
410418
const std::set<exprt> index_set_empty = {
411419
generator.fresh_symbol("z", t.length_type())};
412420

@@ -459,7 +467,7 @@ SCENARIO(
459467
WHEN("we instantiate and simplify")
460468
{
461469
// Making index sets
462-
const std::set<exprt> index_set_ab = full_index_set(ab_array);
470+
const std::set<exprt> index_set_ab = full_index_set(ab_array, array_pool);
463471

464472
// Instantiate the lemmas
465473
std::vector<exprt> lemmas = instantiate_not_contains(
@@ -510,8 +518,8 @@ SCENARIO(
510518
WHEN("we instantiate and simplify")
511519
{
512520
// Making index sets
513-
const std::set<exprt> index_set_ab = full_index_set(ab_array);
514-
const std::set<exprt> index_set_cd = full_index_set(cd_array);
521+
const std::set<exprt> index_set_ab = full_index_set(ab_array, array_pool);
522+
const std::set<exprt> index_set_cd = full_index_set(cd_array, array_pool);
515523

516524
// Instantiate the lemmas
517525
std::vector<exprt> lemmas = instantiate_not_contains(

src/solvers/strings/string_builtin_function.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,17 @@ string_constraintst string_concatenation_builtin_functiont::constraints(
144144
auto pair = [&]() -> std::pair<exprt, string_constraintst> {
145145
if(args.size() == 0)
146146
return add_axioms_for_concat(
147-
generator.fresh_symbol, result, input1, input2);
147+
generator.fresh_symbol, result, input1, input2, array_pool);
148148
if(args.size() == 2)
149149
{
150150
return add_axioms_for_concat_substr(
151-
generator.fresh_symbol, result, input1, input2, args[0], args[1]);
151+
generator.fresh_symbol,
152+
result,
153+
input1,
154+
input2,
155+
args[0],
156+
args[1],
157+
array_pool);
152158
}
153159
UNREACHABLE;
154160
}();
@@ -159,10 +165,10 @@ string_constraintst string_concatenation_builtin_functiont::constraints(
159165
exprt string_concatenation_builtin_functiont::length_constraint() const
160166
{
161167
if(args.size() == 0)
162-
return length_constraint_for_concat(result, input1, input2);
168+
return length_constraint_for_concat(result, input1, input2, array_pool);
163169
if(args.size() == 2)
164170
return length_constraint_for_concat_substr(
165-
result, input1, input2, args[0], args[1]);
171+
result, input1, input2, args[0], args[1], array_pool);
166172
UNREACHABLE;
167173
}
168174

@@ -214,7 +220,7 @@ string_constraintst string_concat_char_builtin_functiont::constraints(
214220

215221
exprt string_concat_char_builtin_functiont::length_constraint() const
216222
{
217-
return length_constraint_for_concat_char(result, input);
223+
return length_constraint_for_concat_char(result, input, array_pool);
218224
}
219225

220226
optionalt<exprt> string_set_char_builtin_functiont::eval(
@@ -491,7 +497,7 @@ string_constraintst string_insertion_builtin_functiont::constraints(
491497
if(args.size() == 1)
492498
{
493499
auto pair = add_axioms_for_insert(
494-
generator.fresh_symbol, result, input1, input2, args[0]);
500+
generator.fresh_symbol, result, input1, input2, args[0], array_pool);
495501
pair.second.existential.push_back(equal_exprt(pair.first, return_code));
496502
return pair.second;
497503
}
@@ -503,7 +509,7 @@ string_constraintst string_insertion_builtin_functiont::constraints(
503509
exprt string_insertion_builtin_functiont::length_constraint() const
504510
{
505511
if(args.size() == 1)
506-
return length_constraint_for_insert(result, input1, input2);
512+
return length_constraint_for_insert(result, input1, input2, array_pool);
507513
if(args.size() == 3)
508514
UNIMPLEMENTED;
509515
UNREACHABLE;
@@ -562,7 +568,7 @@ string_constraintst string_of_int_builtin_functiont::constraints(
562568
string_constraint_generatort &generator) const
563569
{
564570
auto pair = add_axioms_for_string_of_int_with_radix(
565-
result, arg, radix, 0, generator.ns);
571+
result, arg, radix, 0, generator.ns, array_pool);
566572
pair.second.existential.push_back(equal_exprt(pair.first, return_code));
567573
return pair.second;
568574
}

src/solvers/strings/string_constraint_generator.h

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -96,33 +96,38 @@ std::pair<exprt, string_constraintst> add_axioms_for_concat(
9696
symbol_generatort &fresh_symbol,
9797
const array_string_exprt &res,
9898
const array_string_exprt &s1,
99-
const array_string_exprt &s2);
99+
const array_string_exprt &s2,
100+
array_poolt &array_pool);
100101
std::pair<exprt, string_constraintst> add_axioms_for_concat_substr(
101102
symbol_generatort &fresh_symbol,
102103
const array_string_exprt &res,
103104
const array_string_exprt &s1,
104105
const array_string_exprt &s2,
105106
const exprt &start_index,
106-
const exprt &end_index);
107+
const exprt &end_index,
108+
array_poolt &array_pool);
107109
std::pair<exprt, string_constraintst> add_axioms_for_insert(
108110
symbol_generatort &fresh_symbol,
109111
const array_string_exprt &res,
110112
const array_string_exprt &s1,
111113
const array_string_exprt &s2,
112-
const exprt &offset);
114+
const exprt &offset,
115+
array_poolt &array_pool);
113116
std::pair<exprt, string_constraintst> add_axioms_for_string_of_int_with_radix(
114117
const array_string_exprt &res,
115118
const exprt &input_int,
116119
const exprt &radix,
117120
size_t max_size,
118-
const namespacet &ns);
121+
const namespacet &ns,
122+
array_poolt &array_pool);
119123

120124
string_constraintst add_constraint_on_characters(
121125
symbol_generatort &fresh_symbol,
122126
const array_string_exprt &s,
123127
const exprt &start,
124128
const exprt &end,
125-
const std::string &char_set);
129+
const std::string &char_set,
130+
array_poolt &array_pool);
126131
std::pair<exprt, string_constraintst> add_axioms_for_constrain_characters(
127132
symbol_generatort &fresh_symbol,
128133
const function_application_exprt &f,
@@ -196,6 +201,7 @@ std::pair<exprt, string_constraintst> add_axioms_for_concat_code_point(
196201
std::pair<exprt, string_constraintst> add_axioms_for_constant(
197202
const array_string_exprt &res,
198203
irep_idt sval,
204+
array_poolt &array_pool,
199205
const exprt &guard = true_exprt());
200206

201207
std::pair<exprt, string_constraintst> add_axioms_for_delete(
@@ -260,7 +266,8 @@ std::pair<exprt, string_constraintst> add_axioms_for_cprover_string(
260266
symbol_generatort &fresh_symbol,
261267
const array_string_exprt &res,
262268
const exprt &arg,
263-
const exprt &guard);
269+
const exprt &guard,
270+
array_poolt &array_pool);
264271
std::pair<exprt, string_constraintst> add_axioms_from_literal(
265272
symbol_generatort &fresh_symbol,
266273
const function_application_exprt &f,
@@ -270,9 +277,12 @@ std::pair<exprt, string_constraintst> add_axioms_for_string_of_int(
270277
const array_string_exprt &res,
271278
const exprt &input_int,
272279
size_t max_size,
273-
const namespacet &ns);
274-
std::pair<exprt, string_constraintst>
275-
add_axioms_from_int_hex(const array_string_exprt &res, const exprt &i);
280+
const namespacet &ns,
281+
array_poolt &array_pool);
282+
std::pair<exprt, string_constraintst> add_axioms_from_int_hex(
283+
const array_string_exprt &res,
284+
const exprt &i,
285+
array_poolt &array_pool);
276286
std::pair<exprt, string_constraintst> add_axioms_from_int_hex(
277287
const function_application_exprt &f,
278288
array_poolt &array_pool);
@@ -283,23 +293,29 @@ std::pair<exprt, string_constraintst> add_axioms_from_long(
283293
std::pair<exprt, string_constraintst> add_axioms_from_bool(
284294
const function_application_exprt &f,
285295
array_poolt &array_pool);
286-
std::pair<exprt, string_constraintst>
287-
add_axioms_from_bool(const array_string_exprt &res, const exprt &i);
296+
std::pair<exprt, string_constraintst> add_axioms_from_bool(
297+
const array_string_exprt &res,
298+
const exprt &b,
299+
array_poolt &array_pool);
288300
std::pair<exprt, string_constraintst> add_axioms_from_char(
289301
const function_application_exprt &f,
290302
array_poolt &array_pool);
291-
std::pair<exprt, string_constraintst>
292-
add_axioms_from_char(const array_string_exprt &res, const exprt &i);
303+
std::pair<exprt, string_constraintst> add_axioms_from_char(
304+
const array_string_exprt &res,
305+
const exprt &c,
306+
array_poolt &array_pool);
293307
std::pair<exprt, string_constraintst> add_axioms_for_index_of(
294308
symbol_generatort &fresh_symbol,
295309
const array_string_exprt &str,
296310
const exprt &c,
297-
const exprt &from_index);
311+
const exprt &from_index,
312+
array_poolt &array_pool);
298313
std::pair<exprt, string_constraintst> add_axioms_for_index_of_string(
299314
symbol_generatort &fresh_symbol,
300315
const array_string_exprt &haystack,
301316
const array_string_exprt &needle,
302-
const exprt &from_index);
317+
const exprt &from_index,
318+
array_poolt &array_pool);
303319
std::pair<exprt, string_constraintst> add_axioms_for_index_of(
304320
symbol_generatort &fresh_symbol,
305321
const function_application_exprt &f,
@@ -308,12 +324,14 @@ std::pair<exprt, string_constraintst> add_axioms_for_last_index_of_string(
308324
symbol_generatort &fresh_symbol,
309325
const array_string_exprt &haystack,
310326
const array_string_exprt &needle,
311-
const exprt &from_index);
327+
const exprt &from_index,
328+
array_poolt &array_pool);
312329
std::pair<exprt, string_constraintst> add_axioms_for_last_index_of(
313330
symbol_generatort &fresh_symbol,
314331
const array_string_exprt &str,
315332
const exprt &c,
316-
const exprt &from_index);
333+
const exprt &from_index,
334+
array_poolt &array_pool);
317335

318336
std::pair<exprt, string_constraintst> add_axioms_for_last_index_of(
319337
symbol_generatort &fresh_symbol,
@@ -338,8 +356,9 @@ std::pair<exprt, string_constraintst> add_axioms_for_string_of_float(
338356
const namespacet &ns);
339357
std::pair<exprt, string_constraintst> add_axioms_for_fractional_part(
340358
const array_string_exprt &res,
341-
const exprt &i,
342-
size_t max_size);
359+
const exprt &int_expr,
360+
size_t max_size,
361+
array_poolt &array_pool);
343362
std::pair<exprt, string_constraintst> add_axioms_from_float_scientific_notation(
344363
symbol_generatort &fresh_symbol,
345364
const array_string_exprt &res,
@@ -377,7 +396,8 @@ std::pair<exprt, string_constraintst> add_axioms_for_substring(
377396
const array_string_exprt &res,
378397
const array_string_exprt &str,
379398
const exprt &start,
380-
const exprt &end);
399+
const exprt &end,
400+
array_poolt &array_pool);
381401
std::pair<exprt, string_constraintst> add_axioms_for_substring(
382402
symbol_generatort &fresh_symbol,
383403
const function_application_exprt &f,
@@ -390,7 +410,8 @@ std::pair<exprt, string_constraintst> add_axioms_for_trim(
390410

391411
std::pair<exprt, string_constraintst> add_axioms_for_code_point(
392412
const array_string_exprt &res,
393-
const exprt &code_point);
413+
const exprt &code_point,
414+
array_poolt &array_pool);
394415
std::pair<exprt, string_constraintst>
395416
add_axioms_for_char_literal(const function_application_exprt &f);
396417

@@ -422,13 +443,15 @@ string_constraintst add_axioms_for_characters_in_integer_string(
422443
const array_string_exprt &str,
423444
const std::size_t max_string_length,
424445
const exprt &radix,
425-
const unsigned long radix_ul);
446+
const unsigned long radix_ul,
447+
array_poolt &array_pool);
426448
string_constraintst add_axioms_for_correct_number_format(
427449
const array_string_exprt &str,
428450
const exprt &radix_as_char,
429451
const unsigned long radix_ul,
430452
const std::size_t max_size,
431-
const bool strict_formatting);
453+
const bool strict_formatting,
454+
array_poolt &array_pool);
432455
std::pair<exprt, string_constraintst> add_axioms_for_parse_int(
433456
symbol_generatort &fresh_symbol,
434457
const function_application_exprt &f,
@@ -470,21 +493,25 @@ exprt sum_overflows(const plus_exprt &sum);
470493

471494
exprt length_constraint_for_concat_char(
472495
const array_string_exprt &res,
473-
const array_string_exprt &s1);
496+
const array_string_exprt &s1,
497+
array_poolt &array_pool);
474498
exprt length_constraint_for_concat(
475499
const array_string_exprt &res,
476500
const array_string_exprt &s1,
477-
const array_string_exprt &s2);
501+
const array_string_exprt &s2,
502+
array_poolt &array_pool);
478503
exprt length_constraint_for_concat_substr(
479504
const array_string_exprt &res,
480505
const array_string_exprt &s1,
481506
const array_string_exprt &s2,
482-
const exprt &start_index,
483-
const exprt &end_index);
507+
const exprt &start,
508+
const exprt &end,
509+
array_poolt &array_pool);
484510
exprt length_constraint_for_insert(
485511
const array_string_exprt &res,
486512
const array_string_exprt &s1,
487-
const array_string_exprt &s2);
513+
const array_string_exprt &s2,
514+
array_poolt &array_pool);
488515

489516
exprt zero_if_negative(const exprt &expr);
490517

0 commit comments

Comments
 (0)