Skip to content

Commit bf47f81

Browse files
author
Lukasz A.J. Wrona
committed
Use expr_cast in string_exprt casts
1 parent c5fa708 commit bf47f81

File tree

1 file changed

+42
-34
lines changed

1 file changed

+42
-34
lines changed

src/solvers/refinement/string_refinement.cpp

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,24 @@ optionalt<mp_integer> expr_cast<mp_integer>(const exprt& expr)
5454
template<>
5555
optionalt<std::size_t> expr_cast<std::size_t>(const exprt& expr)
5656
{
57-
if (const auto tmp=expr_cast<mp_integer>(expr))
57+
if(const auto tmp=expr_cast<mp_integer>(expr))
5858
{
5959
if(tmp->is_long() && *tmp >= 0)
6060
return tmp->to_long();
6161
}
6262
return { };
6363
}
6464

65+
template<>
66+
optionalt<string_exprt> expr_cast<string_exprt>(const exprt& expr)
67+
{
68+
if(is_refined_string_type(expr.type()))
69+
{
70+
return to_string_expr(expr);
71+
}
72+
return { };
73+
}
74+
6575
template<typename T>
6676
T expr_cast_v(const exprt& expr) {
6777
const auto maybe=expr_cast<T>(expr);
@@ -343,29 +353,28 @@ bool string_refinementt::add_axioms_for_string_assigns(
343353
/// last value that has been initialized.
344354
void string_refinementt::concretize_string(const exprt &expr)
345355
{
346-
if(is_refined_string_type(expr.type()))
356+
if(const auto str=expr_cast<string_exprt>(expr))
347357
{
348-
const string_exprt str=to_string_expr(expr);
349-
const exprt length=get(str.length());
350-
exprt content=str.content();
358+
const exprt length=get(str->length());
359+
exprt content=str->content();
351360
replace_expr(symbol_resolve, content);
352361
found_length[content]=length;
353362
const auto string_length=expr_cast_v<std::size_t>(length);
354363
INVARIANT(
355364
string_length<=generator.max_string_length,
356365
string_refinement_invariantt("string length must be less than the max "
357366
"length"));
358-
if(index_set[str.content()].empty())
367+
if(index_set[str->content()].empty())
359368
return;
360369

361370
std::map<std::size_t, exprt> map;
362371

363-
for(const auto &i : index_set[str.content()])
372+
for(const auto &i : index_set[str->content()])
364373
{
365374
const exprt simple_i=simplify_expr(get(i), ns);
366375
if(const auto index=expr_cast<std::size_t>(simple_i))
367376
{
368-
const exprt str_i=simplify_expr(str[simple_i], ns);
377+
const exprt str_i=simplify_expr((*str)[simple_i], ns);
369378
const exprt value=simplify_expr(get(str_i), ns);
370379
map.emplace(*index, value);
371380
}
@@ -377,7 +386,7 @@ void string_refinementt::concretize_string(const exprt &expr)
377386
}
378387
array_exprt arr(to_array_type(content.type()));
379388
arr.operands()=fill_in_map_as_vector(map);
380-
debug() << "Concretized " << from_expr(ns, "", str.content())
389+
debug() << "Concretized " << from_expr(ns, "", str->content())
381390
<< " = " << from_expr(ns, "", arr) << eom;
382391
found_content[content]=arr;
383392
}
@@ -399,24 +408,22 @@ void string_refinementt::concretize_results()
399408
/// `found_length`
400409
void string_refinementt::concretize_lengths()
401410
{
402-
for(const auto &it : symbol_resolve)
411+
for(const auto &pair : symbol_resolve)
403412
{
404-
if(is_refined_string_type(it.second.type()))
413+
if(const auto str=expr_cast<string_exprt>(pair.second))
405414
{
406-
string_exprt str=to_string_expr(it.second);
407-
exprt length=get(str.length());
408-
exprt content=str.content();
415+
exprt length=get(str->length());
416+
exprt content=str->content();
409417
replace_expr(symbol_resolve, content);
410418
found_length[content]=length;
411419
}
412420
}
413421
for(const auto &it : generator.get_created_strings())
414422
{
415-
if(is_refined_string_type(it.type()))
423+
if(const auto str=expr_cast<string_exprt>(it))
416424
{
417-
string_exprt str=to_string_expr(it);
418-
exprt length=get(str.length());
419-
exprt content=str.content();
425+
exprt length=get(str->length());
426+
exprt content=str->content();
420427
replace_expr(symbol_resolve, content);
421428
found_length[content]=length;
422429
}
@@ -794,20 +801,19 @@ void string_refinementt::debug_model()
794801
const std::string indent(" ");
795802
for(auto it : symbol_resolve)
796803
{
797-
if(is_refined_string_type(it.second.type()))
804+
if(const auto refined=expr_cast<string_exprt>(it.second))
798805
{
799806
debug() << "- " << from_expr(ns, "", to_symbol_expr(it.first)) << ":\n";
800-
string_exprt refined=to_string_expr(it.second);
801807
debug() << indent << indent << "in_map: "
802-
<< from_expr(ns, "", refined) << eom;
808+
<< from_expr(ns, "", *refined) << eom;
803809
debug() << indent << indent << "resolved: "
804-
<< from_expr(ns, "", refined) << eom;
805-
const exprt &econtent=refined.content();
806-
const exprt &elength=refined.length();
810+
<< from_expr(ns, "", *refined) << eom;
811+
const exprt &econtent=refined->content();
812+
const exprt &elength=refined->length();
807813

808814
exprt len=supert::get(elength);
809815
len=simplify_expr(len, ns);
810-
exprt arr=get_array(econtent, len);
816+
const exprt arr=get_array(econtent, len);
811817
if(arr.id()==ID_array)
812818
debug() << indent << indent << "as_string: \""
813819
<< string_of_array(to_array_expr(arr)) << "\"\n";
@@ -1680,11 +1686,11 @@ std::vector<exprt> string_refinementt::instantiate_not_contains(
16801686
/// \return an expression containing no array-list
16811687
exprt substitute_array_lists(exprt expr, size_t string_max_length)
16821688
{
1683-
for(size_t i=0; i<expr.operands().size(); ++i)
1689+
for(auto& operand : expr.operands())
16841690
{
16851691
// TODO: only copy when necessary
1686-
exprt op=(expr.operands()[i]);
1687-
expr.operands()[i]=substitute_array_lists(op, string_max_length);
1692+
const exprt op(operand);
1693+
operand=substitute_array_lists(op, string_max_length);
16881694
}
16891695

16901696
if(expr.id()=="array-list")
@@ -1729,14 +1735,16 @@ exprt string_refinementt::get(const exprt &expr) const
17291735
if(it!=found_length.end())
17301736
return get_array(ecopy, it->second);
17311737
}
1732-
else if(is_refined_string_type(ecopy.type()) && ecopy.id()==ID_struct)
1738+
else if(ecopy.id()==ID_struct)
17331739
{
1734-
const string_exprt &string=to_string_expr(ecopy);
1735-
const exprt &content=string.content();
1736-
const exprt &length=string.length();
1740+
if (const auto string=expr_cast<string_exprt>(ecopy))
1741+
{
1742+
const exprt &content=string->content();
1743+
const exprt &length=string->length();
17371744

1738-
const exprt arr=get_array(content, length);
1739-
ecopy=string_exprt(length, arr, string.type());
1745+
const exprt arr=get_array(content, length);
1746+
ecopy=string_exprt(length, arr, string->type());
1747+
}
17401748
}
17411749

17421750
ecopy=supert::get(ecopy);

0 commit comments

Comments
 (0)