void uninitialized_domaint::transform( locationt from, locationt to, ai_baset &ai, const namespacet &ns) { if(has_values.is_false()) return; switch(from->type) { case DECL: { const irep_idt &identifier= to_code_decl(from->code).get_identifier(); const symbolt &symbol=ns.lookup(identifier); if(!symbol.is_static_lifetime) uninitialized.insert(identifier); } break; default: { std::list<exprt> read=expressions_read(*from); std::list<exprt> written=expressions_written(*from); forall_expr_list(it, written) assign(*it); // we only care about the *first* uninitalized use forall_expr_list(it, read) assign(*it); } } }
const irep_idt &get_affected_variable(const goto_programt::instructiont &instr) { switch (instr.type) { case goto_program_instruction_typet::DECL: return to_code_decl(instr.code).get_identifier(); case goto_program_instruction_typet::ASSIGN: return to_symbol_expr(to_code_assign(instr.code).lhs()).get_identifier(); case goto_program_instruction_typet::DEAD: return to_code_dead(instr.code).get_identifier(); default: assert(!"Only DECL, ASSIGN, DEAD allowed."); } }
void interval_domaint::transform( locationt from, locationt to, ai_baset &ai, const namespacet &ns) { const goto_programt::instructiont &instruction=*from; switch(instruction.type) { case DECL: havoc_rec(to_code_decl(instruction.code).symbol()); break; case DEAD: havoc_rec(to_code_dead(instruction.code).symbol()); break; case ASSIGN: assign(to_code_assign(instruction.code)); break; case GOTO: { locationt next=from; next++; if(next==to) assume(not_exprt(instruction.guard), ns); else assume(instruction.guard, ns); } break; case ASSUME: assume(instruction.guard, ns); break; case FUNCTION_CALL: { const code_function_callt &code_function_call= to_code_function_call(instruction.code); if(code_function_call.lhs().is_not_nil()) havoc_rec(code_function_call.lhs()); } break; default: { } } }
const typet &get_affected_type(const goto_programt::instructiont &instr) { switch (instr.type) { case goto_program_instruction_typet::DECL: return to_code_decl(instr.code).symbol().type(); case goto_program_instruction_typet::ASSIGN: return to_code_assign(instr.code).lhs().type(); case goto_program_instruction_typet::DEAD: return to_code_dead(instr.code).symbol().type(); default: assert(!"Only DECL, ASSIGN, DEAD allowed."); } }