Skip to content

Commit 0eb945d

Browse files
Factor getting the failure value out of value_set_dereferencet::dereference
1 parent d85ca5c commit 0eb945d

File tree

2 files changed

+41
-34
lines changed

2 files changed

+41
-34
lines changed

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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:

src/pointer-analysis/value_set_dereference.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class value_set_dereferencet final
111111
/// disregard an apparent attempt to dereference NULL
112112
const bool exclude_null_derefs;
113113
const messaget &log;
114+
valuet get_failure_value(const exprt &pointer, const typet &type);
114115
};
115116

116117
#endif // CPROVER_POINTER_ANALYSIS_VALUE_SET_DEREFERENCE_H

0 commit comments

Comments
 (0)