@@ -500,7 +500,37 @@ exprt path_symex_statet::dereference_rec(
500
500
exprt address=read (dereference_expr.pointer (), propagate);
501
501
502
502
// now hand over to dereference
503
- exprt address_dereferenced=::dereference (address, var_map.ns );
503
+ exprt is_invalid;
504
+
505
+ exprt address_dereferenced=
506
+ ::dereference (address, var_map.ns, is_invalid);
507
+
508
+ if (!is_invalid.is_false ())
509
+ {
510
+ #ifdef DEBUG
511
+ std::cout << " Pointer " << from_expr (var_map.ns , " " , src.op0 ())
512
+ << " may be invalid when "
513
+ << from_expr (var_map.ns , " " , is_invalid)
514
+ << " evaluates to true.\n " ;
515
+ #endif
516
+
517
+ irep_idt id=" symex::nondet" +std::to_string (var_map.nondet_count );
518
+ var_map.nondet_count ++;
519
+
520
+ auxiliary_symbolt nondet_symbol;
521
+ nondet_symbol.name =id;
522
+ nondet_symbol.base_name =id;
523
+ nondet_symbol.type =src.type ();
524
+ var_map.new_symbols .add (nondet_symbol);
525
+
526
+ symbol_exprt nondet=nondet_symbol.symbol_expr ();
527
+
528
+ if (is_invalid.is_true ())
529
+ address_dereferenced=nondet;
530
+ else
531
+ address_dereferenced=
532
+ if_exprt (is_invalid, nondet, address_dereferenced);
533
+ }
504
534
505
535
// the dereferenced address is a mixture of non-SSA and SSA symbols
506
536
// (e.g., if-guards and array indices)
0 commit comments