CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 <iosfwd>
16
18
19class ai_baset;
20
22 full_array_abstract_objectt,
23 array_aggregate_typet>
24{
25public:
31
39
46 const exprt &expr,
47 const abstract_environmentt &environment,
48 const namespacet &ns);
49
57 void output(std::ostream &out, const ai_baset &ai, const namespacet &ns)
58 const override;
59
69 write_location_context(const locationt &location) const override;
71 merge_location_context(const locationt &location) const override;
72
86
87protected:
89
103 const exprt &expr,
104 const namespacet &ns) const override;
105
118 abstract_environmentt &environment,
119 const namespacet &ns,
120 const std::stack<exprt> &stack,
121 const exprt &expr,
122 const abstract_object_pointert &value,
123 bool merging_write) const override;
124
125 void statistics(
129 const namespacet &ns) const override;
130
139 const abstract_object_pointert &other,
140 const widen_modet &widen_mode) const override;
141
148 bool verify() const override;
149
152 void set_top_internal() override;
153
154private:
157 const exprt &expr,
158 const namespacet &ns) const;
159
161 abstract_environmentt &environment,
162 const namespacet &ns,
163 const std::stack<exprt> &stack,
164 const exprt &expr,
165 const abstract_object_pointert &value,
166 bool merging_write) const;
167
169 abstract_environmentt &environment,
170 const namespacet &ns,
171 const std::stack<exprt> &stack,
172 const exprt &expr,
173 const abstract_object_pointert &value,
174 bool merging_write) const;
175
177 abstract_environmentt &environment,
178 const namespacet &ns,
179 const exprt &expr,
180 const abstract_object_pointert &value,
181 bool merging_write) const;
182
183 // Since we don't store for any index where the value is top
184 // we don't use a regular array but instead a map of array indices
185 // to the value at that index
187 {
188 size_t operator()(const mp_integer &i) const
189 {
190 return std::hash<BigInt::ullong_t>{}(i.to_ulong());
191 }
192 };
193
194 typedef sharing_mapt<
197 false,
198 mp_integer_hasht>
200
202
203 void map_put(
204 mp_integer index,
205 const abstract_object_pointert &value,
206 bool overrun);
208 mp_integer index,
210 const namespacet &ns) const;
211
221 get_top_entry(const abstract_environmentt &env, const namespacet &ns) const;
222
232 const full_array_pointert &other,
233 const widen_modet &widen_mode) const;
234
235 exprt to_predicate_internal(const exprt &name) const override;
236};
237
238#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:562
Base class for all expressions.
Definition expr.h:56
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...