23
23
#include < util/config.h>
24
24
#include < util/cprover_prefix.h>
25
25
#include < util/expr_iterator.h>
26
+ #include < util/expr_util.h>
26
27
#include < util/format_type.h>
27
28
#include < util/fresh_symbol.h>
28
29
#include < util/options.h>
@@ -361,7 +362,9 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
361
362
const exprt &pointer_expr,
362
363
const namespacet &ns)
363
364
{
364
- const typet &dereference_type = pointer_expr.type ().subtype ();
365
+ const pointer_typet &pointer_type =
366
+ type_checked_cast<pointer_typet>(pointer_expr.type ());
367
+ const typet &dereference_type = pointer_type.subtype ();
365
368
366
369
if (what.id ()==ID_unknown ||
367
370
what.id ()==ID_invalid)
@@ -385,6 +388,7 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
385
388
386
389
if (root_object.id () == ID_null_object)
387
390
{
391
+ result.pointer = null_pointer_exprt{pointer_type};
388
392
}
389
393
else if (root_object.id ()==ID_dynamic_object)
390
394
{
@@ -394,6 +398,7 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
394
398
395
399
// can't remove here, turn into *p
396
400
result.value = dereference_exprt{pointer_expr};
401
+ result.pointer = pointer_expr;
397
402
}
398
403
else if (root_object.id ()==ID_integer_address)
399
404
{
@@ -414,6 +419,7 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
414
419
memory_symbol.type .subtype ());
415
420
416
421
result.value =index_expr;
422
+ result.pointer = address_of_exprt{index_expr};
417
423
}
418
424
else if (
419
425
dereference_type_compare (
@@ -424,6 +430,8 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
424
430
pointer_offset (pointer_expr),
425
431
memory_symbol.type .subtype ());
426
432
result.value =typecast_exprt (index_expr, dereference_type);
433
+ result.pointer =
434
+ typecast_exprt{address_of_exprt{index_expr}, pointer_type};
427
435
}
428
436
else
429
437
{
@@ -440,6 +448,7 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
440
448
symbol_expr,
441
449
pointer_offset (pointer_expr),
442
450
dereference_type);
451
+ result.pointer = address_of_exprt{result.value };
443
452
}
444
453
}
445
454
}
@@ -472,6 +481,8 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
472
481
// This is great, we are almost done.
473
482
474
483
result.value = typecast_exprt::conditional_cast (object, dereference_type);
484
+ result.pointer =
485
+ typecast_exprt::conditional_cast (object_pointer, pointer_type);
475
486
}
476
487
else if (
477
488
root_object_type.id () == ID_array &&
@@ -515,9 +526,12 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
515
526
// TODO: need to assert well-alignedness
516
527
}
517
528
518
- result.value = typecast_exprt::conditional_cast (
519
- index_exprt (root_object, adjusted_offset, root_object_type.subtype ()),
520
- dereference_type);
529
+ const index_exprt &index_expr =
530
+ index_exprt (root_object, adjusted_offset, root_object_type.subtype ());
531
+ result.value =
532
+ typecast_exprt::conditional_cast (index_expr, dereference_type);
533
+ result.pointer = typecast_exprt::conditional_cast (
534
+ address_of_exprt{index_expr}, pointer_type);
521
535
}
522
536
else
523
537
{
@@ -531,11 +545,15 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
531
545
// Successfully found a member, array index, or combination thereof
532
546
// that matches the desired type and offset:
533
547
result.value = subexpr.value ();
548
+ result.pointer = typecast_exprt::conditional_cast (
549
+ address_of_exprt{skip_typecast (subexpr.value ())}, pointer_type);
534
550
return result;
535
551
}
536
552
537
553
// we extract something from the root object
538
554
result.value =o.root_object ();
555
+ result.pointer = typecast_exprt::conditional_cast (
556
+ address_of_exprt{skip_typecast (o.root_object ())}, pointer_type);
539
557
540
558
// this is relative to the root object
541
559
exprt offset;
0 commit comments