CBMC
pointer_predicates.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Various predicates over pointers in programs
4 
5 Author: 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 {
25  return pointer_object_exprt(p, size_type());
26 }
27 
28 exprt same_object(const exprt &p1, const exprt &p2)
29 {
30  return equal_exprt(pointer_object(p1), pointer_object(p2));
31 }
32 
33 exprt object_size(const exprt &pointer)
34 {
35  return object_size_exprt(pointer, size_type());
36 }
37 
38 exprt pointer_offset(const exprt &pointer)
39 {
40  return pointer_offset_exprt(pointer, signed_size_type());
41 }
42 
43 exprt 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 
51 exprt 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 
59 exprt good_pointer(const exprt &pointer)
60 {
61  return unary_exprt(ID_good_pointer, pointer, bool_typet());
62 }
63 
65  const exprt &pointer,
66  const namespacet &ns)
67 {
68  const pointer_typet &pointer_type = to_pointer_type(pointer.type());
69  const typet &dereference_type = pointer_type.base_type();
70 
71  const auto size_of_expr_opt = size_of_expr(dereference_type, ns);
72  CHECK_RETURN(size_of_expr_opt.has_value());
73 
74  const exprt good_dynamic = not_exprt{deallocated(pointer, ns)};
75 
76  const not_exprt not_null(null_pointer(pointer));
77 
78  const not_exprt not_invalid{is_invalid_pointer_exprt{pointer}};
79 
80  const and_exprt good_bounds{
82  not_exprt{object_upper_bound(pointer, size_of_expr_opt.value())}};
83 
84  return and_exprt(not_null, not_invalid, good_dynamic, good_bounds);
85 }
86 
87 exprt null_object(const exprt &pointer)
88 {
90  return same_object(null_pointer, pointer);
91 }
92 
93 exprt integer_address(const exprt &pointer)
94 {
96  return and_exprt(same_object(null_pointer, pointer),
97  notequal_exprt(null_pointer, pointer));
98 }
99 
100 exprt null_pointer(const exprt &pointer)
101 {
103  return same_object(pointer, null_pointer);
104 }
105 
107  const exprt &pointer,
108  const exprt &access_size)
109 {
110  // this is
111  // POINTER_OFFSET(p)+access_size>OBJECT_SIZE(pointer)
112 
113  exprt object_size_expr=object_size(pointer);
114 
115  exprt object_offset=pointer_offset(pointer);
116 
117  // need to add size
118  irep_idt op=ID_ge;
119  exprt sum=object_offset;
120 
121  if(access_size.is_not_nil())
122  {
123  op=ID_gt;
124 
125  sum = plus_exprt(
126  typecast_exprt::conditional_cast(object_offset, access_size.type()),
127  access_size);
128  }
129 
130  return binary_relation_exprt(
131  typecast_exprt::conditional_cast(sum, object_size_expr.type()),
132  op,
133  object_size_expr);
134 }
135 
137  const exprt &pointer,
138  const exprt &offset)
139 {
140  exprt p_offset=pointer_offset(pointer);
141 
142  exprt zero=from_integer(0, p_offset.type());
143 
144  if(offset.is_not_nil())
145  {
146  p_offset = plus_exprt(
147  p_offset, typecast_exprt::conditional_cast(offset, p_offset.type()));
148  }
149 
150  return binary_relation_exprt(std::move(p_offset), ID_lt, std::move(zero));
151 }
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
pointer_offset_size.h
typecast_exprt::conditional_cast
static exprt conditional_cast(const exprt &expr, const typet &type)
Definition: std_expr.h:2025
pointer_object
exprt pointer_object(const exprt &p)
Definition: pointer_predicates.cpp:23
arith_tools.h
good_pointer_def
exprt good_pointer_def(const exprt &pointer, const namespacet &ns)
Definition: pointer_predicates.cpp:64
null_pointer
exprt null_pointer(const exprt &pointer)
Definition: pointer_predicates.cpp:100
CHECK_RETURN
#define CHECK_RETURN(CONDITION)
Definition: invariant.h:495
typet
The type of an expression, extends irept.
Definition: type.h:28
pointer_predicates.h
and_exprt
Boolean AND.
Definition: std_expr.h:2070
plus_exprt
The plus expression Associativity is not specified.
Definition: std_expr.h:946
exprt
Base class for all expressions.
Definition: expr.h:55
unary_exprt
Generic base class for unary expressions.
Definition: std_expr.h:313
good_pointer
exprt good_pointer(const exprt &pointer)
Definition: pointer_predicates.cpp:59
bool_typet
The Boolean type.
Definition: std_types.h:35
namespace.h
object_size_exprt
Expression for finding the size (in bytes) of the object a pointer points to.
Definition: pointer_expr.h:1006
equal_exprt
Equality.
Definition: std_expr.h:1305
notequal_exprt
Disequality.
Definition: std_expr.h:1364
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
namespacet::lookup
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See documentation for namespace_baset::lookup().
Definition: namespace.cpp:138
irept::is_not_nil
bool is_not_nil() const
Definition: irep.h:380
null_pointer_exprt
The null pointer constant.
Definition: pointer_expr.h:734
nil_exprt
The NIL expression.
Definition: std_expr.h:3025
object_upper_bound
exprt object_upper_bound(const exprt &pointer, const exprt &access_size)
Definition: pointer_predicates.cpp:106
symbolt::symbol_expr
class symbol_exprt symbol_expr() const
Produces a symbol_exprt for a symbol.
Definition: symbol.cpp:121
pointer_expr.h
deallocated
exprt deallocated(const exprt &pointer, const namespacet &ns)
Definition: pointer_predicates.cpp:43
signed_size_type
signedbv_typet signed_size_type()
Definition: c_types.cpp:84
dead_object
exprt dead_object(const exprt &pointer, const namespacet &ns)
Definition: pointer_predicates.cpp:51
to_pointer_type
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Definition: pointer_expr.h:79
integer_address
exprt integer_address(const exprt &pointer)
Definition: pointer_predicates.cpp:93
pointer_object_exprt
A numerical identifier for the object a pointer points to.
Definition: pointer_expr.h:947
pointer_type
pointer_typet pointer_type(const typet &subtype)
Definition: c_types.cpp:253
symbol.h
Symbol table entry.
object_size
exprt object_size(const exprt &pointer)
Definition: pointer_predicates.cpp:33
cprover_prefix.h
object_lower_bound
exprt object_lower_bound(const exprt &pointer, const exprt &offset)
Definition: pointer_predicates.cpp:136
pointer_offset
exprt pointer_offset(const exprt &pointer)
Definition: pointer_predicates.cpp:38
null_object
exprt null_object(const exprt &pointer)
Definition: pointer_predicates.cpp:87
pointer_offset_exprt
The offset (in bytes) of a pointer relative to the object.
Definition: pointer_expr.h:889
symbolt
Symbol table entry.
Definition: symbol.h:27
from_integer
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
Definition: arith_tools.cpp:100
binary_relation_exprt
A base class for relations, i.e., binary predicates whose two operands have the same type.
Definition: std_expr.h:706
pointer_typet::base_type
const typet & base_type() const
The type of the data what we point to.
Definition: pointer_expr.h:35
CPROVER_PREFIX
#define CPROVER_PREFIX
Definition: cprover_prefix.h:14
same_object
exprt same_object(const exprt &p1, const exprt &p2)
Definition: pointer_predicates.cpp:28
size_of_expr
optionalt< exprt > size_of_expr(const typet &type, const namespacet &ns)
Definition: pointer_offset_size.cpp:280
is_invalid_pointer_exprt
Definition: pointer_predicates.h:37
pointer_typet
The pointer type These are both 'bitvector_typet' (they have a width) and 'type_with_subtypet' (they ...
Definition: pointer_expr.h:23
size_type
unsignedbv_typet size_type()
Definition: c_types.cpp:68
std_expr.h
c_types.h
not_exprt
Boolean negation.
Definition: std_expr.h:2277