void rd_range_domaint::assign_dereference( const namespacet &ns, locationt from, const dereference_exprt &deref, const mp_integer &size) { assert(local_may_alias); const exprt &pointer=deref.pointer(); std::set<exprt> alias_set=local_may_alias->get(from, pointer); valuest before(values); for(std::set<exprt>::const_iterator it=alias_set.begin(); it!=alias_set.end(); it++) { if(it->id()!=ID_unknown && it->id()!=ID_dynamic_object && it->id()!=ID_null_object) { valuest bak; bak.swap(values); values=before; assign(ns, from, *it, size); rd_range_domaint this_object; this_object.values.swap(values); values.swap(bak); merge(this_object, from); } } }
bool remove_const_function_pointerst::try_resolve_dereference( const dereference_exprt &deref_expr, expressionst &out_expressions, bool &out_is_const) { // We had a pointer, we need to check both the pointer // type can't be changed, and what it what pointing to // can't be changed expressionst pointer_values; bool pointer_const; bool resolved= try_resolve_expression(deref_expr.pointer(), pointer_values, pointer_const); if(resolved && pointer_const) { bool all_objects_const=true; for(const exprt &pointer_val : pointer_values) { if(pointer_val.id()==ID_address_of) { address_of_exprt address_expr=to_address_of_expr(pointer_val); bool object_const=false; expressionst out_object_values; bool resolved= try_resolve_expression( address_expr.object(), out_object_values, object_const); if(resolved) { out_expressions.insert( out_expressions.end(), out_object_values.begin(), out_object_values.end()); all_objects_const&=object_const; } else { LOG("Failed to resolve value of a dereference", address_expr); } } else { LOG( "Squashing dereference did not result in an address", pointer_val); return false; } } out_is_const=all_objects_const; return true; } else { if(!resolved) { LOG("Failed to resolve pointer of dereference", deref_expr); } else if(!pointer_const) { LOG("Pointer value not const so can't squash", deref_expr); } return false; } }