cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
local_bitvector_analysis.h
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module: Field-insensitive, location-sensitive bitvector analysis
4
5
Author: Daniel Kroening, kroening@kroening.com
6
7
\*******************************************************************/
8
11
12
#ifndef CPROVER_ANALYSES_LOCAL_BITVECTOR_ANALYSIS_H
13
#define CPROVER_ANALYSES_LOCAL_BITVECTOR_ANALYSIS_H
14
15
#include <
util/expanding_vector.h
>
16
#include <
util/numbering.h
>
17
18
#include "
locals.h
"
19
#include "
dirty.h
"
20
#include "
local_cfg.h
"
21
22
class
local_bitvector_analysist
23
{
24
public
:
25
typedef
goto_functionst::goto_functiont
goto_functiont
;
26
27
local_bitvector_analysist
(
28
const
goto_functiont
&_goto_function,
29
const
namespacet
&
ns
)
30
:
dirty
(_goto_function),
31
locals
(_goto_function),
32
cfg
(_goto_function.body),
33
ns
(
ns
)
34
{
35
build
();
36
}
37
38
void
output
(
39
std::ostream &out,
40
const
goto_functiont
&goto_function,
41
const
namespacet
&
ns
)
const
;
42
43
dirtyt
dirty
;
44
localst
locals
;
45
local_cfgt
cfg
;
46
47
// categories of things one can point to
48
struct
flagst
49
{
50
flagst
():
bits
(0)
51
{
52
}
53
54
void
clear
()
55
{
56
bits
=0;
57
}
58
59
// the bits for the "bitvector analysis"
60
enum
bitst
61
{
62
B_unknown
=1<<0,
63
B_uninitialized
=1<<1,
64
B_uses_offset
=1<<2,
65
B_dynamic_local
=1<<3,
66
B_dynamic_heap
=1<<4,
67
B_null
=1<<5,
68
B_static_lifetime
=1<<6,
69
B_integer_address
=1<<7
70
};
71
72
explicit
flagst
(
const
bitst
_bits):
bits
(_bits)
73
{
74
}
75
76
unsigned
bits
;
77
78
bool
merge
(
const
flagst
&other)
79
{
80
unsigned
old=
bits
;
81
bits
|=other.
bits
;
// bit-wise or
82
return
old!=
bits
;
83
}
84
85
static
flagst
mk_unknown
()
86
{
87
return
flagst
(
B_unknown
);
88
}
89
90
bool
is_unknown
()
const
91
{
92
return
(
bits
&
B_unknown
)!=0;
93
}
94
95
static
flagst
mk_uninitialized
()
96
{
97
return
flagst
(
B_uninitialized
);
98
}
99
100
bool
is_uninitialized
()
const
101
{
102
return
(
bits
&
B_uninitialized
)!=0;
103
}
104
105
static
flagst
mk_uses_offset
()
106
{
107
return
flagst
(
B_uses_offset
);
108
}
109
110
bool
is_uses_offset
()
const
111
{
112
return
(
bits
&
B_uses_offset
)!=0;
113
}
114
115
static
flagst
mk_dynamic_local
()
116
{
117
return
flagst
(
B_dynamic_local
);
118
}
119
120
bool
is_dynamic_local
()
const
121
{
122
return
(
bits
&
B_dynamic_local
)!=0;
123
}
124
125
static
flagst
mk_dynamic_heap
()
126
{
127
return
flagst
(
B_dynamic_heap
);
128
}
129
130
bool
is_dynamic_heap
()
const
131
{
132
return
(
bits
&
B_dynamic_heap
)!=0;
133
}
134
135
static
flagst
mk_null
()
136
{
137
return
flagst
(
B_null
);
138
}
139
140
bool
is_null
()
const
141
{
142
return
(
bits
&
B_null
)!=0;
143
}
144
145
static
flagst
mk_static_lifetime
()
146
{
147
return
flagst
(
B_static_lifetime
);
148
}
149
150
bool
is_static_lifetime
()
const
151
{
152
return
(
bits
&
B_static_lifetime
)!=0;
153
}
154
155
static
flagst
mk_integer_address
()
156
{
157
return
flagst
(
B_integer_address
);
158
}
159
160
bool
is_integer_address
()
const
161
{
162
return
(
bits
&
B_integer_address
)!=0;
163
}
164
165
void
print
(std::ostream &)
const
;
166
167
flagst
operator|
(
const
flagst
other)
const
168
{
169
flagst
result(*
this
);
170
result.
bits
|=other.
bits
;
171
return
result;
172
}
173
};
174
175
flagst
get
(
176
const
goto_programt::const_targett
t,
177
const
exprt
&src);
178
179
protected
:
180
const
namespacet
&
ns
;
181
void
build
();
182
183
numberingt<irep_idt>
pointers
;
184
185
// pointers -> flagst
186
// This is a vector, so it's fast.
187
typedef
expanding_vectort<flagst>
points_tot
;
188
189
static
bool
merge
(
points_tot
&a,
points_tot
&b);
190
191
typedef
std::vector<points_tot>
loc_infost
;
192
loc_infost
loc_infos
;
193
194
void
assign_lhs
(
195
const
exprt
&lhs,
196
const
exprt
&rhs,
197
points_tot
&loc_info_src,
198
points_tot
&loc_info_dest);
199
200
flagst
get_rec
(
201
const
exprt
&rhs,
202
points_tot
&loc_info_src);
203
204
bool
is_tracked
(
const
irep_idt
&identifier);
205
};
206
207
inline
std::ostream &
operator<<
(
208
std::ostream &out,
209
const
local_bitvector_analysist::flagst
&flags)
210
{
211
flags.
print
(out);
212
return
out;
213
}
214
215
#endif
// CPROVER_ANALYSES_LOCAL_BITVECTOR_ANALYSIS_H
dirtyt
Dirty variables are ones which have their address taken so we can't reliably work out where they may ...
Definition
dirty.h:28
expanding_vectort
Definition
expanding_vector.h:17
exprt
Base class for all expressions.
Definition
expr.h:57
goto_functionst::goto_functiont
::goto_functiont goto_functiont
Definition
goto_functions.h:27
goto_functiont
A goto function, consisting of function body (see body) and parameter identifiers (see parameter_iden...
Definition
goto_function.h:24
goto_programt::const_targett
instructionst::const_iterator const_targett
Definition
goto_program.h:614
local_bitvector_analysist::loc_infos
loc_infost loc_infos
Definition
local_bitvector_analysis.h:192
local_bitvector_analysist::loc_infost
std::vector< points_tot > loc_infost
Definition
local_bitvector_analysis.h:191
local_bitvector_analysist::dirty
dirtyt dirty
Definition
local_bitvector_analysis.h:43
local_bitvector_analysist::locals
localst locals
Definition
local_bitvector_analysis.h:44
local_bitvector_analysist::ns
const namespacet & ns
Definition
local_bitvector_analysis.h:180
local_bitvector_analysist::points_tot
expanding_vectort< flagst > points_tot
Definition
local_bitvector_analysis.h:187
local_bitvector_analysist::merge
static bool merge(points_tot &a, points_tot &b)
Definition
local_bitvector_analysis.cpp:41
local_bitvector_analysist::goto_functiont
goto_functionst::goto_functiont goto_functiont
Definition
local_bitvector_analysis.h:25
local_bitvector_analysist::local_bitvector_analysist
local_bitvector_analysist(const goto_functiont &_goto_function, const namespacet &ns)
Definition
local_bitvector_analysis.h:27
local_bitvector_analysist::build
void build()
Definition
local_bitvector_analysis.cpp:237
local_bitvector_analysist::get
flagst get(const goto_programt::const_targett t, const exprt &src)
Definition
local_bitvector_analysis.cpp:102
local_bitvector_analysist::output
void output(std::ostream &out, const goto_functiont &goto_function, const namespacet &ns) const
Definition
local_bitvector_analysis.cpp:343
local_bitvector_analysist::get_rec
flagst get_rec(const exprt &rhs, points_tot &loc_info_src)
Definition
local_bitvector_analysis.cpp:112
local_bitvector_analysist::assign_lhs
void assign_lhs(const exprt &lhs, const exprt &rhs, points_tot &loc_info_src, points_tot &loc_info_dest)
Definition
local_bitvector_analysis.cpp:62
local_bitvector_analysist::is_tracked
bool is_tracked(const irep_idt &identifier)
Definition
local_bitvector_analysis.cpp:55
local_bitvector_analysist::pointers
numberingt< irep_idt > pointers
Definition
local_bitvector_analysis.h:183
local_bitvector_analysist::cfg
local_cfgt cfg
Definition
local_bitvector_analysis.h:45
local_cfgt
Definition
local_cfg.h:20
localst
Definition
locals.h:25
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition
namespace.h:91
numberingt
Definition
numbering.h:22
dirty.h
Variables whose address is taken.
expanding_vector.h
operator<<
std::ostream & operator<<(std::ostream &out, const local_bitvector_analysist::flagst &flags)
Definition
local_bitvector_analysis.h:207
local_cfg.h
CFG for One Function.
locals.h
Local variables whose address is taken.
numbering.h
local_bitvector_analysist::flagst
Definition
local_bitvector_analysis.h:49
local_bitvector_analysist::flagst::mk_uses_offset
static flagst mk_uses_offset()
Definition
local_bitvector_analysis.h:105
local_bitvector_analysist::flagst::mk_integer_address
static flagst mk_integer_address()
Definition
local_bitvector_analysis.h:155
local_bitvector_analysist::flagst::mk_dynamic_heap
static flagst mk_dynamic_heap()
Definition
local_bitvector_analysis.h:125
local_bitvector_analysist::flagst::operator|
flagst operator|(const flagst other) const
Definition
local_bitvector_analysis.h:167
local_bitvector_analysist::flagst::mk_static_lifetime
static flagst mk_static_lifetime()
Definition
local_bitvector_analysis.h:145
local_bitvector_analysist::flagst::mk_unknown
static flagst mk_unknown()
Definition
local_bitvector_analysis.h:85
local_bitvector_analysist::flagst::mk_dynamic_local
static flagst mk_dynamic_local()
Definition
local_bitvector_analysis.h:115
local_bitvector_analysist::flagst::is_static_lifetime
bool is_static_lifetime() const
Definition
local_bitvector_analysis.h:150
local_bitvector_analysist::flagst::is_dynamic_local
bool is_dynamic_local() const
Definition
local_bitvector_analysis.h:120
local_bitvector_analysist::flagst::print
void print(std::ostream &) const
Definition
local_bitvector_analysis.cpp:21
local_bitvector_analysist::flagst::is_dynamic_heap
bool is_dynamic_heap() const
Definition
local_bitvector_analysis.h:130
local_bitvector_analysist::flagst::bitst
bitst
Definition
local_bitvector_analysis.h:61
local_bitvector_analysist::flagst::B_uninitialized
@ B_uninitialized
Definition
local_bitvector_analysis.h:63
local_bitvector_analysist::flagst::B_static_lifetime
@ B_static_lifetime
Definition
local_bitvector_analysis.h:68
local_bitvector_analysist::flagst::B_unknown
@ B_unknown
Definition
local_bitvector_analysis.h:62
local_bitvector_analysist::flagst::B_dynamic_heap
@ B_dynamic_heap
Definition
local_bitvector_analysis.h:66
local_bitvector_analysist::flagst::B_uses_offset
@ B_uses_offset
Definition
local_bitvector_analysis.h:64
local_bitvector_analysist::flagst::B_dynamic_local
@ B_dynamic_local
Definition
local_bitvector_analysis.h:65
local_bitvector_analysist::flagst::B_integer_address
@ B_integer_address
Definition
local_bitvector_analysis.h:69
local_bitvector_analysist::flagst::B_null
@ B_null
Definition
local_bitvector_analysis.h:67
local_bitvector_analysist::flagst::mk_null
static flagst mk_null()
Definition
local_bitvector_analysis.h:135
local_bitvector_analysist::flagst::is_uses_offset
bool is_uses_offset() const
Definition
local_bitvector_analysis.h:110
local_bitvector_analysist::flagst::is_uninitialized
bool is_uninitialized() const
Definition
local_bitvector_analysis.h:100
local_bitvector_analysist::flagst::merge
bool merge(const flagst &other)
Definition
local_bitvector_analysis.h:78
local_bitvector_analysist::flagst::flagst
flagst()
Definition
local_bitvector_analysis.h:50
local_bitvector_analysist::flagst::is_integer_address
bool is_integer_address() const
Definition
local_bitvector_analysis.h:160
local_bitvector_analysist::flagst::mk_uninitialized
static flagst mk_uninitialized()
Definition
local_bitvector_analysis.h:95
local_bitvector_analysist::flagst::is_null
bool is_null() const
Definition
local_bitvector_analysis.h:140
local_bitvector_analysist::flagst::bits
unsigned bits
Definition
local_bitvector_analysis.h:76
local_bitvector_analysist::flagst::is_unknown
bool is_unknown() const
Definition
local_bitvector_analysis.h:90
local_bitvector_analysist::flagst::flagst
flagst(const bitst _bits)
Definition
local_bitvector_analysis.h:72
local_bitvector_analysist::flagst::clear
void clear()
Definition
local_bitvector_analysis.h:54
irep_idt
dstringt irep_idt
Definition
verification_result.h:16
analyses
local_bitvector_analysis.h
Generated by
1.17.0