cprover
pointer_arithmetic.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 #include "pointer_arithmetic.h"
10 
11 #include <util/arith_tools.h>
12 #include <util/std_expr.h>
13 
15 {
16  pointer.make_nil();
17  offset.make_nil();
18  read(src);
19 }
20 
22 {
23  if(src.id()==ID_plus)
24  {
25  forall_operands(it, src)
26  {
27  if(it->type().id()==ID_pointer)
28  read(*it);
29  else
30  add_to_offset(*it);
31  }
32  }
33  else if(src.id()==ID_minus)
34  {
35  auto const &minus_src = to_minus_expr(src);
36  read(minus_src.op0());
37  const unary_minus_exprt unary_minus(
38  minus_src.op1(), minus_src.op1().type());
39  add_to_offset(unary_minus);
40  }
41  else if(src.id()==ID_address_of)
42  {
43  auto const &address_of_src = to_address_of_expr(src);
44  if(address_of_src.op().id() == ID_index)
45  {
46  const index_exprt &index_expr = to_index_expr(address_of_src.op());
47 
48  if(index_expr.index().is_zero())
49  make_pointer(address_of_src);
50  else
51  {
52  add_to_offset(index_expr.index());
53  // produce &x[0] + i instead of &x[i]
54  auto new_address_of_src = address_of_src;
55  to_index_expr(new_address_of_src.op()).index() =
56  from_integer(0, index_expr.index().type());
57  make_pointer(new_address_of_src);
58  }
59  }
60  else
61  make_pointer(address_of_src);
62  }
63  else
64  make_pointer(src);
65 }
66 
68 {
69  if(offset.is_nil())
70  offset=src;
71  else if(offset.id()==ID_plus)
73  else
74  {
75  offset =
77  }
78 }
79 
81 {
82  if(pointer.is_nil())
83  pointer=src;
84  else
85  add_to_offset(src);
86 }
exprt::copy_to_operands
void copy_to_operands(const exprt &expr)
Copy the given argument to the end of exprt's operands.
Definition: expr.h:150
typecast_exprt::conditional_cast
static exprt conditional_cast(const exprt &expr, const typet &type)
Definition: std_expr.h:2021
arith_tools.h
pointer_arithmetic.h
irept::make_nil
void make_nil()
Definition: irep.h:475
to_index_expr
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
Definition: std_expr.h:1347
pointer_arithmetict::pointer
exprt pointer
Definition: pointer_arithmetic.h:17
plus_exprt
The plus expression Associativity is not specified.
Definition: std_expr.h:881
exprt
Base class for all expressions.
Definition: expr.h:53
to_minus_expr
const minus_exprt & to_minus_expr(const exprt &expr)
Cast an exprt to a minus_exprt.
Definition: std_expr.h:965
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:81
pointer_arithmetict::add_to_offset
void add_to_offset(const exprt &src)
Definition: pointer_arithmetic.cpp:67
to_address_of_expr
const address_of_exprt & to_address_of_expr(const exprt &expr)
Cast an exprt to an address_of_exprt.
Definition: std_expr.h:2823
forall_operands
#define forall_operands(it, expr)
Definition: expr.h:18
index_exprt::index
exprt & index()
Definition: std_expr.h:1319
unary_minus_exprt
The unary minus expression.
Definition: std_expr.h:378
pointer_arithmetict::offset
exprt offset
Definition: pointer_arithmetic.h:17
pointer_arithmetict::read
void read(const exprt &src)
Definition: pointer_arithmetic.cpp:21
irept::is_nil
bool is_nil() const
Definition: irep.h:398
irept::id
const irep_idt & id() const
Definition: irep.h:418
exprt::is_zero
bool is_zero() const
Return whether the expression is a constant representing 0.
Definition: expr.cpp:132
from_integer
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
Definition: arith_tools.cpp:99
pointer_arithmetict::make_pointer
void make_pointer(const exprt &src)
Definition: pointer_arithmetic.cpp:80
index_exprt
Array index operator.
Definition: std_expr.h:1293
std_expr.h
API to expression classes.
pointer_arithmetict::pointer_arithmetict
pointer_arithmetict(const exprt &src)
Definition: pointer_arithmetic.cpp:14