@@ -131,6 +131,23 @@ void memory_snapshot_harness_generatort::add_init_section(
131
131
goto_program.const_cast_target (entry_location.start_instruction )));
132
132
}
133
133
134
+ const symbolt &memory_snapshot_harness_generatort::fresh_symbol_copy (
135
+ const symbolt &snapshot_symbol,
136
+ symbol_tablet &symbol_table) const
137
+ {
138
+ symbolt &tmp_symbol = get_fresh_aux_symbol (
139
+ snapshot_symbol.type ,
140
+ " " , // no prefix name
141
+ id2string (snapshot_symbol.base_name ),
142
+ snapshot_symbol.location ,
143
+ snapshot_symbol.mode ,
144
+ symbol_table);
145
+ tmp_symbol.is_static_lifetime = true ;
146
+ tmp_symbol.value = snapshot_symbol.value ;
147
+
148
+ return tmp_symbol;
149
+ }
150
+
134
151
code_blockt memory_snapshot_harness_generatort::add_assignments_to_globals (
135
152
const symbol_tablet &snapshot,
136
153
goto_modelt &goto_model) const
@@ -141,17 +158,30 @@ code_blockt memory_snapshot_harness_generatort::add_assignments_to_globals(
141
158
code_blockt code;
142
159
for (const auto &pair : snapshot)
143
160
{
144
- const symbolt &symbol = pair.second ;
145
- if (!symbol.is_static_lifetime )
161
+ const symbolt &snapshot_symbol = pair.second ;
162
+ symbol_tablet &symbol_table = goto_model.symbol_table ;
163
+
164
+ auto should_get_fresh = [&symbol_table](const symbolt &symbol) {
165
+ return symbol_table.lookup (symbol.base_name ) == nullptr &&
166
+ !symbol.is_type ;
167
+ };
168
+ const symbolt &fresh_or_snapshot_symbol =
169
+ should_get_fresh (snapshot_symbol)
170
+ ? fresh_symbol_copy (snapshot_symbol, symbol_table)
171
+ : snapshot_symbol;
172
+
173
+ if (!fresh_or_snapshot_symbol.is_static_lifetime )
146
174
continue ;
147
175
148
- if (variables_to_havoc.count (symbol .base_name ) == 0 )
176
+ if (variables_to_havoc.count (fresh_or_snapshot_symbol .base_name ) == 0 )
149
177
{
150
- code.add (code_assignt{symbol.symbol_expr (), symbol.value });
178
+ code.add (code_assignt{fresh_or_snapshot_symbol.symbol_expr (),
179
+ fresh_or_snapshot_symbol.value });
151
180
}
152
181
else
153
182
{
154
- recursive_initialization.initialize (symbol.symbol_expr (), 0 , {}, code);
183
+ recursive_initialization.initialize (
184
+ fresh_or_snapshot_symbol.symbol_expr (), 0 , {}, code);
155
185
}
156
186
}
157
187
return code;
0 commit comments