diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog
index cdc707e9ec8846a5a4fafcc30d86d28541dfc968..8f683ce6a6a8cc08073ac168759770839f8856a4 100644
--- a/src/plugins/e-acsl/doc/Changelog
+++ b/src/plugins/e-acsl/doc/Changelog
@@ -29,6 +29,8 @@ Plugin E-ACSL <next-release>
 Plugin E-ACSL 22.0 (Titanium)
 #############################
 
+-* E-ACSL       [2020-11-16] Fix soundness bug when checking
+	        initialization of a chunk of heap memory block.
 -  E-ACSL       [2020-10-14] Add Support for Variadic generated functions in
                 the AST (frama-c/e-acsl#128).
 -  E-ACSL       [2020-10-06] Add support for the `\separated` predicate.
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
index 083d015a3016899debff7f46273890665e035425..852f1447084e3b2569b4c28eb681abfe3f7bb06b 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
@@ -744,19 +744,76 @@ void* realloc(void *ptr, size_t size) {
          * shadow block to the size of the new allocation */
         if (old_size > size) {
           clearbits_right(
-              old_alloc_size - size,
-              old_init_shadow + old_alloc_size/8);
+              old_alloc_size - size,               // size in bits
+              old_init_shadow + old_alloc_size/8); // end of the old init shadow
         }
 
-        /* Now init shadow can be moved (if needed), keep in mind that
-         * segment base addresses are aligned at a boundary of something
-         * divisible by 8, so instead of moving actual bits here the
-         * segments are moved to avoid dealing with bit-level operations
-         * on incomplete bytes. */
+        /* Keep in mind that there is a ratio of 8 between the actual heap
+         * memory and the init shadow memory. So a byte in the actual memory
+         * corresponds to a bit in the shadow memory.
+         */
+
+        /* We need to keep the status of the init shadow up to `old_size` bits
+         * (or `size` if `size < old_size`), and we need to make sure that the
+         * bits of the init shadow correspondings to the bytes between
+         * `old_size` and `size` are set to zero if `size > old_size`. */
+
+        /* First of all, determine the number of bits in the init shadow that
+         * must be kept */
+        size_t keep_bits = (size < old_size) ? size : old_size;
+
+        /* To avoid doing too much bitwise operations, separate this size in
+         * the amount of bytes of init shadow that must be kept including any
+         * incomplete byte, and the number of bits that must be kept in the last
+         * byte if it is incomplete */
+        size_t rem_keep_bits = keep_bits%8;
+        size_t keep_bytes = keep_bits/8 + (rem_keep_bits > 0 ? 1 : 0);
+
+        /* If the pointer has been moved, then we need to copy `keep_bytes`
+         * from the old shadow to the new shadow to carry over all the needed
+         * information. Then the old init shadow can be reset. */
         if (res != ptr) {
-          size_t copy_size = (old_size > size) ? alloc_size : old_alloc_size;
-          memcpy(new_init_shadow, old_init_shadow, copy_size);
-          memset(old_init_shadow, 0, copy_size);
+          DVASSERT(keep_bytes <= alloc_size/8 && keep_bytes < old_alloc_size/8,
+            "Attempt to access out of bound init shadow. Accessing %lu bytes, \
+            old init shadow size: %lu bytes, new init shadow size: %lu bytes.",
+            keep_bytes, old_alloc_size/8, alloc_size/8);
+          memcpy(new_init_shadow, old_init_shadow, keep_bytes);
+          memset(old_init_shadow, 0, old_alloc_size/8);
+        }
+
+        if (size > old_size) {
+          // Last kept byte index
+          size_t idx = keep_bytes - 1; // idx < init_shadow_size by construction
+
+          /* If the new size is greater than the old size and the last kept byte
+           * is incomplete (`rem_keep_bits > 0`), then reset the unkept bits of
+           * the last byte in the new init shadow */
+          if (rem_keep_bits > 0) {
+            DVASSERT(idx < alloc_size/8,
+              "Attempt to access out of bound init shadow. Accessing index %lu \
+              with init shadow of size %lu bytes.", idx, alloc_size/8);
+            unsigned char mask = 0;
+            setbits64(rem_keep_bits, mask);
+            *(new_init_shadow + idx) &= mask;
+          }
+
+          /* Finally, if the new size is greater than the old size and the
+           * pointer hasn't been moved, then we need to make sure that the
+           * remaining bits of the init shadow corresponding to the memory
+           * between `old_size` and `size` are set to zero. */
+          if (res == ptr) {
+            // Index of the byte after the last kept byte
+            ++idx;
+            // Number of bytes between the index and the end of the init
+            // shadow corresponding to the new allocated memory
+            size_t count = size/8 - idx;
+
+            DVASSERT((idx+count) <= alloc_size/8,
+              "Attempt to access out of bound init shadow. Accessing %lu bytes \
+              from index %lu with init shadow of size %lu bytes.",
+              count, idx, alloc_size/8);
+            memset(new_init_shadow+idx, 0, count);
+          }
         }
       }
     } else {
@@ -895,7 +952,7 @@ int heap_initialized(uintptr_t addr, long len) {
     unsigned char mask = 0;
     setbits64_skip(set,mask,skip);
 
-    if (*shadow != mask)
+    if ((*shadow & mask) != mask)
       return 0;
   }
   if (len > 0)
diff --git a/src/plugins/e-acsl/tests/memory/initialized.c b/src/plugins/e-acsl/tests/memory/initialized.c
index 4af4918caa2b7445e02f84fe3e115ef369e3f150..34f53edb19e059c2a8ff498d9e54d9c052536f36 100644
--- a/src/plugins/e-acsl/tests/memory/initialized.c
+++ b/src/plugins/e-acsl/tests/memory/initialized.c
@@ -84,6 +84,52 @@ int main(void) {
   /*@assert ! \initialized(p); */
   /*@assert ! \initialized(q); */
 
+  /* Specially crafted calloc and realloc calls to check corner cases of
+   * initialization */
+  q = calloc(3, sizeof(int));
+  /*@ assert \initialized(&q[0..2]); */
+  q = realloc(q, 6 * sizeof(int));
+  /*@ assert \initialized(&q[0..2]); */
+  /*@ assert ! \initialized(&q[3]); */
+  /*@ assert ! \initialized(&q[4]); */
+  /*@ assert ! \initialized(&q[5]); */
+  free(q);
+  q = calloc(7, sizeof(int));
+  /*@ assert \initialized(&q[0..6]); */
+  q = realloc(q, 8 * sizeof(int));
+  /*@ assert \initialized(&q[0..6]); */
+  /*@ assert ! \initialized(&q[7]); */
+  q = realloc(q, 10 * sizeof(int));
+  /*@ assert \initialized(&q[0..6]); */
+  /*@ assert ! \initialized(&q[7]); */
+  /*@ assert ! \initialized(&q[8]); */
+  /*@ assert ! \initialized(&q[9]); */
+  free(q);
+  q = calloc(2, sizeof(int));
+  /*@ assert \initialized(&q[0..1]); */
+  q = realloc(q, 4 * sizeof(int));
+  /*@ assert \initialized(&q[0..1]); */
+  /*@ assert ! \initialized(&q[2]); */
+  /*@ assert ! \initialized(&q[3]); */
+  free(q);
+  q = calloc(6, sizeof(int));
+  /*@ assert \initialized(&q[0..5]); */
+  q = realloc(q, 3 * sizeof(int));
+  /*@ assert \initialized(&q[0..2]); */
+  free(q);
+  q = malloc(6 * sizeof(int));
+  /*@ assert ! \initialized(&q[0]); */
+  /*@ assert ! \initialized(&q[1]); */
+  /*@ assert ! \initialized(&q[2]); */
+  /*@ assert ! \initialized(&q[3]); */
+  /*@ assert ! \initialized(&q[4]); */
+  /*@ assert ! \initialized(&q[5]); */
+  q = realloc(q, 3 * sizeof(int));
+  /*@ assert ! \initialized(&q[0]); */
+  /*@ assert ! \initialized(&q[1]); */
+  /*@ assert ! \initialized(&q[2]); */
+  free(q);
+
   /* Spoofing access to a non-existing stack address */
   q = (int*)(&q - 1024*5);
   /*assert ! \initialized(q); */
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c
index 2fc7f4ff02452f9cf5ec262dc1a11a7dff556df0..dec94db6533f1ddb8db1ab53e6913dab01393817 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_initialized.c
@@ -319,23 +319,329 @@ int main(void)
   }
   /*@ assert ¬\initialized(q); */ ;
   __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)3,sizeof(int));
+  {
+    int __gen_e_acsl_size;
+    int __gen_e_acsl_if;
+    int __gen_e_acsl_initialized_32;
+    __gen_e_acsl_size = 4 * ((2 - 0) + 1);
+    if (__gen_e_acsl_size <= 0) __gen_e_acsl_if = 0;
+    else __gen_e_acsl_if = __gen_e_acsl_size;
+    __gen_e_acsl_initialized_32 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if);
+    __e_acsl_assert(__gen_e_acsl_initialized_32,"Assertion","main",
+                    "\\initialized(q + (0 .. 2))",
+                    "tests/memory/initialized.c",90);
+  }
+  /*@ assert \initialized(q + (0 .. 2)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)6 * sizeof(int));
+  {
+    int __gen_e_acsl_size_2;
+    int __gen_e_acsl_if_2;
+    int __gen_e_acsl_initialized_33;
+    __gen_e_acsl_size_2 = 4 * ((2 - 0) + 1);
+    if (__gen_e_acsl_size_2 <= 0) __gen_e_acsl_if_2 = 0;
+    else __gen_e_acsl_if_2 = __gen_e_acsl_size_2;
+    __gen_e_acsl_initialized_33 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_2);
+    __e_acsl_assert(__gen_e_acsl_initialized_33,"Assertion","main",
+                    "\\initialized(q + (0 .. 2))",
+                    "tests/memory/initialized.c",92);
+  }
+  /*@ assert \initialized(q + (0 .. 2)); */ ;
+  {
+    int __gen_e_acsl_initialized_34;
+    __gen_e_acsl_initialized_34 = __e_acsl_initialized((void *)(q + 3),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_34,"Assertion","main",
+                    "!\\initialized(q + 3)","tests/memory/initialized.c",93);
+  }
+  /*@ assert ¬\initialized(q + 3); */ ;
+  {
+    int __gen_e_acsl_initialized_35;
+    __gen_e_acsl_initialized_35 = __e_acsl_initialized((void *)(q + 4),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_35,"Assertion","main",
+                    "!\\initialized(q + 4)","tests/memory/initialized.c",94);
+  }
+  /*@ assert ¬\initialized(q + 4); */ ;
+  {
+    int __gen_e_acsl_initialized_36;
+    __gen_e_acsl_initialized_36 = __e_acsl_initialized((void *)(q + 5),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_36,"Assertion","main",
+                    "!\\initialized(q + 5)","tests/memory/initialized.c",95);
+  }
+  /*@ assert ¬\initialized(q + 5); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)7,sizeof(int));
+  {
+    int __gen_e_acsl_size_3;
+    int __gen_e_acsl_if_3;
+    int __gen_e_acsl_initialized_37;
+    __gen_e_acsl_size_3 = 4 * ((6 - 0) + 1);
+    if (__gen_e_acsl_size_3 <= 0) __gen_e_acsl_if_3 = 0;
+    else __gen_e_acsl_if_3 = __gen_e_acsl_size_3;
+    __gen_e_acsl_initialized_37 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_3);
+    __e_acsl_assert(__gen_e_acsl_initialized_37,"Assertion","main",
+                    "\\initialized(q + (0 .. 6))",
+                    "tests/memory/initialized.c",98);
+  }
+  /*@ assert \initialized(q + (0 .. 6)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)8 * sizeof(int));
+  {
+    int __gen_e_acsl_size_4;
+    int __gen_e_acsl_if_4;
+    int __gen_e_acsl_initialized_38;
+    __gen_e_acsl_size_4 = 4 * ((6 - 0) + 1);
+    if (__gen_e_acsl_size_4 <= 0) __gen_e_acsl_if_4 = 0;
+    else __gen_e_acsl_if_4 = __gen_e_acsl_size_4;
+    __gen_e_acsl_initialized_38 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_4);
+    __e_acsl_assert(__gen_e_acsl_initialized_38,"Assertion","main",
+                    "\\initialized(q + (0 .. 6))",
+                    "tests/memory/initialized.c",100);
+  }
+  /*@ assert \initialized(q + (0 .. 6)); */ ;
+  {
+    int __gen_e_acsl_initialized_39;
+    __gen_e_acsl_initialized_39 = __e_acsl_initialized((void *)(q + 7),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_39,"Assertion","main",
+                    "!\\initialized(q + 7)","tests/memory/initialized.c",101);
+  }
+  /*@ assert ¬\initialized(q + 7); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)10 * sizeof(int));
+  {
+    int __gen_e_acsl_size_5;
+    int __gen_e_acsl_if_5;
+    int __gen_e_acsl_initialized_40;
+    __gen_e_acsl_size_5 = 4 * ((6 - 0) + 1);
+    if (__gen_e_acsl_size_5 <= 0) __gen_e_acsl_if_5 = 0;
+    else __gen_e_acsl_if_5 = __gen_e_acsl_size_5;
+    __gen_e_acsl_initialized_40 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_5);
+    __e_acsl_assert(__gen_e_acsl_initialized_40,"Assertion","main",
+                    "\\initialized(q + (0 .. 6))",
+                    "tests/memory/initialized.c",103);
+  }
+  /*@ assert \initialized(q + (0 .. 6)); */ ;
+  {
+    int __gen_e_acsl_initialized_41;
+    __gen_e_acsl_initialized_41 = __e_acsl_initialized((void *)(q + 7),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_41,"Assertion","main",
+                    "!\\initialized(q + 7)","tests/memory/initialized.c",104);
+  }
+  /*@ assert ¬\initialized(q + 7); */ ;
+  {
+    int __gen_e_acsl_initialized_42;
+    __gen_e_acsl_initialized_42 = __e_acsl_initialized((void *)(q + 8),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_42,"Assertion","main",
+                    "!\\initialized(q + 8)","tests/memory/initialized.c",105);
+  }
+  /*@ assert ¬\initialized(q + 8); */ ;
+  {
+    int __gen_e_acsl_initialized_43;
+    __gen_e_acsl_initialized_43 = __e_acsl_initialized((void *)(q + 9),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_43,"Assertion","main",
+                    "!\\initialized(q + 9)","tests/memory/initialized.c",106);
+  }
+  /*@ assert ¬\initialized(q + 9); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)2,sizeof(int));
+  {
+    int __gen_e_acsl_size_6;
+    int __gen_e_acsl_if_6;
+    int __gen_e_acsl_initialized_44;
+    __gen_e_acsl_size_6 = 4 * ((1 - 0) + 1);
+    if (__gen_e_acsl_size_6 <= 0) __gen_e_acsl_if_6 = 0;
+    else __gen_e_acsl_if_6 = __gen_e_acsl_size_6;
+    __gen_e_acsl_initialized_44 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_6);
+    __e_acsl_assert(__gen_e_acsl_initialized_44,"Assertion","main",
+                    "\\initialized(q + (0 .. 1))",
+                    "tests/memory/initialized.c",109);
+  }
+  /*@ assert \initialized(q + (0 .. 1)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)4 * sizeof(int));
+  {
+    int __gen_e_acsl_size_7;
+    int __gen_e_acsl_if_7;
+    int __gen_e_acsl_initialized_45;
+    __gen_e_acsl_size_7 = 4 * ((1 - 0) + 1);
+    if (__gen_e_acsl_size_7 <= 0) __gen_e_acsl_if_7 = 0;
+    else __gen_e_acsl_if_7 = __gen_e_acsl_size_7;
+    __gen_e_acsl_initialized_45 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_7);
+    __e_acsl_assert(__gen_e_acsl_initialized_45,"Assertion","main",
+                    "\\initialized(q + (0 .. 1))",
+                    "tests/memory/initialized.c",111);
+  }
+  /*@ assert \initialized(q + (0 .. 1)); */ ;
+  {
+    int __gen_e_acsl_initialized_46;
+    __gen_e_acsl_initialized_46 = __e_acsl_initialized((void *)(q + 2),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_46,"Assertion","main",
+                    "!\\initialized(q + 2)","tests/memory/initialized.c",112);
+  }
+  /*@ assert ¬\initialized(q + 2); */ ;
+  {
+    int __gen_e_acsl_initialized_47;
+    __gen_e_acsl_initialized_47 = __e_acsl_initialized((void *)(q + 3),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_47,"Assertion","main",
+                    "!\\initialized(q + 3)","tests/memory/initialized.c",113);
+  }
+  /*@ assert ¬\initialized(q + 3); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)6,sizeof(int));
+  {
+    int __gen_e_acsl_size_8;
+    int __gen_e_acsl_if_8;
+    int __gen_e_acsl_initialized_48;
+    __gen_e_acsl_size_8 = 4 * ((5 - 0) + 1);
+    if (__gen_e_acsl_size_8 <= 0) __gen_e_acsl_if_8 = 0;
+    else __gen_e_acsl_if_8 = __gen_e_acsl_size_8;
+    __gen_e_acsl_initialized_48 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_8);
+    __e_acsl_assert(__gen_e_acsl_initialized_48,"Assertion","main",
+                    "\\initialized(q + (0 .. 5))",
+                    "tests/memory/initialized.c",116);
+  }
+  /*@ assert \initialized(q + (0 .. 5)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)3 * sizeof(int));
+  {
+    int __gen_e_acsl_size_9;
+    int __gen_e_acsl_if_9;
+    int __gen_e_acsl_initialized_49;
+    __gen_e_acsl_size_9 = 4 * ((2 - 0) + 1);
+    if (__gen_e_acsl_size_9 <= 0) __gen_e_acsl_if_9 = 0;
+    else __gen_e_acsl_if_9 = __gen_e_acsl_size_9;
+    __gen_e_acsl_initialized_49 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_9);
+    __e_acsl_assert(__gen_e_acsl_initialized_49,"Assertion","main",
+                    "\\initialized(q + (0 .. 2))",
+                    "tests/memory/initialized.c",118);
+  }
+  /*@ assert \initialized(q + (0 .. 2)); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)malloc((unsigned long)6 * sizeof(int));
+  {
+    int __gen_e_acsl_initialized_50;
+    __gen_e_acsl_initialized_50 = __e_acsl_initialized((void *)(q + 0),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_50,"Assertion","main",
+                    "!\\initialized(q + 0)","tests/memory/initialized.c",121);
+  }
+  /*@ assert ¬\initialized(q + 0); */ ;
+  {
+    int __gen_e_acsl_initialized_51;
+    __gen_e_acsl_initialized_51 = __e_acsl_initialized((void *)(q + 1),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_51,"Assertion","main",
+                    "!\\initialized(q + 1)","tests/memory/initialized.c",122);
+  }
+  /*@ assert ¬\initialized(q + 1); */ ;
+  {
+    int __gen_e_acsl_initialized_52;
+    __gen_e_acsl_initialized_52 = __e_acsl_initialized((void *)(q + 2),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_52,"Assertion","main",
+                    "!\\initialized(q + 2)","tests/memory/initialized.c",123);
+  }
+  /*@ assert ¬\initialized(q + 2); */ ;
+  {
+    int __gen_e_acsl_initialized_53;
+    __gen_e_acsl_initialized_53 = __e_acsl_initialized((void *)(q + 3),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_53,"Assertion","main",
+                    "!\\initialized(q + 3)","tests/memory/initialized.c",124);
+  }
+  /*@ assert ¬\initialized(q + 3); */ ;
+  {
+    int __gen_e_acsl_initialized_54;
+    __gen_e_acsl_initialized_54 = __e_acsl_initialized((void *)(q + 4),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_54,"Assertion","main",
+                    "!\\initialized(q + 4)","tests/memory/initialized.c",125);
+  }
+  /*@ assert ¬\initialized(q + 4); */ ;
+  {
+    int __gen_e_acsl_initialized_55;
+    __gen_e_acsl_initialized_55 = __e_acsl_initialized((void *)(q + 5),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_55,"Assertion","main",
+                    "!\\initialized(q + 5)","tests/memory/initialized.c",126);
+  }
+  /*@ assert ¬\initialized(q + 5); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)3 * sizeof(int));
+  {
+    int __gen_e_acsl_initialized_56;
+    __gen_e_acsl_initialized_56 = __e_acsl_initialized((void *)(q + 0),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_56,"Assertion","main",
+                    "!\\initialized(q + 0)","tests/memory/initialized.c",128);
+  }
+  /*@ assert ¬\initialized(q + 0); */ ;
+  {
+    int __gen_e_acsl_initialized_57;
+    __gen_e_acsl_initialized_57 = __e_acsl_initialized((void *)(q + 1),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_57,"Assertion","main",
+                    "!\\initialized(q + 1)","tests/memory/initialized.c",129);
+  }
+  /*@ assert ¬\initialized(q + 1); */ ;
+  {
+    int __gen_e_acsl_initialized_58;
+    __gen_e_acsl_initialized_58 = __e_acsl_initialized((void *)(q + 2),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_58,"Assertion","main",
+                    "!\\initialized(q + 2)","tests/memory/initialized.c",130);
+  }
+  /*@ assert ¬\initialized(q + 2); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
   q = (int *)(& q - 1024 * 5);
   __e_acsl_full_init((void *)(& q));
   q = (int *)128;
   {
-    int __gen_e_acsl_initialized_32;
-    __gen_e_acsl_initialized_32 = __e_acsl_initialized((void *)q,sizeof(int));
-    __e_acsl_assert(! __gen_e_acsl_initialized_32,"Assertion","main",
-                    "!\\initialized(q)","tests/memory/initialized.c",93);
+    int __gen_e_acsl_initialized_59;
+    __gen_e_acsl_initialized_59 = __e_acsl_initialized((void *)q,sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_59,"Assertion","main",
+                    "!\\initialized(q)","tests/memory/initialized.c",139);
   }
   /*@ assert ¬\initialized(q); */ ;
   __e_acsl_full_init((void *)(& p));
   p = (int *)0;
   {
-    int __gen_e_acsl_initialized_33;
-    __gen_e_acsl_initialized_33 = __e_acsl_initialized((void *)p,sizeof(int));
-    __e_acsl_assert(! __gen_e_acsl_initialized_33,"Assertion","main",
-                    "!\\initialized(p)","tests/memory/initialized.c",96);
+    int __gen_e_acsl_initialized_60;
+    __gen_e_acsl_initialized_60 = __e_acsl_initialized((void *)p,sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_60,"Assertion","main",
+                    "!\\initialized(p)","tests/memory/initialized.c",142);
   }
   /*@ assert ¬\initialized(p); */ ;
   int size = 100;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_struct_initialized.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_struct_initialized.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e1047dc8b47a51c32345364e5bcb7c37dcf6ee8
--- /dev/null
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_struct_initialized.c
@@ -0,0 +1,147 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdint.h"
+#include "stdio.h"
+#include "stdlib.h"
+struct __anonstruct_int32_pair_t_1 {
+   int32_t a ;
+   int32_t b ;
+};
+typedef struct __anonstruct_int32_pair_t_1 int32_pair_t;
+int main(void)
+{
+  int __retres;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  {
+    int32_pair_t static_pair;
+    __e_acsl_store_block((void *)(& static_pair),(size_t)8);
+    {
+      int __gen_e_acsl_initialized;
+      __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& static_pair.a),
+                                                      sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized,"Assertion","main",
+                      "!\\initialized(&static_pair.a)",
+                      "tests/memory/struct_initialized.c",13);
+    }
+    /*@ assert ¬\initialized(&static_pair.a); */ ;
+    {
+      int __gen_e_acsl_initialized_2;
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& static_pair.b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_2,"Assertion","main",
+                      "!\\initialized(&static_pair.b)",
+                      "tests/memory/struct_initialized.c",14);
+    }
+    /*@ assert ¬\initialized(&static_pair.b); */ ;
+    __e_acsl_initialize((void *)(& static_pair.a),sizeof(int32_t));
+    static_pair.a = 1;
+    {
+      int __gen_e_acsl_initialized_3;
+      __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& static_pair.a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_3,"Assertion","main",
+                      "\\initialized(&static_pair.a)",
+                      "tests/memory/struct_initialized.c",16);
+    }
+    /*@ assert \initialized(&static_pair.a); */ ;
+    {
+      int __gen_e_acsl_initialized_4;
+      __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& static_pair.b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_4,"Assertion","main",
+                      "!\\initialized(&static_pair.b)",
+                      "tests/memory/struct_initialized.c",17);
+    }
+    /*@ assert ¬\initialized(&static_pair.b); */ ;
+    __e_acsl_initialize((void *)(& static_pair.b),sizeof(int32_t));
+    static_pair.b = 2;
+    {
+      int __gen_e_acsl_initialized_5;
+      __gen_e_acsl_initialized_5 = __e_acsl_initialized((void *)(& static_pair.a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_5,"Assertion","main",
+                      "\\initialized(&static_pair.a)",
+                      "tests/memory/struct_initialized.c",19);
+    }
+    /*@ assert \initialized(&static_pair.a); */ ;
+    {
+      int __gen_e_acsl_initialized_6;
+      __gen_e_acsl_initialized_6 = __e_acsl_initialized((void *)(& static_pair.b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_6,"Assertion","main",
+                      "\\initialized(&static_pair.b)",
+                      "tests/memory/struct_initialized.c",20);
+    }
+    /*@ assert \initialized(&static_pair.b); */ ;
+    __e_acsl_delete_block((void *)(& static_pair));
+  }
+  {
+    int32_pair_t *heap_pair = malloc(sizeof(int32_pair_t));
+    __e_acsl_store_block((void *)(& heap_pair),(size_t)8);
+    __e_acsl_full_init((void *)(& heap_pair));
+    {
+      int __gen_e_acsl_initialized_7;
+      __gen_e_acsl_initialized_7 = __e_acsl_initialized((void *)(& heap_pair->a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_7,"Assertion","main",
+                      "!\\initialized(&heap_pair->a)",
+                      "tests/memory/struct_initialized.c",26);
+    }
+    /*@ assert ¬\initialized(&heap_pair->a); */ ;
+    {
+      int __gen_e_acsl_initialized_8;
+      __gen_e_acsl_initialized_8 = __e_acsl_initialized((void *)(& heap_pair->b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_8,"Assertion","main",
+                      "!\\initialized(&heap_pair->b)",
+                      "tests/memory/struct_initialized.c",27);
+    }
+    /*@ assert ¬\initialized(&heap_pair->b); */ ;
+    __e_acsl_initialize((void *)(& heap_pair->a),sizeof(int32_t));
+    heap_pair->a = 3;
+    {
+      int __gen_e_acsl_initialized_9;
+      __gen_e_acsl_initialized_9 = __e_acsl_initialized((void *)(& heap_pair->a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_9,"Assertion","main",
+                      "\\initialized(&heap_pair->a)",
+                      "tests/memory/struct_initialized.c",29);
+    }
+    /*@ assert \initialized(&heap_pair->a); */ ;
+    {
+      int __gen_e_acsl_initialized_10;
+      __gen_e_acsl_initialized_10 = __e_acsl_initialized((void *)(& heap_pair->b),
+                                                         sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_10,"Assertion","main",
+                      "!\\initialized(&heap_pair->b)",
+                      "tests/memory/struct_initialized.c",30);
+    }
+    /*@ assert ¬\initialized(&heap_pair->b); */ ;
+    __e_acsl_initialize((void *)(& heap_pair->b),sizeof(int32_t));
+    heap_pair->b = 4;
+    {
+      int __gen_e_acsl_initialized_11;
+      __gen_e_acsl_initialized_11 = __e_acsl_initialized((void *)(& heap_pair->a),
+                                                         sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_11,"Assertion","main",
+                      "\\initialized(&heap_pair->a)",
+                      "tests/memory/struct_initialized.c",32);
+    }
+    /*@ assert \initialized(&heap_pair->a); */ ;
+    {
+      int __gen_e_acsl_initialized_12;
+      __gen_e_acsl_initialized_12 = __e_acsl_initialized((void *)(& heap_pair->b),
+                                                         sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_12,"Assertion","main",
+                      "\\initialized(&heap_pair->b)",
+                      "tests/memory/struct_initialized.c",33);
+    }
+    /*@ assert \initialized(&heap_pair->b); */ ;
+    __e_acsl_delete_block((void *)(& heap_pair));
+  }
+  __retres = 0;
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/struct_initialized.res.oracle b/src/plugins/e-acsl/tests/memory/oracle_ci/struct_initialized.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..efd026311297e55d8fefb674326118e6ece88624
--- /dev/null
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/struct_initialized.res.oracle
@@ -0,0 +1,2 @@
+[e-acsl] beginning translation.
+[e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/memory/oracle_dev/struct_initialized.e-acsl.err.log b/src/plugins/e-acsl/tests/memory/oracle_dev/struct_initialized.e-acsl.err.log
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/plugins/e-acsl/tests/memory/struct_initialized.c b/src/plugins/e-acsl/tests/memory/struct_initialized.c
new file mode 100644
index 0000000000000000000000000000000000000000..87ee96337d2ebfbddd575f46715f31fbd7b338d3
--- /dev/null
+++ b/src/plugins/e-acsl/tests/memory/struct_initialized.c
@@ -0,0 +1,35 @@
+#include <stdint.h>
+#include <stdlib.h>
+
+typedef struct {
+  int32_t a;
+  int32_t b;
+} int32_pair_t;
+
+int main() {
+  // Static alloc
+  {
+    int32_pair_t static_pair;
+    //@ assert !\initialized(&static_pair.a);
+    //@ assert !\initialized(&static_pair.b);
+    static_pair.a = 1;
+    //@ assert \initialized(&static_pair.a);
+    //@ assert !\initialized(&static_pair.b);
+    static_pair.b = 2;
+    //@ assert \initialized(&static_pair.a);
+    //@ assert \initialized(&static_pair.b);
+  }
+
+  // Dynamic alloc
+  {
+    int32_pair_t * heap_pair = malloc(sizeof(int32_pair_t));
+    //@ assert !\initialized(&heap_pair->a);
+    //@ assert !\initialized(&heap_pair->b);
+    heap_pair->a = 3;
+    //@ assert \initialized(&heap_pair->a);
+    //@ assert !\initialized(&heap_pair->b);
+    heap_pair->b = 4;
+    //@ assert \initialized(&heap_pair->a);
+    //@ assert \initialized(&heap_pair->b);
+  }
+}