Skip to content

Commit 667cb0f

Browse files
author
owen-jones-diffblue
authored
Merge pull request diffblue#325 from diffblue/owen-jones-diffblue/taint-analysis-should-ignore-precise-external-value-sets
Taint analysis should ignore precise EVSs
2 parents 6037785 + a1fb4a6 commit 667cb0f

File tree

1 file changed

+51
-29
lines changed

1 file changed

+51
-29
lines changed

src/taint-analysis/taint_summary.cpp

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void expand_external_objects(
8181
// TODO: figure out when an external reference made by the callee
8282
// is certain to be resolved here, so we can remove the external reference.
8383

84-
std::vector<unsigned> new_keys;
84+
std::vector<taint_lvalue_numbert> new_keys;
8585
for(const auto& lval_number : lvalue_set)
8686
{
8787
const auto& lval=taint_object_numbering[lval_number];
@@ -117,42 +117,56 @@ static exprt transform_external_objects(const exprt& e)
117117
// uses it to mean
118118
// deref(any x field)
119119
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+
}
130137
}
131138
else if(e.id()==ID_external_value_set)
132139
{
133140
// Similarly, deref(any external), without a member operator, is assumed
134141
// to be an array access, and is rewritten to (any array)
135142
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+
}
141155
}
142-
else
143-
return e;
156+
157+
return e;
144158
}
145159

146160
static void collect_lvsa_access_paths(
147-
exprt const& querye_in,
161+
exprt const& query_in,
148162
namespacet const& ns,
149163
local_value_set_analysist& lvsa,
150164
instruction_iteratort const& instit,
151165
std::set<exprt> &result)
152166
{
153-
if(querye_in.id()==ID_side_effect)
167+
if(query_in.id()==ID_side_effect)
154168
{
155-
side_effect_exprt const see=to_side_effect_expr(querye_in);
169+
side_effect_exprt const see=to_side_effect_expr(query_in);
156170
if(see.get_statement()==ID_nondet)
157171
{
158172
// TODO(marek-trtik): Add computation of a proper points-to set for NONDET
@@ -161,10 +175,10 @@ static void collect_lvsa_access_paths(
161175
}
162176
}
163177

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;
168182

169183
if(e.id()==ID_symbol ||
170184
e.id()==ID_index ||
@@ -195,6 +209,14 @@ static void collect_lvsa_access_paths(
195209
}
196210
else if(get_underlying_object(transformed_object).id()=="NULL-object")
197211
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+
}
198220

199221
result.insert(transformed_object);
200222
}
@@ -212,7 +234,7 @@ static void collect_lvsa_access_paths(
212234
}
213235

214236
static void collect_lvsa_access_paths(
215-
exprt const& querye_in,
237+
exprt const& query_in,
216238
namespacet const& ns,
217239
local_value_set_analysist& lvsa,
218240
instruction_iteratort const& instit,
@@ -222,7 +244,7 @@ static void collect_lvsa_access_paths(
222244
{
223245
std::set<exprt> referees;
224246
collect_lvsa_access_paths(
225-
querye_in,
247+
query_in,
226248
ns,
227249
lvsa,
228250
instit,
@@ -256,7 +278,7 @@ static void collect_lvsa_alias_access_paths(
256278
}
257279

258280
static void collect_lvsa_access_paths(
259-
exprt const& querye_in,
281+
exprt const& query_in,
260282
namespacet const& ns,
261283
lvalue_numbers_sett &result,
262284
local_value_set_analysist& lvsa,
@@ -266,7 +288,7 @@ static void collect_lvsa_access_paths(
266288
bool singular=false;
267289

268290
collect_lvsa_access_paths(
269-
querye_in,
291+
query_in,
270292
ns,
271293
lvsa,
272294
instit,

0 commit comments

Comments
 (0)