Skip to content

Commit 8f7c4aa

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 a20da78 commit 8f7c4aa

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
@@ -103,3 +103,10 @@ void symex_dereference_statet::get_value_set(
103103
std::cout << "**************************\n";
104104
#endif
105105
}
106+
107+
/// Just forwards a value-set query to `state.value_set`
108+
value_setst::valuest
109+
symex_dereference_statet::get_value_set(const exprt &expr) const
110+
{
111+
return state.value_set.get_value_set(expr, ns);
112+
}

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>
@@ -307,8 +308,7 @@ bool value_sett::eval_pointer_offset(
307308
{
308309
assert(expr.operands().size()==1);
309310

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

313313
exprt new_expr;
314314
mp_integer previous_offset=0;
@@ -355,8 +355,7 @@ void value_sett::get_value_set(
355355
value_setst::valuest &dest,
356356
const namespacet &ns) const
357357
{
358-
object_mapt object_map;
359-
get_value_set(std::move(expr), object_map, ns, false);
358+
object_mapt object_map = get_value_set(std::move(expr), ns, false);
360359

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

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

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

13081327
// Permit custom subclass to alter the read values prior to write:
13091328
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);
@@ -456,18 +462,25 @@ class value_sett
456462
void erase_symbol(const symbol_exprt &symbol_expr, const namespacet &ns);
457463

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

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

0 commit comments

Comments
 (0)