@@ -35,18 +35,24 @@ class value_set_dereferencet
35
35
* \param _options Options, in particular whether pointer checks are
36
36
to be performed
37
37
* \param _dereference_callback Callback object for error reporting
38
+ * \param _language_mode Mode for any new symbols created to represent
39
+ a dereference failure
40
+ * \param _exclude_null_derefs Ignore value-set entries that indicate a given
41
+ dereference may follow a null pointer
38
42
*/
39
43
value_set_dereferencet (
40
44
const namespacet &_ns,
41
45
symbol_tablet &_new_symbol_table,
42
46
const optionst &_options,
43
47
dereference_callbackt &_dereference_callback,
44
- const irep_idt _language_mode):
48
+ const irep_idt _language_mode,
49
+ bool _exclude_null_derefs):
45
50
ns (_ns),
46
51
new_symbol_table (_new_symbol_table),
47
52
options (_options),
48
53
dereference_callback (_dereference_callback),
49
- language_mode (_language_mode)
54
+ language_mode (_language_mode),
55
+ exclude_null_derefs (_exclude_null_derefs)
50
56
{ }
51
57
52
58
virtual ~value_set_dereferencet () { }
@@ -82,6 +88,9 @@ class value_set_dereferencet
82
88
// / language_mode: ID_java, ID_C or another language identifier
83
89
// / if we know the source language in use, irep_idt() otherwise.
84
90
const irep_idt language_mode;
91
+ // / Flag indicating whether `value_set_dereferencet::dereference` should
92
+ // / disregard an apparent attempt to dereference NULL
93
+ const bool exclude_null_derefs;
85
94
static unsigned invalid_counter;
86
95
87
96
bool dereference_type_compare (
@@ -92,17 +101,38 @@ class value_set_dereferencet
92
101
exprt &dest,
93
102
const exprt &offset) const ;
94
103
104
+ // / Return value for `build_reference_to`; see that method for documentation.
95
105
class valuet
96
106
{
97
107
public:
98
108
exprt value;
99
109
exprt pointer_guard;
110
+ bool ignore;
100
111
101
- valuet ():value(nil_exprt()), pointer_guard(false_exprt())
112
+ valuet ():value(nil_exprt()), pointer_guard(false_exprt()), ignore( false )
102
113
{
103
114
}
104
115
};
105
116
117
+ // / Get a guard and expression to access `what` under `guard`.
118
+ // / \param what: value set entry to convert to an expression: either
119
+ // / ID_unknown, ID_invalid, or an object_descriptor_exprt giving a referred
120
+ // / object and offset.
121
+ // / \param mode: whether the pointer is being read or written; used to create
122
+ // / pointer validity checks if need be
123
+ // / \param pointer: pointer expression that may point to `what`
124
+ // / \param guard: guard under which the pointer is dereferenced
125
+ // / \return
126
+ // / * If we were explicitly instructed to ignore `what` as a possible
127
+ // / pointer target: a `valuet` with `ignore` = true, and `value` and
128
+ // / `pointer_guard` set to nil.
129
+ // / * If we could build an expression corresponding to `what`:
130
+ // / A `valuet` with non-nil `value`, and `pointer_guard` set to an
131
+ // / appropriate check to determine if `pointer_expr` really points to
132
+ // / `what` (for example, we might return
133
+ // / `{.value = global, .pointer_guard = (pointer_expr == &global)}`
134
+ // / * Otherwise, if we couldn't build an expression (e.g. for `what` ==
135
+ // / ID_unknown), a `valuet` with nil `value` and `ignore` == false.
106
136
valuet build_reference_to (
107
137
const exprt &what,
108
138
const modet mode,
0 commit comments