@@ -67,26 +67,23 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
67
67
68
68
// get the values of these
69
69
70
+ std::vector<exprt> retained_values;
71
+ for (const auto &value : points_to_set)
72
+ {
73
+ if (!should_ignore_value (value, exclude_null_derefs, language_mode))
74
+ retained_values.push_back (value);
75
+ }
76
+
70
77
std::list<valuet> values;
71
78
72
- for (value_setst::valuest::const_iterator
73
- it=points_to_set.begin ();
74
- it!=points_to_set.end ();
75
- it++)
79
+ for (const auto &value : retained_values)
76
80
{
77
- valuet value =
78
- build_reference_to (*it, pointer, exclude_null_derefs, language_mode, ns);
79
-
81
+ values.push_back (build_reference_to (value, pointer, ns));
80
82
#if 0
81
83
std::cout << "V: " << format(value.pointer_guard) << " --> ";
82
84
std::cout << format(value.value);
83
- if(value.ignore)
84
- std::cout << " (ignored)";
85
85
std::cout << '\n';
86
86
#endif
87
-
88
- if (!value.ignore )
89
- values.push_back (value);
90
87
}
91
88
92
89
// can this fail?
@@ -243,31 +240,59 @@ bool value_set_dereferencet::dereference_type_compare(
243
240
return false ;
244
241
}
245
242
243
+ // / Determine whether possible alias `what` should be ignored when replacing a
244
+ // / pointer by its referees.
245
+ // / We currently ignore a `null` object when \p exclude_null_derefs is true
246
+ // / (pass true if you know the dereferenced pointer cannot be null), and also
247
+ // / ignore integer addresses when \p language_mode is "java"
246
248
// / \param what: value set entry to convert to an expression: either
247
249
// / ID_unknown, ID_invalid, or an object_descriptor_exprt giving a referred
248
250
// / object and offset.
249
- // / \param pointer_expr: pointer expression that may point to `what`
250
251
// / \param exclude_null_derefs: Ignore value-set entries that indicate a
251
252
// / given dereference may follow a null pointer
252
253
// / \param language_mode: Mode for any new symbols created to represent a
253
254
// / dereference failure
255
+ // / \return true if \p what should be ignored as a possible alias
256
+ bool value_set_dereferencet::should_ignore_value (
257
+ const exprt &what,
258
+ bool exclude_null_derefs,
259
+ const irep_idt &language_mode)
260
+ {
261
+ if (what.id () == ID_unknown || what.id () == ID_invalid)
262
+ {
263
+ return false ;
264
+ }
265
+
266
+ const object_descriptor_exprt &o = to_object_descriptor_expr (what);
267
+
268
+ const exprt &root_object = o.root_object ();
269
+ if (root_object.id () == ID_null_object)
270
+ {
271
+ return exclude_null_derefs;
272
+ }
273
+ else if (root_object.id () == ID_integer_address)
274
+ {
275
+ return language_mode == ID_java;
276
+ }
277
+
278
+ return false ;
279
+ }
280
+
281
+ // / \param what: value set entry to convert to an expression: either
282
+ // / ID_unknown, ID_invalid, or an object_descriptor_exprt giving a referred
283
+ // / object and offset.
284
+ // / \param pointer_expr: pointer expression that may point to `what`
254
285
// / \param ns: A namespace
255
- // / \return a `valuet` object containing `guard`, `value` and `ignore` fields.
256
- // / The `ignore` field is true for a `null` object when `exclude_null_derefs`
257
- // / is true (set by our creator when they know \p what cannot be null)
258
- // // and for integer addresses in java mode.
286
+ // / \return a `valuet` object containing `guard` and `value` fields.
259
287
// / The guard is an appropriate check to determine whether `pointer_expr`
260
288
// / really points to `what`; for example `pointer_expr == &what`.
261
289
// / The value corresponds to the dereferenced pointer_expr assuming it is
262
290
// / pointing to the object described by `what`.
263
291
// / For example, we might return
264
- // / `{.value = global, .pointer_guard = (pointer_expr == &global),
265
- // / .ignore = false}`
292
+ // / `{.value = global, .pointer_guard = (pointer_expr == &global)}`
266
293
value_set_dereferencet::valuet value_set_dereferencet::build_reference_to (
267
294
const exprt &what,
268
295
const exprt &pointer_expr,
269
- const bool exclude_null_derefs,
270
- const irep_idt language_mode,
271
296
const namespacet &ns)
272
297
{
273
298
const typet &dereference_type = pointer_expr.type ().subtype ();
@@ -294,10 +319,6 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
294
319
295
320
if (root_object.id () == ID_null_object)
296
321
{
297
- if (exclude_null_derefs)
298
- {
299
- result.ignore = true ;
300
- }
301
322
}
302
323
else if (root_object.id ()==ID_dynamic_object)
303
324
{
@@ -313,12 +334,6 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
313
334
// This is stuff like *((char *)5).
314
335
// This is turned into an access to __CPROVER_memory[...].
315
336
316
- if (language_mode == ID_java)
317
- {
318
- result.ignore = true ;
319
- return result;
320
- }
321
-
322
337
const symbolt &memory_symbol=ns.lookup (CPROVER_PREFIX " memory" );
323
338
const symbol_exprt symbol_expr (memory_symbol.name , memory_symbol.type );
324
339
0 commit comments