@@ -184,40 +184,7 @@ exprt value_set_dereferencet::dereference(
184
184
185
185
if (may_fail)
186
186
{
187
- // first see if we have a "failed object" for this pointer
188
-
189
- exprt failure_value;
190
-
191
- if (
192
- const symbolt *failed_symbol =
193
- dereference_callback.get_or_create_failed_symbol (pointer))
194
- {
195
- // yes!
196
- failure_value=failed_symbol->symbol_expr ();
197
- failure_value.set (ID_C_invalid_object, true );
198
- }
199
- else
200
- {
201
- // else: produce new symbol
202
- symbolt &symbol = get_fresh_aux_symbol (
203
- type,
204
- " symex" ,
205
- " invalid_object" ,
206
- pointer.source_location (),
207
- language_mode,
208
- new_symbol_table);
209
-
210
- // make it a lvalue, so we can assign to it
211
- symbol.is_lvalue =true ;
212
-
213
- failure_value=symbol.symbol_expr ();
214
- failure_value.set (ID_C_invalid_object, true );
215
- }
216
-
217
- valuet value;
218
- value.value =failure_value;
219
- value.pointer_guard =true_exprt ();
220
- values.push_front (value);
187
+ values.push_front (get_failure_value (pointer, type));
221
188
}
222
189
223
190
// now build big case split, but we only do "good" objects
@@ -248,6 +215,45 @@ exprt value_set_dereferencet::dereference(
248
215
return result_value;
249
216
}
250
217
218
+ value_set_dereferencet::valuet value_set_dereferencet::get_failure_value (
219
+ const exprt &pointer,
220
+ const typet &type)
221
+ {
222
+ // first see if we have a "failed object" for this pointer
223
+ exprt failure_value;
224
+
225
+ if (
226
+ const symbolt *failed_symbol =
227
+ dereference_callback.get_or_create_failed_symbol (pointer))
228
+ {
229
+ // yes!
230
+ failure_value = failed_symbol->symbol_expr ();
231
+ failure_value.set (ID_C_invalid_object, true );
232
+ }
233
+ else
234
+ {
235
+ // else: produce new symbol
236
+ symbolt &symbol = get_fresh_aux_symbol (
237
+ type,
238
+ " symex" ,
239
+ " invalid_object" ,
240
+ pointer.source_location (),
241
+ language_mode,
242
+ new_symbol_table);
243
+
244
+ // make it a lvalue, so we can assign to it
245
+ symbol.is_lvalue = true ;
246
+
247
+ failure_value = symbol.symbol_expr ();
248
+ failure_value.set (ID_C_invalid_object, true );
249
+ }
250
+
251
+ valuet result{};
252
+ result.value = failure_value;
253
+ result.pointer_guard = true_exprt ();
254
+ return result;
255
+ }
256
+
251
257
// / Check if the two types have matching number of ID_pointer levels, with
252
258
// / the dereference type eventually pointing to void; then this is ok
253
259
// / for example:
0 commit comments