Skip to content

Commit 8840256

Browse files
committed
Linker-script processing: mind temporaries
Lambdas default to coercion to return-by-value and require explicit specification of the return value to ensure references are returned. As these references now point into an expression being changed, take a copy before replacing inside the expression.
1 parent 50b6018 commit 8840256

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/goto-cc/linker_script_merge.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ linker_script_merget::linker_script_merget(
130130
replacement_predicates(
131131
{
132132
replacement_predicatet("address of array's first member",
133-
[](const exprt expr){ return to_symbol_expr(expr.op0().op0()); },
133+
[](const exprt &expr) -> const symbol_exprt&
134+
{ return to_symbol_expr(expr.op0().op0()); },
134135
[](const exprt expr)
135136
{
136137
return expr.id()==ID_address_of &&
@@ -146,7 +147,8 @@ linker_script_merget::linker_script_merget(
146147
expr.op0().op1().type().id()==ID_signedbv;
147148
}),
148149
replacement_predicatet("address of array",
149-
[](const exprt expr){ return to_symbol_expr(expr.op0()); },
150+
[](const exprt &expr) -> const symbol_exprt&
151+
{ return to_symbol_expr(expr.op0()); },
150152
[](const exprt expr)
151153
{
152154
return expr.id()==ID_address_of &&
@@ -156,14 +158,16 @@ linker_script_merget::linker_script_merget(
156158
expr.op0().type().id()==ID_array;
157159
}),
158160
replacement_predicatet("array variable",
159-
[](const exprt expr){ return to_symbol_expr(expr); },
161+
[](const exprt &expr) -> const symbol_exprt&
162+
{ return to_symbol_expr(expr); },
160163
[](const exprt expr)
161164
{
162165
return expr.id()==ID_symbol &&
163166
expr.type().id()==ID_array;
164167
}),
165168
replacement_predicatet("pointer (does not need pointerizing)",
166-
[](const exprt expr){ return to_symbol_expr(expr); },
169+
[](const exprt &expr) -> const symbol_exprt&
170+
{ return to_symbol_expr(expr); },
167171
[](const exprt expr)
168172
{
169173
return expr.id()==ID_symbol &&
@@ -280,7 +284,8 @@ int linker_script_merget::pointerize_subexprs_of(
280284
{
281285
if(!pattern.match(expr))
282286
continue;
283-
const symbol_exprt &inner_symbol=pattern.inner_symbol(expr);
287+
// take a copy, expr will be changed below
288+
const symbol_exprt inner_symbol=pattern.inner_symbol(expr);
284289
if(pair.first!=inner_symbol.get_identifier())
285290
continue;
286291
tmp=replace_expr(expr, linker_values, inner_symbol, pair.first,

0 commit comments

Comments
 (0)