@@ -358,6 +358,7 @@ exprt string_constraint_generatort::add_axioms_for_format(
358
358
const typet &index_type = res.length ().type ();
359
359
360
360
for (const format_elementt &fe : format_strings)
361
+ {
361
362
if (fe.is_format_specifier ())
362
363
{
363
364
const format_specifiert &fs=fe.get_format_specifier ();
@@ -392,24 +393,37 @@ exprt string_constraint_generatort::add_axioms_for_format(
392
393
add_axioms_for_constant (str, fe.get_format_text ().get_content ());
393
394
intermediary_strings.push_back (str);
394
395
}
396
+ }
397
+
398
+ exprt return_code = from_integer (0 , get_return_code_type ());
395
399
396
400
if (intermediary_strings.empty ())
397
- return to_array_string_expr (
398
- array_exprt (array_typet (char_type, from_integer (0 , index_type))));
401
+ {
402
+ lemmas.push_back (equal_exprt (res.length (), from_integer (0 , index_type)));
403
+ return return_code;
404
+ }
399
405
400
- auto it=intermediary_strings.begin ();
401
- array_string_exprt str = *(it++);
402
- exprt return_code = from_integer (0 , signedbv_typet (32 ));
403
- for (; it!=intermediary_strings.end (); ++it)
406
+ array_string_exprt str = intermediary_strings[0 ];
407
+
408
+ if (intermediary_strings.size () == 1 )
404
409
{
410
+ // Copy the first string
411
+ return add_axioms_for_substring (
412
+ res, str, from_integer (0 , index_type), str.length ());
413
+ }
414
+
415
+ // start after the first string and stop before the last
416
+ for (std::size_t i = 1 ; i < intermediary_strings.size () - 1 ; ++i)
417
+ {
418
+ const array_string_exprt &intermediary = intermediary_strings[i];
405
419
const array_string_exprt fresh = fresh_string (index_type, char_type);
406
420
return_code =
407
- bitor_exprt (return_code, add_axioms_for_concat (fresh, str, *it ));
421
+ bitor_exprt (return_code, add_axioms_for_concat (fresh, str, intermediary ));
408
422
str = fresh;
409
423
}
410
- // Copy
411
- add_axioms_for_substring (res, str, from_integer ( 0 , index_type), str. length ());
412
- return return_code;
424
+
425
+ return bitor_exprt (
426
+ return_code, add_axioms_for_concat (res, str, intermediary_strings. back ())) ;
413
427
}
414
428
415
429
// / Construct a string from a constant array.
0 commit comments