Skip to content

Commit f175f75

Browse files
authored
Merge pull request #4690 from romainbrenguier/clean-up/value-set
Clean up in the value set API
2 parents ba23989 + fa1412c commit f175f75

16 files changed

+150
-43
lines changed

src/doxyfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2041,7 +2041,7 @@ INCLUDE_FILE_PATTERNS =
20412041
# recursively expanded use the := operator instead of the = operator.
20422042
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
20432043

2044-
PREDEFINED =
2044+
PREDEFINED = "DEPRECATED(msg)= /// \deprecated msg"
20452045

20462046
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
20472047
# tag can be used to specify a list of macro names that should be expanded. The

src/goto-symex/postcondition.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,13 @@ 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+
std::vector<exprt> expr_set =
164+
value_set.get_value_set(to_dereference_expr(expr).pointer(), ns);
165165
std::unordered_set<irep_idt> symbols;
166166

167-
for(value_setst::valuest::const_iterator
168-
it=expr_set.begin();
169-
it!=expr_set.end();
170-
it++)
167+
for(const exprt &e : expr_set)
171168
{
172-
const exprt tmp = get_original_name(*it);
169+
const exprt tmp = get_original_name(e);
173170
find_symbols(tmp, symbols);
174171
}
175172

src/goto-symex/precondition.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,12 @@ 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+
const std::vector<exprt> expr_set = value_sets.get_values(
116+
SSA_step.source.function_id, target, deref_expr.pointer());
118117
std::unordered_set<irep_idt> symbols;
119118

120-
for(value_setst::valuest::const_iterator
121-
it=expr_set.begin();
122-
it!=expr_set.end();
123-
it++)
124-
find_symbols(*it, symbols);
119+
for(const exprt &e : expr_set)
120+
find_symbols(e, symbols);
125121

126122
if(symbols.find(lhs_identifier)!=symbols.end())
127123
{

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+
std::vector<exprt>
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 vector returning version instead"))
3738
void get_value_set(const exprt &expr, value_setst::valuest &value_set)
3839
const override;
3940

41+
std::vector<exprt> 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 vector returning version instead"))
3233
virtual void
3334
get_value_set(const exprt &expr, value_setst::valuest &value_set) const = 0;
3435

36+
virtual std::vector<exprt> 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::vector<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 vector returning version instead"))
6869
void
6970
get_value_set(const exprt &expr, value_setst::valuest &dest) const override;
7071

72+
std::vector<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: 29 additions & 11 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;
@@ -352,12 +352,11 @@ bool value_sett::eval_pointer_offset(
352352
}
353353

354354
void value_sett::get_value_set(
355-
const exprt &expr,
355+
exprt expr,
356356
value_setst::valuest &dest,
357357
const namespacet &ns) const
358358
{
359-
object_mapt object_map;
360-
get_value_set(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,17 +371,37 @@ void value_sett::get_value_set(
372371
#endif
373372
}
374373

374+
std::vector<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(
376-
const exprt &expr,
383+
exprt expr,
377384
object_mapt &dest,
378385
const namespacet &ns,
379386
bool is_simplified) const
380387
{
381-
exprt tmp(expr);
382388
if(!is_simplified)
383-
simplify(tmp, ns);
389+
simplify(expr, ns);
390+
391+
get_value_set_rec(expr, dest, "", expr.type(), ns);
392+
}
393+
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);
384401

385-
get_value_set_rec(tmp, dest, "", tmp.type(), ns);
402+
object_mapt dest;
403+
get_value_set_rec(expr, dest, "", expr.type(), ns);
404+
return dest;
386405
}
387406

388407
/// Check if 'suffix' starts with 'field'.
@@ -1304,8 +1323,7 @@ void value_sett::assign(
13041323
else
13051324
{
13061325
// basic type
1307-
object_mapt values_rhs;
1308-
get_value_set(rhs, values_rhs, ns, is_simplified);
1326+
object_mapt values_rhs = get_value_set(rhs, ns, is_simplified);
13091327

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

src/pointer-analysis/value_set.h

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class value_sett
8080
/// Represents the offset into an object: either a unique integer offset,
8181
/// or an unknown value, represented by `!offset`.
8282
typedef optionalt<mp_integer> offsett;
83+
DEPRECATED(SINCE(2019, 05, 22, "Unused"))
8384
bool offset_is_zero(const offsett &offset) const
8485
{
8586
return offset && offset->is_zero();
@@ -236,11 +237,13 @@ class value_sett
236237

237238
/// Set of expressions; only used for the `get` API, not for internal
238239
/// data representation.
240+
DEPRECATED(SINCE(2019, 05, 22, "Only used in deprecated function"))
239241
typedef std::set<exprt> expr_sett;
240242

241243
/// Set of dynamic object numbers, equivalent to a set of
242244
/// `dynamic_object_exprt`s with corresponding IDs. Used only in internal
243245
/// implementation details.
246+
DEPRECATED(SINCE(2019, 05, 22, "Unused"))
244247
typedef std::set<unsigned int> dynamic_object_id_sett;
245248

246249
/// Map representing the entire value set, mapping from string LHS IDs
@@ -258,17 +261,24 @@ class value_sett
258261
/// `entryt` fields.
259262
typedef sharing_mapt<irep_idt, entryt> valuest;
260263

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

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::vector<exprt> get_value_set(exprt expr, const namespacet &ns) const;
279+
271280
/// Appears to be unimplemented.
281+
DEPRECATED(SINCE(2019, 05, 22, "Unimplemented"))
272282
expr_sett &get(const irep_idt &identifier, const std::string &suffix);
273283

274284
void clear()
@@ -454,18 +464,25 @@ class value_sett
454464
void erase_symbol(const symbol_exprt &symbol_expr, const namespacet &ns);
455465

456466
protected:
457-
/// Reads the set of objects pointed to by `expr`, including making
467+
/// Reads the set of objects pointed to by \p expr, including making
458468
/// recursive lookups for dereference operations etc.
459-
/// \param expr: query expression
460-
/// \param [out] dest: overwritten by the set of object numbers pointed to
461-
/// \param ns: global namespace
462-
/// \param is_simplified: if false, simplify `expr` before reading.
469+
DEPRECATED(
470+
SINCE(2019, 05, 22, "Use the version returning object_mapt instead"))
463471
void get_value_set(
464-
const exprt &expr,
472+
exprt expr,
465473
object_mapt &dest,
466474
const namespacet &ns,
467475
bool is_simplified) const;
468476

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+
469486
/// See the other overload of `get_reference_set`. This one returns object
470487
/// numbers and offsets instead of expressions.
471488
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::vector<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::vector<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::vector<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

0 commit comments

Comments
 (0)