@@ -70,7 +70,7 @@ exprt goto_symext::address_arithmetic(
70
70
71
71
// there could be further dereferencing in the offset
72
72
exprt offset=be.offset ();
73
- dereference_rec (offset, state);
73
+ dereference_rec (offset, state, false );
74
74
75
75
result=plus_exprt (result, offset);
76
76
@@ -106,14 +106,14 @@ exprt goto_symext::address_arithmetic(
106
106
// just grab the pointer, but be wary of further dereferencing
107
107
// in the pointer itself
108
108
result=to_dereference_expr (expr).pointer ();
109
- dereference_rec (result, state);
109
+ dereference_rec (result, state, false );
110
110
}
111
111
else if (expr.id ()==ID_if)
112
112
{
113
113
if_exprt if_expr=to_if_expr (expr);
114
114
115
115
// the condition is not an address
116
- dereference_rec (if_expr.cond (), state);
116
+ dereference_rec (if_expr.cond (), state, false );
117
117
118
118
// recursive call
119
119
if_expr.true_case () =
@@ -130,7 +130,7 @@ exprt goto_symext::address_arithmetic(
130
130
{
131
131
// give up, just dereference
132
132
result=expr;
133
- dereference_rec (result, state);
133
+ dereference_rec (result, state, false );
134
134
135
135
// turn &array into &array[0]
136
136
if (result.type ().id () == ID_array && !keep_array)
@@ -198,7 +198,7 @@ exprt goto_symext::address_arithmetic(
198
198
// / such as `&struct.flexible_array[0]` (see inline comments in code).
199
199
// / For full details of this method's pointer replacement and potential side-
200
200
// / effects see \ref goto_symext::dereference
201
- void goto_symext::dereference_rec (exprt &expr, statet &state)
201
+ void goto_symext::dereference_rec (exprt &expr, statet &state, bool write )
202
202
{
203
203
if (expr.id ()==ID_dereference)
204
204
{
@@ -221,7 +221,7 @@ void goto_symext::dereference_rec(exprt &expr, statet &state)
221
221
tmp1.swap (to_dereference_expr (expr).pointer ());
222
222
223
223
// first make sure there are no dereferences in there
224
- dereference_rec (tmp1, state);
224
+ dereference_rec (tmp1, state, false );
225
225
226
226
// we need to set up some elaborate call-backs
227
227
symex_dereference_statet symex_dereference_state (state, ns);
@@ -259,7 +259,7 @@ void goto_symext::dereference_rec(exprt &expr, statet &state)
259
259
tmp.add_source_location ()=expr.source_location ();
260
260
261
261
// recursive call
262
- dereference_rec (tmp, state);
262
+ dereference_rec (tmp, state, write );
263
263
264
264
expr.swap (tmp);
265
265
}
@@ -297,17 +297,17 @@ void goto_symext::dereference_rec(exprt &expr, statet &state)
297
297
to_address_of_expr (tc_op).object (),
298
298
from_integer (0 , index_type ())));
299
299
300
- dereference_rec (expr, state);
300
+ dereference_rec (expr, state, write );
301
301
}
302
302
else
303
303
{
304
- dereference_rec (tc_op, state);
304
+ dereference_rec (tc_op, state, write );
305
305
}
306
306
}
307
307
else
308
308
{
309
309
Forall_operands (it, expr)
310
- dereference_rec (*it, state);
310
+ dereference_rec (*it, state, write );
311
311
}
312
312
}
313
313
@@ -348,7 +348,7 @@ void goto_symext::dereference_rec(exprt &expr, statet &state)
348
348
// / dereferenced. If new objects are created by this mechanism then
349
349
// / state will be altered (by `symex_assign`) to initialise them.
350
350
// / See \ref auto_objects.cpp for details.
351
- void goto_symext::dereference (exprt &expr, statet &state)
351
+ void goto_symext::dereference (exprt &expr, statet &state, bool write )
352
352
{
353
353
// The expression needs to be renamed to level 1
354
354
// in order to distinguish addresses of local variables
@@ -358,7 +358,7 @@ void goto_symext::dereference(exprt &expr, statet &state)
358
358
exprt l1_expr = state.rename <L1>(expr, ns).get ();
359
359
360
360
// start the recursion!
361
- dereference_rec (l1_expr, state);
361
+ dereference_rec (l1_expr, state, write );
362
362
// dereferencing may introduce new symbol_exprt
363
363
// (like __CPROVER_memory)
364
364
expr = state.rename <L1>(std::move (l1_expr), ns).get ();
0 commit comments