CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
pointer_predicates.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Various predicates over pointers in programs
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
11
12#include "pointer_predicates.h"
13
14#include "arith_tools.h"
15#include "c_types.h"
16#include "cprover_prefix.h"
17#include "namespace.h"
18#include "pointer_expr.h"
19#include "pointer_offset_size.h"
20#include "std_expr.h"
21#include "symbol.h"
22
24{
26}
27
32
33exprt object_size(const exprt &pointer)
34{
35 return object_size_exprt(pointer, size_type());
36}
37
38exprt pointer_offset(const exprt &pointer)
39{
40 return pointer_offset_exprt(pointer, size_type());
41}
42
43exprt deallocated(const exprt &pointer, const namespacet &ns)
44{
45 // we check __CPROVER_deallocated!
46 const symbolt &deallocated_symbol=ns.lookup(CPROVER_PREFIX "deallocated");
47
48 return same_object(pointer, deallocated_symbol.symbol_expr());
49}
50
51exprt dead_object(const exprt &pointer, const namespacet &ns)
52{
53 // we check __CPROVER_dead_object!
54 const symbolt &deallocated_symbol=ns.lookup(CPROVER_PREFIX "dead_object");
55
56 return same_object(pointer, deallocated_symbol.symbol_expr());
57}
58
59exprt null_object(const exprt &pointer)
60{
62 return same_object(null_pointer, pointer);
63}
64
71
73 const exprt &pointer,
74 const exprt &access_size)
75{
77
79
80 std::size_t max_width = std::max(
81 to_bitvector_type(object_offset.type()).get_width(),
82 to_bitvector_type(object_size_expr.type()).get_width());
83
84 // We add the size to the offset, if given.
85 if(access_size.is_not_nil())
86 {
87 // This is
88 // POINTER_OFFSET(p)+access_size>OBJECT_SIZE(pointer)
89 // We enlarge all bit-vectors to avoid an overflow on the addition.
90
91 max_width =
92 std::max(max_width, to_bitvector_type(access_size.type()).get_width());
93
94 auto type = unsignedbv_typet(max_width + 1);
95
96 auto sum = plus_exprt(
99
102 }
103 else
104 {
105 // This is
106 // POINTER_OFFSET(p)>=OBJECT_SIZE(pointer)
107
108 auto type = unsignedbv_typet(max_width);
109
112 ID_ge,
114 }
115}
116
118 const exprt &pointer,
119 const exprt &offset)
120{
122
123 exprt zero=from_integer(0, p_offset.type());
124
125 if(offset.is_not_nil())
126 {
129 }
130
131 return binary_relation_exprt(std::move(p_offset), ID_lt, std::move(zero));
132}
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
const bitvector_typet & to_bitvector_type(const typet &type)
Cast a typet to a bitvector_typet.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
Boolean AND.
Definition std_expr.h:2125
A base class for relations, i.e., binary predicates whose two operands have the same type.
Definition std_expr.h:762
Equality.
Definition std_expr.h:1366
Base class for all expressions.
Definition expr.h:56
typet & type()
Return the type of the expression.
Definition expr.h:84
bool is_not_nil() const
Definition irep.h:372
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See documentation for namespace_baset::lookup().
Disequality.
Definition std_expr.h:1425
The null pointer constant.
Expression for finding the size (in bytes) of the object a pointer points to.
The plus expression Associativity is not specified.
Definition std_expr.h:1002
A numerical identifier for the object a pointer points to.
The offset (in bytes) of a pointer relative to the object.
Symbol table entry.
Definition symbol.h:28
static exprt conditional_cast(const exprt &expr, const typet &type)
Definition std_expr.h:2081
Fixed-width bit-vector with unsigned binary interpretation.
#define CPROVER_PREFIX
API to expression classes for Pointers.
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Pointer Logic.
exprt pointer_offset(const exprt &pointer)
exprt integer_address(const exprt &pointer)
exprt deallocated(const exprt &pointer, const namespacet &ns)
exprt object_size(const exprt &pointer)
exprt object_upper_bound(const exprt &pointer, const exprt &access_size)
exprt dead_object(const exprt &pointer, const namespacet &ns)
exprt same_object(const exprt &p1, const exprt &p2)
exprt null_object(const exprt &pointer)
exprt pointer_object(const exprt &p)
exprt object_lower_bound(const exprt &pointer, const exprt &offset)
Various predicates over pointers in programs.
API to expression classes.
Symbol table entry.
#define size_type
Definition unistd.c:186