CBMC
Loading...
Searching...
No Matches
full_array_abstract_object.h
Go to the documentation of this file.
1/*******************************************************************\
2
3 Module: Variable Sensitivity
4
5 Author: Thomas Kiley, thomas.kiley@diffblue.com
6
7\*******************************************************************/
8
11
12#ifndef CPROVER_ANALYSES_VARIABLE_SENSITIVITY_FULL_ARRAY_ABSTRACT_OBJECT_H
13#define CPROVER_ANALYSES_VARIABLE_SENSITIVITY_FULL_ARRAY_ABSTRACT_OBJECT_H
14
15#include <util/mp_arith.h>
16
18
19#include <iosfwd>
20
21class ai_baset;
22
24 full_array_abstract_objectt,
25 array_aggregate_typet>
26{
27public:
33
41
48 const exprt &expr,
49 const abstract_environmentt &environment,
50 const namespacet &ns);
51
59 void output(std::ostream &out, const ai_baset &ai, const namespacet &ns)
60 const override;
61
71 write_location_context(const locationt &location) const override;
73 merge_location_context(const locationt &location) const override;
74
88
89protected:
91
105 const exprt &expr,
106 const namespacet &ns) const override;
107
120 abstract_environmentt &environment,
121 const namespacet &ns,
122 const std::stack<exprt> &stack,
123 const exprt &expr,
124 const abstract_object_pointert &value,
125 bool merging_write) const override;
126
127 void statistics(
131 const namespacet &ns) const override;
132
141 const abstract_object_pointert &other,
142 const widen_modet &widen_mode) const override;
143
150 bool verify() const override;
151
154 void set_top_internal() override;
155
156private:
159 const exprt &expr,
160 const namespacet &ns) const;
161
163 abstract_environmentt &environment,
164 const namespacet &ns,
165 const std::stack<exprt> &stack,
166 const exprt &expr,
167 const abstract_object_pointert &value,
168 bool merging_write) const;
169
171 abstract_environmentt &environment,
172 const namespacet &ns,
173 const std::stack<exprt> &stack,
174 const exprt &expr,
175 const abstract_object_pointert &value,
176 bool merging_write) const;
177
179 abstract_environmentt &environment,
180 const namespacet &ns,
181 const exprt &expr,
182 const abstract_object_pointert &value,
183 bool merging_write) const;
184
185 // Since we don't store for any index where the value is top
186 // we don't use a regular array but instead a map of array indices
187 // to the value at that index
189 {
190 size_t operator()(const mp_integer &i) const
191 {
192 return std::hash<BigInt::ullong_t>{}(i.to_ulong());
193 }
194 };
195
196 typedef sharing_mapt<
199 false,
200 mp_integer_hasht>
202
204
205 void map_put(
206 mp_integer index,
207 const abstract_object_pointert &value,
208 bool overrun);
210 mp_integer index,
212 const namespacet &ns) const;
213
223 get_top_entry(const abstract_environmentt &env, const namespacet &ns) const;
224
234 const full_array_pointert &other,
235 const widen_modet &widen_mode) const;
236
237 exprt to_predicate_internal(const exprt &name) const override;
238};
239
240#endif // CPROVER_ANALYSES_VARIABLE_SENSITIVITY_FULL_ARRAY_ABSTRACT_OBJECT_H
Common behaviour for abstract objects modelling aggregate values - arrays, structs,...
#define CLONE
std::set< abstract_object_pointert > abstract_object_visitedt
sharing_ptrt< class abstract_objectt > abstract_object_pointert
goto_programt::const_targett locationt
virtual const typet & type() const
Get the real type of the variable this abstract object is representing.
This is the basic interface of the abstract interpreter with default implementations of the core func...
Definition ai.h:117
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:566
Base class for all expressions.
Definition expr.h:57
abstract_object_pointert merge(const abstract_object_pointert &other, const widen_modet &widen_mode) const override
Tries to do an array/array merge if merging with a constant array If it can't, falls back to parent m...
void map_put(mp_integer index, const abstract_object_pointert &value, bool overrun)
exprt to_predicate_internal(const exprt &name) const override
to_predicate implementation - derived classes will override
void output(std::ostream &out, const ai_baset &ai, const namespacet &ns) const override
the current known value about this object.
abstract_object_pointert get_top_entry(const abstract_environmentt &env, const namespacet &ns) const
Short hand method for creating a top element of the array.
abstract_object_pointert map_find_or_top(mp_integer index, const abstract_environmentt &env, const namespacet &ns) const
abstract_object_pointert write_element(abstract_environmentt &environment, const namespacet &ns, const std::stack< exprt > &stack, const exprt &expr, const abstract_object_pointert &value, bool merging_write) const
bool verify() const override
To validate that the struct object is in a valid state.
abstract_object_pointert read_component(const abstract_environmentt &env, const exprt &expr, const namespacet &ns) const override
A helper function to read elements from an array.
abstract_object_pointert merge_location_context(const locationt &location) const override
Update the merge location context for an abstract object.
void set_top_internal() override
Perform any additional structural modifications when setting this object to TOP.
abstract_object_pointert full_array_merge(const full_array_pointert &other, const widen_modet &widen_mode) const
Merges an array into this array.
abstract_object_pointert write_component(abstract_environmentt &environment, const namespacet &ns, const std::stack< exprt > &stack, const exprt &expr, const abstract_object_pointert &value, bool merging_write) const override
A helper function to evaluate writing to a index of an array.
abstract_object_pointert visit_sub_elements(const abstract_object_visitort &visitor) const override
Apply a visitor operation to all sub elements of this abstract_object.
abstract_aggregate_objectt< full_array_abstract_objectt, array_aggregate_typet > abstract_aggregate_baset
abstract_object_pointert read_element(const abstract_environmentt &env, const exprt &expr, const namespacet &ns) const
abstract_object_pointert write_leaf_element(abstract_environmentt &environment, const namespacet &ns, const exprt &expr, const abstract_object_pointert &value, bool merging_write) const
abstract_object_pointert write_sub_element(abstract_environmentt &environment, const namespacet &ns, const std::stack< exprt > &stack, const exprt &expr, const abstract_object_pointert &value, bool merging_write) const
abstract_object_pointert write_location_context(const locationt &location) const override
Update the location context for an abstract object.
void statistics(abstract_object_statisticst &statistics, abstract_object_visitedt &visited, const abstract_environmentt &env, const namespacet &ns) const override
sharing_ptrt< full_array_abstract_objectt > const full_array_pointert
sharing_mapt< mp_integer, abstract_object_pointert, false, mp_integer_hasht > shared_array_mapt
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
A map implemented as a tree where subtrees can be shared between different maps.
The type of an expression, extends irept.
Definition type.h:29
BigInt mp_integer
Definition smt_terms.h:17
Pure virtual interface required of a client that can apply a copy-on-write operation to a given abstr...