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