50 if(lhs.
id()==ID_symbol)
52 if(lhs.
type().
id()==ID_pointer)
60 get_rec(rhs_set, rhs, loc_info_src);
63 for(object_sett::const_iterator
72 else if(lhs.
id()==ID_dereference)
77 if(lhs.
type().
id()==ID_pointer)
95 else if(lhs.
id()==ID_index)
99 else if(lhs.
id()==ID_member)
102 to_member_expr(lhs).struct_op(), rhs, loc_info_src, loc_info_dest);
104 else if(lhs.
id()==ID_typecast)
108 else if(lhs.
id()==ID_if)
117 const exprt &rhs)
const
119 local_cfgt::loc_mapt::const_iterator loc_it=
cfg.
loc_map.find(t);
126 get_rec(result_tmp, rhs, loc_info_src);
128 std::set<exprt> result;
130 for(object_sett::const_iterator
131 it=result_tmp.begin();
132 it!=result_tmp.end();
145 local_cfgt::loc_mapt::const_iterator loc_it=
cfg.
loc_map.find(t);
152 get_rec(tmp1, src1, loc_info_src);
153 get_rec(tmp2, src2, loc_info_src);
159 std::list<unsigned> result;
161 std::set_intersection(
162 tmp1.begin(), tmp1.end(),
163 tmp2.begin(), tmp2.end(),
164 std::back_inserter(result));
166 return !result.empty();
174 if(rhs.
id()==ID_constant)
181 else if(rhs.
id()==ID_symbol)
183 if(rhs.
type().
id()==ID_pointer)
187 dest.insert(src_pointer);
189 for(std::size_t i=0; i<loc_info_src.
aliases.
size(); i++)
196 else if(rhs.
id()==ID_if)
201 else if(rhs.
id()==ID_address_of)
205 if(
object.
id()==ID_symbol)
208 dest.insert(object_nr);
210 for(std::size_t i=0; i<loc_info_src.
aliases.
size(); i++)
214 else if(
object.
id()==ID_index)
217 if(index_expr.
array().
id()==ID_symbol)
223 dest.insert(object_nr);
225 for(std::size_t i=0; i<loc_info_src.
aliases.
size(); i++)
229 else if(index_expr.
array().
id()==ID_string_constant)
235 dest.insert(object_nr);
237 for(std::size_t i=0; i<loc_info_src.
aliases.
size(); i++)
247 else if(rhs.
id()==ID_typecast)
251 else if(rhs.
id()==ID_plus)
255 if(plus_expr.operands().size() >= 3)
258 plus_expr.op0().type().id() == ID_pointer,
259 "pointer in pointer-typed sum must be op0");
260 get_rec(dest, plus_expr.op0(), loc_info_src);
262 else if(plus_expr.operands().size() == 2)
265 if(plus_expr.op0().type().id() == ID_pointer)
267 get_rec(dest, plus_expr.op0(), loc_info_src);
269 else if(plus_expr.op1().type().id() == ID_pointer)
271 get_rec(dest, plus_expr.op1(), loc_info_src);
279 else if(rhs.
id()==ID_minus)
283 if(op0.type().id() == ID_pointer)
285 get_rec(dest, op0, loc_info_src);
290 else if(rhs.
id()==ID_member)
294 else if(rhs.
id()==ID_index)
298 else if(rhs.
id()==ID_dereference)
302 else if(rhs.
id()==ID_side_effect)
307 if(statement==ID_allocate)
340 for(code_typet::parameterst::const_iterator
341 it=goto_function.type.parameters().begin();
342 it!=goto_function.type.parameters().end();
345 const irep_idt &identifier=it->get_identifier();
346 if(is_tracked(identifier))
353 for(localst::locals_mapt::const_iterator
354 l_it=
locals.locals_map.begin();
355 l_it!=
locals.locals_map.end();
358 if(is_tracked(l_it->first))
364 while(!work_queue.empty())
374 switch(instruction.
type())
398 const auto &lhs = instruction.
call_lhs();
407 if(
objects[i].
id() == ID_symbol)
424 DATA_INVARIANT(
false,
"Exceptions must be removed before analysis");
428 DATA_INVARIANT(
false,
"SET_RETURN_VALUE must be removed before analysis");
445 false,
"Unclear what is a safe over-approximation of OTHER");
450 DATA_INVARIANT(
false,
"Only complete instructions can be analyzed");
454 for(local_cfgt::successorst::const_iterator
460 work_queue.push(*it);
474 out <<
"**** " << instruction.source_location() <<
"\n";
478 for(std::size_t i=0; i<loc_info.
aliases.
size(); i++)
484 for(std::size_t j=0; j<loc_info.
aliases.
size(); j++)
489 if(
objects[j].
id() == ID_symbol)
500 instruction.output(out);