Skip to content

Commit 5b4d618

Browse files
Reduce number of constraints in format
We reduce the number of constraints by avoiding the copy of the last string.
1 parent ede2fa1 commit 5b4d618

File tree

1 file changed

+24
-10
lines changed

1 file changed

+24
-10
lines changed

src/solvers/refinement/string_constraint_generator_format.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ exprt string_constraint_generatort::add_axioms_for_format(
358358
const typet &index_type = res.length().type();
359359

360360
for(const format_elementt &fe : format_strings)
361+
{
361362
if(fe.is_format_specifier())
362363
{
363364
const format_specifiert &fs=fe.get_format_specifier();
@@ -392,24 +393,37 @@ exprt string_constraint_generatort::add_axioms_for_format(
392393
add_axioms_for_constant(str, fe.get_format_text().get_content());
393394
intermediary_strings.push_back(str);
394395
}
396+
}
397+
398+
exprt return_code = from_integer(0, get_return_code_type());
395399

396400
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+
}
399405

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)
404409
{
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];
405419
const array_string_exprt fresh = fresh_string(index_type, char_type);
406420
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));
408422
str = fresh;
409423
}
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()));
413427
}
414428

415429
/// Construct a string from a constant array.

0 commit comments

Comments
 (0)