Skip to content

Commit 00b4af2

Browse files
committed
Bugfix: Explicit retrievals of DOs from value_set amd reaching_defs.
1 parent 19858f9 commit 00b4af2

File tree

4 files changed

+37
-11
lines changed

4 files changed

+37
-11
lines changed

src/analyses/goto_rw.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,17 @@ void rw_range_set_value_sett::get_objects_dereference(
613613
new_size=std::min(size, new_size);
614614
}
615615

616+
if(object.is_not_nil() && object.id()==ID_symbol &&
617+
as_string(to_symbol_expr(object).get_identifier()).find(
618+
get_vsderef_dynamic_object_prefix())==0UL)
619+
{
620+
add(
621+
mode,
622+
to_symbol_expr(object).get_identifier(),
623+
range_start,
624+
range_start + new_size);
625+
}
626+
616627
// value_set_dereferencet::build_reference_to will turn *p into
617628
// DYNAMIC_OBJECT(p) ? *p : invalid_objectN
618629
if(object.is_not_nil() &&

src/analyses/reaching_definitions.cpp

+15-10
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Date: February 2013
2222
#include <util/make_unique.h>
2323

2424
#include <pointer-analysis/value_set_analysis_fi.h>
25+
#include <pointer-analysis/value_set_dereference.h>
2526

2627
#include "is_threaded.h"
2728
#include "dirty.h"
@@ -309,21 +310,25 @@ void rd_range_domaint::transform_assign(
309310
forall_rw_range_set_w_objects(it, rw_set)
310311
{
311312
const irep_idt &identifier=it->first;
312-
// ignore symex::invalid_object
313+
bool do_kill=is_must_alias;
313314
const symbolt *symbol_ptr;
314315
if(ns.lookup(identifier, symbol_ptr))
315-
continue;
316-
INVARIANT_STRUCTURED(
317-
symbol_ptr!=nullptr,
318-
nullptr_exceptiont,
319-
"Symbol is in symbol table");
316+
{
317+
if(as_string(identifier).find(get_vsderef_dynamic_object_prefix())!=0UL)
318+
// ignore symex::invalid_object
319+
continue;
320+
}
321+
else
322+
{
323+
do_kill = do_kill &&
324+
(!rd.get_is_threaded()(from) ||
325+
(!symbol_ptr->is_shared() &&
326+
!rd.get_is_dirty()(identifier)));
327+
}
320328

321329
const range_domaint &ranges=rw_set.get_ranges(it);
322330

323-
if(is_must_alias &&
324-
(!rd.get_is_threaded()(from) ||
325-
(!symbol_ptr->is_shared() &&
326-
!rd.get_is_dirty()(identifier))))
331+
if(do_kill)
327332
for(const auto &range : ranges)
328333
kill(identifier, range.first, range.second);
329334

src/pointer-analysis/value_set_dereference.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ const exprt &value_set_dereferencet::get_symbol(const exprt &expr)
6060
return expr;
6161
}
6262

63+
const std::string &get_vsderef_dynamic_object_prefix()
64+
{
65+
static std::string prefix(CPROVER_PREFIX "_VSDEREF_");
66+
return prefix;
67+
}
68+
6369
/// \par parameters: expression dest, to be dereferenced under given guard,
6470
/// and given mode
6571
/// \return returns pointer after dereferencing
@@ -344,7 +350,9 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
344350
result.pointer_guard=dynamic_object_expr;
345351

346352
// can't remove here, turn into *p
347-
result.value=dereference_exprt(pointer_expr, dereference_type);
353+
result.value=symbol_exprt(
354+
get_vsderef_dynamic_object_prefix() + from_expr(root_object),
355+
ns.follow(dereference_type));
348356

349357
if(options.get_bool_option("pointer-check"))
350358
{

src/pointer-analysis/value_set_dereference.h

+2
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,6 @@ class value_set_dereferencet
144144
const exprt &offset);
145145
};
146146

147+
const std::string &get_vsderef_dynamic_object_prefix();
148+
147149
#endif // CPROVER_POINTER_ANALYSIS_VALUE_SET_DEREFERENCE_H

0 commit comments

Comments
 (0)