CBMC
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 
19 class ai_baset;
20 
22  full_array_abstract_objectt,
23  array_aggregate_typet>
24 {
25 public:
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 
85  visit_sub_elements(const abstract_object_visitort &visitor) const override;
86 
87 protected:
89 
102  const abstract_environmentt &env,
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(
127  abstract_object_visitedt &visited,
128  const abstract_environmentt &env,
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 
154 private:
156  const abstract_environmentt &env,
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<
195  mp_integer,
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,
209  const abstract_environmentt &env,
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,...
std::shared_ptr< const T > sharing_ptrt
Merge is designed to allow different abstractions to be merged gracefully.
#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
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
full_array_abstract_objectt(typet type, bool top, bool bottom)
Start the abstract object at either top or bottom or neither Asserts if both top and bottom are true.
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:94
A map implemented as a tree where subtrees can be shared between different maps.
Definition: sharing_map.h:190
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...