26 out <<
"+uninitialized";
28 out <<
"+uses_offset";
30 out <<
"+dynamic_local";
32 out <<
"+dynamic_heap";
36 out <<
"+static_lifetime";
38 out <<
"+integer_address";
45 std::size_t max_index=
48 for(std::size_t i=0; i<max_index; i++)
49 result |= a[i].
merge(b[i]);
57 localst::locals_sett::const_iterator it =
locals.
locals.find(identifier);
68 if(lhs.
id()==ID_symbol)
76 loc_info_dest[dest_pointer]=rhs_flags;
79 else if(lhs.
id()==ID_dereference)
82 else if(lhs.
id()==ID_index)
86 else if(lhs.
id()==ID_member)
89 to_member_expr(lhs).struct_op(), rhs, loc_info_src, loc_info_dest);
91 else if(lhs.
id()==ID_typecast)
95 else if(lhs.
id()==ID_if)
106 local_cfgt::loc_mapt::const_iterator loc_it=
cfg.
loc_map.find(t);
123 else if(rhs.
id()==ID_symbol)
129 return loc_info_src[src_pointer];
134 else if(rhs.
id()==ID_address_of)
138 if(
object.
id()==ID_symbol)
145 else if(
object.
id()==ID_index)
148 if(index_expr.
array().
id()==ID_symbol)
162 else if(rhs.
id()==ID_typecast)
166 else if(rhs.
id()==ID_uninitialized)
170 else if(rhs.
id()==ID_plus)
174 if(plus_expr.operands().size() >= 3)
177 plus_expr.op0().type().id() == ID_pointer,
178 "pointer in pointer-typed sum must be op0");
181 else if(plus_expr.operands().size() == 2)
184 if(plus_expr.op0().type().id() == ID_pointer)
186 return get_rec(plus_expr.op0(), loc_info_src) |
189 else if(plus_expr.op1().type().id() == ID_pointer)
191 return get_rec(plus_expr.op1(), loc_info_src) |
200 else if(rhs.
id()==ID_minus)
204 if(op0.type().id() == ID_pointer)
211 else if(rhs.
id()==ID_member)
215 else if(rhs.
id()==ID_index)
219 else if(rhs.
id()==ID_dereference)
223 else if(rhs.
id()==ID_side_effect)
228 if(statement==ID_allocate)
242 std::set<local_cfgt::node_nrt> work_queue;
243 work_queue.insert(0);
256 while(!work_queue.empty())
258 const auto loc_nr = *work_queue.begin();
261 work_queue.erase(work_queue.begin());
266 switch(instruction.
type())
279 exprt(ID_uninitialized),
287 exprt(ID_uninitialized),
294 const auto &lhs = instruction.
call_lhs();
303 DATA_INVARIANT(
false,
"Exceptions must be removed before analysis");
308 DATA_INVARIANT(
false,
"SET_RETURN_VALUE must be removed before analysis");
325 false,
"Unclear what is a safe over-approximation of OTHER");
330 DATA_INVARIANT(
false,
"Only complete instructions can be analyzed");
338 work_queue.insert(succ);
352 out <<
"**** " << instruction.source_location() <<
"\n";
357 p_it=loc_info.begin();
358 p_it!=loc_info.end();
361 out <<
" " <<
pointers[p_it-loc_info.begin()]
368 instruction.output(out);
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
data_typet::const_iterator const_iterator
Base class for all expressions.
bool is_zero() const
Return whether the expression is a constant representing 0.
bool is_constant() const
Return whether the expression is a constant.
A goto function, consisting of function body (see body) and parameter identifiers (see parameter_iden...
This class represents an instruction in the GOTO intermediate representation.
const exprt & call_lhs() const
Get the lhs of a FUNCTION_CALL (may be nil)
const exprt & assign_rhs() const
Get the rhs of the assignment for ASSIGN.
const symbol_exprt & dead_symbol() const
Get the symbol for DEAD.
const symbol_exprt & decl_symbol() const
Get the declared symbol for DECL.
const exprt & assign_lhs() const
Get the lhs of the assignment for ASSIGN.
goto_program_instruction_typet type() const
What kind of instruction?
instructionst instructions
The list of instructions in the goto program.
instructionst::const_iterator const_targett
const irep_idt & id() const
static bool merge(points_tot &a, points_tot &b)
flagst get(const goto_programt::const_targett t, const exprt &src)
void output(std::ostream &out, const goto_functiont &goto_function, const namespacet &ns) const
flagst get_rec(const exprt &rhs, points_tot &loc_info_src)
void assign_lhs(const exprt &lhs, const exprt &rhs, points_tot &loc_info_src, points_tot &loc_info_dest)
bool is_tracked(const irep_idt &identifier)
numberingt< irep_idt > pointers
goto_programt::const_targett t
bool is_local(const irep_idt &identifier) const
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See documentation for namespace_baset::lookup().
number_type number(const key_type &a)
An expression containing a side effect.
const irep_idt & get_statement() const
const irep_idt & get_identifier() const
Field-insensitive, location-sensitive bitvector analysis.
API to expression classes for Pointers.
const address_of_exprt & to_address_of_expr(const exprt &expr)
Cast an exprt to an address_of_exprt.
#define CHECK_RETURN(CONDITION)
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
side_effect_exprt & to_side_effect_expr(exprt &expr)
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
const minus_exprt & to_minus_expr(const exprt &expr)
Cast an exprt to a minus_exprt.
const plus_exprt & to_plus_expr(const exprt &expr)
Cast an exprt to a plus_exprt.
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
static flagst mk_uses_offset()
static flagst mk_integer_address()
static flagst mk_dynamic_heap()
static flagst mk_static_lifetime()
static flagst mk_unknown()
static flagst mk_dynamic_local()
bool is_static_lifetime() const
bool is_dynamic_local() const
void print(std::ostream &) const
bool is_dynamic_heap() const
bool is_uses_offset() const
bool is_uninitialized() const
bool is_integer_address() const
static flagst mk_uninitialized()