Skip to content

Commit 93d1c78

Browse files
committed
symex: handle dereferencing failures
1 parent 89fa342 commit 93d1c78

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

src/path-symex/path_symex_state_read.cpp

+31-1
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,37 @@ exprt path_symex_statet::dereference_rec(
500500
exprt address=read(dereference_expr.pointer(), propagate);
501501

502502
// 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+
}
504534

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

0 commit comments

Comments
 (0)