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: { } } }
void interval_domaint::havoc_rec(const exprt &lhs) { if(lhs.id()==ID_if) { havoc_rec(to_if_expr(lhs).true_case()); havoc_rec(to_if_expr(lhs).false_case()); } else if(lhs.id()==ID_symbol) { irep_idt identifier=to_symbol_expr(lhs).get_identifier(); if(is_int(lhs.type())) int_map.erase(identifier); else if(is_float(lhs.type())) float_map.erase(identifier); } else if(lhs.id()==ID_typecast) { havoc_rec(to_typecast_expr(lhs).op()); } }
void interval_domaint::assign(const code_assignt &code_assign) { havoc_rec(code_assign.lhs()); assume_rec(code_assign.lhs(), ID_equal, code_assign.rhs()); }