From f71d1a0eeae7ba5396ec5ed0f7d1752693176f78 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Tue, 21 Jul 2020 15:24:17 +0200
Subject: [PATCH] [wp] Generate ACSL predicates for model hypotheses

---
 src/plugins/wp/MemoryContext.ml               | 288 +++++++++++-------
 src/plugins/wp/MemoryContext.mli              |  14 +-
 src/plugins/wp/register.ml                    |  15 +-
 .../wp_acsl/oracle/assigns_path.res.oracle    |   3 +-
 .../wp_acsl/oracle/chunk_typing.res.oracle    |  11 +-
 .../tests/wp_acsl/oracle/pointer.res.oracle   |   6 +-
 .../oracle_qualif/assigns_path.res.oracle     |   3 +-
 .../oracle_qualif/chunk_typing.res.oracle     |  11 +-
 .../oracle_qualif/pointer.0.res.oracle        |   3 +-
 .../oracle_qualif/pointer.1.res.oracle        |   3 +-
 .../wp/tests/wp_bts/oracle/bts0843.res.oracle |   3 +-
 .../tests/wp_bts/oracle/bts_1828.0.res.oracle |   3 +-
 .../tests/wp_bts/oracle/bts_1828.1.res.oracle |   6 +-
 .../wp_bts/oracle_qualif/bts0843.res.oracle   |   3 +-
 .../oracle_qualif/bts_1828.0.res.oracle       |   3 +-
 .../oracle_qualif/bts_1828.1.res.oracle       |   6 +-
 .../oracle/frama_c_exo3_solved.old.res.oracle |   6 +-
 .../frama_c_exo3_solved.old.v2.res.oracle     |   6 +-
 .../frama_c_exo3_solved.old.res.oracle        |  12 +-
 .../frama_c_exo3_solved.old.v2.res.oracle     |  12 +-
 .../alias_assigns_hypotheses.res.oracle       |  39 +--
 .../tests/wp_hoare/oracle/byref.1.res.oracle  |   9 +-
 .../wp_hoare/oracle/dispatch_var.res.oracle   |   6 +-
 .../oracle/dispatch_var2.0.res.oracle         |  12 +-
 .../oracle/dispatch_var2.1.res.oracle         |  12 +-
 .../wp_hoare/oracle/reference.res.oracle      |   9 +-
 .../oracle/reference_and_struct.res.oracle    |   8 +-
 .../oracle/reference_array.res.oracle         |   8 +-
 .../wp_hoare/oracle/refguards.res.oracle      |  18 +-
 .../alias_assigns_hypotheses.res.oracle       |  39 +--
 .../wp_hoare/oracle_qualif/byref.1.res.oracle |   9 +-
 .../oracle_qualif/dispatch_var.res.oracle     |   6 +-
 .../oracle_qualif/dispatch_var2.0.res.oracle  |  12 +-
 .../oracle_qualif/dispatch_var2.1.res.oracle  |  12 +-
 .../oracle_qualif/reference.res.oracle        |   9 +-
 .../reference_and_struct.res.oracle           |   8 +-
 .../oracle_qualif/reference_array.res.oracle  |   8 +-
 .../oracle_qualif/refguards.res.oracle        |  18 +-
 .../tests/wp_plugin/oracle/dynamic.res.oracle |  12 +-
 .../wp_plugin/oracle/overassign.res.oracle    |   6 +-
 .../wp/tests/wp_plugin/oracle/sep.res.oracle  |  40 +--
 .../wp_plugin/oracle/volatile.0.res.oracle    |   3 +-
 .../wp_plugin/oracle/volatile.1.res.oracle    |   3 +-
 .../oracle_qualif/dynamic.res.oracle          |  12 +-
 .../oracle_qualif/overassign.res.oracle       |   6 +-
 .../wp_typed/oracle/unit_ite.1.res.oracle     |   3 +-
 .../wp_typed/oracle/unit_labels.1.res.oracle  |   6 +-
 .../oracle/unit_loopscope.1.res.oracle        |   3 +-
 .../wp_typed/oracle/user_injector.res.oracle  |   9 +-
 .../wp_typed/oracle/user_swap.1.res.oracle    |   6 +-
 .../oracle_qualif/unit_loopscope.1.res.oracle |   3 +-
 .../oracle_qualif/user_injector.0.res.oracle  |   9 +-
 .../oracle_qualif/user_injector.1.res.oracle  |  16 +-
 .../oracle_qualif/user_swap.1.res.oracle      |   6 +-
 .../tests/wp_usage/oracle/caveat.1.res.oracle |  18 +-
 .../tests/wp_usage/oracle/caveat2.res.oracle  |   6 +-
 .../wp_usage/oracle/caveat_range.res.oracle   |   3 +-
 .../tests/wp_usage/oracle/global.1.res.oracle |   3 +-
 .../tests/wp_usage/oracle/global.2.res.oracle |   4 +-
 .../oracle/issue-189-bis.1.res.oracle         |   6 +-
 .../wp_usage/oracle/issue-189.2.res.oracle    |   4 +-
 .../wp_usage/oracle_qualif/caveat2.res.oracle |   6 +-
 .../oracle_qualif/caveat_range.res.oracle     |   3 +-
 .../oracle_qualif/issue-189-bis.1.res.oracle  |   6 +-
 64 files changed, 518 insertions(+), 343 deletions(-)

diff --git a/src/plugins/wp/MemoryContext.ml b/src/plugins/wp/MemoryContext.ml
index b97d05a8b64..f0d8d79fed9 100644
--- a/src/plugins/wp/MemoryContext.ml
+++ b/src/plugins/wp/MemoryContext.ml
@@ -40,13 +40,11 @@ let pp_param fmt = function
 (* -------------------------------------------------------------------------- *)
 
 open Cil_types
-open Cil_datatype
 
 type zone =
   | Var of varinfo   (* &x     - the cell x *)
   | Ptr of varinfo   (* p      - the cell pointed by p *)
   | Arr of varinfo   (* p+(..) - the cell and its neighbors pointed by p *)
-  | Term of term
 
 type partition = {
   globals : zone list ; (* [ &G , G[...], ... ] *)
@@ -55,106 +53,6 @@ type partition = {
   assigned: identified_term list (* Must refer to pointed locations *)
 }
 
-type clause = Valid of zone | Separated of zone list list
-
-(* -------------------------------------------------------------------------- *)
-
-let is_separated_true = function [] | [_] -> true | _ -> false
-
-(* -------------------------------------------------------------------------- *)
-let pp_zone fmt = function
-  | Arr vi -> Format.fprintf fmt "%a+(..)" Varinfo.pretty vi
-  | Ptr vi -> Varinfo.pretty fmt vi
-  | Var vi -> Format.fprintf fmt "&%a" Varinfo.pretty vi
-  | Term t -> Format.fprintf fmt "%a" Cil_printer.pp_term t
-
-let pp_region fmt = function
-  | [] -> Format.pp_print_string fmt "\\empty"
-  | [z] -> pp_zone fmt z
-  | z::zs ->
-      Format.fprintf fmt "@[<hov 2>\\union(%a" pp_zone z ;
-      List.iter (fun z -> Format.fprintf fmt ",@,%a" pp_zone z) zs ;
-      Format.fprintf fmt ")@]"
-
-let pp_separation fmt = function
-  | [] | [_]  -> Format.pp_print_string fmt "\\true"
-  | r::rs ->
-      Format.fprintf fmt "@[<hov 2>\\separated(%a" pp_region r ;
-      List.iter (fun r -> Format.fprintf fmt ",@,%a" pp_region r) rs ;
-      Format.fprintf fmt ")@]"
-
-let pp_clause fmt = function
-  | Separated sep -> Format.fprintf fmt "@ @[<hov 2>requires %a;@]" pp_separation sep
-  | Valid zone -> Format.fprintf fmt "@ @[<hov 2>requires \\valid(%a);@]" pp_zone zone
-
-(* -------------------------------------------------------------------------- *)
-(* --- Memory Context                                                     --- *)
-(* -------------------------------------------------------------------------- *)
-
-let rec ptr_of = function
-  | Ctype t -> Ctype (TPtr(t, []))
-  | t when Logic_typing.is_set_type t ->
-      let t = Logic_typing.type_of_set_elem t in
-      Logic_const.make_set_type (ptr_of t)
-  | _ -> assert false
-
-let rec addr_of_lval ?loc term =
-  let typ = ptr_of term.term_type in
-  match term.term_node with
-  | TLval lv ->
-      Logic_utils.mk_logic_AddrOf ?loc lv typ
-  | TCastE (_, t) | TLogic_coerce (_, t) ->
-      addr_of_lval ?loc t
-  | Tif(c, t, e) ->
-      let t = addr_of_lval ?loc t in
-      let e = addr_of_lval ?loc e in
-      Logic_const.term ?loc (Tif(c, t, e)) typ
-  | Tat( _, _) ->
-      term
-  | Tunion l ->
-      let l = List.map (addr_of_lval ?loc) l in
-      Logic_const.term ?loc (Tunion l) typ
-  | Tinter l ->
-      let l = List.map (addr_of_lval ?loc) l in
-      Logic_const.term ?loc (Tinter l) typ
-  | Tcomprehension (t, qs, p) ->
-      let t = addr_of_lval ?loc t in
-      Logic_const.term ?loc (Tcomprehension (t,qs,p)) typ
-  | _ -> term
-
-let add_region r s = if r = [] then s else r::s
-
-let main_separation partition =
-  let separated =
-    List.rev @@
-    add_region (List.rev partition.to_heap) @@
-    add_region (List.rev partition.globals) @@
-    List.map (fun z -> [z]) partition.context
-  in
-  Separated separated
-
-let assigns_separation partition =
-  if partition.globals = [] then []
-  else
-    let assign_zone t = Term (addr_of_lval t.it_content) in
-    List.map
-      (fun t -> Separated ([[assign_zone t]] @ [ partition.globals ]))
-      partition.assigned
-
-let validity partition =
-  List.rev @@ List.map (fun z -> Valid z) partition.context
-
-let requires partition =
-  let ms = main_separation partition in
-  let ass_sep = assigns_separation partition in
-  let not_trivial_separation = function
-    | Separated s -> not (is_separated_true s)
-    | Valid _ -> false
-  in
-  let s = List.filter not_trivial_separation (ms :: ass_sep) in
-  let v = validity partition in
-  s @ v
-
 (* -------------------------------------------------------------------------- *)
 (* --- Partition                                                          --- *)
 (* -------------------------------------------------------------------------- *)
@@ -205,3 +103,189 @@ let assigned t w =
   { w with assigned = assigned }
 
 (* -------------------------------------------------------------------------- *)
+(* ANNOTS                                                                     *)
+(* -------------------------------------------------------------------------- *)
+
+open Logic_const
+
+
+let rec ptr_of = function
+  | Ctype t -> Ctype (TPtr(t, []))
+  | t when Logic_typing.is_set_type t ->
+      let t = Logic_typing.type_of_set_elem t in
+      Logic_const.make_set_type (ptr_of t)
+  | _ -> assert false
+
+let rec addr_of_lval ?loc term =
+  let typ = ptr_of term.term_type in
+  match term.term_node with
+  | TLval lv ->
+      Logic_utils.mk_logic_AddrOf ?loc lv typ
+  | TCastE (_, t) | TLogic_coerce (_, t) ->
+      addr_of_lval ?loc t
+  | Tif(c, t, e) ->
+      let t = addr_of_lval ?loc t in
+      let e = addr_of_lval ?loc e in
+      Logic_const.term ?loc (Tif(c, t, e)) typ
+  | Tat( _, _) ->
+      term
+  | Tunion l ->
+      let l = List.map (addr_of_lval ?loc) l in
+      Logic_const.term ?loc (Tunion l) typ
+  | Tinter l ->
+      let l = List.map (addr_of_lval ?loc) l in
+      Logic_const.term ?loc (Tinter l) typ
+  | Tcomprehension (t, qs, p) ->
+      let t = addr_of_lval ?loc t in
+      Logic_const.term ?loc (Tcomprehension (t,qs,p)) typ
+  | _ -> term
+
+let type_of_zone = function
+  | Ptr vi -> vi.vtype
+  | Var vi -> TPtr(vi.vtype, [])
+  | Arr vi when Cil.isPointerType vi.vtype -> vi.vtype
+  | Arr vi -> TPtr(Cil.typeOf_array_elem vi.vtype, [])
+
+let zone_to_term ?(to_char=false) loc zone =
+  let typ = Ctype (type_of_zone zone) in
+  let lval vi = TVar (Cil.cvar_to_lvar vi), TNoOffset in
+  let loc_range ptr =
+    if not to_char then ptr
+    else
+      let pointed =
+        match typ with
+        | (Ctype (TPtr (t, []))) -> t
+        | _ -> assert false (* typ has been generated by type_of_zone *)
+      in
+      let len = Logic_utils.expr_to_term (Cil.sizeOf ~loc pointed) in
+      let last = term (TBinOp(MinusA, len, tinteger ~loc 1)) len.term_type in
+      let range = trange ~loc (Some (tinteger ~loc 0), Some last) in
+      let ptr = Logic_utils.mk_cast ~loc Cil.charPtrType ptr in
+      term ~loc (TBinOp(PlusPI, ptr, range)) ptr.term_type
+  in
+  match zone with
+  | Var vi -> loc_range (term ~loc (TAddrOf(lval vi)) typ)
+  | Ptr vi -> loc_range (term ~loc (TLval(lval vi)) typ)
+  | Arr vi ->
+      let ptr =
+        if Cil.isArrayType vi.vtype
+        then term ~loc (TStartOf (lval vi)) typ
+        else term ~loc (TLval(lval vi)) typ
+      in
+      let ptr =
+        if not to_char then ptr
+        else Logic_utils.mk_cast ~loc Cil.charPtrType ptr
+      in
+      let range = trange ~loc (None, None) in
+      term ~loc (TBinOp(PlusPI, ptr, range)) ptr.term_type
+
+let region_to_term loc = function
+  | [] -> term ~loc Tempty_set (Ctype Cil.charPtrType)
+  | [z] -> zone_to_term loc z
+  | x :: tl as l ->
+      let fst = type_of_zone x in
+      let tl = List.map type_of_zone tl in
+      let to_char = not (List.for_all (Cil_datatype.Typ.equal fst) tl) in
+      let set_typ =
+        make_set_type (Ctype (if to_char then Cil.charPtrType else fst))
+      in
+      term ~loc (Tunion (List.map (zone_to_term ~to_char loc) l)) set_typ
+
+let separated_list ?loc = function
+  | [] | [ _ ] -> ptrue
+  | l -> pseparated ?loc l
+
+let separated_from_term loc assigned l =
+  separated_list ~loc (assigned :: List.map (region_to_term loc) l)
+
+let separated_from_addr loc assigned =
+  separated_from_term loc (addr_of_lval ~loc assigned.it_content)
+
+let valid_region loc r =
+  let t = region_to_term loc r in
+  pvalid ~loc (here_label, t)
+
+let global_zones partition =
+  List.map (fun z -> [z]) partition.globals
+
+let context_zones partition =
+  List.map (fun z -> [z]) partition.context
+
+let heap_zones partition =
+  let comp a b = Cil_datatype.Typ.compare (type_of_zone a) (type_of_zone b) in
+  List.sort comp partition.to_heap
+
+(* Note that this function does not return separated zone lists, but well-typed
+   zone lists.
+*)
+let heaps partition =
+  let rec partition_by_type t acc l =
+    match l, acc with
+    | [], _ ->
+        acc
+    | x :: l, [] ->
+        partition_by_type (type_of_zone x) [[x]] l
+    | x :: l, p :: acc' when Cil_datatype.Typ.equal t (type_of_zone x) ->
+        partition_by_type t ((x :: p) :: acc') l
+    | x :: l, acc ->
+        partition_by_type (type_of_zone x) ([x] :: acc) l
+  in
+  partition_by_type Cil.voidType [] (heap_zones partition)
+
+let main_separation loc globals context heaps =
+  match heaps, context with
+  | [], [] ->
+      (* In this case, separation is completely trivial *)
+      [ ptrue ]
+  | [], context ->
+      let zones = globals @ context in
+      [ separated_list ~loc (List.map (region_to_term loc) zones) ]
+  | heaps, context ->
+      let for_typed_heap h =
+        let zones = h :: globals @ context in
+        separated_list ~loc (List.map (region_to_term loc) zones)
+      in
+      List.map for_typed_heap heaps
+
+let clauses_of_partition loc p =
+  let globals = global_zones p in
+  let filter p = not (Logic_utils.is_trivially_true p) in
+  let main_sep =
+    main_separation loc globals (context_zones p) (heaps p)
+  in
+  let assigns_sep =
+    List.map (fun t -> separated_from_addr loc t globals) p.assigned
+  in
+  let context_validity =
+    List.map (valid_region loc) (context_zones p)
+  in
+  let reqs = main_sep @ assigns_sep @ context_validity in
+  let reqs = List.filter filter reqs in
+  let reqs = List.sort_uniq Logic_utils.compare_predicate reqs in
+  reqs, []
+
+let emitter =
+  Emitter.(create "Wp.Hypotheses" [Funspec] ~correctness:[] ~tuning:[])
+
+let get_behavior kf name partition =
+  let loc = Kernel_function.get_location kf in
+  let reqs,enss = clauses_of_partition loc partition in
+  let reqs = List.map Logic_const.new_predicate reqs in
+  let enss = List.map (fun p -> Normal, Logic_const.new_predicate p) enss in
+  match reqs,enss with
+  | [], [] -> None
+  | l1, l2 ->
+      Some {
+        b_name = name ;
+        b_requires = l1 ;
+        b_assumes = [] ;
+        b_post_cond = l2 ;
+        b_assigns = WritesAny ;
+        b_allocation = FreeAllocAny ;
+        b_extended = []
+      }
+
+let add_behavior kf name partition =
+  match get_behavior kf name partition with
+  | None -> ()
+  | Some bhv -> Annotations.add_behaviors emitter kf [bhv]
diff --git a/src/plugins/wp/MemoryContext.mli b/src/plugins/wp/MemoryContext.mli
index 96707953d64..45dc45afbea 100644
--- a/src/plugins/wp/MemoryContext.mli
+++ b/src/plugins/wp/MemoryContext.mli
@@ -32,15 +32,5 @@ val empty : partition
 val set : varinfo -> param -> partition -> partition
 val assigned : identified_term -> partition -> partition
 
-type zone
-
-type clause =
-  | Valid of zone
-  | Separated of zone list list
-
-(** Build the separation clause from a partition,
-    including the clauses related to the pointer validity *)
-val requires : partition -> clause list
-
-val pp_zone : Format.formatter -> zone -> unit
-val pp_clause : Format.formatter -> clause -> unit
+val add_behavior : kernel_function -> string -> partition -> unit
+val get_behavior : kernel_function -> string -> partition -> behavior option
diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml
index bb54e4da628..83a43cc7466 100644
--- a/src/plugins/wp/register.ml
+++ b/src/plugins/wp/register.ml
@@ -89,13 +89,11 @@ let wp_iter_model ?ip ?index job =
     Fmap.iter (fun kf ms -> Models.iter (fun m -> job kf m) ms) !pool
   end
 
-let wp_print_memory_context kf m hyp fmt =
+let wp_print_memory_context kf bhv fmt =
   begin
     let printer = new Printer.extensible_printer () in
     let pp_vdecl = printer#without_annot printer#vdecl in
-    Format.fprintf fmt
-      "@[<hv 0>@[<hv 3>/*@@@ behavior %s:" (WpContext.MODEL.id m) ;
-    List.iter (MemoryContext.pp_clause fmt) hyp ;
+    Format.fprintf fmt "@[<hv 0>@[<hv 3>/*@@@ %a" Cil_printer.pp_behavior bhv ;
     let vkf = Kernel_function.get_vi kf in
     Format.fprintf fmt "@ @]*/@]@\n@[<hov 2>%a;@]@\n"
       pp_vdecl vkf ;
@@ -106,13 +104,16 @@ let wp_warn_memory_context () =
     wp_iter_model
       begin fun kf m ->
         let partition = WpContext.compute_hypotheses m kf in
-        let hyp = MemoryContext.requires partition in
-        if hyp <> [] then
+        let model = WpContext.MODEL.id m in
+        let hyp = MemoryContext.get_behavior kf model partition in
+        match hyp with
+        | None -> ()
+        | Some bhv ->
           Wp_parameters.warning
             ~current:false
             "@[<hv 0>Memory model hypotheses for function '%s':@ %t@]"
             (Kernel_function.get_name kf)
-            (wp_print_memory_context kf m hyp)
+            (wp_print_memory_context kf bhv)
       end
   end
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle
index 6d629988524..0c4bd8dfbdf 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigns_path.res.oracle
@@ -99,5 +99,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job':
-  /*@ behavior typed: requires \separated(&p,b+(..)); */
+  /*@ behavior typed:
+        requires \separated(b + (..), &p); */
   void job(int n, int *b);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
index 8f21ca532c0..72d6142a7ae 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
@@ -1879,9 +1879,14 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'function':
   /*@
      behavior typed:
-     requires \separated(x+(..),
-                \union(i8+(..),u8+(..),i16+(..),u16+(..),i32+(..),u32+(..),
-                  i64+(..),u64+(..)));
+       requires \separated(i16 + (..), (char const *)x + (..));
+       requires \separated(i32 + (..), (char const *)x + (..));
+       requires \separated(i64 + (..), (char const *)x + (..));
+       requires \separated(i8 + (..), (char const *)x + (..));
+       requires \separated(u16 + (..), (char const *)x + (..));
+       requires \separated(u32 + (..), (char const *)x + (..));
+       requires \separated(u64 + (..), (char const *)x + (..));
+       requires \separated(u8 + (..), (char const *)x + (..));
      */
   void function(signed char * /*[10]*/ i8, unsigned char * /*[10]*/ u8,
                 short * /*[10]*/ i16, unsigned short * /*[10]*/ u16,
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
index 1737e32302f..76387c61d81 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
@@ -236,8 +236,10 @@ Prove: false.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'compare':
-  /*@ behavior typed: requires \separated(&p,q+(..)); */
+  /*@ behavior typed:
+        requires \separated(q + (..), &p); */
   void compare(int *q);
 [wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed: requires \separated(&p,q+(..)); */
+  /*@ behavior typed:
+        requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle
index 1c72369eadb..a2e6ef5f8fb 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigns_path.res.oracle
@@ -21,5 +21,6 @@
   job                       6        3        9       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job':
-  /*@ behavior typed: requires \separated(&p,b+(..)); */
+  /*@ behavior typed:
+        requires \separated(b + (..), &p); */
   void job(int n, int *b);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle
index 89b1b1b5b97..992ef461134 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle
@@ -53,9 +53,14 @@
 [wp] Warning: Memory model hypotheses for function 'function':
   /*@
      behavior typed:
-     requires \separated(x+(..),
-                \union(i8+(..),u8+(..),i16+(..),u16+(..),i32+(..),u32+(..),
-                  i64+(..),u64+(..)));
+       requires \separated(i16 + (..), (char const *)x + (..));
+       requires \separated(i32 + (..), (char const *)x + (..));
+       requires \separated(i64 + (..), (char const *)x + (..));
+       requires \separated(i8 + (..), (char const *)x + (..));
+       requires \separated(u16 + (..), (char const *)x + (..));
+       requires \separated(u32 + (..), (char const *)x + (..));
+       requires \separated(u64 + (..), (char const *)x + (..));
+       requires \separated(u8 + (..), (char const *)x + (..));
      */
   void function(signed char * /*[10]*/ i8, unsigned char * /*[10]*/ u8,
                 short * /*[10]*/ i16, unsigned short * /*[10]*/ u16,
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle
index 310d71f1258..e84a81d1246 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.0.res.oracle
@@ -28,5 +28,6 @@
   absurd                    -        -        2       0.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed_ref: requires \separated(&p,q+(..)); */
+  /*@ behavior typed_ref:
+        requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle
index ee3c703ca33..89712b41fe4 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/pointer.1.res.oracle
@@ -28,5 +28,6 @@
   absurd                    -        -        2       0.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed: requires \separated(&p,q+(..)); */
+  /*@ behavior typed:
+        requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
index e99403ea348..d68634ce45e 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
@@ -54,5 +54,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f3':
-  /*@ behavior typed: requires \separated(&p->a,&p); */
+  /*@ behavior typed:
+        requires \separated(&p->a, &p); */
   void f3(void);
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle
index 0054a9afc53..66651f78d70 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.0.res.oracle
@@ -67,5 +67,6 @@ Prove: global(L_two_24) != one_0.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'global_frame':
-  /*@ behavior typed: requires \separated(&zero,one); */
+  /*@ behavior typed:
+        requires \separated(one, &zero); */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle
index 3949d8d5a74..6a0f4dd76d0 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1828.1.res.oracle
@@ -48,8 +48,8 @@ Prove: global(L_two_24) != one_0.
 [wp] Warning: Memory model hypotheses for function 'global_frame':
   /*@
      behavior typed_ref:
-     requires \separated(zero,one);
-     requires \valid(zero);
-     requires \valid(one);
+       requires \separated(one, zero);
+       requires \valid(one);
+       requires \valid(zero);
      */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle
index 159f27542af..f2b4509858e 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts0843.res.oracle
@@ -17,5 +17,6 @@
   g3                        1        2        3       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f3':
-  /*@ behavior typed: requires \separated(&p->a,&p); */
+  /*@ behavior typed:
+        requires \separated(&p->a, &p); */
   void f3(void);
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle
index 24788faf50d..ebe06ce52f4 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.0.res.oracle
@@ -19,5 +19,6 @@
   global_frame              3        -        5      60.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'global_frame':
-  /*@ behavior typed: requires \separated(&zero,one); */
+  /*@ behavior typed:
+        requires \separated(one, &zero); */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle
index f560c0a026a..b8015e5f58f 100644
--- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1828.1.res.oracle
@@ -21,8 +21,8 @@
 [wp] Warning: Memory model hypotheses for function 'global_frame':
   /*@
      behavior typed_ref:
-     requires \separated(zero,one);
-     requires \valid(zero);
-     requires \valid(one);
+       requires \separated(one, zero);
+       requires \valid(one);
+       requires \valid(zero);
      */
   void global_frame(int *one, int arg);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle
index d0d68abc9ca..83c3ad493cf 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle
@@ -56,8 +56,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(a + (..), v2, v1);
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle
index 8b40acb3f43..406c46f42e2 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle
@@ -57,8 +57,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(a + (..), v2, v1);
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle
index 56be9acc1db..36e3c1f31d6 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle
@@ -48,9 +48,9 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(a + (..), v2, v1);
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
 [wp] Running WP plugin...
@@ -116,8 +116,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(a + (..), v2, v1);
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle
index 0d2cb66d920..04523680472 100644
--- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle
@@ -49,9 +49,9 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(a + (..), v2, v1);
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
 [wp] Running WP plugin...
@@ -118,8 +118,8 @@
 [wp] Warning: Memory model hypotheses for function 'equal_elements':
   /*@
      behavior typed_ref:
-     requires \separated(v1,v2,a+(..));
-     requires \valid(v1);
-     requires \valid(v2);
+       requires \separated(a + (..), v2, v1);
+       requires \valid(v1);
+       requires \valid(v2);
      */
   void equal_elements(int *a, int *v1, int *v2);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.res.oracle
index c9a461392e7..60d04236d9a 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/alias_assigns_hypotheses.res.oracle
@@ -197,58 +197,59 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'global_alias':
   /*@
      behavior typed:
-     requires \separated(g_alias,\union(&g_alias,global+(..)));
+       requires \separated(g_alias, &g_alias, (int *)global + (..));
      */
   void global_alias(void);
 [wp] Warning: Memory model hypotheses for function 'global_no_alias':
-  /*@ behavior typed: requires \separated(g_alias,&g_alias); */
+  /*@ behavior typed:
+        requires \separated(g_alias, &g_alias); */
   void global_no_alias(void);
 [wp] Warning: Memory model hypotheses for function 'formal_alias':
-  /*@
-     behavior typed:
-     requires \separated(global+(..),f_alias);
-     requires \separated(f_alias,global+(..));
-     */
+  /*@ behavior typed:
+        requires \separated(f_alias, (int *)global + (..)); */
   void formal_alias(int *f_alias);
 [wp] Warning: Memory model hypotheses for function 'formal_alias_array':
   /*@
      behavior typed:
-     requires \separated(global+(..),alias_array+(..));
-     requires \separated(&(*alias_array)[0 .. 1],global+(..));
+       requires \separated(&(*alias_array)[0 .. 1], (int *)global + (..));
+       requires \separated(alias_array + (..), (int *)global + (..));
      */
   void formal_alias_array(int (*alias_array)[2]);
 [wp] Warning: Memory model hypotheses for function 'field_alias':
   /*@
      behavior typed:
-     requires \separated(global+(..),x);
-     requires \separated(&x->x,global+(..));
+       requires \separated(&x->x, (int *)global + (..));
+       requires \separated(x, (int *)global + (..));
      */
   void field_alias(struct X *x);
 [wp] Warning: Memory model hypotheses for function 'field_range_alias':
   /*@
      behavior typed:
-     requires \separated(global+(..),x+(..));
-     requires \separated(&(x + (0 .. 3))->x,global+(..));
+       requires \separated(&(x + (0 .. 3))->x, (int *)global + (..));
+       requires \separated(x + (..), (int *)global + (..));
      */
   void field_range_alias(struct X *x);
 [wp] Warning: Memory model hypotheses for function 'set_alias':
   /*@
      behavior typed:
-     requires \separated(\union(global+(..),&g_alias),f_alias);
-     requires \separated({g_alias, f_alias},\union(&g_alias,global+(..)));
+       requires \separated({g_alias, f_alias}, &g_alias, (int *)global + (..));
+       requires \separated(f_alias, &g_alias, (int *)global + (..));
      */
   void set_alias(int *f_alias);
 [wp] Warning: Memory model hypotheses for function 'comprehension_alias':
   /*@
      behavior typed:
-     requires \separated({alias | int *alias; alias ≡ \at(g_alias,Pre)},
-                \union(&g_alias,global+(..)));
+       requires
+         \separated(
+           {alias | int *alias; alias ≡ \at(g_alias,Pre)}, &g_alias,
+           (int *)global + (..)
+           );
      */
   void comprehension_alias(void);
 [wp] Warning: Memory model hypotheses for function 'union_alias':
   /*@
      behavior typed:
-     requires \separated(\union(global+(..),&g_alias),f_alias);
-     requires \separated({g_alias, f_alias},\union(&g_alias,global+(..)));
+       requires \separated({g_alias, f_alias}, &g_alias, (int *)global + (..));
+       requires \separated(f_alias, &g_alias, (int *)global + (..));
      */
   void union_alias(int *f_alias);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle
index 4720ded8277..051a94929b4 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/byref.1.res.oracle
@@ -87,11 +87,14 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(r); */
+  /*@ behavior typed_ref:
+        requires \valid(r); */
   void f(int *r);
 [wp] Warning: Memory model hypotheses for function 'wrong_without_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int wrong_without_ref(int *q);
 [wp] Warning: Memory model hypotheses for function 'pointer':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int pointer(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle
index f9c9e2a5b35..bb48a4672be 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var.res.oracle
@@ -498,8 +498,10 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'ref_bd':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int ref_bd(int *q);
 [wp] Warning: Memory model hypotheses for function 'g':
-  /*@ behavior typed_ref: requires \valid(pg); */
+  /*@ behavior typed_ref:
+        requires \valid(pg); */
   int g(int *pg);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle
index b128329870f..72989020ece 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.0.res.oracle
@@ -464,14 +464,18 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle
index 9845add669a..181d3c1dad2 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/dispatch_var2.1.res.oracle
@@ -212,14 +212,18 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
index f5c773ac7bd..3eef87eaec3 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
@@ -143,11 +143,14 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'call_f2':
-  /*@ behavior typed_ref: requires \valid(ptr); */
+  /*@ behavior typed_ref:
+        requires \valid(ptr); */
   int call_f2(int *ptr, int y);
 [wp] Warning: Memory model hypotheses for function 'call_global':
-  /*@ behavior typed_ref: requires \valid(gl); */
+  /*@ behavior typed_ref:
+        requires \valid(gl); */
   int call_global(void);
 [wp] Warning: Memory model hypotheses for function 'write':
-  /*@ behavior typed_ref: requires \valid(pa); */
+  /*@ behavior typed_ref:
+        requires \valid(pa); */
   void write(int kb, int *pa);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
index 502ee3eec09..b68225c3d9a 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
@@ -253,8 +253,12 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(p); */
+  /*@ behavior typed_ref:
+        requires \valid(p); */
   void reset(struct T *p);
 [wp] Warning: Memory model hypotheses for function 'call_reset_5_tps':
-  /*@ behavior typed_ref: requires \separated(tps[9] + (0 .. 4),tps+(..)); */
+  /*@
+     behavior typed_ref:
+       requires \separated(tps[9] + (0 .. 4), (struct T **)tps + (..));
+     */
   void call_reset_5_tps(void);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
index 8cdc9f4d9d2..aba051f764c 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
@@ -403,11 +403,15 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'load_1_5':
-  /*@ behavior typed_ref: requires \separated(reg_load+(..),lp+(..)); */
+  /*@
+     behavior typed_ref:
+       requires \separated(lp + (..), (int *)reg_load + (..));
+     */
   void load_1_5(int (*lp)[5]);
 [wp] Warning: Memory model hypotheses for function 'add_1_5':
   /*@
      behavior typed_ref:
-     requires \separated(\union(reg_load+(..),reg_add+(..)),ap+(..));
+       requires
+         \separated(ap + (..), (int *)reg_add + (..), (int *)reg_load + (..));
      */
   void add_1_5(int (*ap)[5]);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
index 25649f1ac96..615dc325426 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
@@ -72,24 +72,24 @@ Prove: d != c.
 [wp] Warning: Memory model hypotheses for function 'f':
   /*@
      behavior typed_ref:
-     requires \separated(c,d,\union(a+(..),b+(..)));
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated({a + (..), b + (..)}, d, c);
+       requires \valid(c);
+       requires \valid(d);
      */
   void f(int *a, int *b, int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 'h':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(d, c);
+       requires \valid(c);
+       requires \valid(d);
      */
   void h(int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 's':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(d, c);
+       requires \valid(c);
+       requires \valid(d);
      */
   void s(int **c, int **d, int k);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/alias_assigns_hypotheses.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/alias_assigns_hypotheses.res.oracle
index f524e017b1a..c189e0e008e 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/alias_assigns_hypotheses.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/alias_assigns_hypotheses.res.oracle
@@ -52,58 +52,59 @@
 [wp] Warning: Memory model hypotheses for function 'global_alias':
   /*@
      behavior typed:
-     requires \separated(g_alias,\union(&g_alias,global+(..)));
+       requires \separated(g_alias, &g_alias, (int *)global + (..));
      */
   void global_alias(void);
 [wp] Warning: Memory model hypotheses for function 'global_no_alias':
-  /*@ behavior typed: requires \separated(g_alias,&g_alias); */
+  /*@ behavior typed:
+        requires \separated(g_alias, &g_alias); */
   void global_no_alias(void);
 [wp] Warning: Memory model hypotheses for function 'formal_alias':
-  /*@
-     behavior typed:
-     requires \separated(global+(..),f_alias);
-     requires \separated(f_alias,global+(..));
-     */
+  /*@ behavior typed:
+        requires \separated(f_alias, (int *)global + (..)); */
   void formal_alias(int *f_alias);
 [wp] Warning: Memory model hypotheses for function 'formal_alias_array':
   /*@
      behavior typed:
-     requires \separated(global+(..),alias_array+(..));
-     requires \separated(&(*alias_array)[0 .. 1],global+(..));
+       requires \separated(&(*alias_array)[0 .. 1], (int *)global + (..));
+       requires \separated(alias_array + (..), (int *)global + (..));
      */
   void formal_alias_array(int (*alias_array)[2]);
 [wp] Warning: Memory model hypotheses for function 'field_alias':
   /*@
      behavior typed:
-     requires \separated(global+(..),x);
-     requires \separated(&x->x,global+(..));
+       requires \separated(&x->x, (int *)global + (..));
+       requires \separated(x, (int *)global + (..));
      */
   void field_alias(struct X *x);
 [wp] Warning: Memory model hypotheses for function 'field_range_alias':
   /*@
      behavior typed:
-     requires \separated(global+(..),x+(..));
-     requires \separated(&(x + (0 .. 3))->x,global+(..));
+       requires \separated(&(x + (0 .. 3))->x, (int *)global + (..));
+       requires \separated(x + (..), (int *)global + (..));
      */
   void field_range_alias(struct X *x);
 [wp] Warning: Memory model hypotheses for function 'set_alias':
   /*@
      behavior typed:
-     requires \separated(\union(global+(..),&g_alias),f_alias);
-     requires \separated({g_alias, f_alias},\union(&g_alias,global+(..)));
+       requires \separated({g_alias, f_alias}, &g_alias, (int *)global + (..));
+       requires \separated(f_alias, &g_alias, (int *)global + (..));
      */
   void set_alias(int *f_alias);
 [wp] Warning: Memory model hypotheses for function 'comprehension_alias':
   /*@
      behavior typed:
-     requires \separated({alias | int *alias; alias ≡ \at(g_alias,Pre)},
-                \union(&g_alias,global+(..)));
+       requires
+         \separated(
+           {alias | int *alias; alias ≡ \at(g_alias,Pre)}, &g_alias,
+           (int *)global + (..)
+           );
      */
   void comprehension_alias(void);
 [wp] Warning: Memory model hypotheses for function 'union_alias':
   /*@
      behavior typed:
-     requires \separated(\union(global+(..),&g_alias),f_alias);
-     requires \separated({g_alias, f_alias},\union(&g_alias,global+(..)));
+       requires \separated({g_alias, f_alias}, &g_alias, (int *)global + (..));
+       requires \separated(f_alias, &g_alias, (int *)global + (..));
      */
   void union_alias(int *f_alias);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle
index fabfc588e61..0d4681981ee 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/byref.1.res.oracle
@@ -28,11 +28,14 @@
   global                    2        -        2       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(r); */
+  /*@ behavior typed_ref:
+        requires \valid(r); */
   void f(int *r);
 [wp] Warning: Memory model hypotheses for function 'wrong_without_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int wrong_without_ref(int *q);
 [wp] Warning: Memory model hypotheses for function 'pointer':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int pointer(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle
index 0824c5c95dd..179a9259950 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var.res.oracle
@@ -101,8 +101,10 @@
   array_in_struct_param     2        -        2       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'ref_bd':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int ref_bd(int *q);
 [wp] Warning: Memory model hypotheses for function 'g':
-  /*@ behavior typed_ref: requires \valid(pg); */
+  /*@ behavior typed_ref:
+        requires \valid(pg); */
   int g(int *pg);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle
index c472b2c06f3..f2b9868fd88 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.0.res.oracle
@@ -51,14 +51,18 @@
   call_param_ref            6        -        6       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle
index 3996bedbab0..d23ba332da0 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/dispatch_var2.1.res.oracle
@@ -51,14 +51,18 @@
   call_param_ref            6        -        6       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(rp); */
+  /*@ behavior typed_ref:
+        requires \valid(rp); */
   void reset(int *rp);
 [wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref: requires \valid(ip); */
+  /*@ behavior typed_ref:
+        requires \valid(ip); */
   void incr(int *ip);
 [wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref: requires \valid(lp); */
+  /*@ behavior typed_ref:
+        requires \valid(lp); */
   int load(int *lp);
 [wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref: requires \valid(q); */
+  /*@ behavior typed_ref:
+        requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle
index 4ff3c1673ec..e4be92ac66b 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference.res.oracle
@@ -38,11 +38,14 @@
   write                     2        -        2       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'call_f2':
-  /*@ behavior typed_ref: requires \valid(ptr); */
+  /*@ behavior typed_ref:
+        requires \valid(ptr); */
   int call_f2(int *ptr, int y);
 [wp] Warning: Memory model hypotheses for function 'call_global':
-  /*@ behavior typed_ref: requires \valid(gl); */
+  /*@ behavior typed_ref:
+        requires \valid(gl); */
   int call_global(void);
 [wp] Warning: Memory model hypotheses for function 'write':
-  /*@ behavior typed_ref: requires \valid(pa); */
+  /*@ behavior typed_ref:
+        requires \valid(pa); */
   void write(int kb, int *pa);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle
index d7fdaedb3bd..7f79d288a41 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle
@@ -51,8 +51,12 @@
   call_array_in_struct_param   5     -        5       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref: requires \valid(p); */
+  /*@ behavior typed_ref:
+        requires \valid(p); */
   void reset(struct T *p);
 [wp] Warning: Memory model hypotheses for function 'call_reset_5_tps':
-  /*@ behavior typed_ref: requires \separated(tps[9] + (0 .. 4),tps+(..)); */
+  /*@
+     behavior typed_ref:
+       requires \separated(tps[9] + (0 .. 4), (struct T **)tps + (..));
+     */
   void call_reset_5_tps(void);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle
index 72ab30d0d2f..cc9487f8d96 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_array.res.oracle
@@ -53,11 +53,15 @@
   calls_on_array_dim_2      5        3        8       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'load_1_5':
-  /*@ behavior typed_ref: requires \separated(reg_load+(..),lp+(..)); */
+  /*@
+     behavior typed_ref:
+       requires \separated(lp + (..), (int *)reg_load + (..));
+     */
   void load_1_5(int (*lp)[5]);
 [wp] Warning: Memory model hypotheses for function 'add_1_5':
   /*@
      behavior typed_ref:
-     requires \separated(\union(reg_load+(..),reg_add+(..)),ap+(..));
+       requires
+         \separated(ap + (..), (int *)reg_add + (..), (int *)reg_load + (..));
      */
   void add_1_5(int (*ap)[5]);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle
index b61a8f43c6a..82ba6e3fe6f 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/refguards.res.oracle
@@ -26,24 +26,24 @@
 [wp] Warning: Memory model hypotheses for function 'f':
   /*@
      behavior typed_ref:
-     requires \separated(c,d,\union(a+(..),b+(..)));
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated({a + (..), b + (..)}, d, c);
+       requires \valid(c);
+       requires \valid(d);
      */
   void f(int *a, int *b, int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 'h':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(d, c);
+       requires \valid(c);
+       requires \valid(d);
      */
   void h(int *c, int *d, int k);
 [wp] Warning: Memory model hypotheses for function 's':
   /*@
      behavior typed_ref:
-     requires \separated(c,d);
-     requires \valid(c);
-     requires \valid(d);
+       requires \separated(d, c);
+       requires \valid(c);
+       requires \valid(d);
      */
   void s(int **c, int **d, int k);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
index f61e601b4d2..6e4b15fb4d0 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
@@ -374,14 +374,18 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'guarded_call':
-  /*@ behavior typed: requires \separated(&X,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X); */
   void guarded_call(struct S *p);
 [wp] Warning: Memory model hypotheses for function 'behavior':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int behavior(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'some_behaviors':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int some_behaviors(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'missing_context':
-  /*@ behavior typed: requires \separated(&X1,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X1); */
   int missing_context(int (*p)(void));
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
index e522e771289..c0547370f6f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
@@ -102,8 +102,10 @@ Prove: invalid(Malloc_0, shift_sint32(global(G_A_32), -5), 10).
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f1_ok':
-  /*@ behavior typed: requires \separated(p + (0 .. 9),&p); */
+  /*@ behavior typed:
+        requires \separated(p + (0 .. 9), &p); */
   void f1_ok(void);
 [wp] Warning: Memory model hypotheses for function 'f2_ok':
-  /*@ behavior typed: requires \separated(p + (10 .. 19),&p); */
+  /*@ behavior typed:
+        requires \separated(p + (10 .. 19), &p); */
   void f2_ok(void);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
index 9d7b81db6f6..62a03745ae2 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
@@ -68,51 +68,51 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f2_p_a':
-  /*@ behavior typed_caveat: requires \separated(p,&a); requires \valid(p); */
+  /*@ behavior typed_caveat:
+        requires \separated(&a, p);
+        requires \valid(p); */
   void f2_p_a(int *p);
 [wp] Warning: Memory model hypotheses for function 'f3_p_ab':
-  /*@
-     behavior typed_caveat:
-     requires \separated(p,\union(&a,&b));
-     requires \valid(p);
-     */
+  /*@ behavior typed_caveat:
+        requires \separated(&b, &a, p);
+        requires \valid(p); */
   void f3_p_ab(int *p);
 [wp] Warning: Memory model hypotheses for function 'f4_pq_ab':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q,\union(&a,&b));
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(&b, &a, q, p);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f4_pq_ab(int *p, int *q);
 [wp] Warning: Memory model hypotheses for function 'f5_pq':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q);
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(q, p);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f5_pq(int *p, int *q);
 [wp] Warning: Memory model hypotheses for function 'f6_Pa':
   /*@
      behavior typed_caveat:
-     requires \separated(p+(..),&a);
-     requires \valid(p+(..));
+       requires \separated(&a, p + (..));
+       requires \valid(p + (..));
      */
   void f6_Pa(int *p, int k);
 [wp] Warning: Memory model hypotheses for function 'f7_pq_ad':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q,\union(&a,&d));
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(&d, &a, q, p);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f7_pq_ad(int *p, int *q);
 [wp] Warning: Memory model hypotheses for function 'f8_pq_a':
   /*@
      behavior typed_caveat:
-     requires \separated(p,q,&a);
-     requires \valid(p);
-     requires \valid(q);
+       requires \separated(&a, q, p);
+       requires \valid(p);
+       requires \valid(q);
      */
   void f8_pq_a(int *p, int *q);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle
index 0c06a8becec..8f8e6a453d9 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/volatile.0.res.oracle
@@ -37,5 +37,6 @@ Prove: EqS1_st_v(w, w_1).
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job_struct_assigns':
-  /*@ behavior typed: requires \separated(&sv,p); */
+  /*@ behavior typed:
+        requires \separated(p, &sv); */
   void job_struct_assigns(struct st_v *p);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle
index 64cb1c39940..129e94d6af2 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/volatile.1.res.oracle
@@ -71,5 +71,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'job_struct_assigns':
-  /*@ behavior typed: requires \separated(&sv,p); */
+  /*@ behavior typed:
+        requires \separated(p, &sv); */
   void job_struct_assigns(struct st_v *p);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle
index c38d5c4f213..a0f09e08be3 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/dynamic.res.oracle
@@ -69,14 +69,18 @@
   no_call                   4        -        4       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'guarded_call':
-  /*@ behavior typed: requires \separated(&X,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X); */
   void guarded_call(struct S *p);
 [wp] Warning: Memory model hypotheses for function 'behavior':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int behavior(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'some_behaviors':
-  /*@ behavior typed: requires \separated(&X1,p+(..)); */
+  /*@ behavior typed:
+        requires \separated(p + (..), &X1); */
   int some_behaviors(int (*p)(void));
 [wp] Warning: Memory model hypotheses for function 'missing_context':
-  /*@ behavior typed: requires \separated(&X1,p); */
+  /*@ behavior typed:
+        requires \separated(p, &X1); */
   int missing_context(int (*p)(void));
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle
index 31cd7d9aaed..5222a717ce6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overassign.res.oracle
@@ -29,8 +29,10 @@
   f6_ko                     -        -        2       0.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f1_ok':
-  /*@ behavior typed: requires \separated(p + (0 .. 9),&p); */
+  /*@ behavior typed:
+        requires \separated(p + (0 .. 9), &p); */
   void f1_ok(void);
 [wp] Warning: Memory model hypotheses for function 'f2_ok':
-  /*@ behavior typed: requires \separated(p + (10 .. 19),&p); */
+  /*@ behavior typed:
+        requires \separated(p + (10 .. 19), &p); */
   void f2_ok(void);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle
index 9976179a712..43877a40342 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_ite.1.res.oracle
@@ -12,5 +12,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'check':
-  /*@ behavior typed_ref: requires \valid(p); */
+  /*@ behavior typed_ref:
+        requires \valid(p); */
   void check(int x, int *p);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle
index cba638b02bb..6759a580906 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_labels.1.res.oracle
@@ -30,8 +30,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'duplet':
   /*@
      behavior typed_ref:
-     requires \separated(pi,pj,a+(..));
-     requires \valid(pi);
-     requires \valid(pj);
+       requires \separated(a + (..), pj, pi);
+       requires \valid(pi);
+       requires \valid(pj);
      */
   void duplet(int *a, int *pi, int *pj);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle
index 6413e9d7d32..62ec7355781 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/unit_loopscope.1.res.oracle
@@ -19,5 +19,6 @@ Prove: false.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(written); */
+  /*@ behavior typed_ref:
+        requires \valid(written); */
   void f(unsigned int *written);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle
index 3dd0d642f58..a07757a5ff9 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_injector.res.oracle
@@ -119,9 +119,10 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed:
-     requires \separated(\union(&seq,&service_cpt,service_id+(..),
-                           service_result+(..)),error);
-     requires \separated(error,
-                \union(service_result+(..),service_id+(..),&service_cpt,&seq));
+       requires
+         \separated(
+           error, (int *)service_result + (..), (int *)service_id + (..),
+           &service_cpt, &seq
+           );
      */
   int job(int a, int b, int *error);
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle
index d4109c97637..c56fc78178c 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_swap.1.res.oracle
@@ -44,8 +44,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'swap':
   /*@
      behavior typed_ref:
-     requires \separated(a,b);
-     requires \valid(a);
-     requires \valid(b);
+       requires \separated(b, a);
+       requires \valid(a);
+       requires \valid(b);
      */
   void swap(int *a, int *b);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle
index 58761bdefa3..7e327b11a78 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_loopscope.1.res.oracle
@@ -16,5 +16,6 @@
   f                         1        -        2      50.0%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref: requires \valid(written); */
+  /*@ behavior typed_ref:
+        requires \valid(written); */
   void f(unsigned int *written);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle
index 510cdf0e651..1928fc98220 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.0.res.oracle
@@ -33,9 +33,10 @@
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed:
-     requires \separated(\union(&seq,&service_cpt,service_id+(..),
-                           service_result+(..)),error);
-     requires \separated(error,
-                \union(service_result+(..),service_id+(..),&service_cpt,&seq));
+       requires
+         \separated(
+           error, (int *)service_result + (..), (int *)service_id + (..),
+           &service_cpt, &seq
+           );
      */
   int job(int a, int b, int *error);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle
index 3f861815767..dbb2487bebb 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_injector.1.res.oracle
@@ -29,10 +29,16 @@
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed_ref:
-     requires \separated(error,
-                \union(&seq,&service_cpt,service_id+(..),service_result+(..)));
-     requires \separated(error,
-                \union(service_result+(..),service_id+(..),&service_cpt,&seq));
-     requires \valid(error);
+       requires
+         \separated(
+           (int *)service_result + (..), (int *)service_id + (..),
+           &service_cpt, &seq, error
+           );
+       requires
+         \separated(
+           error, (int *)service_result + (..), (int *)service_id + (..),
+           &service_cpt, &seq
+           );
+       requires \valid(error);
      */
   int job(int a, int b, int *error);
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle
index ce020046acf..6f039f366e4 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_swap.1.res.oracle
@@ -20,8 +20,8 @@
 [wp] Warning: Memory model hypotheses for function 'swap':
   /*@
      behavior typed_ref:
-     requires \separated(a,b);
-     requires \valid(a);
-     requires \valid(b);
+       requires \separated(b, a);
+       requires \valid(a);
+       requires \valid(b);
      */
   void swap(int *a, int *b);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle
index bf3ddd57997..99b18742b0c 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat.1.res.oracle
@@ -72,24 +72,24 @@ Prove: P_OBS(x_2, x_3, x_4).
 [wp] Warning: Memory model hypotheses for function 'implicit':
   /*@
      behavior typed_caveat:
-     requires \separated(a,r);
-     requires \valid(a);
-     requires \valid(r);
+       requires \separated(r, a);
+       requires \valid(a);
+       requires \valid(r);
      */
   void implicit(struct S *a, int *r);
 [wp] Warning: Memory model hypotheses for function 'explicit':
   /*@
      behavior typed_caveat:
-     requires \separated(a,r);
-     requires \valid(a);
-     requires \valid(r);
+       requires \separated(r, a);
+       requires \valid(a);
+       requires \valid(r);
      */
   void explicit(struct S *a, int *r);
 [wp] Warning: Memory model hypotheses for function 'observer':
   /*@
      behavior typed_caveat:
-     requires \separated(a,r);
-     requires \valid(a);
-     requires \valid(r);
+       requires \separated(r, a);
+       requires \valid(a);
+       requires \valid(r);
      */
   void observer(struct S *a, int *r);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
index e1c317646d5..234508ea4f7 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
@@ -101,8 +101,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed_caveat:
-     requires \separated(p,b+(..));
-     requires \valid(p);
-     requires \valid(b+(..));
+       requires \separated(b + (..), p);
+       requires \valid(b + (..));
+       requires \valid(p);
      */
   void job(struct S *p, int n, int *b);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
index 514fab0cd9f..200b214f0cc 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
@@ -156,5 +156,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_caveat: requires \valid(p+(..)); */
+  /*@ behavior typed_caveat:
+        requires \valid(p + (..)); */
   void reset(struct S *p);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle
index a6c3906898a..504e20e6bd6 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/global.1.res.oracle
@@ -21,5 +21,6 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'foo':
-  /*@ behavior typed: requires \separated(&GLOBAL,a); */
+  /*@ behavior typed:
+        requires \separated(a, &GLOBAL); */
   void foo(int *a);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle
index 33647c6dcb4..5d5c635c06b 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/global.2.res.oracle
@@ -21,5 +21,7 @@ Prove: true.
 
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'foo':
-  /*@ behavior typed_ref: requires \separated(a,&GLOBAL); requires \valid(a); */
+  /*@ behavior typed_ref:
+        requires \separated(&GLOBAL, a);
+        requires \valid(a); */
   void foo(int *a);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
index f3a2767ec5c..967d775c75e 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
@@ -171,8 +171,8 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'memcpy_context_vars':
   /*@
      behavior typed:
-     requires \separated(src,dst);
-     requires \valid(src);
-     requires \valid(dst);
+       requires \separated(dst, src);
+       requires \valid(dst);
+       requires \valid(src);
      */
   void memcpy_context_vars(unsigned char *src, unsigned char *dst, int len);
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle
index ec41c7f550d..5ce9a0dd10c 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189.2.res.oracle
@@ -26,7 +26,7 @@ Prove: true.
 [wp] Warning: Memory model hypotheses for function 'f':
   /*@
      behavior typed_caveat:
-     requires \separated(ptr,src);
-     requires \valid(ptr);
+       requires \separated(src, ptr);
+       requires \valid(ptr);
      */
   void f(char *ptr, char const *src, unsigned int idx);
diff --git a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle
index c46a68ad13b..e5abfd8d02a 100644
--- a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat2.res.oracle
@@ -24,8 +24,8 @@
 [wp] Warning: Memory model hypotheses for function 'job':
   /*@
      behavior typed_caveat:
-     requires \separated(p,b+(..));
-     requires \valid(p);
-     requires \valid(b+(..));
+       requires \separated(b + (..), p);
+       requires \valid(b + (..));
+       requires \valid(p);
      */
   void job(struct S *p, int n, int *b);
diff --git a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle
index cf2d2ab507e..d985f8cbec7 100644
--- a/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle_qualif/caveat_range.res.oracle
@@ -24,5 +24,6 @@
   reset                     7        5       12       100%
 ------------------------------------------------------------
 [wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_caveat: requires \valid(p+(..)); */
+  /*@ behavior typed_caveat:
+        requires \valid(p + (..)); */
   void reset(struct S *p);
diff --git a/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle
index e063c170d22..d3fa8c4754e 100644
--- a/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle_qualif/issue-189-bis.1.res.oracle
@@ -24,8 +24,8 @@
 [wp] Warning: Memory model hypotheses for function 'memcpy_context_vars':
   /*@
      behavior typed:
-     requires \separated(src,dst);
-     requires \valid(src);
-     requires \valid(dst);
+       requires \separated(dst, src);
+       requires \valid(dst);
+       requires \valid(src);
      */
   void memcpy_context_vars(unsigned char *src, unsigned char *dst, int len);
-- 
GitLab