@@ -184,40 +184,7 @@ exprt value_set_dereferencet::dereference(
184184
185185 if (may_fail)
186186 {
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));
221188 }
222189
223190 // now build big case split, but we only do "good" objects
@@ -248,6 +215,45 @@ exprt value_set_dereferencet::dereference(
248215 return result_value;
249216}
250217
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+
251257// / Check if the two types have matching number of ID_pointer levels, with
252258// / the dereference type eventually pointing to void; then this is ok
253259// / for example:
0 commit comments