Skip to content

Commit 9c4ca28

Browse files
author
owen-jones-diffblue
authored
Merge pull request diffblue#324 from diffblue/owen-jones-diffblue/strong-writes-precise-evs
SEC-200: Use strong writes on precise EVSs except for arrays
2 parents 54a3a1b + 12aa1b4 commit 9c4ca28

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

src/pointer-analysis/external_value_set_expr.h

+11
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,17 @@ class external_value_set_exprt:public exprt
295295
}
296296
}
297297

298+
bool can_make_strong_write_to_precise_external_value_set() const
299+
{
300+
PRECONDITION(
301+
get_external_value_set_type() == external_value_set_typet::PRECISE);
302+
for(const auto &entry : access_path_entries())
303+
if(entry.label() == "[]")
304+
return false;
305+
306+
return true;
307+
}
308+
298309
static const typet &get_precise_evs_irep_id()
299310
{
300311
static typet precise_evs("precise_evs");

src/pointer-analysis/local_value_set.cpp

+17-1
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,23 @@ void local_value_sett::assign_rec(
625625

626626
auto &lhs_entry=insert_result.first->second;
627627

628-
make_union(lhs_entry.object_map, values_rhs);
628+
const bool weak_write =
629+
add_to_sets ||
630+
!new_ext_set.can_make_strong_write_to_precise_external_value_set();
631+
632+
if(weak_write)
633+
{
634+
/// If we are doing a weak write, but this precise EVS did not
635+
/// already exist in the domain, we also put a copy of the precise
636+
/// EVS with is_initializer set to true in its value-set to
637+
/// represent that it might have its original value
638+
if(insert_result.second)
639+
insert(lhs_entry.object_map, new_ext_set.as_initializer());
640+
641+
make_union(lhs_entry.object_map, values_rhs);
642+
}
643+
else
644+
lhs_entry.object_map = values_rhs;
629645
}
630646
}
631647
}

src/pointer-analysis/local_value_set_analysis.cpp

+11-5
Original file line numberDiff line numberDiff line change
@@ -445,10 +445,10 @@ void local_value_set_analysist::transform_function_stub(
445445
}
446446
else if(has_prefix(lhs_fieldname.base_name, precise_evs_prefix))
447447
{
448+
const external_value_set_exprt &precise_evs =
449+
to_external_value_set(lhs_fieldname.structured_lhs);
448450
const external_value_set_exprt::access_path_entriest
449-
&access_path_entries =
450-
to_external_value_set(lhs_fieldname.structured_lhs)
451-
.access_path_entries();
451+
&access_path_entries = precise_evs.access_path_entries();
452452
const exprt precise_access_path_expr = get_expr_from_root_object(
453453
lhs_fieldname.base_name.substr(precise_evs_prefix.size()),
454454
access_path_entries,
@@ -457,8 +457,14 @@ void local_value_set_analysist::transform_function_stub(
457457
ns,
458458
*this);
459459

460-
/// Weak write - can we do strong writes?
461-
bool add_to_sets=true;
460+
std::string objkey = lhs_fieldname.base_name + lhs_fieldname.field_name;
461+
auto it = valuesets.values.find(objkey);
462+
const bool singular = it == valuesets.values.end() ||
463+
it->second.object_map.read().size() == 1;
464+
bool add_to_sets =
465+
!singular ||
466+
!precise_evs.can_make_strong_write_to_precise_external_value_set();
467+
462468
auto demoted_rhs_values=pre_call_rhs_value_sets.at(assignment.second);
463469
valuesets.demote_initializers(demoted_rhs_values);
464470
valuesets.assign_valueset(

0 commit comments

Comments
 (0)