CBMC
abstract_value_object.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3  Module: analyses variable-sensitivity
4 
5  Author: Jez Higgins, jez@jezuk.co.uk
6 
7 \*******************************************************************/
8 
12 #ifndef CPROVER_ANALYSES_VARIABLE_SENSITIVITY_ABSTRACT_VALUE_OBJECT_H
13 #define CPROVER_ANALYSES_VARIABLE_SENSITIVITY_ABSTRACT_VALUE_OBJECT_H
14 
16 
18 
20 {
21 };
22 
24 
26  std::unique_ptr<index_range_implementationt>;
27 
29 {
30 public:
31  virtual ~index_range_implementationt() = default;
32 
33  virtual index_range_implementation_ptrt reset() const = 0;
34 
35  virtual const exprt &current() const = 0;
36  virtual bool advance_to_next() = 0;
37 };
38 
40 {
41 public:
42  const exprt &operator*() const
43  {
44  return range->current();
45  }
46  void operator++()
47  {
48  active = range->advance_to_next();
49  }
50  bool operator==(const index_range_iteratort &other) const
51  {
52  if(!active && !other.active)
53  return true;
54  return false;
55  }
56  bool operator!=(const index_range_iteratort &other) const
57  {
58  return !operator==(other);
59  }
60 
62  : range(std::move(rhs.range)), active(rhs.active)
63  {
64  }
66  ~index_range_iteratort() = default;
67 
68 private:
69  index_range_iteratort() : range(nullptr), active(false)
70  {
71  }
73  : range(std::move(r)), active(true)
74  {
75  active = range->advance_to_next();
76  }
77 
79  bool active;
80 
81  friend class index_ranget;
82 };
83 
85 {
86 public:
88  {
89  }
90  index_ranget(index_ranget &&rhs) : range(rhs.range.release())
91  {
92  }
93  index_ranget(const index_ranget &) = delete;
94  ~index_ranget() = default;
95 
97  {
98  return index_range_iteratort{range->reset()};
99  }
101  {
102  return {};
103  }
104 
105 private:
107 };
108 
110 {
111 protected:
112  explicit single_value_index_ranget(const exprt &val);
113 
114 public:
115  const exprt &current() const override;
116  bool advance_to_next() override;
117 
118 protected:
119  const exprt value;
120 
121 private:
122  bool available;
123 };
124 
127 
129 
131  std::unique_ptr<value_range_implementationt>;
132 
134 {
135 public:
136  virtual ~value_range_implementationt() = default;
137 
138  virtual value_range_implementation_ptrt reset() const = 0;
139 
140  virtual const abstract_object_pointert &current() const = 0;
141  virtual bool advance_to_next() = 0;
142 };
143 
145 {
146 public:
148  {
149  return range->current();
150  }
151  void operator++()
152  {
153  active = range->advance_to_next();
154  }
155  bool operator==(const value_range_iteratort &other) const
156  {
157  if(!active && !other.active)
158  return true;
159  return false;
160  }
161  bool operator!=(const value_range_iteratort &other) const
162  {
163  return !operator==(other);
164  }
165 
167  : range(std::move(rhs.range)), active(rhs.active)
168  {
169  }
171  ~value_range_iteratort() = default;
172 
173 private:
174  value_range_iteratort() : range(nullptr), active(false)
175  {
176  }
178  : range(std::move(r)), active(true)
179  {
180  active = range->advance_to_next();
181  }
182 
184  bool active;
185 
186  friend class value_ranget;
187 };
188 
190 {
191 public:
193 
195  {
196  }
197  value_ranget(value_ranget &&rhs) : range(rhs.range.release())
198  {
199  }
200  value_ranget(const value_ranget &) = delete;
201  ~value_ranget() = default;
202 
204  {
205  return value_range_iteratort{range->reset()};
206  }
208  {
209  return {};
210  }
211 
212 private:
214 };
215 
218 
220 {
221 public:
222  const abstract_object_pointert &current() const override
223  {
224  return nothing;
225  }
226  bool advance_to_next() override
227  {
228  return false;
229  }
231  {
232  return util_make_unique<empty_value_ranget>();
233  }
234 
235 private:
237 };
238 
240  public abstract_value_tag
241 {
242 public:
244  {
245  }
246 
247  abstract_value_objectt(const typet &type, bool tp, bool bttm)
248  : abstract_objectt(type, tp, bttm)
249  {
250  }
251 
253  const exprt &expr,
254  const abstract_environmentt &environment,
255  const namespacet &ns)
256  : abstract_objectt(expr, environment, ns)
257  {
258  }
259 
261  {
263  }
264 
266  {
268  }
269 
270  virtual constant_interval_exprt to_interval() const = 0;
271 
285  const exprt &expr,
286  const std::vector<abstract_object_pointert> &operands,
287  const abstract_environmentt &environment,
288  const namespacet &ns) const final;
289 
291  constrain(const exprt &lower, const exprt &upper) const = 0;
292 
294  abstract_environmentt &environment,
295  const namespacet &ns,
296  const std::stack<exprt> &stack,
297  const exprt &specifier,
298  const abstract_object_pointert &value,
299  bool merging_write) const final;
300 
301 protected:
303 
312  const abstract_object_pointert &other,
313  const widen_modet &widen_mode) const final;
314 
316  meet(const abstract_object_pointert &other) const final;
317 
319  const abstract_value_pointert &other,
320  const widen_modet &widen_mode) const = 0;
321 
323  meet_with_value(const abstract_value_pointert &other) const = 0;
324 
326  index_range_implementation(const namespacet &ns) const = 0;
327 
329  value_range_implementation() const = 0;
330 
332  as_value(const abstract_object_pointert &obj) const;
333 };
334 
336 
337 #endif
widen_modet
widen_modet
Definition: abstract_environment.h:32
index_ranget
Definition: abstract_value_object.h:84
single_value_index_ranget
Definition: abstract_value_object.h:109
value_range_implementationt::reset
virtual value_range_implementation_ptrt reset() const =0
abstract_value_pointert
sharing_ptrt< const abstract_value_objectt > abstract_value_pointert
Definition: abstract_value_object.h:335
index_ranget::index_ranget
index_ranget(index_ranget &&rhs)
Definition: abstract_value_object.h:90
abstract_object_pointert
sharing_ptrt< class abstract_objectt > abstract_object_pointert
Definition: abstract_object.h:69
make_indeterminate_index_range
index_range_implementation_ptrt make_indeterminate_index_range()
Definition: abstract_value_object.cpp:81
abstract_value_objectt::value_range
value_ranget value_range() const
Definition: abstract_value_object.h:265
index_range_implementationt
Definition: abstract_value_object.h:28
make_empty_index_range
index_range_implementation_ptrt make_empty_index_range()
Definition: abstract_value_object.cpp:76
abstract_value_objectt::merge_with_value
virtual abstract_object_pointert merge_with_value(const abstract_value_pointert &other, const widen_modet &widen_mode) const =0
abstract_value_objectt::constrain
virtual sharing_ptrt< const abstract_value_objectt > constrain(const exprt &lower, const exprt &upper) const =0
typet
The type of an expression, extends irept.
Definition: type.h:28
empty_value_ranget
Definition: abstract_value_object.h:219
index_range_iteratort::operator++
void operator++()
Definition: abstract_value_object.h:46
abstract_objectt::type
virtual const typet & type() const
Get the real type of the variable this abstract object is representing.
Definition: abstract_object.cpp:47
value_range_iteratort::operator!=
bool operator!=(const value_range_iteratort &other) const
Definition: abstract_value_object.h:161
index_ranget::end
index_range_iteratort end() const
Definition: abstract_value_object.h:100
single_value_index_ranget::current
const exprt & current() const override
Definition: abstract_value_object.cpp:64
value_range_iteratort::operator++
void operator++()
Definition: abstract_value_object.h:151
value_range_iteratort::value_range_iteratort
value_range_iteratort(value_range_implementation_ptrt &&r)
Definition: abstract_value_object.h:177
empty_value_ranget::nothing
abstract_object_pointert nothing
Definition: abstract_value_object.h:236
index_range_iteratort::index_range_iteratort
index_range_iteratort()
Definition: abstract_value_object.h:69
abstract_environmentt
Definition: abstract_environment.h:40
exprt
Base class for all expressions.
Definition: expr.h:55
sharing_ptrt
std::shared_ptr< const T > sharing_ptrt
Merge is designed to allow different abstractions to be merged gracefully.
Definition: abstract_object.h:67
single_value_index_ranget::value
const exprt value
Definition: abstract_value_object.h:119
value_ranget::value_ranget
value_ranget(value_range_implementation_ptrt r)
Definition: abstract_value_object.h:194
value_range_iteratort::active
bool active
Definition: abstract_value_object.h:184
abstract_value_objectt::index_range_implementation
virtual index_range_implementation_ptrt index_range_implementation(const namespacet &ns) const =0
abstract_object.h
abstract_value_objectt::value_range_implementation
virtual value_range_implementation_ptrt value_range_implementation() const =0
constant_interval_exprt
Represents an interval of values.
Definition: interval.h:47
value_range_implementation_ptrt
std::unique_ptr< value_range_implementationt > value_range_implementation_ptrt
Definition: abstract_value_object.h:131
index_range_implementationt::advance_to_next
virtual bool advance_to_next()=0
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
abstract_value_objectt::abstract_value_objectt
abstract_value_objectt(const exprt &expr, const abstract_environmentt &environment, const namespacet &ns)
Definition: abstract_value_object.h:252
abstract_value_objectt::write
abstract_object_pointert write(abstract_environmentt &environment, const namespacet &ns, const std::stack< exprt > &stack, const exprt &specifier, const abstract_object_pointert &value, bool merging_write) const final
A helper function to evaluate writing to a component of an abstract object.
Definition: abstract_value_object.cpp:181
value_ranget::range
value_range_implementation_ptrt range
Definition: abstract_value_object.h:213
value_ranget::end
value_range_iteratort end() const
Definition: abstract_value_object.h:207
value_range_iteratort::value_range_iteratort
value_range_iteratort(value_range_iteratort &&rhs)
Definition: abstract_value_object.h:166
single_value_index_ranget::single_value_index_ranget
single_value_index_ranget(const exprt &val)
Definition: abstract_value_object.cpp:59
value_ranget::value_type
abstract_object_pointert value_type
Definition: abstract_value_object.h:192
value_range_iteratort::operator*
const abstract_object_pointert & operator*() const
Definition: abstract_value_object.h:147
abstract_value_tag
Definition: abstract_value_object.h:19
empty_value_ranget::current
const abstract_object_pointert & current() const override
Definition: abstract_value_object.h:222
index_range_iteratort::~index_range_iteratort
~index_range_iteratort()=default
abstract_value_objectt
Definition: abstract_value_object.h:239
value_range_iteratort
Definition: abstract_value_object.h:144
index_range_iteratort
Definition: abstract_value_object.h:39
index_range_iteratort::active
bool active
Definition: abstract_value_object.h:79
value_range_implementationt
Definition: abstract_value_object.h:133
index_range_implementationt::current
virtual const exprt & current() const =0
value_range_iteratort::value_range_iteratort
value_range_iteratort()
Definition: abstract_value_object.h:174
value_range_implementationt::advance_to_next
virtual bool advance_to_next()=0
abstract_value_objectt::as_value
sharing_ptrt< const abstract_value_objectt > as_value(const abstract_object_pointert &obj) const
Definition: abstract_value_object.cpp:697
abstract_value_objectt::meet_with_value
virtual abstract_object_pointert meet_with_value(const abstract_value_pointert &other) const =0
empty_value_ranget::reset
value_range_implementation_ptrt reset() const override
Definition: abstract_value_object.h:230
make_single_value_range
value_range_implementation_ptrt make_single_value_range(const abstract_object_pointert &value)
Definition: abstract_value_object.cpp:115
index_range_implementationt::reset
virtual index_range_implementation_ptrt reset() const =0
value_range_iteratort::operator==
bool operator==(const value_range_iteratort &other) const
Definition: abstract_value_object.h:155
index_range_iteratort::operator*
const exprt & operator*() const
Definition: abstract_value_object.h:42
index_range_iteratort::index_range_iteratort
index_range_iteratort(index_range_iteratort &&rhs)
Definition: abstract_value_object.h:61
index_range_iteratort::range
index_range_implementation_ptrt range
Definition: abstract_value_object.h:78
index_range_iteratort::operator==
bool operator==(const index_range_iteratort &other) const
Definition: abstract_value_object.h:50
empty_value_ranget::advance_to_next
bool advance_to_next() override
Definition: abstract_value_object.h:226
index_ranget::range
index_range_implementation_ptrt range
Definition: abstract_value_object.h:106
index_ranget::~index_ranget
~index_ranget()=default
abstract_value_objectt::expression_transform
abstract_object_pointert expression_transform(const exprt &expr, const std::vector< abstract_object_pointert > &operands, const abstract_environmentt &environment, const namespacet &ns) const final
Interface for transforms.
Definition: abstract_value_object.cpp:172
abstract_value_objectt::index_range
index_ranget index_range(const namespacet &ns) const
Definition: abstract_value_object.h:260
index_range_implementationt::~index_range_implementationt
virtual ~index_range_implementationt()=default
abstract_value_objectt::abstract_value_objectt
abstract_value_objectt(const typet &type, bool tp, bool bttm)
Definition: abstract_value_object.h:247
value_range_implementationt::~value_range_implementationt
virtual ~value_range_implementationt()=default
single_value_index_ranget::available
bool available
Definition: abstract_value_object.h:122
single_value_index_ranget::advance_to_next
bool advance_to_next() override
Definition: abstract_value_object.cpp:69
abstract_value_objectt::to_interval
virtual constant_interval_exprt to_interval() const =0
value_ranget::value_ranget
value_ranget(value_ranget &&rhs)
Definition: abstract_value_object.h:197
index_range_iteratort::index_range_iteratort
index_range_iteratort(index_range_implementation_ptrt &&r)
Definition: abstract_value_object.h:72
index_range_iteratort::operator!=
bool operator!=(const index_range_iteratort &other) const
Definition: abstract_value_object.h:56
abstract_value_objectt::merge
abstract_object_pointert merge(const abstract_object_pointert &other, const widen_modet &widen_mode) const final
Attempts to do a value/value merge if both are constants, otherwise falls back to the parent merge.
Definition: abstract_value_object.cpp:192
value_range_implementationt::current
virtual const abstract_object_pointert & current() const =0
value_range_iteratort::range
value_range_implementation_ptrt range
Definition: abstract_value_object.h:183
r
static int8_t r
Definition: irep_hash.h:60
index_ranget::begin
index_range_iteratort begin() const
Definition: abstract_value_object.h:96
index_range_implementation_ptrt
std::unique_ptr< index_range_implementationt > index_range_implementation_ptrt
Definition: abstract_value_object.h:26
abstract_objectt
Definition: abstract_object.h:72
abstract_value_objectt::abstract_value_pointert
sharing_ptrt< const abstract_value_objectt > abstract_value_pointert
Definition: abstract_value_object.h:302
index_ranget::index_ranget
index_ranget(index_range_implementation_ptrt r)
Definition: abstract_value_object.h:87
abstract_value_objectt::abstract_value_objectt
abstract_value_objectt(const typet &type)
Definition: abstract_value_object.h:243
abstract_value_objectt::meet
abstract_object_pointert meet(const abstract_object_pointert &other) const final
Base implementation of the meet operation: only used if no more precise abstraction can be used,...
Definition: abstract_value_object.cpp:205
value_ranget
Definition: abstract_value_object.h:189
value_range_iteratort::~value_range_iteratort
~value_range_iteratort()=default
value_ranget::~value_ranget
~value_ranget()=default
value_ranget::begin
value_range_iteratort begin() const
Definition: abstract_value_object.h:203