Skip to content

Commit 98bce91

Browse files
committed
symex: handle dereferencing failures
1 parent f19eb9d commit 98bce91

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

src/path-symex/path_symex_state_read.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,37 @@ exprt path_symex_statet::dereference_rec(
601601
exprt address=read(dereference_expr.pointer(), propagate);
602602

603603
// 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+
}
605635

606636
// the dereferenced address is a mixture of non-SSA and SSA symbols
607637
// (e.g., if-guards and array indices)

0 commit comments

Comments
 (0)