Skip to content

Commit 557d3f2

Browse files
author
Owen
committed
Use build_reference_to when filtering value sets
1 parent e1af2ee commit 557d3f2

File tree

1 file changed

+18
-51
lines changed

1 file changed

+18
-51
lines changed

src/goto-symex/symex_main.cpp

Lines changed: 18 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Author: Daniel Kroening, [email protected]
1414
#include <cassert>
1515
#include <memory>
1616

17+
#include <pointer-analysis/value_set_dereference.h>
18+
1719
#include <util/exception_utils.h>
1820
#include <util/expr_iterator.h>
1921
#include <util/expr_util.h>
@@ -581,52 +583,6 @@ find_unique_pointer_typed_symbol(const exprt &expr)
581583
return return_value;
582584
}
583585

584-
/// This is a simplified version of value_set_dereferencet::build_reference_to.
585-
/// It ignores the ID_dynamic_object case (which doesn't occur in goto-symex)
586-
/// and gives up for integer addresses and non-trivial symbols
587-
/// \param value_set_element: An element of a value-set
588-
/// \param type: the type of the expression that might point to
589-
/// \p value_set_element
590-
/// \return An expression for the value of the pointer indicated by \p
591-
/// value_set_element if it is easy to determine, or an empty optionalt
592-
/// otherwise
593-
static optionalt<exprt>
594-
value_set_element_to_expr(exprt value_set_element, pointer_typet type)
595-
{
596-
const object_descriptor_exprt *object_descriptor =
597-
expr_try_dynamic_cast<object_descriptor_exprt>(value_set_element);
598-
if(!object_descriptor)
599-
{
600-
return {};
601-
}
602-
603-
const exprt &root_object = object_descriptor->root_object();
604-
const exprt &object = object_descriptor->object();
605-
606-
if(root_object.id() == ID_null_object)
607-
{
608-
return null_pointer_exprt{type};
609-
}
610-
else if(root_object.id() == ID_integer_address)
611-
{
612-
return {};
613-
}
614-
else
615-
{
616-
// We should do something like
617-
// value_set_dereference::dereference_type_compare, which deals with
618-
// arrays having types containing void
619-
if(object_descriptor->offset().is_zero() && object.type() == type.subtype())
620-
{
621-
return address_of_exprt(object);
622-
}
623-
else
624-
{
625-
return {};
626-
}
627-
}
628-
}
629-
630586
void goto_symext::try_filter_value_sets(
631587
goto_symex_statet &state,
632588
exprt condition,
@@ -661,18 +617,29 @@ void goto_symext::try_filter_value_sets(
661617
// used if the condition is false, and vice versa.
662618
for(const auto &value_set_element : value_set_elements)
663619
{
664-
optionalt<exprt> possible_value =
665-
value_set_element_to_expr(value_set_element, symbol_type);
666-
667-
if(!possible_value)
620+
const bool exclude_null_derefs = false;
621+
value_set_dereferencet::valuet possible_value =
622+
value_set_dereferencet::build_reference_to(
623+
value_set_element,
624+
*symbol_expr,
625+
exclude_null_derefs,
626+
language_mode,
627+
ns);
628+
629+
if(possible_value.ignore)
668630
{
669631
continue;
670632
}
671633

634+
exprt replacement_expr =
635+
possible_value.value.is_nil()
636+
? static_cast<exprt>(null_pointer_exprt{symbol_type})
637+
: static_cast<exprt>(address_of_exprt{possible_value.value});
638+
672639
exprt modified_condition(condition);
673640

674641
address_of_aware_replace_symbolt replace_symbol{};
675-
replace_symbol.insert(*symbol_expr, *possible_value);
642+
replace_symbol.insert(*symbol_expr, replacement_expr);
676643
replace_symbol(modified_condition);
677644

678645
// This do_simplify() is needed for the following reason: if `condition` is

0 commit comments

Comments
 (0)