Skip to content

Commit 90867d3

Browse files
author
Daniel Kroening
committed
type simplify_unary_minus
This improves memory safety.
1 parent e8a1ae4 commit 90867d3

File tree

3 files changed

+12
-16
lines changed

3 files changed

+12
-16
lines changed

src/util/simplify_expr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2209,7 +2209,7 @@ bool simplify_exprt::simplify_node(exprt &expr)
22092209
}
22102210
else if(expr.id()==ID_unary_minus)
22112211
{
2212-
r = simplify_unary_minus(expr);
2212+
r = simplify_unary_minus(to_unary_minus_expr(expr));
22132213
}
22142214
else if(expr.id()==ID_unary_plus)
22152215
{

src/util/simplify_expr_class.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class sign_exprt;
5757
class tvt;
5858
class typecast_exprt;
5959
class unary_exprt;
60+
class unary_minus_exprt;
6061

6162
#define forall_value_list(it, value_list) \
6263
for(simplify_exprt::value_listt::const_iterator it=(value_list).begin(); \
@@ -169,7 +170,7 @@ class simplify_exprt
169170
NODISCARD resultt<> simplify_same_object(const exprt &);
170171
NODISCARD resultt<> simplify_good_pointer(const exprt &);
171172
NODISCARD resultt<> simplify_object(const exprt &);
172-
NODISCARD resultt<> simplify_unary_minus(const exprt &);
173+
NODISCARD resultt<> simplify_unary_minus(const unary_minus_exprt &);
173174
NODISCARD resultt<> simplify_unary_plus(const exprt &);
174175
NODISCARD resultt<> simplify_dereference(const dereference_exprt &);
175176
NODISCARD resultt<> simplify_address_of(const address_of_exprt &);

src/util/simplify_expr_int.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,39 +1120,34 @@ simplify_exprt::resultt<> simplify_exprt::simplify_unary_plus(const exprt &expr)
11201120
}
11211121

11221122
simplify_exprt::resultt<>
1123-
simplify_exprt::simplify_unary_minus(const exprt &expr)
1123+
simplify_exprt::simplify_unary_minus(const unary_minus_exprt &expr)
11241124
{
1125-
if(expr.operands().size()!=1)
1126-
return unchanged(expr);
1127-
11281125
if(!is_number(expr.type()))
11291126
return unchanged(expr);
11301127

1131-
const exprt &operand = expr.op0();
1128+
const exprt &operand = expr.op();
11321129

11331130
if(expr.type()!=operand.type())
11341131
return unchanged(expr);
11351132

11361133
if(operand.id()==ID_unary_minus)
11371134
{
11381135
// cancel out "-(-x)" to "x"
1139-
if(operand.operands().size()!=1)
1140-
return unchanged(expr);
1141-
1142-
if(!is_number(operand.op0().type()))
1136+
if(!is_number(to_unary_minus_expr(operand).op().type()))
11431137
return unchanged(expr);
11441138

1145-
return expr.op0().op0();
1139+
return to_unary_minus_expr(operand).op();
11461140
}
11471141
else if(operand.id()==ID_constant)
11481142
{
11491143
const irep_idt &type_id=expr.type().id();
1144+
const auto &constant_expr = to_constant_expr(operand);
11501145

11511146
if(type_id==ID_integer ||
11521147
type_id==ID_signedbv ||
11531148
type_id==ID_unsignedbv)
11541149
{
1155-
const auto int_value = numeric_cast<mp_integer>(expr.op0());
1150+
const auto int_value = numeric_cast<mp_integer>(constant_expr);
11561151

11571152
if(!int_value.has_value())
11581153
return unchanged(expr);
@@ -1162,20 +1157,20 @@ simplify_exprt::simplify_unary_minus(const exprt &expr)
11621157
else if(type_id==ID_rational)
11631158
{
11641159
rationalt r;
1165-
if(to_rational(expr.op0(), r))
1160+
if(to_rational(constant_expr, r))
11661161
return unchanged(expr);
11671162

11681163
return from_rational(-r);
11691164
}
11701165
else if(type_id==ID_fixedbv)
11711166
{
1172-
fixedbvt f(to_constant_expr(expr.op0()));
1167+
fixedbvt f(constant_expr);
11731168
f.negate();
11741169
return f.to_expr();
11751170
}
11761171
else if(type_id==ID_floatbv)
11771172
{
1178-
ieee_floatt f(to_constant_expr(expr.op0()));
1173+
ieee_floatt f(constant_expr);
11791174
f.negate();
11801175
return f.to_expr();
11811176
}

0 commit comments

Comments
 (0)