@@ -601,7 +601,37 @@ exprt path_symex_statet::dereference_rec(
601
601
exprt address=read (dereference_expr.pointer (), propagate);
602
602
603
603
// now hand over to dereference
604
- exprt address_dereferenced=::dereference (address, var_map.ns );
604
+ exprt is_invalid;
605
+
606
+ exprt address_dereferenced=
607
+ ::dereference (address, var_map.ns, is_invalid);
608
+
609
+ if (!is_invalid.is_false ())
610
+ {
611
+ #ifdef DEBUG
612
+ std::cout << " Pointer " << from_expr (var_map.ns , " " , src.op0 ())
613
+ << " may be invalid when "
614
+ << from_expr (var_map.ns , " " , is_invalid)
615
+ << " evaluates to true." << std::endl;
616
+ #endif
617
+
618
+ irep_idt id=" symex::nondet" +i2string (var_map.nondet_count );
619
+ var_map.nondet_count ++;
620
+
621
+ auxiliary_symbolt nondet_symbol;
622
+ nondet_symbol.name =id;
623
+ nondet_symbol.base_name =id;
624
+ nondet_symbol.type =src.type ();
625
+ var_map.new_symbols .add (nondet_symbol);
626
+
627
+ symbol_exprt nondet=nondet_symbol.symbol_expr ();
628
+
629
+ if (is_invalid.is_true ())
630
+ address_dereferenced=nondet;
631
+ else
632
+ address_dereferenced=
633
+ if_exprt (is_invalid, nondet, address_dereferenced);
634
+ }
605
635
606
636
// the dereferenced address is a mixture of non-SSA and SSA symbols
607
637
// (e.g., if-guards and array indices)
0 commit comments