Skip to content

Commit abd2628

Browse files
Merge pull request #4702 from romainbrenguier/refactor/value-set
Refactor in value_set
2 parents c4ffbee + 4f40147 commit abd2628

File tree

4 files changed

+43
-36
lines changed

4 files changed

+43
-36
lines changed

src/goto-symex/symex_dereference_state.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ Author: Daniel Kroening, [email protected]
1313

1414
#include <util/symbol_table.h>
1515

16+
#ifdef DEBUG
17+
# include <iostream>
18+
#endif
19+
1620
/// Get or create a failed symbol for the given pointer-typed expression. These
1721
/// are used as placeholders when dereferencing expressions that are illegal to
1822
/// dereference, such as null pointers. The \ref add_failed_symbols pass must
@@ -84,10 +88,10 @@ void symex_dereference_statet::get_value_set(
8488
{
8589
state.value_set.get_value_set(expr, value_set, ns);
8690

87-
#if 0
88-
std::cout << "**************************\n";
89-
state.value_set.output(goto_symex.ns, std::cout);
90-
std::cout << "**************************\n";
91+
#ifdef DEBUG
92+
std::cout << "symex_dereference_statet state.value_set={\n";
93+
state.value_set.output(ns, std::cout, " - ");
94+
std::cout << "}" << std::endl;
9195
#endif
9296

9397
#if 0

src/pointer-analysis/value_set.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,10 @@ bool value_sett::insert(
131131
return true;
132132
}
133133

134-
void value_sett::output(const namespacet &ns, std::ostream &out) const
134+
void value_sett::output(
135+
const namespacet &ns,
136+
std::ostream &out,
137+
const std::string &indent) const
135138
{
136139
values.iterate([&](const irep_idt &, const entryt &e) {
137140
irep_idt identifier, display_name;
@@ -158,9 +161,7 @@ void value_sett::output(const namespacet &ns, std::ostream &out) const
158161
#endif
159162
}
160163

161-
out << display_name;
162-
163-
out << " = { ";
164+
out << indent << display_name << " = { ";
164165

165166
const object_map_dt &object_map = e.object_map.read();
166167

@@ -204,7 +205,7 @@ void value_sett::output(const namespacet &ns, std::ostream &out) const
204205
{
205206
out << ", ";
206207
if(width >= 40)
207-
out << "\n ";
208+
out << "\n" << std::string(' ', indent.size()) << " ";
208209
}
209210
}
210211

src/pointer-analysis/value_set.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,11 @@ class value_sett
305305
/// Pretty-print this value-set
306306
/// \param ns: global namespace
307307
/// \param [out] out: stream to write to
308+
/// \param indent: string to use for indentation of the output
308309
void output(
309310
const namespacet &ns,
310-
std::ostream &out) const;
311+
std::ostream &out,
312+
const std::string &indent = "") const;
311313

312314
/// Stores the LHS ID -> RHS expression set map. See `valuest` documentation
313315
/// for more detail.

src/pointer-analysis/value_set_dereference.cpp

+26-26
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Author: Daniel Kroening, [email protected]
2929
#include <util/options.h>
3030
#include <util/pointer_offset_size.h>
3131
#include <util/pointer_predicates.h>
32+
#include <util/range.h>
3233
#include <util/simplify_expr.h>
3334
#include <util/ssa_expr.h>
3435

@@ -97,33 +98,28 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
9798
// type of the object
9899
const typet &type=pointer.type().subtype();
99100

100-
#if 0
101-
std::cout << "DEREF: " << format(pointer) << '\n';
101+
#ifdef DEBUG
102+
std::cout << "value_set_dereferencet::dereference pointer=" << format(pointer)
103+
<< '\n';
102104
#endif
103105

104106
// collect objects the pointer may point to
105107
value_setst::valuest points_to_set;
106108

107109
dereference_callback.get_value_set(pointer, points_to_set);
108110

109-
#if 0
110-
for(value_setst::valuest::const_iterator
111-
it=points_to_set.begin();
112-
it!=points_to_set.end();
113-
it++)
114-
std::cout << "P: " << format(*it) << '\n';
111+
#ifdef DEBUG
112+
std::cout << "value_set_dereferencet::dereference points_to_set={";
113+
for(auto p : points_to_set)
114+
std::cout << format(p) << "; ";
115+
std::cout << "}\n" << std::flush;
115116
#endif
116117

117118
// get the values of these
118-
119-
std::vector<exprt> retained_values;
120-
for(const auto &value : points_to_set)
121-
{
122-
if(!should_ignore_value(value, exclude_null_derefs, language_mode))
123-
retained_values.push_back(value);
124-
}
125-
126-
std::list<valuet> values;
119+
const std::vector<exprt> retained_values =
120+
make_range(points_to_set).filter([&](const exprt &value) {
121+
return !should_ignore_value(value, exclude_null_derefs, language_mode);
122+
});
127123

128124
exprt compare_against_pointer = pointer;
129125

@@ -140,15 +136,17 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
140136
compare_against_pointer = fresh_binder.symbol_expr();
141137
}
142138

139+
#ifdef DEBUG
140+
std::cout << "value_set_dereferencet::dereference retained_values={";
143141
for(const auto &value : retained_values)
144-
{
145-
values.push_back(build_reference_to(value, compare_against_pointer, ns));
146-
#if 0
147-
std::cout << "V: " << format(value.pointer_guard) << " --> ";
148-
std::cout << format(value.value);
149-
std::cout << '\n';
142+
std::cout << format(value) << "; ";
143+
std::cout << "}\n" << std::flush;
150144
#endif
151-
}
145+
146+
std::list<valuet> values =
147+
make_range(retained_values).map([&](const exprt &value) {
148+
return build_reference_to(value, compare_against_pointer, ns);
149+
});
152150

153151
// can this fail?
154152
bool may_fail;
@@ -227,8 +225,10 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
227225
if(compare_against_pointer != pointer)
228226
value = let_exprt(to_symbol_expr(compare_against_pointer), pointer, value);
229227

230-
#if 0
231-
std::cout << "R: " << format(value) << "\n\n";
228+
#ifdef DEBUG
229+
std::cout << "value_set_derefencet::dereference value=" << format(value)
230+
<< '\n'
231+
<< std::flush;
232232
#endif
233233

234234
return value;

0 commit comments

Comments
 (0)