Go to the documentation of this file.
38 const typet &new_type,
53 std::make_shared<constant_pointer_abstract_objectt>(
type,
top,
bottom));
63 std::make_shared<constant_pointer_abstract_objectt>(expr, environment, ns));
80 std::dynamic_pointer_cast<const abstract_pointer_objectt>(value);
81 results.
insert(pointer->read_dereference(env, ns));
84 return results.
first();
90 const std::stack<exprt> &stack,
92 bool merging_write)
const
96 environment.
havoc(
"Writing to a 2value pointer");
97 return shared_from_this();
103 std::dynamic_pointer_cast<const abstract_pointer_objectt>(value);
104 pointer->write_dereference(
105 environment, ns, stack, new_value, merging_write);
108 return shared_from_this();
112 const typet &new_type,
124 std::dynamic_pointer_cast<const abstract_pointer_objectt>(value);
125 new_values.
insert(pointer->typecast(new_type, environment, ns));
127 return std::make_shared<value_set_pointer_abstract_objectt>(
133 const std::vector<abstract_object_pointert> &operands,
138 std::dynamic_pointer_cast<const value_set_pointer_abstract_objectt>(
141 auto differences = std::vector<abstract_object_pointert>{};
145 auto lhsp = std::dynamic_pointer_cast<const abstract_pointer_objectt>(lhsv);
146 for(
auto const &rhsp : rhs->values)
148 auto ops = std::vector<abstract_object_pointert>{lhsp, rhsp};
149 differences.push_back(lhsp->ptr_diff(expr, ops, environment, ns));
153 return std::accumulate(
154 differences.cbegin(),
160 return abstract_objectt::merge(lhs, rhs, widen_modet::no).object;
166 const std::vector<abstract_object_pointert> &operands,
171 std::dynamic_pointer_cast<const value_set_pointer_abstract_objectt>(
174 auto comparisons = std::set<exprt>{};
178 auto lhsp = std::dynamic_pointer_cast<const abstract_pointer_objectt>(lhsv);
179 for(
auto const &rhsp : rhs->values)
181 auto ops = std::vector<abstract_object_pointert>{lhsp, rhsp};
182 auto comparison = lhsp->ptr_comparison_expr(expr, ops, environment, ns);
184 comparisons.insert(result);
188 if(comparisons.size() > 1)
190 return *comparisons.cbegin();
199 return shared_from_this();
203 auto result = std::dynamic_pointer_cast<value_set_pointer_abstract_objectt>(
212 result->set_values(unwrapped_values);
221 auto cast_other = std::dynamic_pointer_cast<const value_set_tag>(other);
224 auto union_values =
values;
225 union_values.
insert(cast_other->get_values());
233 const exprt &name)
const
242 std::back_inserter(all_predicates),
244 return value->to_predicate(name);
246 std::sort(all_predicates.begin(), all_predicates.end());
274 out <<
"value-set-begin: ";
278 out <<
" :value-set-end";
286 for(
auto const &value : values)
291 return unwrapped_values;
297 auto const &value_as_set = std::dynamic_pointer_cast<const value_set_tag>(
298 maybe_singleton->unwrap_context());
302 PRECONDITION(!std::dynamic_pointer_cast<const context_abstract_objectt>(
303 value_as_set->get_values().first()));
305 return value_as_set->get_values().first();
308 return maybe_singleton;
sharing_ptrt< class abstract_objectt > abstract_object_pointert
virtual bool is_top() const
Find out if the abstract object is top.
abstract_object_pointert typecast(const typet &new_type, const abstract_environmentt &environment, const namespacet &ns) const override
const_iterator begin() const
abstract_object_sett values
The type of an expression, extends irept.
static abstract_object_pointert transform(const exprt &expr, const std::vector< abstract_object_pointert > &operands, const abstract_environmentt &environment, const namespacet &ns)
virtual const typet & type() const
Get the real type of the variable this abstract object is representing.
abstract_object_pointert merge(const abstract_object_pointert &other, const widen_modet &widen_mode) const override
Merge two sets of constraints by appending to the first one.
abstract_object_pointert ptr_diff(const exprt &expr, const std::vector< abstract_object_pointert > &operands, const abstract_environmentt &environment, const namespacet &ns) const override
const_iterator end() const
Base class for all expressions.
static abstract_object_pointert maybe_extract_single_value(const abstract_object_pointert &maybe_singleton)
Helper for converting singleton value sets into its only value.
virtual void havoc(const std::string &havoc_string)
This should be used as a default case / everything else has failed The string is so that I can easily...
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
static combine_result merge(const abstract_object_pointert &op1, const abstract_object_pointert &op2, const locationt &merge_location, const widen_modet &widen_mode)
value_sett::size_type size() const
void set_values(const abstract_object_sett &other_values)
Setter for updating the stored values.
virtual abstract_object_pointert abstract_object_factory(const typet &type, const namespacet &ns, bool top, bool bottom) const
Look at the configuration for the sensitivity and create an appropriate abstract_object.
#define PRECONDITION(CONDITION)
void insert(const abstract_object_pointert &o)
abstract_object_pointert read_dereference(const abstract_environmentt &env, const namespacet &ns) const override
A helper function to read elements from an array.
abstract_object_pointert first() const
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
exprt simplify_expr(exprt src, const namespacet &ns)
std::vector< exprt > operandst
internal_abstract_object_pointert mutable_clone() const override
exprt ptr_comparison_expr(const exprt &expr, const std::vector< abstract_object_pointert > &operands, const abstract_environmentt &environment, const namespacet &ns) const override
static const size_t max_value_set_size
The threshold size for value-sets: past this threshold the object is either converted to interval or ...
static abstract_object_sett unwrap_and_extract_values(const abstract_object_sett &values)
value_set_pointer_abstract_objectt(const typet &type)
This is the basic interface of the abstract interpreter with default implementations of the core func...
void output(std::ostream &out, const ai_baset &ai, const namespacet &ns) const
bool is_void_pointer(const typet &type)
This method tests, if the given typet is a pointer of type void.
virtual bool is_bottom() const
Find out if the abstract object is bottom.
void output(std::ostream &out, const ai_baset &ai, const namespacet &ns) const override
abstract_object_pointert write_dereference(abstract_environmentt &environment, const namespacet &ns, const std::stack< exprt > &stack, const abstract_object_pointert &new_value, bool merging_write) const override
Evaluate writing to a pointer's value.
exprt to_predicate_internal(const exprt &name) const override
to_predicate implementation - derived classes will override
abstract_object_pointert resolve_values(const abstract_object_sett &new_values) const
Update the set of stored values to new_values.