@@ -74,7 +74,8 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
74
74
it!=points_to_set.end ();
75
75
it++)
76
76
{
77
- valuet value = build_reference_to (*it, pointer);
77
+ valuet value =
78
+ build_reference_to (*it, pointer, exclude_null_derefs, language_mode, ns);
78
79
79
80
#if 0
80
81
std::cout << "V: " << format(value.pointer_guard) << " --> ";
@@ -179,7 +180,8 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
179
180
// / - object_type=(int *), dereference_type=(void **) is not ok;
180
181
bool value_set_dereferencet::dereference_type_compare (
181
182
const typet &object_type,
182
- const typet &dereference_type) const
183
+ const typet &dereference_type,
184
+ const namespacet &ns)
183
185
{
184
186
const typet *object_unwrapped = &object_type;
185
187
const typet *dereference_unwrapped = &dereference_type;
@@ -245,6 +247,11 @@ bool value_set_dereferencet::dereference_type_compare(
245
247
// / ID_unknown, ID_invalid, or an object_descriptor_exprt giving a referred
246
248
// / object and offset.
247
249
// / \param pointer_expr: pointer expression that may point to `what`
250
+ // / \param exclude_null_derefs: Ignore value-set entries that indicate a
251
+ // / given dereference may follow a null pointer
252
+ // / \param language_mode: Mode for any new symbols created to represent a
253
+ // / dereference failure
254
+ // / \param ns: A namespace
248
255
// / \return a `valuet` object containing `guard`, `value` and `ignore` fields.
249
256
// / The `ignore` field is true for a `null` object when `exclude_null_derefs`
250
257
// / is true (set by our creator when they know \p what cannot be null)
@@ -258,7 +265,10 @@ bool value_set_dereferencet::dereference_type_compare(
258
265
// / .ignore = false}`
259
266
value_set_dereferencet::valuet value_set_dereferencet::build_reference_to (
260
267
const exprt &what,
261
- const exprt &pointer_expr)
268
+ const exprt &pointer_expr,
269
+ const bool exclude_null_derefs,
270
+ const irep_idt language_mode,
271
+ const namespacet &ns)
262
272
{
263
273
const typet &dereference_type = pointer_expr.type ().subtype ();
264
274
@@ -324,8 +334,9 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
324
334
325
335
result.value =index_expr;
326
336
}
327
- else if (dereference_type_compare (
328
- memory_symbol.type .subtype (), dereference_type))
337
+ else if (
338
+ dereference_type_compare (
339
+ memory_symbol.type .subtype (), dereference_type, ns))
329
340
{
330
341
const index_exprt index_expr (
331
342
symbol_expr,
@@ -372,18 +383,19 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
372
383
373
384
exprt root_object_subexpression=root_object;
374
385
375
- if (dereference_type_compare (object_type, dereference_type) &&
376
- o.offset ().is_zero ())
386
+ if (
387
+ dereference_type_compare (object_type, dereference_type, ns) &&
388
+ o.offset ().is_zero ())
377
389
{
378
390
// The simplest case: types match, and offset is zero!
379
391
// This is great, we are almost done.
380
392
381
393
result.value = typecast_exprt::conditional_cast (object, dereference_type);
382
394
}
383
- else if (root_object_type. id ()==ID_array &&
384
- dereference_type_compare (
385
- root_object_type. subtype (),
386
- dereference_type))
395
+ else if (
396
+ root_object_type. id () == ID_array &&
397
+ dereference_type_compare (
398
+ root_object_type. subtype (), dereference_type, ns ))
387
399
{
388
400
// We have an array with a subtype that matches
389
401
// the dereferencing type.
@@ -451,7 +463,7 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
451
463
else
452
464
offset=o.offset ();
453
465
454
- if (memory_model (result.value , dereference_type, offset))
466
+ if (memory_model (result.value , dereference_type, offset, ns ))
455
467
{
456
468
// ok, done
457
469
}
@@ -486,7 +498,8 @@ static bool is_a_bv_type(const typet &type)
486
498
bool value_set_dereferencet::memory_model (
487
499
exprt &value,
488
500
const typet &to_type,
489
- const exprt &offset)
501
+ const exprt &offset,
502
+ const namespacet &ns)
490
503
{
491
504
// we will allow more or less arbitrary pointer type cast
492
505
@@ -518,7 +531,7 @@ bool value_set_dereferencet::memory_model(
518
531
519
532
// otherwise, we will stitch it together from bytes
520
533
521
- return memory_model_bytes (value, to_type, offset);
534
+ return memory_model_bytes (value, to_type, offset, ns );
522
535
}
523
536
524
537
// / Replace `value` by an expression of type `to_type` corresponding to the
@@ -532,7 +545,8 @@ bool value_set_dereferencet::memory_model(
532
545
bool value_set_dereferencet::memory_model_bytes (
533
546
exprt &value,
534
547
const typet &to_type,
535
- const exprt &offset)
548
+ const exprt &offset,
549
+ const namespacet &ns)
536
550
{
537
551
const typet from_type=value.type ();
538
552
0 commit comments