Skip to content

Commit 2d23e60

Browse files
author
Daniel Kroening
committed
simplify_dereference now has new interface
This improves memory safety.
1 parent 06d727c commit 2d23e60

File tree

2 files changed

+27
-19
lines changed

2 files changed

+27
-19
lines changed

src/util/simplify_expr.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -848,38 +848,39 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
848848
return unchanged(expr);
849849
}
850850

851-
bool simplify_exprt::simplify_dereference(exprt &expr)
851+
simplify_exprt::resultt<>
852+
simplify_exprt::simplify_dereference(const dereference_exprt &expr)
852853
{
853-
const exprt &pointer=to_dereference_expr(expr).pointer();
854+
const exprt &pointer = expr.pointer();
854855

855856
if(pointer.type().id()!=ID_pointer)
856-
return true;
857+
return unchanged(expr);
857858

858859
if(pointer.id()==ID_if && pointer.operands().size()==3)
859860
{
860861
const if_exprt &if_expr=to_if_expr(pointer);
861862

862-
exprt tmp_op1=expr;
863-
tmp_op1.op0()=if_expr.true_case();
864-
simplify_dereference(tmp_op1);
865-
exprt tmp_op2=expr;
866-
tmp_op2.op0()=if_expr.false_case();
867-
simplify_dereference(tmp_op2);
863+
auto tmp_op1 = expr;
864+
tmp_op1.op() = if_expr.true_case();
865+
exprt tmp_op1_result = simplify_dereference(tmp_op1);
868866

869-
expr=if_exprt(if_expr.cond(), tmp_op1, tmp_op2);
867+
auto tmp_op2 = expr;
868+
tmp_op2.op() = if_expr.false_case();
869+
exprt tmp_op2_result = simplify_dereference(tmp_op2);
870870

871-
simplify_if(to_if_expr(expr));
871+
if_exprt tmp{if_expr.cond(), tmp_op1_result, tmp_op2_result};
872872

873-
return false;
873+
simplify_if(tmp);
874+
875+
return tmp;
874876
}
875877

876878
if(pointer.id()==ID_address_of)
877879
{
878880
exprt tmp=to_address_of_expr(pointer).object();
879881
// one address_of is gone, try again
880882
simplify_rec(tmp);
881-
expr.swap(tmp);
882-
return false;
883+
return tmp;
883884
}
884885
// rewrite *(&a[0] + x) to a[x]
885886
else if(pointer.id()==ID_plus &&
@@ -898,13 +899,12 @@ bool simplify_exprt::simplify_dereference(exprt &expr)
898899
pointer_offset_sum(old.index(), pointer.op1()),
899900
old.array().type().subtype());
900901
simplify_rec(idx);
901-
expr.swap(idx);
902-
return false;
902+
return idx;
903903
}
904904
}
905905
}
906906

907-
return true;
907+
return unchanged(expr);
908908
}
909909

910910
bool simplify_exprt::simplify_if_implies(
@@ -2491,7 +2491,14 @@ bool simplify_exprt::simplify_node(exprt &expr)
24912491
expr.id()==ID_and)
24922492
no_change = simplify_boolean(expr) && no_change;
24932493
else if(expr.id()==ID_dereference)
2494-
no_change = simplify_dereference(expr) && no_change;
2494+
{
2495+
auto r = simplify_dereference(to_dereference_expr(expr));
2496+
if(r.has_changed())
2497+
{
2498+
no_change = false;
2499+
expr = r.expr;
2500+
}
2501+
}
24952502
else if(expr.id()==ID_address_of)
24962503
no_change = simplify_address_of(expr) && no_change;
24972504
else if(expr.id()==ID_pointer_offset)

src/util/simplify_expr_class.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class array_exprt;
3030
class bswap_exprt;
3131
class byte_extract_exprt;
3232
class byte_update_exprt;
33+
class dereference_exprt;
3334
class exprt;
3435
class extractbits_exprt;
3536
class function_application_exprt;
@@ -154,7 +155,7 @@ class simplify_exprt
154155
bool simplify_object(exprt &expr);
155156
bool simplify_unary_minus(exprt &expr);
156157
bool simplify_unary_plus(exprt &expr);
157-
bool simplify_dereference(exprt &expr);
158+
resultt<> simplify_dereference(const dereference_exprt &);
158159
bool simplify_address_of(exprt &expr);
159160
bool simplify_pointer_offset(exprt &expr);
160161
bool simplify_bswap(bswap_exprt &expr);

0 commit comments

Comments
 (0)