let by_array_reference_pattern = function
  | StartOf (Var x,off) -> Ok (x,true,brackets_typ (Cil.typeOfLval (Var x,off)))
  | CastE(ty,{enode = StartOf (Var x,off)}) when Cil.isPointerType ty -> 
      Ok (x,true,brackets_typ (Cil.typeOfLval (Var x,off)))
  | AddrOf (Mem e, _) -> 
      (match delta_ptr (Cil.stripInfo e).enode with 
         | None -> Any
         | Some (x,n) -> Ok (x,true,n)) 
  | CastE (t,e) -> 
      debug "[by_array_reference_pattern] cast case";
     if Cil.isPointerType t then 
       ( debug "is a pointer type";
       help_by_array_reference_pattern (Cil.stripInfo e).enode)
     else 
       (debug "is NOT a pointer type " ;Any )
  | e -> help_by_array_reference_pattern e