Skip to content

Commit b8df2b3

Browse files
Initialize return_code for all builtin_functions
1 parent 82f552c commit b8df2b3

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

src/solvers/refinement/string_builtin_function.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ static array_string_exprt make_string(
1818

1919
string_transformation_builtin_functiont::
2020
string_transformation_builtin_functiont(
21+
const exprt &return_code,
2122
const std::vector<exprt> &fun_args,
2223
array_poolt &array_pool)
24+
: string_builtin_functiont(return_code)
2325
{
2426
PRECONDITION(fun_args.size() > 2);
2527
const auto arg1 = expr_checked_cast<struct_exprt>(fun_args[2]);
@@ -55,8 +57,10 @@ optionalt<exprt> string_transformation_builtin_functiont::eval(
5557
}
5658

5759
string_insertion_builtin_functiont::string_insertion_builtin_functiont(
60+
const exprt &return_code,
5861
const std::vector<exprt> &fun_args,
5962
array_poolt &array_pool)
63+
: string_builtin_functiont(return_code)
6064
{
6165
PRECONDITION(fun_args.size() > 4);
6266
const auto arg1 = expr_checked_cast<struct_exprt>(fun_args[2]);
@@ -69,8 +73,10 @@ string_insertion_builtin_functiont::string_insertion_builtin_functiont(
6973
}
7074

7175
string_concatenation_builtin_functiont::string_concatenation_builtin_functiont(
76+
const exprt &return_code,
7277
const std::vector<exprt> &fun_args,
7378
array_poolt &array_pool)
79+
: string_insertion_builtin_functiont(return_code)
7480
{
7581
PRECONDITION(fun_args.size() >= 4 && fun_args.size() <= 6);
7682
const auto arg1 = expr_checked_cast<struct_exprt>(fun_args[2]);
@@ -209,9 +215,10 @@ optionalt<exprt> string_insertion_builtin_functiont::eval(
209215
}
210216

211217
string_builtin_function_with_no_evalt::string_builtin_function_with_no_evalt(
218+
const exprt &return_code,
212219
const function_application_exprt &f,
213220
array_poolt &array_pool)
214-
: function_application(f)
221+
: string_builtin_functiont(return_code), function_application(f)
215222
{
216223
const std::vector<exprt> &fun_args = f.arguments();
217224
std::size_t i = 0;

src/solvers/refinement/string_builtin_function.h

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,16 @@ class string_builtin_functiont
3838
virtual exprt
3939
add_constraints(string_constraint_generatort &constraint_generator) const = 0;
4040

41-
protected:
41+
exprt return_code;
42+
43+
private:
4244
string_builtin_functiont() = default;
45+
46+
protected:
47+
explicit string_builtin_functiont(const exprt &return_code)
48+
: return_code(return_code)
49+
{
50+
}
4351
};
4452

4553
/// String builtin_function transforming one string into another
@@ -49,14 +57,14 @@ class string_transformation_builtin_functiont : public string_builtin_functiont
4957
array_string_exprt result;
5058
array_string_exprt input;
5159
std::vector<exprt> args;
52-
exprt return_code;
5360

5461
/// Constructor from arguments of a function application.
5562
/// The arguments in `fun_args` should be in order:
5663
/// an integer `result.length`, a character pointer `&result[0]`,
5764
/// a string `arg1` of type refined_string_typet, and potentially some
5865
/// arguments of primitive types.
5966
string_transformation_builtin_functiont(
67+
const exprt &return_code,
6068
const std::vector<exprt> &fun_args,
6169
array_poolt &array_pool);
6270

@@ -88,9 +96,10 @@ class string_concat_char_builtin_functiont
8896
/// an integer `result.length`, a character pointer `&result[0]`,
8997
/// a string `arg1` of type refined_string_typet, and a character.
9098
string_concat_char_builtin_functiont(
99+
const exprt &return_code,
91100
const std::vector<exprt> &fun_args,
92101
array_poolt &array_pool)
93-
: string_transformation_builtin_functiont(fun_args, array_pool)
102+
: string_transformation_builtin_functiont(return_code, fun_args, array_pool)
94103
{
95104
}
96105

@@ -117,7 +126,6 @@ class string_insertion_builtin_functiont : public string_builtin_functiont
117126
array_string_exprt input1;
118127
array_string_exprt input2;
119128
std::vector<exprt> args;
120-
exprt return_code;
121129

122130
/// Constructor from arguments of a function application.
123131
/// The arguments in `fun_args` should be in order:
@@ -126,6 +134,7 @@ class string_insertion_builtin_functiont : public string_builtin_functiont
126134
/// a string `arg2` of type refined_string_typet,
127135
/// and potentially some arguments of primitive types.
128136
string_insertion_builtin_functiont(
137+
const exprt &return_code,
129138
const std::vector<exprt> &fun_args,
130139
array_poolt &array_pool);
131140

@@ -162,7 +171,10 @@ class string_insertion_builtin_functiont : public string_builtin_functiont
162171
};
163172

164173
protected:
165-
string_insertion_builtin_functiont() = default;
174+
explicit string_insertion_builtin_functiont(const exprt &return_code)
175+
: string_builtin_functiont(return_code)
176+
{
177+
}
166178
};
167179

168180
class string_concatenation_builtin_functiont final
@@ -176,6 +188,7 @@ class string_concatenation_builtin_functiont final
176188
/// a string `arg2` of type refined_string_typet,
177189
/// optionally followed by an integer `start` and an integer `end`.
178190
string_concatenation_builtin_functiont(
191+
const exprt &return_code,
179192
const std::vector<exprt> &fun_args,
180193
array_poolt &array_pool);
181194

@@ -240,6 +253,7 @@ class string_builtin_function_with_no_evalt : public string_builtin_functiont
240253
std::vector<exprt> args;
241254

242255
string_builtin_function_with_no_evalt(
256+
const exprt &return_code,
243257
const function_application_exprt &f,
244258
array_poolt &array_pool);
245259

src/solvers/refinement/string_refinement_util.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ equation_symbol_mappingt::find_equations(const exprt &expr)
167167
/// \return a unique pointer to the created object
168168
static std::unique_ptr<string_builtin_functiont> to_string_builtin_function(
169169
const function_application_exprt &fun_app,
170+
const exprt &return_code,
170171
array_poolt &array_pool)
171172
{
172173
const auto name = expr_checked_cast<symbol_exprt>(fun_app.function());
@@ -175,18 +176,18 @@ static std::unique_ptr<string_builtin_functiont> to_string_builtin_function(
175176

176177
if(id == ID_cprover_string_insert_func)
177178
return util_make_unique<string_insertion_builtin_functiont>(
178-
fun_app.arguments(), array_pool);
179+
return_code, fun_app.arguments(), array_pool);
179180

180181
if(id == ID_cprover_string_concat_func)
181182
return util_make_unique<string_concatenation_builtin_functiont>(
182-
fun_app.arguments(), array_pool);
183+
return_code, fun_app.arguments(), array_pool);
183184

184185
if(id == ID_cprover_string_concat_char_func)
185186
return util_make_unique<string_concat_char_builtin_functiont>(
186-
fun_app.arguments(), array_pool);
187+
return_code, fun_app.arguments(), array_pool);
187188

188189
return util_make_unique<string_builtin_function_with_no_evalt>(
189-
fun_app.arguments(), array_pool);
190+
return_code, fun_app, array_pool);
190191
}
191192

192193
string_dependenciest::string_nodet &
@@ -322,7 +323,9 @@ bool add_node(
322323
if(!fun_app)
323324
return false;
324325

325-
auto builtin_function = to_string_builtin_function(*fun_app, array_pool);
326+
auto builtin_function =
327+
to_string_builtin_function(*fun_app, equation.lhs(), array_pool);
328+
326329
CHECK_RETURN(builtin_function != nullptr);
327330
const auto &builtin_function_node = dependencies.make_node(builtin_function);
328331
// Warning: `builtin_function` has been emptied and should not be used anymore

0 commit comments

Comments
 (0)