示例#1
0
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;
  }
}