@@ -35,18 +35,29 @@ 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
42
+ * \param _exclude_int_as_pointer_derefs Ignore value-set entries that
43
+ indicate a given dereference may follow an integer cast to a pointer
44
+ (e.g. `(char*)5`)
38
45
*/
39
46
value_set_dereferencet (
40
47
const namespacet &_ns,
41
48
symbol_tablet &_new_symbol_table,
42
49
const optionst &_options,
43
50
dereference_callbackt &_dereference_callback,
44
- const irep_idt _language_mode):
51
+ const irep_idt _language_mode,
52
+ bool _exclude_null_derefs,
53
+ bool _exclude_int_as_pointer_derefs):
45
54
ns (_ns),
46
55
new_symbol_table (_new_symbol_table),
47
56
options (_options),
48
57
dereference_callback (_dereference_callback),
49
- language_mode (_language_mode)
58
+ language_mode (_language_mode),
59
+ exclude_null_derefs (_exclude_null_derefs),
60
+ exclude_int_as_pointer_derefs (_exclude_int_as_pointer_derefs)
50
61
{ }
51
62
52
63
virtual ~value_set_dereferencet () { }
@@ -82,6 +93,13 @@ class value_set_dereferencet
82
93
// / language_mode: ID_java, ID_C or another language identifier
83
94
// / if we know the source language in use, irep_idt() otherwise.
84
95
const irep_idt language_mode;
96
+ // / Flag indicating whether `value_set_dereferencet::dereference` should
97
+ // / disregard an apparent attempt to dereference NULL
98
+ const bool exclude_null_derefs;
99
+ // / Flag indicating whether `value_set_dereferencet::dereference` should
100
+ // / disregard an apparent attempt to dereference an integer cast to a pointer
101
+ // / (e.g. `(char*)5`)
102
+ const bool exclude_int_as_pointer_derefs;
85
103
static unsigned invalid_counter;
86
104
87
105
bool dereference_type_compare (
@@ -92,17 +110,38 @@ class value_set_dereferencet
92
110
exprt &dest,
93
111
const exprt &offset) const ;
94
112
113
+ // / Return value for `build_reference_to`; see that method for documentation.
95
114
class valuet
96
115
{
97
116
public:
98
117
exprt value;
99
118
exprt pointer_guard;
119
+ bool ignore;
100
120
101
- valuet ():value(nil_exprt()), pointer_guard(false_exprt())
121
+ valuet ():value(nil_exprt()), pointer_guard(false_exprt()), ignore( false )
102
122
{
103
123
}
104
124
};
105
125
126
+ // / Get a guard and expression to access `what` under `guard`.
127
+ // / \param what: value set entry to convert to an expression: either
128
+ // / ID_unknown, ID_invalid, or an object_descriptor_exprt giving a referred
129
+ // / object and offset.
130
+ // / \param mode: whether the pointer is being read or written; used to create
131
+ // / pointer validity checks if need be
132
+ // / \param pointer: pointer expression that may point to `what`
133
+ // / \param guard: guard under which the pointer is dereferenced
134
+ // / \return
135
+ // / * If we were explicitly instructed to ignore `what` as a possible
136
+ // / pointer target: a `valuet` with `ignore` = true, and `value` and
137
+ // / `pointer_guard` set to nil.
138
+ // / * If we could build an expression corresponding to `what`:
139
+ // / A `valuet` with non-nil `value`, and `pointer_guard` set to an
140
+ // / appropriate check to determine if `pointer_expr` really points to
141
+ // / `what` (for example, we might return
142
+ // / `{.value = global, .pointer_guard = (pointer_expr == &global)}`
143
+ // / * Otherwise, if we couldn't build an expression (e.g. for `what` ==
144
+ // / ID_unknown), a `valuet` with nil `value` and `ignore` == false.
106
145
valuet build_reference_to (
107
146
const exprt &what,
108
147
const modet mode,
@@ -138,6 +177,10 @@ class value_set_dereferencet
138
177
const typet &type,
139
178
const guardt &guard,
140
179
const exprt &offset);
180
+
181
+ // / Returns true if due to language guarantees or some pre-processing pass
182
+ // / we always know pointers being dereferenced cannot be null.
183
+ bool null_dereference_is_impossible () const ;
141
184
};
142
185
143
186
#endif // CPROVER_POINTER_ANALYSIS_VALUE_SET_DEREFERENCE_H
0 commit comments