Skip to content

Commit 7206654

Browse files
Merge pull request #5638 from hannes-steffenhagen-diffblue/refactor/value-set-dereference-debug-output
Refactor value set dereference debug output
2 parents b2f45b4 + 09d06f7 commit 7206654

File tree

2 files changed

+48
-70
lines changed

2 files changed

+48
-70
lines changed

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 38 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,42 @@ static bool should_use_local_definition_for(const exprt &expr)
6161
return false;
6262
}
6363

64+
static json_objectt value_set_dereference_stats_to_json(
65+
const exprt &pointer,
66+
const std::vector<exprt> &points_to_set,
67+
const std::vector<exprt> &retained_values,
68+
const exprt &value)
69+
{
70+
json_objectt json_result;
71+
json_result["Pointer"] = json_stringt{format_to_string(pointer)};
72+
json_result["PointsToSetSize"] =
73+
json_numbert{std::to_string(points_to_set.size())};
74+
75+
json_arrayt points_to_set_json;
76+
for(const auto &object : points_to_set)
77+
{
78+
points_to_set_json.push_back(json_stringt{format_to_string(object)});
79+
}
80+
81+
json_result["PointsToSet"] = points_to_set_json;
82+
83+
json_result["RetainedValuesSetSize"] =
84+
json_numbert{std::to_string(points_to_set.size())};
85+
86+
json_arrayt retained_values_set_json;
87+
for(auto &retained_value : retained_values)
88+
{
89+
retained_values_set_json.push_back(
90+
json_stringt{format_to_string(retained_value)});
91+
}
92+
93+
json_result["RetainedValuesSet"] = retained_values_set_json;
94+
95+
json_result["Value"] = json_stringt{format_to_string(value)};
96+
97+
return json_result;
98+
}
99+
64100
exprt value_set_dereferencet::dereference(
65101
const exprt &pointer,
66102
bool display_points_to_sets)
@@ -106,46 +142,10 @@ exprt value_set_dereferencet::dereference(
106142
// type of the object
107143
const typet &type=pointer.type().subtype();
108144

109-
json_objectt json_result;
110-
if(display_points_to_sets)
111-
{
112-
std::stringstream ss;
113-
ss << format(pointer);
114-
json_result["Pointer"] = json_stringt(ss.str());
115-
}
116-
117-
#ifdef DEBUG
118-
std::cout << "value_set_dereferencet::dereference pointer=" << format(pointer)
119-
<< '\n';
120-
#endif
121-
122145
// collect objects the pointer may point to
123146
const std::vector<exprt> points_to_set =
124147
dereference_callback.get_value_set(pointer);
125148

126-
if(display_points_to_sets)
127-
{
128-
json_result["PointsToSetSize"] =
129-
json_numbert(std::to_string(points_to_set.size()));
130-
131-
json_arrayt points_to_set_json;
132-
for(auto p : points_to_set)
133-
{
134-
std::stringstream ss;
135-
ss << format(p);
136-
points_to_set_json.push_back(json_stringt(ss.str()));
137-
}
138-
139-
json_result["PointsToSet"] = points_to_set_json;
140-
}
141-
142-
#ifdef DEBUG
143-
std::cout << "value_set_dereferencet::dereference points_to_set={";
144-
for(auto p : points_to_set)
145-
std::cout << format(p) << "; ";
146-
std::cout << "}\n" << std::flush;
147-
#endif
148-
149149
// get the values of these
150150
const std::vector<exprt> retained_values =
151151
make_range(points_to_set).filter([&](const exprt &value) {
@@ -167,29 +167,6 @@ exprt value_set_dereferencet::dereference(
167167
compare_against_pointer = fresh_binder.symbol_expr();
168168
}
169169

170-
if(display_points_to_sets)
171-
{
172-
json_result["RetainedValuesSetSize"] =
173-
json_numbert(std::to_string(points_to_set.size()));
174-
175-
json_arrayt retained_values_set_json;
176-
for(auto &value : retained_values)
177-
{
178-
std::stringstream ss;
179-
ss << format(value);
180-
retained_values_set_json.push_back(json_stringt(ss.str()));
181-
}
182-
183-
json_result["RetainedValuesSet"] = retained_values_set_json;
184-
}
185-
186-
#ifdef DEBUG
187-
std::cout << "value_set_dereferencet::dereference retained_values={";
188-
for(const auto &value : retained_values)
189-
std::cout << format(value) << "; ";
190-
std::cout << "}\n" << std::flush;
191-
#endif
192-
193170
std::list<valuet> values =
194171
make_range(retained_values).map([&](const exprt &value) {
195172
return build_reference_to(value, compare_against_pointer, ns);
@@ -274,19 +251,10 @@ exprt value_set_dereferencet::dereference(
274251

275252
if(display_points_to_sets)
276253
{
277-
std::stringstream ss;
278-
ss << format(value);
279-
json_result["Value"] = json_stringt(ss.str());
280-
281-
log.status() << json_result;
254+
log.status() << value_set_dereference_stats_to_json(
255+
pointer, points_to_set, retained_values, value);
282256
}
283257

284-
#ifdef DEBUG
285-
std::cout << "value_set_derefencet::dereference value=" << format(value)
286-
<< '\n'
287-
<< std::flush;
288-
#endif
289-
290258
return value;
291259
}
292260

src/util/format.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Author: Daniel Kroening, [email protected]
1010
#define CPROVER_UTIL_FORMAT_H
1111

1212
#include <iosfwd>
13+
#include <sstream>
14+
#include <string>
1315

1416
//! The below enables convenient syntax for feeding
1517
//! objects into streams, via stream << format(o)
@@ -37,4 +39,12 @@ static inline format_containert<T> format(const T &o)
3739
return format_containert<T>(o);
3840
}
3941

42+
template <typename T>
43+
std::string format_to_string(const T &o)
44+
{
45+
std::ostringstream oss;
46+
oss << format(o);
47+
return oss.str();
48+
}
49+
4050
#endif // CPROVER_UTIL_FORMAT_H

0 commit comments

Comments
 (0)