Skip to content

Commit 1e06eda

Browse files
Add versions of get_value_set returning a value
These return the computed value, which makes the information flow clearer in the program. We deprecate at the same time the functions from the previous version.
1 parent e1eb12e commit 1e06eda

15 files changed

+130
-25
lines changed

src/goto-symex/postcondition.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ bool postconditiont::is_used(
160160
else if(expr.id()==ID_dereference)
161161
{
162162
// aliasing may happen here
163-
value_setst::valuest expr_set;
164-
value_set.get_value_set(to_dereference_expr(expr).pointer(), expr_set, ns);
163+
value_setst::valuest expr_set =
164+
value_set.get_value_set(to_dereference_expr(expr).pointer(), ns);
165165
std::unordered_set<irep_idt> symbols;
166166

167167
for(value_setst::valuest::const_iterator

src/goto-symex/precondition.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,8 @@ void preconditiont::compute_rec(exprt &dest)
112112

113113
// aliasing may happen here
114114

115-
value_setst::valuest expr_set;
116-
value_sets.get_values(
117-
SSA_step.source.function_id, target, deref_expr.pointer(), expr_set);
115+
value_setst::valuest expr_set = value_sets.get_values(
116+
SSA_step.source.function_id, target, deref_expr.pointer());
118117
std::unordered_set<irep_idt> symbols;
119118

120119
for(value_setst::valuest::const_iterator

src/goto-symex/symex_dereference_state.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,10 @@ void symex_dereference_statet::get_value_set(
107107
std::cout << "**************************\n";
108108
#endif
109109
}
110+
111+
/// Just forwards a value-set query to `state.value_set`
112+
value_setst::valuest
113+
symex_dereference_statet::get_value_set(const exprt &expr) const
114+
{
115+
return state.value_set.get_value_set(expr, ns);
116+
}

src/goto-symex/symex_dereference_state.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@ class symex_dereference_statet:
3434
goto_symext::statet &state;
3535
const namespacet &ns;
3636

37+
DEPRECATED(SINCE(2019, 05, 22, "use list returning version instead"))
3738
void get_value_set(const exprt &expr, value_setst::valuest &value_set)
3839
const override;
3940

41+
value_setst::valuest get_value_set(const exprt &expr) const override;
42+
4043
const symbolt *get_or_create_failed_symbol(const exprt &expr) override;
4144
};
4245

src/pointer-analysis/dereference_callback.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ class dereference_callbackt
2929
public:
3030
virtual ~dereference_callbackt() = default;
3131

32+
DEPRECATED(SINCE(2019, 05, 22, "use list returning version instead"))
3233
virtual void
3334
get_value_set(const exprt &expr, value_setst::valuest &value_set) const = 0;
3435

36+
virtual value_setst::valuest get_value_set(const exprt &expr) const = 0;
37+
3538
virtual const symbolt *get_or_create_failed_symbol(const exprt &expr) = 0;
3639
};
3740

src/pointer-analysis/goto_program_dereference.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,16 @@ void goto_program_dereferencet::get_value_set(
147147
value_sets.get_values(current_function, current_target, expr, dest);
148148
}
149149

150+
/// Gets the value set corresponding to the current target and
151+
/// expression \p expr.
152+
/// \param expr: an expression
153+
/// \return the value set
154+
std::list<exprt>
155+
goto_program_dereferencet::get_value_set(const exprt &expr) const
156+
{
157+
return value_sets.get_values(current_function, current_target, expr);
158+
}
159+
150160
/// Remove dereference expressions contained in `expr`.
151161
/// \param expr: an expression
152162
/// \param checks_only: when true, execute the substitution on a copy of expr

src/pointer-analysis/goto_program_dereference.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,12 @@ class goto_program_dereferencet:protected dereference_callbackt
6565

6666
const symbolt *get_or_create_failed_symbol(const exprt &expr) override;
6767

68+
DEPRECATED(SINCE(2019, 05, 22, "use list returning version instead"))
6869
void
6970
get_value_set(const exprt &expr, value_setst::valuest &dest) const override;
7071

72+
std::list<exprt> get_value_set(const exprt &expr) const override;
73+
7174
void dereference_instruction(
7275
goto_programt::targett target,
7376
bool checks_only=false);

src/pointer-analysis/value_set.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Author: Daniel Kroening, [email protected]
2121
#include <util/simplify_expr.h>
2222

2323
#include <langapi/language_util.h>
24+
#include <util/range.h>
2425

2526
#ifdef DEBUG
2627
#include <iostream>
@@ -308,8 +309,7 @@ bool value_sett::eval_pointer_offset(
308309
{
309310
assert(expr.operands().size()==1);
310311

311-
object_mapt reference_set;
312-
get_value_set(expr.op0(), reference_set, ns, true);
312+
const object_mapt reference_set = get_value_set(expr.op0(), ns, true);
313313

314314
exprt new_expr;
315315
mp_integer previous_offset=0;
@@ -356,8 +356,7 @@ void value_sett::get_value_set(
356356
value_setst::valuest &dest,
357357
const namespacet &ns) const
358358
{
359-
object_mapt object_map;
360-
get_value_set(std::move(expr), object_map, ns, false);
359+
object_mapt object_map = get_value_set(std::move(expr), ns, false);
361360

362361
for(object_map_dt::const_iterator
363362
it=object_map.read().begin();
@@ -372,6 +371,14 @@ void value_sett::get_value_set(
372371
#endif
373372
}
374373

374+
std::list<exprt>
375+
value_sett::get_value_set(exprt expr, const namespacet &ns) const
376+
{
377+
const object_mapt object_map = get_value_set(std::move(expr), ns, false);
378+
return make_range(object_map.read())
379+
.map([&](const object_map_dt::value_type &pair) { return to_expr(pair); });
380+
}
381+
375382
void value_sett::get_value_set(
376383
exprt expr,
377384
object_mapt &dest,
@@ -384,6 +391,19 @@ void value_sett::get_value_set(
384391
get_value_set_rec(expr, dest, "", expr.type(), ns);
385392
}
386393

394+
value_sett::object_mapt value_sett::get_value_set(
395+
exprt expr,
396+
const namespacet &ns,
397+
bool is_simplified) const
398+
{
399+
if(!is_simplified)
400+
simplify(expr, ns);
401+
402+
object_mapt dest;
403+
get_value_set_rec(expr, dest, "", expr.type(), ns);
404+
return dest;
405+
}
406+
387407
/// Check if 'suffix' starts with 'field'.
388408
/// Suffix is delimited by periods and '[]' (array access) tokens, so we're
389409
/// looking for ".field($|[]|.)"
@@ -1303,8 +1323,7 @@ void value_sett::assign(
13031323
else
13041324
{
13051325
// basic type
1306-
object_mapt values_rhs;
1307-
get_value_set(rhs, values_rhs, ns, is_simplified);
1326+
object_mapt values_rhs = get_value_set(rhs, ns, is_simplified);
13081327

13091328
// Permit custom subclass to alter the read values prior to write:
13101329
adjust_assign_rhs_values(rhs, ns, values_rhs);

src/pointer-analysis/value_set.h

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,16 +261,22 @@ class value_sett
261261
/// `entryt` fields.
262262
typedef sharing_mapt<irep_idt, entryt> valuest;
263263

264-
/// Gets values pointed to by `expr`, including following dereference
264+
/// Gets values pointed to by \p expr, including following dereference
265265
/// operators (i.e. this is not a simple lookup in `valuest`).
266-
/// \param expr: query expression
267-
/// \param [out] dest: assigned a set of expressions that `expr` may point to
268-
/// \param ns: global namespace
266+
DEPRECATED(
267+
SINCE(2019, 05, 22, "Use get_value_set(exprt, const namespacet &) instead"))
269268
void get_value_set(
270269
exprt expr,
271270
value_setst::valuest &dest,
272271
const namespacet &ns) const;
273272

273+
/// Gets values pointed to by `expr`, including following dereference
274+
/// operators (i.e. this is not a simple lookup in `valuest`).
275+
/// \param expr: query expression
276+
/// \param ns: global namespace
277+
/// \return list of expressions that `expr` may point to
278+
std::list<exprt> get_value_set(exprt expr, const namespacet &ns) const;
279+
274280
/// Appears to be unimplemented.
275281
DEPRECATED(SINCE(2019, 05, 22, "Unimplemented"))
276282
expr_sett &get(const irep_idt &identifier, const std::string &suffix);
@@ -458,18 +464,25 @@ class value_sett
458464
void erase_symbol(const symbol_exprt &symbol_expr, const namespacet &ns);
459465

460466
protected:
461-
/// Reads the set of objects pointed to by `expr`, including making
467+
/// Reads the set of objects pointed to by \p expr, including making
462468
/// recursive lookups for dereference operations etc.
463-
/// \param expr: query expression
464-
/// \param [out] dest: overwritten by the set of object numbers pointed to
465-
/// \param ns: global namespace
466-
/// \param is_simplified: if false, simplify `expr` before reading.
469+
DEPRECATED(
470+
SINCE(2019, 05, 22, "Use the version returning object_mapt instead"))
467471
void get_value_set(
468472
exprt expr,
469473
object_mapt &dest,
470474
const namespacet &ns,
471475
bool is_simplified) const;
472476

477+
/// Reads the set of objects pointed to by `expr`, including making
478+
/// recursive lookups for dereference operations etc.
479+
/// \param expr: query expression
480+
/// \param ns: global namespace
481+
/// \param is_simplified: if false, simplify `expr` before reading.
482+
/// \return the set of object numbers pointed to
483+
object_mapt
484+
get_value_set(exprt expr, const namespacet &ns, bool is_simplified) const;
485+
473486
/// See the other overload of `get_reference_set`. This one returns object
474487
/// numbers and offsets instead of expressions.
475488
void get_reference_set(

src/pointer-analysis/value_set_analysis.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class value_set_analysis_templatet:
6565

6666
public:
6767
// interface value_sets
68+
DEPRECATED(SINCE(2019, 05, 22, "use list returning version instead"))
6869
void get_values(
6970
const irep_idt &,
7071
locationt l,
@@ -73,6 +74,13 @@ class value_set_analysis_templatet:
7374
{
7475
(*this)[l].value_set.get_value_set(expr, dest, baset::ns);
7576
}
77+
78+
// interface value_sets
79+
std::list<exprt>
80+
get_values(const irep_idt &, locationt l, const exprt &expr) override
81+
{
82+
return (*this)[l].value_set.get_value_set(expr, baset::ns);
83+
}
7684
};
7785

7886
typedef

src/pointer-analysis/value_set_analysis_fi.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,3 +195,17 @@ bool value_set_analysis_fit::check_type(const typet &type)
195195

196196
return false;
197197
}
198+
199+
std::list<exprt> value_set_analysis_fit::get_values(
200+
const irep_idt &function_id,
201+
flow_insensitive_analysis_baset::locationt l,
202+
const exprt &expr)
203+
{
204+
state.value_set.from_function =
205+
state.value_set.function_numbering.number(function_id);
206+
state.value_set.to_function =
207+
state.value_set.function_numbering.number(function_id);
208+
state.value_set.from_target_index = l->location_number;
209+
state.value_set.to_target_index = l->location_number;
210+
return state.value_set.get_value_set(expr, ns);
211+
}

src/pointer-analysis/value_set_analysis_fi.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class value_set_analysis_fit:
5858

5959
public:
6060
// interface value_sets
61+
DEPRECATED(SINCE(2019, 05, 22, "Use the version returning list instead"))
6162
void get_values(
6263
const irep_idt &function_id,
6364
locationt l,
@@ -72,6 +73,11 @@ class value_set_analysis_fit:
7273
state.value_set.to_target_index = l->location_number;
7374
state.value_set.get_value_set(expr, dest, ns);
7475
}
76+
77+
std::list<exprt> get_values(
78+
const irep_idt &function_id,
79+
locationt l,
80+
const exprt &expr) override;
7581
};
7682

7783
#endif // CPROVER_POINTER_ANALYSIS_VALUE_SET_ANALYSIS_FI_H

src/pointer-analysis/value_set_fi.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Author: Daniel Kroening, [email protected]
1212
#include "value_set_fi.h"
1313

1414
#include <cassert>
15+
#include <iterator>
1516
#include <ostream>
1617

1718
#include <util/symbol_table.h>
@@ -296,6 +297,12 @@ void value_set_fit::get_value_set(
296297
const exprt &expr,
297298
std::list<exprt> &value_set,
298299
const namespacet &ns) const
300+
{
301+
value_set = get_value_set(expr, ns);
302+
}
303+
304+
std::list<exprt>
305+
value_set_fit::get_value_set(const exprt &expr, const namespacet &ns) const
299306
{
300307
object_mapt object_map;
301308
get_value_set(expr, object_map, ns);
@@ -336,21 +343,24 @@ void value_set_fit::get_value_set(
336343
flat_map.write()[it->first]=it->second;
337344
}
338345

346+
std::list<exprt> result;
339347
forall_objects(fit, flat_map.read())
340-
value_set.push_back(to_expr(*fit));
348+
result.push_back(to_expr(*fit));
341349

342-
#if 0
350+
#if 0
343351
// Sanity check!
344352
for(std::list<exprt>::const_iterator it=value_set.begin();
345353
it!=value_set.end();
346354
it++)
347355
assert(it->type().id()!="#REF");
348-
#endif
356+
#endif
349357

350-
#if 0
358+
#if 0
351359
for(expr_sett::const_iterator it=value_set.begin(); it!=value_set.end(); it++)
352360
std::cout << "GET_VALUE_SET: " << format(*it) << '\n';
353-
#endif
361+
#endif
362+
363+
return result;
354364
}
355365

356366
void value_set_fit::get_value_set(

src/pointer-analysis/value_set_fi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,14 @@ class value_set_fit
205205
typedef std::unordered_set<idt, string_hash> assign_recursion_sett;
206206
#endif
207207

208+
DEPRECATED(SINCE(2019, 05, 22, "Use the version returning object_mapt instead"))
208209
void get_value_set(
209210
const exprt &expr,
210211
std::list<exprt> &dest,
211212
const namespacet &ns) const;
212213

214+
std::list<exprt> get_value_set(const exprt &expr, const namespacet &ns) const;
215+
213216
expr_sett &get(
214217
const idt &identifier,
215218
const std::string &suffix);

src/pointer-analysis/value_sets.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,19 @@ class value_setst
2828
typedef std::list<exprt> valuest;
2929

3030
// this is not const to allow a lazy evaluation
31+
DEPRECATED(SINCE(2019, 05, 22, "use list returning version instead"))
3132
virtual void get_values(
3233
const irep_idt &function_id,
3334
goto_programt::const_targett l,
3435
const exprt &expr,
3536
valuest &dest) = 0;
3637

38+
// this is not const to allow a lazy evaluation
39+
virtual valuest get_values(
40+
const irep_idt &function_id,
41+
goto_programt::const_targett l,
42+
const exprt &expr) = 0;
43+
3744
virtual ~value_setst()
3845
{
3946
}

0 commit comments

Comments
 (0)