From 29c20694715593de06936b43cfecf26c8a66ae21 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9cile=20RUET-CROS?= <cecile.ruet-cros@cea.fr>
Date: Tue, 17 Dec 2024 11:33:35 +0100
Subject: [PATCH] [wp] havoc->memcpy: non-qualif oracles

---
 .../assigned_initialized_memtyped.res.oracle  | 122 ++++----
 ...signed_not_initialized_memtyped.res.oracle |  43 +--
 .../wp/tests/wp_acsl/oracle/axioms.res.oracle |  12 +-
 .../wp_acsl/oracle/chunk_typing.res.oracle    | 294 +++++++++---------
 .../wp_acsl/oracle/looplabels.res.oracle      |   4 +-
 .../wp_acsl/oracle/opaque_struct.res.oracle   |  36 +--
 .../wp_acsl/oracle/simpl_is_type.res.oracle   |  40 +--
 .../wp_acsl/oracle/struct_fields.res.oracle   |  16 +-
 .../wp/tests/wp_acsl/oracle/zero.0.res.oracle |   7 +-
 .../wp/tests/wp_acsl/oracle/zero.1.res.oracle |   6 +-
 .../tests/wp_bts/oracle/bts_2110.res.oracle   |   6 +-
 .../wp_bytes/oracle/assigns_sep.res.oracle    |  15 +-
 .../tests/wp_bytes/oracle/structs.res.oracle  |   2 +-
 .../wp/tests/wp_bytes/oracle/union.res.oracle |   8 +-
 .../oracle/reference_and_struct.res.oracle    |   2 +-
 .../oracle/reference_array.res.oracle         |   2 +-
 .../wp_plugin/oracle/combined.res.oracle      |  30 +-
 .../wp/tests/wp_plugin/oracle/copy.res.oracle |  12 +-
 .../wp/tests/wp_plugin/oracle/loop.res.oracle |   9 +-
 .../wp_plugin/oracle/string_c.res.oracle      |  38 +--
 .../oracle/unfold_assigns.0.res.oracle        |   4 +-
 .../oracle/unfold_assigns.1.res.oracle        |   4 +-
 .../oracle/unfold_assigns.2.res.oracle        |   4 +-
 .../oracle/unfold_assigns.3.res.oracle        |   4 +-
 .../wp_region/oracle/copy_array.res.oracle    |  12 +-
 .../oracle/multi_matrix_types.res.oracle      |  20 +-
 .../wp_typed/oracle/user_init.0.res.oracle    |  46 +--
 .../wp_typed/oracle/user_init.1.res.oracle    |  46 +--
 .../wp_usage/oracle/caveat_range.res.oracle   |  42 +--
 .../oracle/issue-189-bis.0.res.oracle         |  20 +-
 .../oracle/issue-189-bis.1.res.oracle         |  35 ++-
 31 files changed, 489 insertions(+), 452 deletions(-)

diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
index 27be73e9aa2..677ad375262 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
@@ -10,8 +10,8 @@ Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 69):
 Let m = Init_0[shiftfield_F1_S_i(s) <- true].
 Let a = shiftfield_F1_S_a(s).
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Init_undef_0, m, a_1, 10).
-Let a_3 = havoc(Init_undef_1, m, a_1, 10).
+Let a_2 = memcpy(m, Init_undef_0, a_1, a_1, 10).
+Let a_3 = memcpy(m, Init_undef_1, a_1, a_1, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
@@ -63,25 +63,26 @@ Prove: IsInit_S1_S(global(G_glob_82), Init_0).
 
 Goal Preservation of Invariant 'CHECK' (file assigned_initialized_memtyped.i, line 129):
 Let a = shiftfield_F1_S_a(pg_0).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(pg_0) <- true],
-            shift_sint32(a, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(pg_0) <- true], Init_undef_0, a_1,
+            a_1, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Heap *)
   Type: (region(G_glob_82) <= 0) /\ (region(pg_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-       (a_1[shift_sint32(a, i_1)]=true)))).
+       (a_2[shift_sint32(a, i_1)]=true)))).
   (* Then *)
   Have: i <= 9.
 }
 Prove: ((-1) <= i) /\
     (forall i_1 : Z. ((i_1 <= i) -> ((0 <= i_1) ->
-     (a_1[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
+     (a_2[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
 
 ------------------------------------------------------------
 
@@ -92,20 +93,21 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 142):
 Let m = Init_0[shiftfield_F1_S_i(pg_0) <- true].
-Let a = havoc(Init_undef_0, m, pg_0, 11).
+Let a = memcpy(m, Init_undef_0, pg_0, pg_0, 11).
 Let a_1 = shiftfield_F1_S_a(pg_0).
-Let a_2 = havoc(Init_undef_1, m, shift_sint32(a_1, 0), 10).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(m, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(G_glob_82) <= 0) /\ (region(pg_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_2[shift_sint32(a_1, i_2)]=true)))).
+       (a_3[shift_sint32(a_1, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
@@ -121,20 +123,21 @@ Prove: IsInit_S1_S(pg_0, a).
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 143):
 Let m = Init_0[shiftfield_F1_S_i(pg_0) <- true].
-Let a = havoc(Init_undef_0, m, pg_0, 11).
+Let a = memcpy(m, Init_undef_0, pg_0, pg_0, 11).
 Let a_1 = shiftfield_F1_S_a(pg_0).
-Let a_2 = havoc(Init_undef_1, m, shift_sint32(a_1, 0), 10).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(m, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(G_glob_82) <= 0) /\ (region(pg_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_2[shift_sint32(a_1, i_2)]=true)))).
+       (a_3[shift_sint32(a_1, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
@@ -187,19 +190,20 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 118):
 Let m = Init_0[shiftfield_F1_S_i(s) <- true].
-Let a = havoc(Init_undef_0, m, s, 11).
+Let a = memcpy(m, Init_undef_0, s, s, 11).
 Let a_1 = shiftfield_F1_S_a(s).
-Let a_2 = havoc(Init_undef_1, m, shift_sint32(a_1, 0), 10).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(m, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_2[shift_sint32(a_1, i_2)]=true)))).
+       (a_3[shift_sint32(a_1, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
@@ -237,7 +241,7 @@ Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 99):
 Let a = shiftfield_F1_S_a(s).
 Let a_1 = shiftfield_F1_S_i(s).
 Let a_2 = shift_sint32(a, 0).
-Let a_3 = havoc(Init_undef_0, Init_1[a_1 <- true], a_2, 10).
+Let a_3 = memcpy(Init_1[a_1 <- true], Init_undef_0, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
@@ -259,7 +263,8 @@ Assume {
       (forall a_4 : addr.
        ((forall i_2 : Z. (((i_2 = 0) \/ (i_2 = 2) \/ (i_2 = 4)) ->
          (shift_sint32(a, i_2) != a_4))) ->
-       (havoc(Mint_undef_0, Mint_0[a_1 <- 0], a_2, 10)[a_4] = Mint_1[a_4]))).
+       (memcpy(Mint_0[a_1 <- 0], Mint_undef_0, a_2, a_2, 10)[a_4] =
+        Mint_1[a_4]))).
   (* Else *)
   Have: 10 <= i_1.
 }
@@ -275,6 +280,7 @@ Prove: true.
 Goal Loop assigns 'CHECK' (2/5):
 Effect at line 96
 Let a = shiftfield_F1_S_a(s).
+Let a_1 = shift_sint32(a, 0).
 Assume {
   Type: is_sint32(i_2) /\ is_sint32(i_3).
   (* Heap *)
@@ -288,11 +294,11 @@ Assume {
   (* Else *)
   Have: 10 <= i_2.
   (* Loop assigns 'CHECK' *)
-  Have: forall a_1 : addr.
+  Have: forall a_2 : addr.
       ((forall i_5 : Z. (((i_5 = 0) \/ (i_5 = 2) \/ (i_5 = 4)) ->
-        (shift_sint32(a, i_5) != a_1))) ->
-      (havoc(Mint_undef_0, Mint_0[shiftfield_F1_S_i(s) <- 0],
-         shift_sint32(a, 0), 10)[a_1] = Mint_1[a_1])).
+        (shift_sint32(a, i_5) != a_2))) ->
+      (memcpy(Mint_0[shiftfield_F1_S_i(s) <- 0], Mint_undef_0, a_1, a_1, 10)
+         [a_2] = Mint_1[a_2])).
   (* Then *)
   Have: i_3 <= 9.
 }
@@ -325,26 +331,27 @@ Prove: true.
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 51):
 Let a = shiftfield_F1_S_i(s).
 Let a_1 = shiftfield_F1_S_a(s).
-Let a_2 = havoc(Init_undef_0, Init_0[a <- true], shift_sint32(a_1, 0), 10).
-Let a_3 = a_2[a <- i].
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(Init_0[a <- true], Init_undef_0, a_2, a_2, 10).
+Let a_4 = a_3[a <- i].
 Assume {
   Type: is_sint32(i_1) /\ is_sint32(i_2).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant *)
   Have: (0 <= i_1) /\ (i_1 <= 10) /\
       (forall i_3 : Z. ((0 <= i_3) -> ((i_3 < i_1) ->
-       (a_2[shift_sint32(a_1, i_3)]=true)))).
+       (a_3[shift_sint32(a_1, i_3)]=true)))).
   (* Else *)
   Have: 10 <= i_1.
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_3).
+  Have: cinits(a_4).
   (* Else *)
   Have: 10 <= i_2.
 }
-Prove: IsInit_S1_S(s, a_3).
+Prove: IsInit_S1_S(s, a_4).
 
 ------------------------------------------------------------
 
@@ -364,27 +371,28 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 84):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
-Let a_2 = a_1[shift_sint32(a, 4) <- i].
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
+Let a_3 = a_2[shift_sint32(a, 4) <- i].
 Assume {
   Type: is_sint32(i_1) /\ is_sint32(i_2).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant *)
   Have: (0 <= i_1) /\ (i_1 <= 10) /\
       (forall i_3 : Z. ((0 <= i_3) -> ((i_3 < i_1) ->
-       (a_1[shift_sint32(a, i_3)]=true)))).
+       (a_2[shift_sint32(a, i_3)]=true)))).
   (* Else *)
   Have: 10 <= i_1.
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Else *)
   Have: 10 <= i_2.
 }
-Prove: IsInit_S1_S(s, a_2).
+Prove: IsInit_S1_S(s, a_3).
 
 ------------------------------------------------------------
 
@@ -410,24 +418,25 @@ Prove: true.
 
 Goal Preservation of Invariant 'CHECK' (file assigned_initialized_memtyped.i, line 16):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-       (a_1[shift_sint32(a, i_1)]=true)))).
+       (a_2[shift_sint32(a, i_1)]=true)))).
   (* Then *)
   Have: i <= 9.
 }
 Prove: ((-1) <= i) /\
     (forall i_1 : Z. ((i_1 <= i) -> ((0 <= i_1) ->
-     (a_1[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
+     (a_2[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
 
 ------------------------------------------------------------
 
@@ -438,22 +447,23 @@ Prove: true.
 
 Goal Check 'CHECK' (file assigned_initialized_memtyped.i, line 21):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-       (a_1[shift_sint32(a, i_1)]=true)))).
+       (a_2[shift_sint32(a, i_1)]=true)))).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInit_S1_S(s, a_1).
+Prove: IsInit_S1_S(s, a_2).
 
 ------------------------------------------------------------
 
@@ -479,27 +489,29 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 36):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_1, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
-Let a_2 = havoc(Init_undef_0, a_1, shift_sint32(a, 1), 4).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
+Let a_3 = shift_sint32(a, 1).
+Let a_4 = memcpy(a_2, Init_undef_1, a_3, a_3, 4).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_1[shift_sint32(a, i_2)]=true)))).
+       (a_2[shift_sint32(a, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_4).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: IsInit_S1_S(s, a_2).
+Prove: IsInit_S1_S(s, a_4).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
index cc9ab803f2d..15eea06fe87 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
@@ -7,17 +7,18 @@
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 28):
-Let a = havoc(Init_undef_0, Init_0, shift_sint32(array_0, 0), 10).
+Let a = shift_sint32(array_0, 0).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(array_0.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a).
+  Have: cinits(a_1).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray_sint32(array_0, 10, a).
+Prove: IsInitArray_sint32(array_0, 10, a_1).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -25,38 +26,41 @@ Prove: IsInitArray_sint32(array_0, 10, a).
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 60):
-Let a = havoc(Init_undef_1, Init_0, shift_sint32(global(G_glob_array_51), 0),
-          10).
-Let a_1 = havoc(Init_undef_0, a, shift_sint32(pg_array_0, 0), 10).
+Let a = shift_sint32(global(G_glob_array_51), 0).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 10).
+Let a_2 = shift_sint32(pg_array_0, 0).
+Let a_3 = memcpy(a_1, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(G_glob_array_51) <= 0) /\ (region(pg_array_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a) /\ cinits(a_1).
+  Have: cinits(a_1) /\ cinits(a_3).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray_sint32(pg_array_0, 10, a_1).
+Prove: IsInitArray_sint32(pg_array_0, 10, a_3).
 
 ------------------------------------------------------------
 
 Goal Check 'OK' (file assigned_not_initialized_memtyped.i, line 61):
 Let a = global(G_glob_array_51).
-Let a_1 = havoc(Init_undef_1, Init_0, shift_sint32(a, 0), 10).
-Let a_2 = havoc(Init_undef_0, a_1, shift_sint32(pg_array_0, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0, Init_undef_0, a_1, a_1, 10).
+Let a_3 = shift_sint32(pg_array_0, 0).
+Let a_4 = memcpy(a_2, Init_undef_1, a_3, a_3, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(G_glob_array_51) <= 0) /\ (region(pg_array_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_1) /\ cinits(a_2).
+  Have: cinits(a_2) /\ cinits(a_4).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray_sint32(a, 10, a_2).
+Prove: IsInitArray_sint32(a, 10, a_4).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -97,26 +101,27 @@ Prove: (m_1[a]=true).
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 49):
-Let a = havoc(Init_undef_1, Init_0, global(G_glob_comp_45), 11).
-Let a_1 = havoc(Init_undef_0, a, pg_comp_0, 11).
+Let a = global(G_glob_comp_45).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 11).
+Let a_2 = memcpy(a_1, Init_undef_1, pg_comp_0, pg_comp_0, 11).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(G_glob_comp_45) <= 0) /\ (region(pg_comp_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a) /\ cinits(a_1).
+  Have: cinits(a_1) /\ cinits(a_2).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInit_S1_S(pg_comp_0, a_1).
+Prove: IsInit_S1_S(pg_comp_0, a_2).
 
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 50):
 Let a = global(G_glob_comp_45).
-Let a_1 = havoc(Init_undef_1, Init_0, a, 11).
-Let a_2 = havoc(Init_undef_0, a_1, pg_comp_0, 11).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 11).
+Let a_2 = memcpy(a_1, Init_undef_1, pg_comp_0, pg_comp_0, 11).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
@@ -144,7 +149,7 @@ Prove: (i=true).
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 22):
-Let a = havoc(Init_undef_0, Init_0, s, 11).
+Let a = memcpy(Init_0, Init_undef_0, s, s, 11).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
index 4cd6d14f461..ef6d4421d9d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
@@ -11,7 +11,7 @@
 Goal Post-condition 'P,todo' in 'f':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
@@ -38,7 +38,7 @@ Prove: P_P(a_2, t, a, b).
 Goal Post-condition 'Q' in 'f':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
@@ -81,7 +81,9 @@ Assume {
   Have: (a <= i) /\ (i <= x_1).
   (* Invariant 'Positive' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
-      (0 < havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)]))).
+      (0
+         < memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a)
+             [shift_sint32(t, i_1)]))).
   (* Then *)
   Have: i <= b.
 }
@@ -107,7 +109,7 @@ Goal Preservation of Invariant 'Positive' (file axioms.i, line 31):
 Let x = 1 + i.
 Let a_1 = shift_sint32(t, a).
 Let x_1 = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_2 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x).
@@ -155,7 +157,7 @@ Goal Loop assigns (file axioms.i, line 32) (3/3):
 Effect at line 35
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let a_3 = shift_sint32(t, i).
 Let x_1 = 1 + i.
 Let x_2 = 1 + 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 cd9646ce0fd..1ebf1e9f5c9 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
@@ -10,33 +10,33 @@
 
 Goal Post-condition (file chunk_typing.i, line 15) in 'function':
 Let a = shift_uint64(u64_0, 0).
-Let a_1 = havoc(Mint_undef_6, Mint_6, a, 10).
+Let a_1 = memcpy(Mint_5, Mint_undef_5, a, a, 10).
 Let a_2 = shift_sint64(i64_0, 0).
-Let a_3 = havoc(Mint_undef_5, Mint_5, a_2, 10).
+Let a_3 = memcpy(Mint_6, Mint_undef_6, a_2, a_2, 10).
 Let a_4 = shift_uint32(u32_0, 0).
-Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_5 = memcpy(Mint_3, Mint_undef_3, a_4, a_4, 10).
 Let a_6 = shift_sint32(i32_0, 0).
-Let a_7 = havoc(Mint_undef_3, Mint_3, a_6, 10).
+Let a_7 = memcpy(Mint_4, Mint_undef_4, a_6, a_6, 10).
 Let a_8 = shift_uint16(u16_0, 0).
-Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_9 = memcpy(Mint_1, Mint_undef_1, a_8, a_8, 10).
 Let a_10 = shift_sint16(i16_0, 0).
-Let a_11 = havoc(Mint_undef_1, Mint_1, a_10, 10).
+Let a_11 = memcpy(Mint_2, Mint_undef_2, a_10, a_10, 10).
 Let a_12 = shift_uint8(u8_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
+Let a_13 = memcpy(Mint_0, Mint_undef_0, a_12, a_12, 10).
 Let a_14 = shift_sint8(i8_0, 0).
-Let a_15 = havoc(Mchar_undef_0, Mchar_0, a_14, 10).
+Let a_15 = memcpy(Mchar_0, Mchar_undef_0, a_14, a_14, 10).
 Let a_16 = a_15[shift_sint8(i8_0, i)].
 Let a_17 = a_13[shift_uint8(u8_0, i)].
-Let a_18 = a_11[shift_sint16(i16_0, i)].
-Let a_19 = a_9[shift_uint16(u16_0, i)].
-Let a_20 = a_7[shift_sint32(i32_0, i)].
-Let a_21 = a_5[shift_uint32(u32_0, i)].
+Let a_18 = a_9[shift_uint16(u16_0, i)].
+Let a_19 = a_11[shift_sint16(i16_0, i)].
+Let a_20 = a_5[shift_uint32(u32_0, i)].
+Let a_21 = a_7[shift_sint32(i32_0, i)].
 Let a_22 = a_3[shift_sint64(i64_0, i)].
 Assume {
-  Type: IsArray_sint8(x) /\ is_sint16_chunk(Mint_1) /\
-      is_sint32_chunk(Mint_3) /\ is_sint64_chunk(Mint_5) /\
-      is_sint8_chunk(Mchar_0) /\ is_uint16_chunk(Mint_2) /\
-      is_uint32_chunk(Mint_4) /\ is_uint64_chunk(Mint_6) /\
+  Type: IsArray_sint8(x) /\ is_sint16_chunk(Mint_2) /\
+      is_sint32_chunk(Mint_4) /\ is_sint64_chunk(Mint_6) /\
+      is_sint8_chunk(Mchar_0) /\ is_uint16_chunk(Mint_1) /\
+      is_uint32_chunk(Mint_3) /\ is_uint64_chunk(Mint_5) /\
       is_uint8_chunk(Mint_0) /\ is_sint32(i_1) /\ is_sint16_chunk(a_11) /\
       is_sint32_chunk(a_7) /\ is_sint64_chunk(a_3) /\ is_sint8_chunk(a_15) /\
       is_uint16_chunk(a_9) /\ is_uint32_chunk(a_5) /\ is_uint64_chunk(a_1) /\
@@ -85,9 +85,9 @@ Assume {
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: (a_16 = (1 + x[i])) /\ (a_17 = (1 + a_16)) /\ (a_18 = (1 + a_17)) /\
-    (a_19 = (1 + a_18)) /\ (a_20 = (1 + a_19)) /\ (a_21 = (1 + a_20)) /\
-    (a_22 = (1 + a_21)) /\ (a_1[shift_uint64(u64_0, i)] = (1 + a_22)).
+Prove: (a_16 = (1 + x[i])) /\ (a_17 = (1 + a_16)) /\ (a_18 = (1 + a_19)) /\
+    (a_19 = (1 + a_17)) /\ (a_20 = (1 + a_21)) /\ (a_21 = (1 + a_18)) /\
+    (a_1[shift_uint64(u64_0, i)] = (1 + a_22)) /\ (a_22 = (1 + a_20)).
 
 ------------------------------------------------------------
 
@@ -111,21 +111,21 @@ Let a_5 = shift_sint16(i16_0, i).
 Let a_6 = shift_uint8(u8_0, i).
 Let a_7 = shift_sint8(i8_0, i).
 Let a_8 = shift_uint64(u64_0, 0).
-Let a_9 = havoc(Mint_undef_5, Mint_5, a_8, 10).
+Let a_9 = memcpy(Mint_5, Mint_undef_5, a_8, a_8, 10).
 Let a_10 = shift_sint64(i64_0, 0).
-Let a_11 = havoc(Mint_undef_2, Mint_2, a_10, 10).
+Let a_11 = memcpy(Mint_2, Mint_undef_2, a_10, a_10, 10).
 Let a_12 = shift_uint32(u32_0, 0).
-Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_13 = memcpy(Mint_4, Mint_undef_4, a_12, a_12, 10).
 Let a_14 = shift_sint32(i32_0, 0).
-Let a_15 = havoc(Mint_undef_1, Mint_1, a_14, 10).
+Let a_15 = memcpy(Mint_1, Mint_undef_1, a_14, a_14, 10).
 Let a_16 = shift_uint16(u16_0, 0).
-Let a_17 = havoc(Mint_undef_3, Mint_3, a_16, 10).
+Let a_17 = memcpy(Mint_3, Mint_undef_3, a_16, a_16, 10).
 Let a_18 = shift_sint16(i16_0, 0).
-Let a_19 = havoc(Mint_undef_0, Mint_0, a_18, 10).
+Let a_19 = memcpy(Mint_0, Mint_undef_0, a_18, a_18, 10).
 Let a_20 = shift_uint8(u8_0, 0).
-Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_21 = memcpy(Mint_6, Mint_undef_6, a_20, a_20, 10).
 Let a_22 = shift_sint8(i8_0, 0).
-Let a_23 = havoc(Mchar_undef_0, Mchar_0, a_22, 10).
+Let a_23 = memcpy(Mchar_0, Mchar_undef_0, a_22, a_22, 10).
 Let a_24 = a_23[a_7 <- 1].
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
@@ -213,7 +213,7 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 33):
 Let a = shift_sint8(i8_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, 10).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, 10).
 Let a_2 = shift_sint8(i8_0, i).
 Let a_3 = a_1[a_2 <- 1].
 Let a_4 = shift_uint64(u64_0, i).
@@ -224,19 +224,19 @@ Let a_8 = shift_uint16(u16_0, i).
 Let a_9 = shift_sint16(i16_0, i).
 Let a_10 = shift_uint8(u8_0, i).
 Let a_11 = shift_uint64(u64_0, 0).
-Let a_12 = havoc(Mint_undef_6, Mint_6, a_11, 10).
+Let a_12 = memcpy(Mint_6, Mint_undef_6, a_11, a_11, 10).
 Let a_13 = shift_sint64(i64_0, 0).
-Let a_14 = havoc(Mint_undef_3, Mint_3, a_13, 10).
+Let a_14 = memcpy(Mint_3, Mint_undef_3, a_13, a_13, 10).
 Let a_15 = shift_uint32(u32_0, 0).
-Let a_16 = havoc(Mint_undef_5, Mint_5, a_15, 10).
+Let a_16 = memcpy(Mint_5, Mint_undef_5, a_15, a_15, 10).
 Let a_17 = shift_sint32(i32_0, 0).
-Let a_18 = havoc(Mint_undef_2, Mint_2, a_17, 10).
+Let a_18 = memcpy(Mint_2, Mint_undef_2, a_17, a_17, 10).
 Let a_19 = shift_uint16(u16_0, 0).
-Let a_20 = havoc(Mint_undef_4, Mint_4, a_19, 10).
+Let a_20 = memcpy(Mint_4, Mint_undef_4, a_19, a_19, 10).
 Let a_21 = shift_sint16(i16_0, 0).
-Let a_22 = havoc(Mint_undef_1, Mint_1, a_21, 10).
+Let a_22 = memcpy(Mint_1, Mint_undef_1, a_21, a_21, 10).
 Let a_23 = shift_uint8(u8_0, 0).
-Let a_24 = havoc(Mint_undef_0, Mint_0, a_23, 10).
+Let a_24 = memcpy(Mint_0, Mint_undef_0, a_23, a_23, 10).
 Let a_25 = a_24[a_10 <- 2].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -327,11 +327,11 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 34):
 Let a = shift_uint8(u8_0, 0).
-Let a_1 = havoc(Mint_undef_6, Mint_6, a, 10).
+Let a_1 = memcpy(Mint_6, Mint_undef_6, a, a, 10).
 Let a_2 = shift_uint8(u8_0, i).
 Let a_3 = a_1[a_2 <- 2].
 Let a_4 = shift_sint8(i8_0, 0).
-Let a_5 = havoc(Mchar_undef_0, Mchar_0, a_4, 10).
+Let a_5 = memcpy(Mchar_0, Mchar_undef_0, a_4, a_4, 10).
 Let a_6 = shift_sint8(i8_0, i).
 Let a_7 = a_5[a_6 <- 1].
 Let a_8 = shift_uint64(u64_0, i).
@@ -341,17 +341,17 @@ Let a_11 = shift_sint32(i32_0, i).
 Let a_12 = shift_uint16(u16_0, i).
 Let a_13 = shift_sint16(i16_0, i).
 Let a_14 = shift_uint64(u64_0, 0).
-Let a_15 = havoc(Mint_undef_5, Mint_5, a_14, 10).
+Let a_15 = memcpy(Mint_5, Mint_undef_5, a_14, a_14, 10).
 Let a_16 = shift_sint64(i64_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
+Let a_17 = memcpy(Mint_2, Mint_undef_2, a_16, a_16, 10).
 Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
+Let a_19 = memcpy(Mint_4, Mint_undef_4, a_18, a_18, 10).
 Let a_20 = shift_sint32(i32_0, 0).
-Let a_21 = havoc(Mint_undef_1, Mint_1, a_20, 10).
+Let a_21 = memcpy(Mint_1, Mint_undef_1, a_20, a_20, 10).
 Let a_22 = shift_uint16(u16_0, 0).
-Let a_23 = havoc(Mint_undef_3, Mint_3, a_22, 10).
+Let a_23 = memcpy(Mint_3, Mint_undef_3, a_22, a_22, 10).
 Let a_24 = shift_sint16(i16_0, 0).
-Let a_25 = havoc(Mint_undef_0, Mint_0, a_24, 10).
+Let a_25 = memcpy(Mint_0, Mint_undef_0, a_24, a_24, 10).
 Let a_26 = a_25[a_13 <- 3].
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
@@ -445,15 +445,15 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 35):
 Let a = shift_sint16(i16_0, 0).
-Let a_1 = havoc(Mint_undef_1, Mint_1, a, 10).
+Let a_1 = memcpy(Mint_1, Mint_undef_1, a, a, 10).
 Let a_2 = shift_sint16(i16_0, i).
 Let a_3 = a_1[a_2 <- 3].
 Let a_4 = shift_uint8(u8_0, 0).
-Let a_5 = havoc(Mint_undef_6, Mint_6, a_4, 10).
+Let a_5 = memcpy(Mint_6, Mint_undef_6, a_4, a_4, 10).
 Let a_6 = shift_uint8(u8_0, i).
 Let a_7 = a_5[a_6 <- 2].
 Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
+Let a_9 = memcpy(Mchar_0, Mchar_undef_0, a_8, a_8, 10).
 Let a_10 = shift_sint8(i8_0, i).
 Let a_11 = a_9[a_10 <- 1].
 Let a_12 = shift_uint64(u64_0, i).
@@ -462,15 +462,15 @@ Let a_14 = shift_uint32(u32_0, i).
 Let a_15 = shift_sint32(i32_0, i).
 Let a_16 = shift_uint16(u16_0, i).
 Let a_17 = shift_uint64(u64_0, 0).
-Let a_18 = havoc(Mint_undef_5, Mint_5, a_17, 10).
+Let a_18 = memcpy(Mint_5, Mint_undef_5, a_17, a_17, 10).
 Let a_19 = shift_sint64(i64_0, 0).
-Let a_20 = havoc(Mint_undef_3, Mint_3, a_19, 10).
+Let a_20 = memcpy(Mint_3, Mint_undef_3, a_19, a_19, 10).
 Let a_21 = shift_uint32(u32_0, 0).
-Let a_22 = havoc(Mint_undef_4, Mint_4, a_21, 10).
+Let a_22 = memcpy(Mint_4, Mint_undef_4, a_21, a_21, 10).
 Let a_23 = shift_sint32(i32_0, 0).
-Let a_24 = havoc(Mint_undef_2, Mint_2, a_23, 10).
+Let a_24 = memcpy(Mint_2, Mint_undef_2, a_23, a_23, 10).
 Let a_25 = shift_uint16(u16_0, 0).
-Let a_26 = havoc(Mint_undef_0, Mint_0, a_25, 10).
+Let a_26 = memcpy(Mint_0, Mint_undef_0, a_25, a_25, 10).
 Let a_27 = a_26[a_16 <- 4].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -567,19 +567,19 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 36):
 Let a = shift_uint16(u16_0, 0).
-Let a_1 = havoc(Mint_undef_3, Mint_3, a, 10).
+Let a_1 = memcpy(Mint_3, Mint_undef_3, a, a, 10).
 Let a_2 = shift_uint16(u16_0, i).
 Let a_3 = a_1[a_2 <- 4].
 Let a_4 = shift_sint16(i16_0, 0).
-Let a_5 = havoc(Mint_undef_1, Mint_1, a_4, 10).
+Let a_5 = memcpy(Mint_1, Mint_undef_1, a_4, a_4, 10).
 Let a_6 = shift_sint16(i16_0, i).
 Let a_7 = a_5[a_6 <- 3].
 Let a_8 = shift_uint8(u8_0, 0).
-Let a_9 = havoc(Mint_undef_6, Mint_6, a_8, 10).
+Let a_9 = memcpy(Mint_6, Mint_undef_6, a_8, a_8, 10).
 Let a_10 = shift_uint8(u8_0, i).
 Let a_11 = a_9[a_10 <- 2].
 Let a_12 = shift_sint8(i8_0, 0).
-Let a_13 = havoc(Mchar_undef_0, Mchar_0, a_12, 10).
+Let a_13 = memcpy(Mchar_0, Mchar_undef_0, a_12, a_12, 10).
 Let a_14 = shift_sint8(i8_0, i).
 Let a_15 = a_13[a_14 <- 1].
 Let a_16 = shift_uint64(u64_0, i).
@@ -587,13 +587,13 @@ Let a_17 = shift_sint64(i64_0, i).
 Let a_18 = shift_uint32(u32_0, i).
 Let a_19 = shift_sint32(i32_0, i).
 Let a_20 = shift_uint64(u64_0, 0).
-Let a_21 = havoc(Mint_undef_5, Mint_5, a_20, 10).
+Let a_21 = memcpy(Mint_5, Mint_undef_5, a_20, a_20, 10).
 Let a_22 = shift_sint64(i64_0, 0).
-Let a_23 = havoc(Mint_undef_2, Mint_2, a_22, 10).
+Let a_23 = memcpy(Mint_2, Mint_undef_2, a_22, a_22, 10).
 Let a_24 = shift_uint32(u32_0, 0).
-Let a_25 = havoc(Mint_undef_4, Mint_4, a_24, 10).
+Let a_25 = memcpy(Mint_4, Mint_undef_4, a_24, a_24, 10).
 Let a_26 = shift_sint32(i32_0, 0).
-Let a_27 = havoc(Mint_undef_0, Mint_0, a_26, 10).
+Let a_27 = memcpy(Mint_0, Mint_undef_0, a_26, a_26, 10).
 Let a_28 = a_27[a_19 <- 5].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_0) /\
@@ -693,34 +693,34 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 37):
 Let a = shift_sint32(i32_0, 0).
-Let a_1 = havoc(Mint_undef_2, Mint_2, a, 10).
+Let a_1 = memcpy(Mint_2, Mint_undef_2, a, a, 10).
 Let a_2 = shift_sint32(i32_0, i).
 Let a_3 = a_1[a_2 <- 5].
 Let a_4 = shift_uint16(u16_0, 0).
-Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_5 = memcpy(Mint_4, Mint_undef_4, a_4, a_4, 10).
 Let a_6 = shift_uint16(u16_0, i).
 Let a_7 = a_5[a_6 <- 4].
 Let a_8 = shift_sint16(i16_0, 0).
-Let a_9 = havoc(Mint_undef_1, Mint_1, a_8, 10).
+Let a_9 = memcpy(Mint_1, Mint_undef_1, a_8, a_8, 10).
 Let a_10 = shift_sint16(i16_0, i).
 Let a_11 = a_9[a_10 <- 3].
 Let a_12 = shift_uint8(u8_0, 0).
-Let a_13 = havoc(Mint_undef_6, Mint_6, a_12, 10).
+Let a_13 = memcpy(Mint_6, Mint_undef_6, a_12, a_12, 10).
 Let a_14 = shift_uint8(u8_0, i).
 Let a_15 = a_13[a_14 <- 2].
 Let a_16 = shift_sint8(i8_0, 0).
-Let a_17 = havoc(Mchar_undef_0, Mchar_0, a_16, 10).
+Let a_17 = memcpy(Mchar_0, Mchar_undef_0, a_16, a_16, 10).
 Let a_18 = shift_sint8(i8_0, i).
 Let a_19 = a_17[a_18 <- 1].
 Let a_20 = shift_uint64(u64_0, i).
 Let a_21 = shift_sint64(i64_0, i).
 Let a_22 = shift_uint32(u32_0, i).
 Let a_23 = shift_uint64(u64_0, 0).
-Let a_24 = havoc(Mint_undef_5, Mint_5, a_23, 10).
+Let a_24 = memcpy(Mint_5, Mint_undef_5, a_23, a_23, 10).
 Let a_25 = shift_sint64(i64_0, 0).
-Let a_26 = havoc(Mint_undef_3, Mint_3, a_25, 10).
+Let a_26 = memcpy(Mint_3, Mint_undef_3, a_25, a_25, 10).
 Let a_27 = shift_uint32(u32_0, 0).
-Let a_28 = havoc(Mint_undef_0, Mint_0, a_27, 10).
+Let a_28 = memcpy(Mint_0, Mint_undef_0, a_27, a_27, 10).
 Let a_29 = a_28[a_22 <- 6].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -823,35 +823,35 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 38):
 Let a = shift_uint32(u32_0, 0).
-Let a_1 = havoc(Mint_undef_4, Mint_4, a, 10).
+Let a_1 = memcpy(Mint_4, Mint_undef_4, a, a, 10).
 Let a_2 = shift_uint32(u32_0, i).
 Let a_3 = a_1[a_2 <- 6].
 Let a_4 = shift_sint32(i32_0, 0).
-Let a_5 = havoc(Mint_undef_2, Mint_2, a_4, 10).
+Let a_5 = memcpy(Mint_2, Mint_undef_2, a_4, a_4, 10).
 Let a_6 = shift_sint32(i32_0, i).
 Let a_7 = a_5[a_6 <- 5].
 Let a_8 = shift_uint16(u16_0, 0).
-Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
+Let a_9 = memcpy(Mint_3, Mint_undef_3, a_8, a_8, 10).
 Let a_10 = shift_uint16(u16_0, i).
 Let a_11 = a_9[a_10 <- 4].
 Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
+Let a_13 = memcpy(Mint_1, Mint_undef_1, a_12, a_12, 10).
 Let a_14 = shift_sint16(i16_0, i).
 Let a_15 = a_13[a_14 <- 3].
 Let a_16 = shift_uint8(u8_0, 0).
-Let a_17 = havoc(Mint_undef_6, Mint_6, a_16, 10).
+Let a_17 = memcpy(Mint_6, Mint_undef_6, a_16, a_16, 10).
 Let a_18 = shift_uint8(u8_0, i).
 Let a_19 = a_17[a_18 <- 2].
 Let a_20 = shift_sint8(i8_0, 0).
-Let a_21 = havoc(Mchar_undef_0, Mchar_0, a_20, 10).
+Let a_21 = memcpy(Mchar_0, Mchar_undef_0, a_20, a_20, 10).
 Let a_22 = shift_sint8(i8_0, i).
 Let a_23 = a_21[a_22 <- 1].
 Let a_24 = shift_uint64(u64_0, i).
 Let a_25 = shift_sint64(i64_0, i).
 Let a_26 = shift_uint64(u64_0, 0).
-Let a_27 = havoc(Mint_undef_5, Mint_5, a_26, 10).
+Let a_27 = memcpy(Mint_5, Mint_undef_5, a_26, a_26, 10).
 Let a_28 = shift_sint64(i64_0, 0).
-Let a_29 = havoc(Mint_undef_0, Mint_0, a_28, 10).
+Let a_29 = memcpy(Mint_0, Mint_undef_0, a_28, a_28, 10).
 Let a_30 = a_29[a_25 <- 7].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -957,36 +957,36 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 39):
 Let a = shift_sint64(i64_0, 0).
-Let a_1 = havoc(Mint_undef_3, Mint_3, a, 10).
+Let a_1 = memcpy(Mint_3, Mint_undef_3, a, a, 10).
 Let a_2 = shift_sint64(i64_0, i).
 Let a_3 = a_1[a_2 <- 7].
 Let a_4 = shift_uint32(u32_0, 0).
-Let a_5 = havoc(Mint_undef_5, Mint_5, a_4, 10).
+Let a_5 = memcpy(Mint_5, Mint_undef_5, a_4, a_4, 10).
 Let a_6 = shift_uint32(u32_0, i).
 Let a_7 = a_5[a_6 <- 6].
 Let a_8 = shift_sint32(i32_0, 0).
-Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_9 = memcpy(Mint_2, Mint_undef_2, a_8, a_8, 10).
 Let a_10 = shift_sint32(i32_0, i).
 Let a_11 = a_9[a_10 <- 5].
 Let a_12 = shift_uint16(u16_0, 0).
-Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_13 = memcpy(Mint_4, Mint_undef_4, a_12, a_12, 10).
 Let a_14 = shift_uint16(u16_0, i).
 Let a_15 = a_13[a_14 <- 4].
 Let a_16 = shift_sint16(i16_0, 0).
-Let a_17 = havoc(Mint_undef_1, Mint_1, a_16, 10).
+Let a_17 = memcpy(Mint_1, Mint_undef_1, a_16, a_16, 10).
 Let a_18 = shift_sint16(i16_0, i).
 Let a_19 = a_17[a_18 <- 3].
 Let a_20 = shift_uint8(u8_0, 0).
-Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_21 = memcpy(Mint_6, Mint_undef_6, a_20, a_20, 10).
 Let a_22 = shift_uint8(u8_0, i).
 Let a_23 = a_21[a_22 <- 2].
 Let a_24 = shift_sint8(i8_0, 0).
-Let a_25 = havoc(Mchar_undef_0, Mchar_0, a_24, 10).
+Let a_25 = memcpy(Mchar_0, Mchar_undef_0, a_24, a_24, 10).
 Let a_26 = shift_sint8(i8_0, i).
 Let a_27 = a_25[a_26 <- 1].
 Let a_28 = shift_uint64(u64_0, i).
 Let a_29 = shift_uint64(u64_0, 0).
-Let a_30 = havoc(Mint_undef_0, Mint_0, a_29, 10).
+Let a_30 = memcpy(Mint_0, Mint_undef_0, a_29, a_29, 10).
 Let a_31 = a_30[a_28 <- 8].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -1095,21 +1095,21 @@ Prove: true.
 
 Goal Assertion 'rte,mem_access' (file chunk_typing.i, line 45):
 Let a = shift_uint64(u64_0, 0).
-Let a_1 = havoc(Mint_undef_5, Mint_5, a, 10).
+Let a_1 = memcpy(Mint_5, Mint_undef_5, a, a, 10).
 Let a_2 = shift_sint64(i64_0, 0).
-Let a_3 = havoc(Mint_undef_2, Mint_2, a_2, 10).
+Let a_3 = memcpy(Mint_2, Mint_undef_2, a_2, a_2, 10).
 Let a_4 = shift_uint32(u32_0, 0).
-Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_5 = memcpy(Mint_4, Mint_undef_4, a_4, a_4, 10).
 Let a_6 = shift_sint32(i32_0, 0).
-Let a_7 = havoc(Mint_undef_1, Mint_1, a_6, 10).
+Let a_7 = memcpy(Mint_1, Mint_undef_1, a_6, a_6, 10).
 Let a_8 = shift_uint16(u16_0, 0).
-Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
+Let a_9 = memcpy(Mint_3, Mint_undef_3, a_8, a_8, 10).
 Let a_10 = shift_sint16(i16_0, 0).
-Let a_11 = havoc(Mint_undef_0, Mint_0, a_10, 10).
+Let a_11 = memcpy(Mint_0, Mint_undef_0, a_10, a_10, 10).
 Let a_12 = shift_uint8(u8_0, 0).
-Let a_13 = havoc(Mint_undef_6, Mint_6, a_12, 10).
+Let a_13 = memcpy(Mint_6, Mint_undef_6, a_12, a_12, 10).
 Let a_14 = shift_sint8(i8_0, 0).
-Let a_15 = havoc(Mchar_undef_0, Mchar_0, a_14, 10).
+Let a_15 = memcpy(Mchar_0, Mchar_undef_0, a_14, a_14, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1165,21 +1165,21 @@ Prove: valid_rw(Malloc_0, shift_sint8(i8_0, i), 1).
 Goal Assertion 'rte,mem_access' (file chunk_typing.i, line 46):
 Let a = shift_sint8(i8_0, i).
 Let a_1 = shift_uint64(u64_0, 0).
-Let a_2 = havoc(Mint_undef_5, Mint_5, a_1, 10).
+Let a_2 = memcpy(Mint_5, Mint_undef_5, a_1, a_1, 10).
 Let a_3 = shift_sint64(i64_0, 0).
-Let a_4 = havoc(Mint_undef_2, Mint_2, a_3, 10).
+Let a_4 = memcpy(Mint_2, Mint_undef_2, a_3, a_3, 10).
 Let a_5 = shift_uint32(u32_0, 0).
-Let a_6 = havoc(Mint_undef_4, Mint_4, a_5, 10).
+Let a_6 = memcpy(Mint_4, Mint_undef_4, a_5, a_5, 10).
 Let a_7 = shift_sint32(i32_0, 0).
-Let a_8 = havoc(Mint_undef_1, Mint_1, a_7, 10).
+Let a_8 = memcpy(Mint_1, Mint_undef_1, a_7, a_7, 10).
 Let a_9 = shift_uint16(u16_0, 0).
-Let a_10 = havoc(Mint_undef_3, Mint_3, a_9, 10).
+Let a_10 = memcpy(Mint_3, Mint_undef_3, a_9, a_9, 10).
 Let a_11 = shift_sint16(i16_0, 0).
-Let a_12 = havoc(Mint_undef_0, Mint_0, a_11, 10).
+Let a_12 = memcpy(Mint_0, Mint_undef_0, a_11, a_11, 10).
 Let a_13 = shift_uint8(u8_0, 0).
-Let a_14 = havoc(Mint_undef_6, Mint_6, a_13, 10).
+Let a_14 = memcpy(Mint_6, Mint_undef_6, a_13, a_13, 10).
 Let a_15 = shift_sint8(i8_0, 0).
-Let a_16 = havoc(Mchar_undef_0, Mchar_0, a_15, 10).
+Let a_16 = memcpy(Mchar_0, Mchar_undef_0, a_15, a_15, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1240,21 +1240,21 @@ Goal Assertion 'rte,mem_access' (file chunk_typing.i, line 47):
 Let a = shift_uint8(u8_0, i).
 Let a_1 = shift_sint8(i8_0, i).
 Let a_2 = shift_uint64(u64_0, 0).
-Let a_3 = havoc(Mint_undef_5, Mint_5, a_2, 10).
+Let a_3 = memcpy(Mint_5, Mint_undef_5, a_2, a_2, 10).
 Let a_4 = shift_sint64(i64_0, 0).
-Let a_5 = havoc(Mint_undef_2, Mint_2, a_4, 10).
+Let a_5 = memcpy(Mint_2, Mint_undef_2, a_4, a_4, 10).
 Let a_6 = shift_uint32(u32_0, 0).
-Let a_7 = havoc(Mint_undef_4, Mint_4, a_6, 10).
+Let a_7 = memcpy(Mint_4, Mint_undef_4, a_6, a_6, 10).
 Let a_8 = shift_sint32(i32_0, 0).
-Let a_9 = havoc(Mint_undef_1, Mint_1, a_8, 10).
+Let a_9 = memcpy(Mint_1, Mint_undef_1, a_8, a_8, 10).
 Let a_10 = shift_uint16(u16_0, 0).
-Let a_11 = havoc(Mint_undef_3, Mint_3, a_10, 10).
+Let a_11 = memcpy(Mint_3, Mint_undef_3, a_10, a_10, 10).
 Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
+Let a_13 = memcpy(Mint_0, Mint_undef_0, a_12, a_12, 10).
 Let a_14 = shift_uint8(u8_0, 0).
-Let a_15 = havoc(Mint_undef_6, Mint_6, a_14, 10).
+Let a_15 = memcpy(Mint_6, Mint_undef_6, a_14, a_14, 10).
 Let a_16 = shift_sint8(i8_0, 0).
-Let a_17 = havoc(Mchar_undef_0, Mchar_0, a_16, 10).
+Let a_17 = memcpy(Mchar_0, Mchar_undef_0, a_16, a_16, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1318,21 +1318,21 @@ Let a = shift_sint16(i16_0, i).
 Let a_1 = shift_uint8(u8_0, i).
 Let a_2 = shift_sint8(i8_0, i).
 Let a_3 = shift_uint64(u64_0, 0).
-Let a_4 = havoc(Mint_undef_5, Mint_5, a_3, 10).
+Let a_4 = memcpy(Mint_5, Mint_undef_5, a_3, a_3, 10).
 Let a_5 = shift_sint64(i64_0, 0).
-Let a_6 = havoc(Mint_undef_2, Mint_2, a_5, 10).
+Let a_6 = memcpy(Mint_2, Mint_undef_2, a_5, a_5, 10).
 Let a_7 = shift_uint32(u32_0, 0).
-Let a_8 = havoc(Mint_undef_4, Mint_4, a_7, 10).
+Let a_8 = memcpy(Mint_4, Mint_undef_4, a_7, a_7, 10).
 Let a_9 = shift_sint32(i32_0, 0).
-Let a_10 = havoc(Mint_undef_1, Mint_1, a_9, 10).
+Let a_10 = memcpy(Mint_1, Mint_undef_1, a_9, a_9, 10).
 Let a_11 = shift_uint16(u16_0, 0).
-Let a_12 = havoc(Mint_undef_3, Mint_3, a_11, 10).
+Let a_12 = memcpy(Mint_3, Mint_undef_3, a_11, a_11, 10).
 Let a_13 = shift_sint16(i16_0, 0).
-Let a_14 = havoc(Mint_undef_0, Mint_0, a_13, 10).
+Let a_14 = memcpy(Mint_0, Mint_undef_0, a_13, a_13, 10).
 Let a_15 = shift_uint8(u8_0, 0).
-Let a_16 = havoc(Mint_undef_6, Mint_6, a_15, 10).
+Let a_16 = memcpy(Mint_6, Mint_undef_6, a_15, a_15, 10).
 Let a_17 = shift_sint8(i8_0, 0).
-Let a_18 = havoc(Mchar_undef_0, Mchar_0, a_17, 10).
+Let a_18 = memcpy(Mchar_0, Mchar_undef_0, a_17, a_17, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1400,21 +1400,21 @@ Let a_1 = shift_sint16(i16_0, i).
 Let a_2 = shift_uint8(u8_0, i).
 Let a_3 = shift_sint8(i8_0, i).
 Let a_4 = shift_uint64(u64_0, 0).
-Let a_5 = havoc(Mint_undef_5, Mint_5, a_4, 10).
+Let a_5 = memcpy(Mint_5, Mint_undef_5, a_4, a_4, 10).
 Let a_6 = shift_sint64(i64_0, 0).
-Let a_7 = havoc(Mint_undef_2, Mint_2, a_6, 10).
+Let a_7 = memcpy(Mint_2, Mint_undef_2, a_6, a_6, 10).
 Let a_8 = shift_uint32(u32_0, 0).
-Let a_9 = havoc(Mint_undef_4, Mint_4, a_8, 10).
+Let a_9 = memcpy(Mint_4, Mint_undef_4, a_8, a_8, 10).
 Let a_10 = shift_sint32(i32_0, 0).
-Let a_11 = havoc(Mint_undef_1, Mint_1, a_10, 10).
+Let a_11 = memcpy(Mint_1, Mint_undef_1, a_10, a_10, 10).
 Let a_12 = shift_uint16(u16_0, 0).
-Let a_13 = havoc(Mint_undef_3, Mint_3, a_12, 10).
+Let a_13 = memcpy(Mint_3, Mint_undef_3, a_12, a_12, 10).
 Let a_14 = shift_sint16(i16_0, 0).
-Let a_15 = havoc(Mint_undef_0, Mint_0, a_14, 10).
+Let a_15 = memcpy(Mint_0, Mint_undef_0, a_14, a_14, 10).
 Let a_16 = shift_uint8(u8_0, 0).
-Let a_17 = havoc(Mint_undef_6, Mint_6, a_16, 10).
+Let a_17 = memcpy(Mint_6, Mint_undef_6, a_16, a_16, 10).
 Let a_18 = shift_sint8(i8_0, 0).
-Let a_19 = havoc(Mchar_undef_0, Mchar_0, a_18, 10).
+Let a_19 = memcpy(Mchar_0, Mchar_undef_0, a_18, a_18, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1485,21 +1485,21 @@ Let a_2 = shift_sint16(i16_0, i).
 Let a_3 = shift_uint8(u8_0, i).
 Let a_4 = shift_sint8(i8_0, i).
 Let a_5 = shift_uint64(u64_0, 0).
-Let a_6 = havoc(Mint_undef_5, Mint_5, a_5, 10).
+Let a_6 = memcpy(Mint_5, Mint_undef_5, a_5, a_5, 10).
 Let a_7 = shift_sint64(i64_0, 0).
-Let a_8 = havoc(Mint_undef_2, Mint_2, a_7, 10).
+Let a_8 = memcpy(Mint_2, Mint_undef_2, a_7, a_7, 10).
 Let a_9 = shift_uint32(u32_0, 0).
-Let a_10 = havoc(Mint_undef_4, Mint_4, a_9, 10).
+Let a_10 = memcpy(Mint_4, Mint_undef_4, a_9, a_9, 10).
 Let a_11 = shift_sint32(i32_0, 0).
-Let a_12 = havoc(Mint_undef_1, Mint_1, a_11, 10).
+Let a_12 = memcpy(Mint_1, Mint_undef_1, a_11, a_11, 10).
 Let a_13 = shift_uint16(u16_0, 0).
-Let a_14 = havoc(Mint_undef_3, Mint_3, a_13, 10).
+Let a_14 = memcpy(Mint_3, Mint_undef_3, a_13, a_13, 10).
 Let a_15 = shift_sint16(i16_0, 0).
-Let a_16 = havoc(Mint_undef_0, Mint_0, a_15, 10).
+Let a_16 = memcpy(Mint_0, Mint_undef_0, a_15, a_15, 10).
 Let a_17 = shift_uint8(u8_0, 0).
-Let a_18 = havoc(Mint_undef_6, Mint_6, a_17, 10).
+Let a_18 = memcpy(Mint_6, Mint_undef_6, a_17, a_17, 10).
 Let a_19 = shift_sint8(i8_0, 0).
-Let a_20 = havoc(Mchar_undef_0, Mchar_0, a_19, 10).
+Let a_20 = memcpy(Mchar_0, Mchar_undef_0, a_19, a_19, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1574,21 +1574,21 @@ Let a_3 = shift_sint16(i16_0, i).
 Let a_4 = shift_uint8(u8_0, i).
 Let a_5 = shift_sint8(i8_0, i).
 Let a_6 = shift_uint64(u64_0, 0).
-Let a_7 = havoc(Mint_undef_5, Mint_5, a_6, 10).
+Let a_7 = memcpy(Mint_5, Mint_undef_5, a_6, a_6, 10).
 Let a_8 = shift_sint64(i64_0, 0).
-Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_9 = memcpy(Mint_2, Mint_undef_2, a_8, a_8, 10).
 Let a_10 = shift_uint32(u32_0, 0).
-Let a_11 = havoc(Mint_undef_4, Mint_4, a_10, 10).
+Let a_11 = memcpy(Mint_4, Mint_undef_4, a_10, a_10, 10).
 Let a_12 = shift_sint32(i32_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
+Let a_13 = memcpy(Mint_1, Mint_undef_1, a_12, a_12, 10).
 Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
+Let a_15 = memcpy(Mint_3, Mint_undef_3, a_14, a_14, 10).
 Let a_16 = shift_sint16(i16_0, 0).
-Let a_17 = havoc(Mint_undef_0, Mint_0, a_16, 10).
+Let a_17 = memcpy(Mint_0, Mint_undef_0, a_16, a_16, 10).
 Let a_18 = shift_uint8(u8_0, 0).
-Let a_19 = havoc(Mint_undef_6, Mint_6, a_18, 10).
+Let a_19 = memcpy(Mint_6, Mint_undef_6, a_18, a_18, 10).
 Let a_20 = shift_sint8(i8_0, 0).
-Let a_21 = havoc(Mchar_undef_0, Mchar_0, a_20, 10).
+Let a_21 = memcpy(Mchar_0, Mchar_undef_0, a_20, a_20, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1666,21 +1666,21 @@ Let a_4 = shift_sint16(i16_0, i).
 Let a_5 = shift_uint8(u8_0, i).
 Let a_6 = shift_sint8(i8_0, i).
 Let a_7 = shift_uint64(u64_0, 0).
-Let a_8 = havoc(Mint_undef_5, Mint_5, a_7, 10).
+Let a_8 = memcpy(Mint_5, Mint_undef_5, a_7, a_7, 10).
 Let a_9 = shift_sint64(i64_0, 0).
-Let a_10 = havoc(Mint_undef_2, Mint_2, a_9, 10).
+Let a_10 = memcpy(Mint_2, Mint_undef_2, a_9, a_9, 10).
 Let a_11 = shift_uint32(u32_0, 0).
-Let a_12 = havoc(Mint_undef_4, Mint_4, a_11, 10).
+Let a_12 = memcpy(Mint_4, Mint_undef_4, a_11, a_11, 10).
 Let a_13 = shift_sint32(i32_0, 0).
-Let a_14 = havoc(Mint_undef_1, Mint_1, a_13, 10).
+Let a_14 = memcpy(Mint_1, Mint_undef_1, a_13, a_13, 10).
 Let a_15 = shift_uint16(u16_0, 0).
-Let a_16 = havoc(Mint_undef_3, Mint_3, a_15, 10).
+Let a_16 = memcpy(Mint_3, Mint_undef_3, a_15, a_15, 10).
 Let a_17 = shift_sint16(i16_0, 0).
-Let a_18 = havoc(Mint_undef_0, Mint_0, a_17, 10).
+Let a_18 = memcpy(Mint_0, Mint_undef_0, a_17, a_17, 10).
 Let a_19 = shift_uint8(u8_0, 0).
-Let a_20 = havoc(Mint_undef_6, Mint_6, a_19, 10).
+Let a_20 = memcpy(Mint_6, Mint_undef_6, a_19, a_19, 10).
 Let a_21 = shift_sint8(i8_0, 0).
-Let a_22 = havoc(Mchar_undef_0, Mchar_0, a_21, 10).
+Let a_22 = memcpy(Mchar_0, Mchar_undef_0, a_21, a_21, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
index 3658aa0a248..1ca8b3a8e79 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
@@ -25,7 +25,7 @@ Prove: true.
 
 Goal Preservation of Invariant (file looplabels.i, line 19):
 Let a_1 = shift_sint32(b, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = shift_sint32(a, 0).
 Let x = 1 + i.
 Assume {
@@ -89,7 +89,7 @@ Prove: true.
 Goal Loop assigns (file looplabels.i, line 20) (3/3):
 Effect at line 24
 Let a_1 = shift_sint32(b, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(b, x).
 Let a_4 = shift_sint32(a, 0).
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
index bbcfeeaf580..a2bb4e09129 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
@@ -52,15 +52,15 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Check 'fail' (file opaque_struct.i, line 60):
-Let a = havoc(Mint_undef_0, Mint_0, p, Length_of_S1_S).
-Let a_1 = havoc(Mint_undef_3, Mint_3, p, Length_of_S1_S).
-Let a_2 = havoc(Mint_undef_5, Mint_5, p, Length_of_S1_S).
-Let a_3 = havoc(Mint_undef_7, Mint_7, p, Length_of_S1_S).
-Let a_4 = havoc(Mchar_undef_0, Mchar_0, p, Length_of_S1_S).
-Let a_5 = havoc(Mint_undef_2, Mint_2, p, Length_of_S1_S).
-Let a_6 = havoc(Mint_undef_4, Mint_4, p, Length_of_S1_S).
-Let a_7 = havoc(Mint_undef_6, Mint_6, p, Length_of_S1_S).
-Let a_8 = havoc(Mint_undef_1, Mint_1, p, Length_of_S1_S).
+Let a = memcpy(Mint_0, Mint_undef_0, p, p, Length_of_S1_S).
+Let a_1 = memcpy(Mint_3, Mint_undef_3, p, p, Length_of_S1_S).
+Let a_2 = memcpy(Mint_5, Mint_undef_5, p, p, Length_of_S1_S).
+Let a_3 = memcpy(Mint_7, Mint_undef_7, p, p, Length_of_S1_S).
+Let a_4 = memcpy(Mchar_0, Mchar_undef_0, p, p, Length_of_S1_S).
+Let a_5 = memcpy(Mint_2, Mint_undef_2, p, p, Length_of_S1_S).
+Let a_6 = memcpy(Mint_4, Mint_undef_4, p, p, Length_of_S1_S).
+Let a_7 = memcpy(Mint_6, Mint_undef_6, p, p, Length_of_S1_S).
+Let a_8 = memcpy(Mint_1, Mint_undef_1, p, p, Length_of_S1_S).
 Assume {
   Type: is_bool_chunk(Mint_0) /\ is_sint16_chunk(Mint_3) /\
       is_sint32_chunk(Mint_5) /\ is_sint64_chunk(Mint_7) /\
@@ -74,9 +74,9 @@ Assume {
   Type: (region(p.base) <= 0) /\ framed(Mptr_0) /\ sconst(Mchar_0).
 }
 Prove: EqS1_S(Load_S1_S(p, a, a_8, a_4, a_5, a_1, a_6, a_2, a_7, a_3,
-                havoc(Mf32_undef_0, Mf32_0, p, Length_of_S1_S),
-                havoc(Mf64_undef_0, Mf64_0, p, Length_of_S1_S),
-                havoc(Mptr_undef_0, Mptr_0, p, Length_of_S1_S)),
+                memcpy(Mf32_0, Mf32_undef_0, p, p, Length_of_S1_S),
+                memcpy(Mf64_0, Mf64_undef_0, p, p, Length_of_S1_S),
+                memcpy(Mptr_0, Mptr_undef_0, p, p, Length_of_S1_S)),
          Load_S1_S(p, Mint_0, Mint_1, Mchar_0, Mint_2, Mint_3, Mint_4,
            Mint_5, Mint_6, Mint_7, Mf32_0, Mf64_0, Mptr_0)).
 
@@ -120,7 +120,7 @@ Prove: true.
 
 Goal Check 'fail' (file opaque_struct.i, line 69):
 Let x = Mint_0[p].
-Let a_1 = havoc(Mint_undef_0, Mint_0, a, Length_of_S1_S).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, Length_of_S1_S).
 Let a_2 = a_1[p].
 Assume {
   Type: is_sint32_chunk(Mint_0) /\ is_sint32(x) /\ is_sint32_chunk(a_1) /\
@@ -143,14 +143,14 @@ Assume {
   (* Pre-condition *)
   Have: separated(a, Length_of_S1_S, c, 1).
 }
-Prove: of_f32(havoc(Mf32_undef_0, Mf32_0, a, Length_of_S1_S)[q])
+Prove: of_f32(memcpy(Mf32_0, Mf32_undef_0, a, a, Length_of_S1_S)[q])
          = of_f32(Mf32_0[q]).
 
 ------------------------------------------------------------
 
 Goal Check 'succeed' (file opaque_struct.i, line 71):
 Let x = Mchar_0[c].
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, Length_of_S1_S).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, Length_of_S1_S).
 Let a_2 = a_1[c].
 Assume {
   Type: is_sint8_chunk(Mchar_0) /\ is_sint8(x) /\ is_sint8_chunk(a_1) /\
@@ -201,7 +201,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Check 'fails' (file opaque_struct.i, line 38):
-Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Let a = memcpy(Init_0, Init_undef_0, p, p, Length_of_S1_S).
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ linked(Malloc_0) /\ cinits(Init_0).
@@ -242,7 +242,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Check 'fail' (file opaque_struct.i, line 54):
-Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Let a = memcpy(Init_0, Init_undef_0, p, p, Length_of_S1_S).
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ cinits(Init_0).
@@ -256,7 +256,7 @@ Prove: !IsInit_S1_S(p, a).
 ------------------------------------------------------------
 
 Goal Check 'fail' (file opaque_struct.i, line 55):
-Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Let a = memcpy(Init_0, Init_undef_0, p, p, Length_of_S1_S).
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ cinits(Init_0).
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
index 08d574c3187..18a691c67f3 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
@@ -207,7 +207,7 @@ Prove: exists i : Z. forall i_1 : Z. (is_uint8(i_1) ->
 
 Goal Post-condition (file simpl_is_type.i, line 17) in 'f':
 Let a = shift_sint32(t, 0).
-Let a_1 = havoc(Mint_undef_0, Mint_0, a, size_0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
 Assume {
   Type: is_sint32(i) /\ is_sint32(size_0).
   (* Heap *)
@@ -230,7 +230,7 @@ Assume {
   (* Else *)
   Have: size_0 <= i.
 }
-Prove: 0 < havoc(Mint_undef_0, Mint_0, a, i)[shift_sint32(t, i_1)].
+Prove: 0 < memcpy(Mint_0, Mint_undef_0, a, a, i)[shift_sint32(t, i_1)].
 
 ------------------------------------------------------------
 
@@ -245,12 +245,13 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file simpl_is_type.i, line 23):
-Let a = havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), size_0).
-Let a_1 = shift_sint32(t, i).
-Let a_2 = a[a_1].
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
+Let a_2 = shift_sint32(t, i).
+Let a_3 = a_1[a_2].
 Assume {
   Type: is_sint32(i) /\ is_sint32(size_0) /\ is_sint32(1 + i) /\
-      is_sint32(a_2).
+      is_sint32(a_3).
   (* Heap *)
   Type: region(t.base) <= 0.
   (* Goal *)
@@ -264,16 +265,16 @@ Assume {
   Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (0 < a[shift_sint32(t, i_2)]))).
+      (0 < a_1[shift_sint32(t, i_2)]))).
   (* Invariant *)
   Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
-      (a[shift_sint32(t, i_2)] < 0))).
+      (a_1[shift_sint32(t, i_2)] < 0))).
   (* Then *)
   Have: i < size_0.
   (* Invariant *)
   Have: (-1) <= i.
 }
-Prove: 0 < a[a_1 <- -a_2][shift_sint32(t, i_1)].
+Prove: 0 < a_1[a_2 <- -a_3][shift_sint32(t, i_1)].
 
 ------------------------------------------------------------
 
@@ -283,13 +284,14 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file simpl_is_type.i, line 24):
-Let a = havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), size_0).
-Let a_1 = shift_sint32(t, i).
-Let a_2 = a[a_1].
-Let a_3 = a[a_1 <- -a_2].
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
+Let a_2 = shift_sint32(t, i).
+Let a_3 = a_1[a_2].
+Let a_4 = a_1[a_2 <- -a_3].
 Assume {
   Type: is_sint32(i) /\ is_sint32(size_0) /\ is_sint32(1 + i) /\
-      is_sint32(a_2).
+      is_sint32(a_3).
   (* Heap *)
   Type: region(t.base) <= 0.
   (* Goal *)
@@ -303,19 +305,19 @@ Assume {
   Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (0 < a[shift_sint32(t, i_2)]))).
+      (0 < a_1[shift_sint32(t, i_2)]))).
   (* Invariant *)
   Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
-      (a[shift_sint32(t, i_2)] < 0))).
+      (a_1[shift_sint32(t, i_2)] < 0))).
   (* Then *)
   Have: i < size_0.
   (* Invariant *)
   Have: (-1) <= i.
   (* Invariant *)
   Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
-      (0 < a_3[shift_sint32(t, i_2)]))).
+      (0 < a_4[shift_sint32(t, i_2)]))).
 }
-Prove: a_3[shift_sint32(t, i_1)] < 0.
+Prove: a_4[shift_sint32(t, i_1)] < 0.
 
 ------------------------------------------------------------
 
@@ -350,7 +352,7 @@ Prove: true.
 Goal Loop assigns (file simpl_is_type.i, line 25) (3/3):
 Effect at line 29
 Let a = shift_sint32(t, 0).
-Let a_1 = havoc(Mint_undef_0, Mint_0, a, size_0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
 Let x = i - 1.
 Let a_2 = shift_sint32(t, x).
 Let a_3 = a_1[a_2].
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
index f43f3e075ee..3488a9b01fa 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
@@ -149,9 +149,9 @@ theory Compound
   axiom Q_Load_S1_X_havoc_Mchar0 :
     forall mchar:addr -> int, mchar1:addr -> int, mint:addr -> int, mint1:
      addr -> int, n:int, p:addr, q:addr
-     [Load_S1_X p (havoc mchar1 mchar q n) mint mint1].
+     [Load_S1_X p (memcpy mchar mchar1 q q n) mint mint1].
      separated p 3 q n ->
-     Load_S1_X p (havoc mchar1 mchar q n) mint mint1 =
+     Load_S1_X p (memcpy mchar mchar1 q q n) mint mint1 =
      Load_S1_X p mchar mint mint1
   
   axiom Q_Load_S1_X_update_Mint1 :
@@ -172,9 +172,9 @@ theory Compound
   axiom Q_Load_S1_X_havoc_Mint1 :
     forall mchar:addr -> int, mint:addr -> int, mint1:addr -> int, mint2:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_X p mchar (havoc mint2 mint1 q n) mint].
+     [Load_S1_X p mchar (memcpy mint1 mint2 q q n) mint].
      separated p 3 q n ->
-     Load_S1_X p mchar (havoc mint2 mint1 q n) mint =
+     Load_S1_X p mchar (memcpy mint1 mint2 q q n) mint =
      Load_S1_X p mchar mint1 mint
   
   axiom Q_Load_S1_X_update_Mint2 :
@@ -195,9 +195,9 @@ theory Compound
   axiom Q_Load_S1_X_havoc_Mint2 :
     forall mchar:addr -> int, mint:addr -> int, mint1:addr -> int, mint2:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_X p mchar mint (havoc mint2 mint1 q n)].
+     [Load_S1_X p mchar mint (memcpy mint1 mint2 q q n)].
      separated p 3 q n ->
-     Load_S1_X p mchar mint (havoc mint2 mint1 q n) =
+     Load_S1_X p mchar mint (memcpy mint1 mint2 q q n) =
      Load_S1_X p mchar mint mint1
   
   axiom Q_Load_Init_S1_X_update_Init0 :
@@ -215,9 +215,9 @@ theory Compound
   
   axiom Q_Load_Init_S1_X_havoc_Init0 :
     forall init:addr -> bool, init1:addr -> bool, n:int, p:addr, q:addr
-     [Load_Init_S1_X p (havoc init1 init q n)].
+     [Load_Init_S1_X p (memcpy init init1 q q n)].
      separated p 3 q n ->
-     Load_Init_S1_X p (havoc init1 init q n) = Load_Init_S1_X p init
+     Load_Init_S1_X p (memcpy init init1 q q n) = Load_Init_S1_X p init
   
 end
 [wp:print-generated] 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle
index 9ba39839927..71e9a2acf38 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle
@@ -30,7 +30,8 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'is_zero' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (of_f64(havoc(Mf64_undef_0, Mf64_0, a, 10)[shift_float64(s, i_1)]) = .0))).
+      (of_f64(memcpy(Mf64_0, Mf64_undef_0, a, a, 10)[shift_float64(s, i_1)])
+         = .0))).
   (* Then *)
   Have: i <= 9.
 }
@@ -46,7 +47,7 @@ Prove: true.
 Goal Preservation of Invariant 'is_zero' (file zero.i, line 25):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
@@ -101,7 +102,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file zero.i, line 29):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle
index 8d825e04288..313b9ed702f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle
@@ -30,7 +30,7 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'is_zero' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (havoc(Mf64_undef_0, Mf64_0, a, 10)[shift_float64(s, i_1)] = 0))).
+      (memcpy(Mf64_0, Mf64_undef_0, a, a, 10)[shift_float64(s, i_1)] = 0))).
   (* Then *)
   Have: i <= 9.
 }
@@ -46,7 +46,7 @@ Prove: true.
 Goal Preservation of Invariant 'is_zero' (file zero.i, line 25):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
@@ -100,7 +100,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file zero.i, line 29):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
index 710eb5bae2e..2befafc093e 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
@@ -82,9 +82,9 @@ theory Compound
   
   axiom Q_Load_S2_A_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, n:int, p:addr, q:addr
-     [Load_S2_A p (havoc mint1 mint q n)].
+     [Load_S2_A p (memcpy mint mint1 q q n)].
      separated p 1 q n ->
-     Load_S2_A p (havoc mint1 mint q n) = Load_S2_A p mint
+     Load_S2_A p (memcpy mint mint1 q q n) = Load_S2_A p mint
   
 end
 [wp:print-generated] 
@@ -113,7 +113,7 @@ end
        let a2 = shiftfield_F1_FD_pos a1 in
        let x = get t a2 in
        let a3 = Load_S2_A a t in
-       let a4 = Load_S2_A a (set (havoc t1 t a 1) a2 i) in
+       let a4 = Load_S2_A a (set (memcpy t t1 a a 1) a2 i) in
        not x = i ->
        region (a1.base) <= 0 ->
        region (a.base) <= 0 ->
diff --git a/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle b/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle
index c2ac0df24d1..0df97f15cf9 100644
--- a/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle
+++ b/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle
@@ -47,8 +47,8 @@ Goal Check (file assigns_sep.i, line 27):
 Let x = read_uint32(mem_0, array_0).
 Let m = write_uint8(mem_0, shift_uint8(array_0, 7), v).
 Let x_1 = read_uint32(m, array_0).
-Let x_2 = read_uint32(havoc(mem_undef_0, m, shift_uint8(array_0, 4), 4),
-            array_0).
+Let a = shift_uint8(array_0, 4).
+Let x_2 = read_uint32(memcpy(m, mem_undef_0, a, a, 4), array_0).
 Assume {
   Type: is_uint32(x) /\ is_uint32(x_1) /\ is_uint32(x_2).
   (* Heap *)
@@ -60,19 +60,20 @@ Prove: (x_1 = x) /\ (x_2 = x_1).
 
 Goal Check (file assigns_sep.i, line 30):
 Let m = write_uint8(mem_0, shift_uint8(array_0, 7), v).
-Let a = havoc(mem_undef_0, m, shift_uint8(array_0, 4), 4).
+Let a = shift_uint8(array_0, 4).
+Let a_1 = memcpy(m, mem_undef_0, a, a, 4).
 Let x = read_uint32(mem_1, array_0).
-Let x_1 = read_uint32(a, array_0).
+Let x_1 = read_uint32(a_1, array_0).
 Assume {
   Type: is_uint32(x) /\ is_uint32(read_uint32(mem_0, array_0)) /\
       is_uint32(read_uint32(m, array_0)) /\ is_uint32(x_1).
   (* Heap *)
   Type: (region(array_0.base) <= 0) /\ framed(mem_0) /\ sconst(mem_0).
   (* Call Effects *)
-  Have: forall a_1 : addr.
+  Have: forall a_2 : addr.
       ((forall i : Z. (((i = 4) \/ (i = 6)) ->
-        (shift_uint8(array_0, i) != a_1))) ->
-      (raw_get(a, a_1) = raw_get(mem_1, a_1))).
+        (shift_uint8(array_0, i) != a_2))) ->
+      (raw_get(a_1, a_2) = raw_get(mem_1, a_2))).
 }
 Prove: x_1 = x.
 
diff --git a/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle b/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle
index 898225de015..31b9b8eebe1 100644
--- a/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle
+++ b/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle
@@ -16,7 +16,7 @@ Prove: true.
 
 Goal Post-condition (file structs.i, line 18) in 'caller':
 Let a = Load_S2_Y(u, mem_0).
-Let a_1 = Load_S2_Y(u, havoc(mem_undef_0, mem_0, y, 32)).
+Let a_1 = Load_S2_Y(u, memcpy(mem_0, mem_undef_0, y, y, 32)).
 Assume {
   Type: IsS2_Y(a) /\ IsS2_Y(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle b/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle
index 23b86bc3588..a5aa25272a0 100644
--- a/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle
+++ b/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle
@@ -341,7 +341,7 @@ Prove: read_uint8(m, shift_uint8(shiftfield_F2_U_a(u), i)) = 0.
 
 Goal Check (file union.i, line 70):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Let x = read_uint64(a_1, shiftfield_F2_U_u(u)).
 Assume {
   Type: is_uint32(read_uint32(a_1, shiftfield_F2_U_s(u))) /\ is_uint64(x).
@@ -361,7 +361,7 @@ Prove: x = 4294967295.
 
 Goal Check (file union.i, line 72):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Assume {
   Type: is_uint32(read_uint32(a_1, shiftfield_F2_U_s(u))) /\
       is_uint64(read_uint64(a_1, shiftfield_F2_U_u(u))).
@@ -383,7 +383,7 @@ Prove: read_uint8(a_1, shift_uint8(shiftfield_F2_U_a(u), i)) = 255.
 
 Goal Check (file union.i, line 73):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Assume {
   Type: is_uint32(read_uint32(a_1, shiftfield_F2_U_s(u))) /\
       is_uint64(read_uint64(a_1, shiftfield_F2_U_u(u))).
@@ -405,7 +405,7 @@ Prove: read_uint8(a_1, shift_uint8(shiftfield_F2_U_a(u), i)) = 0.
 
 Goal Check (file union.i, line 75):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Let x = read_uint32(a_1, shiftfield_F2_U_s(u)).
 Assume {
   Type: is_uint32(x) /\ is_uint64(read_uint64(a_1, shiftfield_F2_U_u(u))).
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 997835abf96..cd4f15d440d 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
@@ -281,7 +281,7 @@ Prove: true.
 Goal Post-condition 'Preset_5_tps' in 'call_reset_5_tps':
 Let a = tps_0[9].
 Let a_1 = shift_S1_T(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, 10).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 10).
 Assume {
   (* Heap *)
   Type: linked(Malloc_0) /\ (forall i_1 : Z. region(tps_0[i_1].base) <= 0).
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 66fd41e2399..b819acb5658 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
@@ -432,7 +432,7 @@ Prove: true.
 Goal Post-condition (file reference_array.i, line 36) in 'reset_1_5':
 Let a = shift_A5_sint32(rp_0, 0).
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, 5).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 5).
 Assume {
   (* Heap *)
   Type: (region(rp_0.base) <= 0) /\ linked(Malloc_0).
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
index e3f4ccc6a7f..0e23fe0de0b 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
@@ -39,7 +39,8 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file combined.c, line 30):
-Let a = havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50).
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, 50).
 Assume {
   Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(v) /\ is_sint32(1 + i).
   (* Heap *)
@@ -52,7 +53,7 @@ Assume {
   Have: (0 <= i) /\ (i <= 50).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      P_P(a[shift_sint32(t, i_2)]))).
+      P_P(a_1[shift_sint32(t, i_2)]))).
   (* Then *)
   Have: i <= 49.
   (* Call 'f' *)
@@ -60,7 +61,7 @@ Assume {
   (* Invariant *)
   Have: (-1) <= i.
 }
-Prove: P_P(a[shift_sint32(t, i) <- v][shift_sint32(t, i_1)]).
+Prove: P_P(a_1[shift_sint32(t, i) <- v][shift_sint32(t, i_1)]).
 
 ------------------------------------------------------------
 
@@ -70,6 +71,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file combined.c, line 36):
+Let a = shift_sint32(t, 0).
 Let x = 1 + j.
 Assume {
   Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(j) /\ is_sint32(x).
@@ -81,8 +83,7 @@ Assume {
   Have: (0 <= i) /\ (i <= 50).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      P_P(havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50)
-            [shift_sint32(t, i_1)]))).
+      P_P(memcpy(Mint_0, Mint_undef_0, a, a, 50)[shift_sint32(t, i_1)]))).
   (* Else *)
   Have: 50 <= i.
   (* Invariant *)
@@ -100,7 +101,9 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Assertion (file combined.c, line 42):
-Let a = havoc(Mint_undef_1, Mint_0, shift_sint32(t, 0), 50).
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, 50).
+Let a_2 = shift_sint32(t, A).
 Assume {
   Type: is_sint32(A) /\ is_sint32(i_1) /\ is_sint32(j).
   (* Heap *)
@@ -113,7 +116,7 @@ Assume {
   Have: (0 <= i_1) /\ (i_1 <= 50).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      P_P(a[shift_sint32(t, i_2)]))).
+      P_P(a_1[shift_sint32(t, i_2)]))).
   (* Else *)
   Have: 50 <= i_1.
   (* Invariant *)
@@ -121,8 +124,7 @@ Assume {
   (* Else *)
   Have: 100 <= j.
 }
-Prove: P_P(havoc(Mint_undef_0, a, shift_sint32(t, A), 100 - A)
-             [shift_sint32(t, i)]).
+Prove: P_P(memcpy(a_1, Mint_undef_1, a_2, a_2, 100 - A)[shift_sint32(t, i)]).
 
 ------------------------------------------------------------
 
@@ -156,22 +158,22 @@ Prove: true.
 
 Goal Loop assigns (file combined.c, line 37) (3/3):
 Call Result at line 40
+Let a = shift_sint32(t, 0).
 Let x = j - 1.
-Let a = shift_sint32(t, x).
+Let a_1 = shift_sint32(t, x).
 Assume {
   Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(j) /\ is_sint32(x).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a, 1).
+  When: !invalid(Malloc_0, a_1, 1).
   (* Assertion *)
   Have: (50 <= A) /\ (A <= 100).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 50).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      P_P(havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50)
-            [shift_sint32(t, i_1)]))).
+      P_P(memcpy(Mint_0, Mint_undef_0, a, a, 50)[shift_sint32(t, i_1)]))).
   (* Else *)
   Have: 50 <= i.
   (* Invariant *)
@@ -179,7 +181,7 @@ Assume {
   (* Then *)
   Have: j <= 100.
 }
-Prove: included(a, 1, shift_sint32(t, A), 100 - A).
+Prove: included(a_1, 1, shift_sint32(t, A), 100 - A).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
index ed016013308..c3d598aa21a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
@@ -10,8 +10,8 @@
 
 Goal Post-condition (file copy.i, line 5) in 'copy':
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_1, i).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n).
   (* Heap *)
@@ -36,7 +36,7 @@ Prove: a_3[shift_sint32(b, i_1)] = a_3[shift_sint32(a, i_1)].
 
 Goal Preservation of Invariant 'Copy' (file copy.i, line 11):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(1 + i).
@@ -85,7 +85,7 @@ Prove: true.
 
 Goal Assertion 'A' (file copy.i, line 18):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = shift_sint32(a, i_1).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n).
@@ -111,7 +111,7 @@ Prove: a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]][a_3] = a_2[a_3].
 
 Goal Assertion 'B' (file copy.i, line 19):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Let a_4 = shift_sint32(b, i_1).
 Assume {
@@ -153,7 +153,7 @@ Prove: true.
 Goal Loop assigns (file copy.i, line 12) (3/3):
 Effect at line 17
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Let a_4 = a_2[a_3 <- a_2[shift_sint32(b, x)]].
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
index d43b32da852..1a0f184dade 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
@@ -11,7 +11,7 @@
 Goal Post-condition 'qed_ok' in 'init':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
@@ -56,7 +56,8 @@ Assume {
   Have: (a <= i) /\ (i <= x_1).
   (* Invariant 'qed_ok' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)] = e))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a)[shift_sint32(t, i_1)] =
+       e))).
   (* Then *)
   Have: i <= b.
 }
@@ -82,7 +83,7 @@ Goal Preservation of Invariant 'qed_ok' (file loop.i, line 13):
 Let x = 1 + i.
 Let a_1 = shift_sint32(t, a).
 Let x_1 = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_2 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x).
@@ -130,7 +131,7 @@ Goal Loop assigns 'qed_ok' (3/3):
 Effect at line 18
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let a_3 = shift_sint32(t, i).
 Let x_1 = 1 + i.
 Let x_2 = 1 + b.
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
index f48b3ded682..e9fcd31a9e0 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
@@ -7,7 +7,7 @@
 
 Goal Post-condition 'copied_contents' in 'memcpy':
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
@@ -29,8 +29,8 @@ Assume {
   (* Else *)
   Have: n <= i.
 }
-Prove: L_memcmp(Mchar_0, havoc(Mchar_undef_0, Mchar_0, a, i), dest_0, src_0,
-         i) = 0.
+Prove: L_memcmp(Mchar_0, memcpy(Mchar_0, Mchar_undef_0, a, a, i), dest_0,
+         src_0, i) = 0.
 
 ------------------------------------------------------------
 
@@ -41,7 +41,7 @@ Prove: true.
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 33):
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
@@ -75,7 +75,7 @@ Prove: true.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 34):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(dest_0, i) <- a_1[shift_sint8(src_0, i)]].
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
@@ -126,7 +126,7 @@ Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 35) (3/3):
 Effect at line 39
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(dest_0, i).
 Let a_3 = a_1[a_2 <- a_1[shift_sint8(src_0, i)]].
 Assume {
@@ -170,7 +170,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 38):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(dest_0, i) <- a_1[shift_sint8(src_0, i)]].
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
@@ -242,7 +242,7 @@ Assume {
       (* Invariant 'no_eva' *)
       Have: 0 <= n.
       (* Loop assigns ... *)
-      Have: havoc(Mchar_undef_0, Mchar_0, a, n) = Mchar_1.
+      Have: memcpy(Mchar_0, Mchar_undef_0, a, a, n) = Mchar_1.
       (* Invariant 'no_eva' *)
       Have: (0 <= i) /\ (i <= n).
       (* Invariant 'no_eva' *)
@@ -267,7 +267,7 @@ Assume {
           (Mchar_0[shift_sint8(src_0, i_3)]
              = Mchar_0[shift_sint8(dest_0, i_3)]))).
       (* Loop assigns ... *)
-      Have: havoc(Mchar_undef_1, Mchar_0, a, n) = Mchar_2.
+      Have: memcpy(Mchar_0, Mchar_undef_1, a, a, n) = Mchar_2.
       (* Invariant 'no_eva' *)
       Have: (0 <= i_1) /\ (i_1 < n).
       (* Invariant 'no_eva' *)
@@ -299,7 +299,7 @@ Prove: true.
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 95):
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
@@ -345,7 +345,7 @@ Prove: true.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 96):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(s, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
@@ -396,7 +396,7 @@ Prove: true.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 97):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let a_3 = shift_sint8(s, 0).
 Let a_4 = shift_sint8(s, i_1).
@@ -450,7 +450,7 @@ Prove: true.
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 107):
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let x = to_uint64(n - 1).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
@@ -521,7 +521,7 @@ Prove: to_uint64(n - 1) < n.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 108):
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let x_1 = to_uint64(n - 1).
 Let a_2 = shift_sint8(s, 0).
 Assume {
@@ -603,7 +603,7 @@ Prove: Mchar_0[shift_sint8(src_0, i)] = Mchar_0[shift_sint8(dest_0, i)].
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 109):
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let x_1 = to_uint64(n - 1).
 Let a_3 = shift_sint8(s, 0).
@@ -674,7 +674,7 @@ Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 98) (3/3):
 Effect at line 102
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(d, i).
 Let a_3 = a_1[a_2 <- a_1[shift_sint8(s, i)]].
 Let a_4 = shift_sint8(s, 0).
@@ -739,7 +739,7 @@ Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 110) (3/3):
 Effect at line 114
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(d, i).
 Let a_3 = a_1[a_2 <- a_1[shift_sint8(s, i)]].
 Let x_1 = to_uint64(n - 1).
@@ -842,7 +842,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 101):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let a_3 = shift_sint8(s, 0).
 Assume {
@@ -897,7 +897,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 113):
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let x_1 = to_uint64(n - 1).
 Let a_3 = shift_sint8(s, 0).
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
index f93ab5d670e..b9bb077fb31 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
@@ -370,7 +370,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -415,7 +415,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
index 012860dfab7..e1451269a58 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
@@ -386,7 +386,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -425,7 +425,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
index 2a09b8ccd3d..d5264fbf8ce 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
@@ -374,7 +374,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -413,7 +413,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
index 28a5ec81a80..d47dda21e78 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
@@ -370,7 +370,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -409,7 +409,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle b/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle
index 75bce10e980..d0453d1612a 100644
--- a/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle
@@ -13,9 +13,9 @@
 
 Goal Post-condition (file copy_array.c, line 4) in 'copy':
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let x = 4 * n.
-Let a_3 = havoc(Msint32_undef_0, Msint32_0, a_1, i).
+Let a_3 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, i).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n).
   (* Heap *)
@@ -40,7 +40,7 @@ Prove: a_3[shift_sint32(b, i_1)] = a_3[shift_sint32(a, i_1)].
 
 Goal Preservation of Invariant 'Copy' (file copy_array.c, line 11):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Let x = 4 * n.
 Assume {
@@ -90,7 +90,7 @@ Prove: true.
 
 Goal Assertion 'A' (file copy_array.c, line 18):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let x = 4 * n.
 Let a_3 = shift_sint32(a, i_1).
 Assume {
@@ -117,7 +117,7 @@ Prove: a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]][a_3] = a_2[a_3].
 
 Goal Assertion 'B' (file copy_array.c, line 19):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Let x = 4 * n.
 Let a_4 = shift_sint32(b, i_1).
@@ -160,7 +160,7 @@ Prove: true.
 Goal Loop assigns (file copy_array.c, line 12) (3/3):
 Effect at line 17
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Let a_4 = a_2[a_3 <- a_2[shift_sint32(b, x)]].
diff --git a/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
index ffdcf75c1ce..ba812dcdc33 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
@@ -132,9 +132,9 @@ theory Compound
   
   axiom Q_Array_uint32_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
-     [Array_uint32 p n (havoc mint1 mint q n1)].
+     [Array_uint32 p n (memcpy mint mint1 q q n1)].
      separated p 1 q n1 ->
-     Array_uint32 p n (havoc mint1 mint q n1) = Array_uint32 p n mint
+     Array_uint32 p n (memcpy mint mint1 q q n1) = Array_uint32 p n mint
   
   axiom Q_Array_sint64_access :
     forall mint:addr -> int, i:int, n:int, p:addr
@@ -156,9 +156,9 @@ theory Compound
   
   axiom Q_Array_sint64_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
-     [Array_sint64 p n (havoc mint1 mint q n1)].
+     [Array_sint64 p n (memcpy mint mint1 q q n1)].
      separated p 1 q n1 ->
-     Array_sint64 p n (havoc mint1 mint q n1) = Array_sint64 p n mint
+     Array_sint64 p n (memcpy mint mint1 q q n1) = Array_sint64 p n mint
   
   axiom Q_Load_S1_S_update_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, p:addr, q:
@@ -178,9 +178,9 @@ theory Compound
   axiom Q_Load_S1_S_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_S p (havoc mint1 mint q n) mint2 mint3].
+     [Load_S1_S p (memcpy mint mint1 q q n) mint2 mint3].
      separated p 11 q n ->
-     Load_S1_S p (havoc mint1 mint q n) mint2 mint3 =
+     Load_S1_S p (memcpy mint mint1 q q n) mint2 mint3 =
      Load_S1_S p mint mint2 mint3
   
   axiom Q_Load_S1_S_update_Mint1 :
@@ -201,9 +201,9 @@ theory Compound
   axiom Q_Load_S1_S_havoc_Mint1 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_S p mint3 (havoc mint2 mint1 q n) mint].
+     [Load_S1_S p mint3 (memcpy mint1 mint2 q q n) mint].
      separated p 11 q n ->
-     Load_S1_S p mint3 (havoc mint2 mint1 q n) mint =
+     Load_S1_S p mint3 (memcpy mint1 mint2 q q n) mint =
      Load_S1_S p mint3 mint1 mint
   
   axiom Q_Load_S1_S_update_Mint2 :
@@ -224,9 +224,9 @@ theory Compound
   axiom Q_Load_S1_S_havoc_Mint2 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_S p mint1 mint (havoc mint3 mint2 q n)].
+     [Load_S1_S p mint1 mint (memcpy mint2 mint3 q q n)].
      separated p 11 q n ->
-     Load_S1_S p mint1 mint (havoc mint3 mint2 q n) =
+     Load_S1_S p mint1 mint (memcpy mint2 mint3 q q n) =
      Load_S1_S p mint1 mint mint2
   
 end
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
index 64c2f4fe312..6e39bf3db96 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
@@ -32,17 +32,17 @@ Assume {
   Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_2)] = v))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, n)[shift_sint32(a, i_2)] = v))).
   (* Else *)
   Have: n <= i.
 }
-Prove: havoc(Mint_undef_0, Mint_0, a_1, i)[shift_sint32(a, i_1)] = v.
+Prove: memcpy(Mint_0, Mint_undef_0, a_1, a_1, i)[shift_sint32(a, i_1)] = v.
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file user_init.i, line 17):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(1 + i).
   (* Heap *)
@@ -96,7 +96,7 @@ Prove: true.
 Goal Loop assigns 'Zone' (3/3):
 Effect at line 20
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Assume {
@@ -287,7 +287,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -324,14 +324,15 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 135):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
         ((i_1 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -342,8 +343,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -370,7 +371,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -412,7 +413,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -515,7 +516,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
@@ -605,7 +606,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -641,13 +642,14 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 153):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -658,8 +660,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -686,7 +688,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -726,7 +728,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -822,7 +824,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
index 76eef451c02..5c0b0175dda 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
@@ -32,17 +32,17 @@ Assume {
   Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_2)] = v))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, n)[shift_sint32(a, i_2)] = v))).
   (* Else *)
   Have: n <= i.
 }
-Prove: havoc(Mint_undef_0, Mint_0, a_1, i)[shift_sint32(a, i_1)] = v.
+Prove: memcpy(Mint_0, Mint_undef_0, a_1, a_1, i)[shift_sint32(a, i_1)] = v.
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file user_init.i, line 17):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(1 + i).
   (* Heap *)
@@ -96,7 +96,7 @@ Prove: true.
 Goal Loop assigns 'Zone' (3/3):
 Effect at line 20
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Assume {
@@ -287,7 +287,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -324,14 +324,15 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 135):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
         ((i_1 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -342,8 +343,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -370,7 +371,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -412,7 +413,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -515,7 +516,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
@@ -605,7 +606,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -641,13 +642,14 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 153):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -658,8 +660,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -686,7 +688,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -726,7 +728,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -822,7 +824,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
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 f8d4fe69e12..5f9dfd94dc8 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
@@ -10,7 +10,8 @@
 
 Goal Post-condition (file caveat_range.i, line 12) in 'reset':
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
 Assume {
   Type: is_sint32(i_1).
   (* Goal *)
@@ -19,20 +20,21 @@ Assume {
   Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: a_1[shiftfield_F1_S_f(shift_S1_S(a, i))] = 1.
+Prove: a_2[shiftfield_F1_S_f(shift_S1_S(a, i))] = 1.
 
 ------------------------------------------------------------
 
 Goal Post-condition (file caveat_range.i, line 13) in 'reset':
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
 Assume {
   Type: is_sint32(i_1).
   (* Goal *)
@@ -41,14 +43,14 @@ Assume {
   Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: a_1[shiftfield_F1_S_g(shift_S1_S(a, i))] = 2.
+Prove: a_2[shiftfield_F1_S_g(shift_S1_S(a, i))] = 2.
 
 ------------------------------------------------------------
 
@@ -64,7 +66,8 @@ Prove: true.
 
 Goal Preservation of Invariant (file caveat_range.i, line 20):
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Goal *)
@@ -73,16 +76,16 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Then *)
   Have: i <= 9.
   (* Invariant *)
   Have: (-1) <= i.
 }
-Prove: a_1[shiftfield_F1_S_f(shift_S1_S(a, i)) <- 1]
+Prove: a_2[shiftfield_F1_S_f(shift_S1_S(a, i)) <- 1]
          [shiftfield_F1_S_f(shift_S1_S(a, i_1))] = 1.
 
 ------------------------------------------------------------
@@ -94,9 +97,10 @@ Prove: true.
 
 Goal Preservation of Invariant (file caveat_range.i, line 21):
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
-Let a_2 = shift_S1_S(a, i).
-Let a_3 = a_1[shiftfield_F1_S_f(a_2) <- 1].
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
+Let a_3 = shift_S1_S(a, i).
+Let a_4 = a_2[shiftfield_F1_S_f(a_3) <- 1].
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Goal *)
@@ -105,19 +109,19 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Then *)
   Have: i <= 9.
   (* Invariant *)
   Have: (-1) <= i.
   (* Invariant *)
   Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
-      (a_3[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_4[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
 }
-Prove: a_3[shiftfield_F1_S_g(a_2) <- 2]
+Prove: a_4[shiftfield_F1_S_g(a_3) <- 2]
          [shiftfield_F1_S_g(shift_S1_S(a, i_1))] = 2.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
index 78be9b03031..793bf4c678c 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
@@ -13,7 +13,7 @@
 Goal Post-condition 'memcpy' in 'memcpy_alias_vars':
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -47,7 +47,7 @@ Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 Goal Post-condition 'unmodified' in 'memcpy_alias_vars':
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = shift_uint8(a_3, i).
@@ -82,7 +82,7 @@ Prove: a_2[a_5] = Mint_0[a_5].
 Goal Preservation of Invariant 'cpy' (file issue-189-bis.i, line 27):
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = a_2[v <- a_2[v_1]].
@@ -134,7 +134,7 @@ Prove: true.
 Goal Preservation of Invariant 'len' (file issue-189-bis.i, line 23):
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_1).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_1).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -200,7 +200,7 @@ Effect at line 33
 Let a = global(P_dst_25).
 Let a_1 = Mptr_0[a].
 Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, len_0).
 Let a_4 = a_3[v <- a_3[v_1]].
 Let a_5 = global(P_src_24).
 Let a_6 = Mptr_0[a_5].
@@ -260,7 +260,7 @@ Prove: true.
 Goal Post-condition 'memcpy,ok' in 'memcpy_context_vars':
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -294,7 +294,7 @@ Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 Goal Post-condition 'unmodified,ok' in 'memcpy_context_vars':
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = shift_uint8(a_3, i).
@@ -329,7 +329,7 @@ Prove: a_2[a_5] = Mint_0[a_5].
 Goal Preservation of Invariant 'ok,cpy' (file issue-189-bis.i, line 56):
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = a_2[dst2_0 <- a_2[src2_0]].
@@ -381,7 +381,7 @@ Prove: true.
 Goal Preservation of Invariant 'ok,len' (file issue-189-bis.i, line 52):
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_1).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_1).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -446,7 +446,7 @@ Goal Loop assigns (file issue-189-bis.i, line 55) (4/4):
 Effect at line 62
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = a_2[tmp_0 <- a_2[src2_0]].
 Let a_4 = Mptr_0[global(P_src_47)].
 Let a_5 = shift_uint8(a_4, 0).
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 9478cae317a..b65c788fa08 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
@@ -7,8 +7,9 @@
 
 Goal Post-condition 'memcpy,ok' in 'memcpy_context_vars':
 Let a = global(G_dst_48).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_0).
-Let a_2 = global(G_src_47).
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
+Let a_3 = global(G_src_47).
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1).
   (* Goal *)
@@ -18,16 +19,16 @@ Assume {
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
   (* Invariant 'ok,src' *)
-  Have: shift_uint8(a_2, len_0) = shift_uint8(src2_0, len_1).
+  Have: shift_uint8(a_3, len_0) = shift_uint8(src2_0, len_1).
   (* Invariant 'ok,dst' *)
   Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
   (* Invariant 'ok,cpy' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_1[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_2, i_1)]))).
+      (a_2[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_3, i_1)]))).
   (* Else *)
   Have: len_1 <= 0.
 }
-Prove: a_1[shift_uint8(a, i)] = Mint_0[shift_uint8(a_2, i)].
+Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 
 ------------------------------------------------------------
 
@@ -38,9 +39,10 @@ Prove: true.
 
 Goal Preservation of Invariant 'ok,cpy' (file issue-189-bis.i, line 56):
 Let a = global(G_dst_48).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_0).
-Let a_2 = global(G_src_47).
-Let a_3 = a_1[dst2_0 <- a_1[src2_0]].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
+Let a_3 = global(G_src_47).
+Let a_4 = a_2[dst2_0 <- a_2[src2_0]].
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Goal *)
@@ -50,18 +52,18 @@ Assume {
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
   (* Invariant 'ok,src' *)
-  Have: shift_uint8(a_2, len_0) = shift_uint8(src2_0, len_1).
+  Have: shift_uint8(a_3, len_0) = shift_uint8(src2_0, len_1).
   (* Invariant 'ok,dst' *)
   Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
   (* Invariant 'ok,cpy' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_1[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_2, i_1)]))).
+      (a_2[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_3, i_1)]))).
   (* Then *)
   Have: 0 < len_1.
   (* Invariant 'ok,len' *)
   Have: len_1 <= (1 + len_0).
 }
-Prove: a_3[shift_uint8(a_2, i)] = a_3[shift_uint8(a, i)].
+Prove: a_4[shift_uint8(a_3, i)] = a_4[shift_uint8(a, i)].
 
 ------------------------------------------------------------
 
@@ -82,7 +84,8 @@ Prove: true.
 
 Goal Preservation of Invariant 'ok,len' (file issue-189-bis.i, line 52):
 Let a = global(G_dst_48).
-Let a_1 = global(G_src_47).
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = global(G_src_47).
 Assume {
   Type: is_sint32(len_1) /\ is_sint32(len_0) /\ is_sint32(len_0 - 1).
   (* Pre-condition 'write_access' *)
@@ -90,13 +93,13 @@ Assume {
   (* Invariant 'ok,len' *)
   Have: len_0 <= len_1.
   (* Invariant 'ok,src' *)
-  Have: shift_uint8(a_1, len_1) = shift_uint8(src2_0, len_0).
+  Have: shift_uint8(a_2, len_1) = shift_uint8(src2_0, len_0).
   (* Invariant 'ok,dst' *)
   Have: shift_uint8(a, len_1) = shift_uint8(dst2_0, len_0).
   (* Invariant 'ok,cpy' *)
   Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
-      (havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_1)
-         [shift_uint8(a, i)] = Mint_0[shift_uint8(a_1, i)]))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_1)[shift_uint8(a, i)] =
+       Mint_0[shift_uint8(a_2, i)]))).
   (* Then *)
   Have: 0 < len_0.
 }
@@ -140,7 +143,7 @@ Goal Loop assigns (file issue-189-bis.i, line 55) (4/4):
 Effect at line 62
 Let a = global(G_dst_48).
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = a_2[tmp_0 <- a_2[src2_0]].
 Let a_4 = global(G_src_47).
 Assume {
-- 
GitLab