27
27
exprt goto_symext::address_arithmetic (
28
28
const exprt &expr,
29
29
statet &state,
30
- guardt &guard,
31
30
bool keep_array)
32
31
{
33
32
exprt result;
@@ -41,7 +40,7 @@ exprt goto_symext::address_arithmetic(
41
40
const byte_extract_exprt &be=to_byte_extract_expr (expr);
42
41
43
42
// recursive call
44
- result= address_arithmetic (be.op (), state, guard , keep_array);
43
+ result = address_arithmetic (be.op (), state, keep_array);
45
44
46
45
if (be.op ().type ().id () == ID_array && result.id () == ID_address_of)
47
46
{
@@ -59,7 +58,7 @@ exprt goto_symext::address_arithmetic(
59
58
60
59
// there could be further dereferencing in the offset
61
60
exprt offset=be.offset ();
62
- dereference_rec (offset, state, guard );
61
+ dereference_rec (offset, state);
63
62
64
63
result=plus_exprt (result, offset);
65
64
@@ -84,7 +83,7 @@ exprt goto_symext::address_arithmetic(
84
83
byte_extract_id (), ode.root_object (), ode.offset (), expr.type ());
85
84
86
85
// recursive call
87
- result= address_arithmetic (be, state, guard , keep_array);
86
+ result = address_arithmetic (be, state, keep_array);
88
87
89
88
do_simplify (result);
90
89
}
@@ -95,20 +94,20 @@ exprt goto_symext::address_arithmetic(
95
94
// just grab the pointer, but be wary of further dereferencing
96
95
// in the pointer itself
97
96
result=to_dereference_expr (expr).pointer ();
98
- dereference_rec (result, state, guard );
97
+ dereference_rec (result, state);
99
98
}
100
99
else if (expr.id ()==ID_if)
101
100
{
102
101
if_exprt if_expr=to_if_expr (expr);
103
102
104
103
// the condition is not an address
105
- dereference_rec (if_expr.cond (), state, guard );
104
+ dereference_rec (if_expr.cond (), state);
106
105
107
106
// recursive call
108
- if_expr.true_case ()=
109
- address_arithmetic (if_expr.true_case (), state, guard, keep_array);
110
- if_expr.false_case ()=
111
- address_arithmetic (if_expr.false_case (), state, guard, keep_array);
107
+ if_expr.true_case () =
108
+ address_arithmetic (if_expr.true_case (), state, keep_array);
109
+ if_expr.false_case () =
110
+ address_arithmetic (if_expr.false_case (), state, keep_array);
112
111
113
112
result=if_expr;
114
113
}
@@ -119,7 +118,7 @@ exprt goto_symext::address_arithmetic(
119
118
{
120
119
// give up, just dereference
121
120
result=expr;
122
- dereference_rec (result, state, guard );
121
+ dereference_rec (result, state);
123
122
124
123
// turn &array into &array[0]
125
124
if (result.type ().id () == ID_array && !keep_array)
@@ -143,7 +142,7 @@ exprt goto_symext::address_arithmetic(
143
142
from_integer (offset, index_type ()),
144
143
expr.type ());
145
144
146
- result= address_arithmetic (be, state, guard , keep_array);
145
+ result = address_arithmetic (be, state, keep_array);
147
146
148
147
do_simplify (result);
149
148
}
@@ -154,7 +153,7 @@ exprt goto_symext::address_arithmetic(
154
153
{
155
154
const typecast_exprt &tc_expr = to_typecast_expr (expr);
156
155
157
- result = address_arithmetic (tc_expr.op (), state, guard, keep_array);
156
+ result = address_arithmetic (tc_expr.op (), state, keep_array);
158
157
159
158
// treat &array as &array[0]
160
159
const typet &expr_type = expr.type ();
@@ -179,7 +178,7 @@ exprt goto_symext::address_arithmetic(
179
178
return result;
180
179
}
181
180
182
- void goto_symext::dereference_rec (exprt &expr, statet &state, guardt &guard )
181
+ void goto_symext::dereference_rec (exprt &expr, statet &state)
183
182
{
184
183
if (expr.id ()==ID_dereference)
185
184
{
@@ -203,7 +202,7 @@ void goto_symext::dereference_rec(exprt &expr, statet &state, guardt &guard)
203
202
tmp1.swap (to_dereference_expr (expr).pointer ());
204
203
205
204
// first make sure there are no dereferences in there
206
- dereference_rec (tmp1, state, guard );
205
+ dereference_rec (tmp1, state);
207
206
208
207
// we need to set up some elaborate call-backs
209
208
symex_dereference_statet symex_dereference_state (*this , state);
@@ -216,7 +215,7 @@ void goto_symext::dereference_rec(exprt &expr, statet &state, guardt &guard)
216
215
expr_is_not_null);
217
216
218
217
// std::cout << "**** " << format(tmp1) << '\n';
219
- exprt tmp2 = dereference.dereference (tmp1, guard );
218
+ exprt tmp2 = dereference.dereference (tmp1, guardt ( true_exprt ()) );
220
219
// std::cout << "**** " << format(tmp2) << '\n';
221
220
222
221
expr.swap (tmp2);
@@ -242,7 +241,7 @@ void goto_symext::dereference_rec(exprt &expr, statet &state, guardt &guard)
242
241
tmp.add_source_location ()=expr.source_location ();
243
242
244
243
// recursive call
245
- dereference_rec (tmp, state, guard );
244
+ dereference_rec (tmp, state);
246
245
247
246
expr.swap (tmp);
248
247
}
@@ -261,7 +260,6 @@ void goto_symext::dereference_rec(exprt &expr, statet &state, guardt &guard)
261
260
expr = address_arithmetic (
262
261
object,
263
262
state,
264
- guard,
265
263
to_pointer_type (expr.type ()).subtype ().id () == ID_array);
266
264
}
267
265
else if (expr.id ()==ID_typecast)
@@ -282,17 +280,17 @@ void goto_symext::dereference_rec(exprt &expr, statet &state, guardt &guard)
282
280
to_address_of_expr (tc_op).object (),
283
281
from_integer (0 , index_type ())));
284
282
285
- dereference_rec (expr, state, guard );
283
+ dereference_rec (expr, state);
286
284
}
287
285
else
288
286
{
289
- dereference_rec (tc_op, state, guard );
287
+ dereference_rec (tc_op, state);
290
288
}
291
289
}
292
290
else
293
291
{
294
292
Forall_operands (it, expr)
295
- dereference_rec (*it, state, guard );
293
+ dereference_rec (*it, state);
296
294
}
297
295
}
298
296
@@ -306,8 +304,7 @@ void goto_symext::dereference(exprt &expr, statet &state)
306
304
state.rename (expr, ns, goto_symex_statet::L1);
307
305
308
306
// start the recursion!
309
- guardt guard{true_exprt{}};
310
- dereference_rec (expr, state, guard);
307
+ dereference_rec (expr, state);
311
308
// dereferencing may introduce new symbol_exprt
312
309
// (like __CPROVER_memory)
313
310
state.rename (expr, ns, goto_symex_statet::L1);
0 commit comments