@@ -81,7 +81,7 @@ void expand_external_objects(
81
81
// TODO: figure out when an external reference made by the callee
82
82
// is certain to be resolved here, so we can remove the external reference.
83
83
84
- std::vector<unsigned > new_keys;
84
+ std::vector<taint_lvalue_numbert > new_keys;
85
85
for (const auto & lval_number : lvalue_set)
86
86
{
87
87
const auto & lval=taint_object_numbering[lval_number];
@@ -117,42 +117,56 @@ static exprt transform_external_objects(const exprt& e)
117
117
// uses it to mean
118
118
// deref(any x field)
119
119
auto evs_copy=to_external_value_set (get_underlying_object (e));
120
- access_path_entry_exprt new_entry (
121
- " ." +
122
- id2string (to_member_expr (e).get_component_name ()),
123
- " " ,
124
- " " ,
125
- typet ());
126
- evs_copy.extend_access_path (new_entry, external_value_set_typet::PER_FIELD);
127
- evs_copy.label ()=constant_exprt (" external_objects" ,string_typet ());
128
- evs_copy.type ()=e.type ();
129
- return evs_copy.as_non_initializer ();
120
+ if (
121
+ evs_copy.get_external_value_set_type () !=
122
+ external_value_set_typet::PRECISE)
123
+ {
124
+ access_path_entry_exprt new_entry (
125
+ " ." +
126
+ id2string (to_member_expr (e).get_component_name ()),
127
+ " " ,
128
+ " " ,
129
+ typet ());
130
+ evs_copy.extend_access_path (
131
+ new_entry,
132
+ external_value_set_typet::PER_FIELD);
133
+ evs_copy.label ()=constant_exprt (" external_objects" , string_typet ());
134
+ evs_copy.type ()=e.type ();
135
+ return evs_copy.as_non_initializer ();
136
+ }
130
137
}
131
138
else if (e.id ()==ID_external_value_set)
132
139
{
133
140
// Similarly, deref(any external), without a member operator, is assumed
134
141
// to be an array access, and is rewritten to (any array)
135
142
auto evs_copy=to_external_value_set (e);
136
- access_path_entry_exprt new_entry (" []" ," " ," " ,typet ());
137
- evs_copy.extend_access_path (new_entry, external_value_set_typet::PER_FIELD);
138
- evs_copy.label ()=constant_exprt (" external_objects" ,string_typet ());
139
- evs_copy.type ()=e.type ();
140
- return evs_copy.as_non_initializer ();
143
+ if (
144
+ evs_copy.get_external_value_set_type () !=
145
+ external_value_set_typet::PRECISE)
146
+ {
147
+ access_path_entry_exprt new_entry (" []" , " " , " " , typet ());
148
+ evs_copy.extend_access_path (
149
+ new_entry,
150
+ external_value_set_typet::PER_FIELD);
151
+ evs_copy.label ()=constant_exprt (" external_objects" , string_typet ());
152
+ evs_copy.type ()=e.type ();
153
+ return evs_copy.as_non_initializer ();
154
+ }
141
155
}
142
- else
143
- return e;
156
+
157
+ return e;
144
158
}
145
159
146
160
static void collect_lvsa_access_paths (
147
- exprt const & querye_in ,
161
+ exprt const & query_in ,
148
162
namespacet const & ns,
149
163
local_value_set_analysist& lvsa,
150
164
instruction_iteratort const & instit,
151
165
std::set<exprt> &result)
152
166
{
153
- if (querye_in .id ()==ID_side_effect)
167
+ if (query_in .id ()==ID_side_effect)
154
168
{
155
- side_effect_exprt const see=to_side_effect_expr (querye_in );
169
+ side_effect_exprt const see=to_side_effect_expr (query_in );
156
170
if (see.get_statement ()==ID_nondet)
157
171
{
158
172
// TODO(marek-trtik): Add computation of a proper points-to set for NONDET
@@ -161,10 +175,10 @@ static void collect_lvsa_access_paths(
161
175
}
162
176
}
163
177
164
- const exprt* querye=&querye_in ;
165
- while (querye ->id ()==ID_typecast)
166
- querye=&querye ->op0 ();
167
- const exprt& e = *querye ;
178
+ const exprt* query=&query_in ;
179
+ while (query ->id ()==ID_typecast)
180
+ query=&query ->op0 ();
181
+ const exprt& e = *query ;
168
182
169
183
if (e.id ()==ID_symbol ||
170
184
e.id ()==ID_index ||
@@ -195,6 +209,14 @@ static void collect_lvsa_access_paths(
195
209
}
196
210
else if (get_underlying_object (transformed_object).id ()==" NULL-object" )
197
211
continue ;
212
+ else if (
213
+ get_underlying_object (transformed_object).id () ==
214
+ ID_external_value_set &&
215
+ to_external_value_set (get_underlying_object (transformed_object))
216
+ .get_external_value_set_type () == external_value_set_typet::PRECISE)
217
+ {
218
+ continue ;
219
+ }
198
220
199
221
result.insert (transformed_object);
200
222
}
@@ -212,7 +234,7 @@ static void collect_lvsa_access_paths(
212
234
}
213
235
214
236
static void collect_lvsa_access_paths (
215
- exprt const & querye_in ,
237
+ exprt const & query_in ,
216
238
namespacet const & ns,
217
239
local_value_set_analysist& lvsa,
218
240
instruction_iteratort const & instit,
@@ -222,7 +244,7 @@ static void collect_lvsa_access_paths(
222
244
{
223
245
std::set<exprt> referees;
224
246
collect_lvsa_access_paths (
225
- querye_in ,
247
+ query_in ,
226
248
ns,
227
249
lvsa,
228
250
instit,
@@ -256,7 +278,7 @@ static void collect_lvsa_alias_access_paths(
256
278
}
257
279
258
280
static void collect_lvsa_access_paths (
259
- exprt const & querye_in ,
281
+ exprt const & query_in ,
260
282
namespacet const & ns,
261
283
lvalue_numbers_sett &result,
262
284
local_value_set_analysist& lvsa,
@@ -266,7 +288,7 @@ static void collect_lvsa_access_paths(
266
288
bool singular=false ;
267
289
268
290
collect_lvsa_access_paths (
269
- querye_in ,
291
+ query_in ,
270
292
ns,
271
293
lvsa,
272
294
instit,
0 commit comments