diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog
index 1fe2370039081e0179c86ab846df2a68d00d8abd..8ae905a083253f93147a446e3d8f300c3c28f5fb 100644
--- a/src/plugins/e-acsl/doc/Changelog
+++ b/src/plugins/e-acsl/doc/Changelog
@@ -15,6 +15,9 @@
 #   E-ACSL: the Whole E-ACSL plug-in
 ###############################################################################
 
+-* E-ACSL       [2017/11/27] Fix 'segmentation fault' of the generated monitor
+	        whenever the main as a precondition depending on the memory
+	        model.
 -* E-ACSL       [2017/11/27] Restore behavior of option -e-acsl-valid broken
 	        since Phosphorus (included).
 -* E-ACSL       [2017/10/25] Fix bug #2303 about unnamed formals in
diff --git a/src/plugins/e-acsl/tests/runtime/mainargs.c b/src/plugins/e-acsl/tests/runtime/mainargs.c
index df475a66627b274afc57e9d7aab44d9af3172654..19bfe02f55227e1f4a3e7e54b8f800de8e10be62 100644
--- a/src/plugins/e-acsl/tests/runtime/mainargs.c
+++ b/src/plugins/e-acsl/tests/runtime/mainargs.c
@@ -4,11 +4,11 @@
 
 #include <string.h>
 
+/*@ requires \valid(&argc);
+  @ requires \valid(&argv); */
 int main(int argc, char **argv) {
   int i;
 
-  /*@ assert \valid(&argc) ; */
-  /*@ assert \valid(&argv) ; */
   /*@ assert \forall int k; 0 <= k && k < argc ==> \valid(argv + k) ; */
   /*@ assert \block_length(argv) == (argc+1)*sizeof(char*) ; */
 
diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c
index 5a9054e4599ca792ef6b39bd44874eac89b9dd02..67b4fb27b2cec0c414f97dce63a621c11983100d 100644
--- a/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c
+++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_labeled_stmt.c
@@ -7,7 +7,6 @@ int main(void);
 int __gen_e_acsl_main(void)
 {
   int __retres;
-  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
   goto L1;
   L1:
   /*@ assert X ≡ 0; */
@@ -38,6 +37,7 @@ int __gen_e_acsl_main(void)
 int main(void)
 {
   int __retres;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
   __retres = __gen_e_acsl_main();
   __e_acsl_assert(X == 3,(char *)"Postcondition",(char *)"main",
                   (char *)"X == 3",7);
diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_mainargs.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_mainargs.c
index d4427946aca08c9a7e139b5ede6ea22e01272ad1..d86edf694ff20b0222a00eb193188308728abfd3 100644
--- a/src/plugins/e-acsl/tests/runtime/oracle/gen_mainargs.c
+++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_mainargs.c
@@ -1,41 +1,29 @@
 /* Generated by Frama-C */
 #include "stdlib.h"
 #include "string.h"
-int main(int argc, char **argv)
+/*@ requires \valid(&argc);
+    requires \valid(&argv); */
+int main(int argc, char **argv);
+
+int __gen_e_acsl_main(int argc, char **argv)
 {
   int __retres;
   int i;
-  __e_acsl_memory_init(& argc,& argv,(size_t)8);
-  /*@ assert \valid(&argc); */
-  {
-    int __gen_e_acsl_valid;
-    __gen_e_acsl_valid = __e_acsl_valid((void *)(& argc),sizeof(int),
-                                        (void *)(& argc),(void *)0);
-    __e_acsl_assert(__gen_e_acsl_valid,(char *)"Assertion",(char *)"main",
-                    (char *)"\\valid(&argc)",10);
-  }
-  /*@ assert \valid(&argv); */
-  {
-    int __gen_e_acsl_valid_2;
-    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)(& argv),sizeof(char **),
-                                          (void *)(& argv),(void *)0);
-    __e_acsl_assert(__gen_e_acsl_valid_2,(char *)"Assertion",(char *)"main",
-                    (char *)"\\valid(&argv)",11);
-  }
   /*@ assert ∀ int k; 0 ≤ k < argc ⇒ \valid(argv + k); */
   {
     int __gen_e_acsl_forall;
     int __gen_e_acsl_k;
+    __e_acsl_store_block((void *)(& argv),(size_t)8);
     __gen_e_acsl_forall = 1;
     __gen_e_acsl_k = 0;
     while (1) {
       if (__gen_e_acsl_k < argc) ; else break;
       {
-        int __gen_e_acsl_valid_3;
-        __gen_e_acsl_valid_3 = __e_acsl_valid((void *)(argv + __gen_e_acsl_k),
-                                              sizeof(char *),(void *)argv,
-                                              (void *)(& argv));
-        if (__gen_e_acsl_valid_3) ;
+        int __gen_e_acsl_valid;
+        __gen_e_acsl_valid = __e_acsl_valid((void *)(argv + __gen_e_acsl_k),
+                                            sizeof(char *),(void *)argv,
+                                            (void *)(& argv));
+        if (__gen_e_acsl_valid) ;
         else {
           __gen_e_acsl_forall = 0;
           goto e_acsl_end_loop1;
@@ -86,7 +74,7 @@ int main(int argc, char **argv)
                                                     sizeof(char *));
     if (__gen_e_acsl_initialized) {
       int __gen_e_acsl_valid_read_2;
-      int __gen_e_acsl_valid_4;
+      int __gen_e_acsl_valid_2;
       __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(argv + argc),
                                                       sizeof(char *),
                                                       (void *)argv,
@@ -94,11 +82,11 @@ int main(int argc, char **argv)
       __e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",(char *)"main",
                       (char *)"mem_access: \\valid_read(argv + argc)",16);
       /*@ assert Value: mem_access: \valid_read(argv + argc); */
-      __gen_e_acsl_valid_4 = __e_acsl_valid((void *)*(argv + argc),
+      __gen_e_acsl_valid_2 = __e_acsl_valid((void *)*(argv + argc),
                                             sizeof(char),
                                             (void *)*(argv + argc),
                                             (void *)(argv + argc));
-      __gen_e_acsl_and = __gen_e_acsl_valid_4;
+      __gen_e_acsl_and = __gen_e_acsl_valid_2;
     }
     else __gen_e_acsl_and = 0;
     __e_acsl_assert(! __gen_e_acsl_and,(char *)"Assertion",(char *)"main",
@@ -118,7 +106,7 @@ int main(int argc, char **argv)
                                                           sizeof(char *));
         if (__gen_e_acsl_initialized_2) {
           int __gen_e_acsl_valid_read_3;
-          int __gen_e_acsl_valid_5;
+          int __gen_e_acsl_valid_3;
           __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)(argv + i),
                                                           sizeof(char *),
                                                           (void *)argv,
@@ -126,11 +114,11 @@ int main(int argc, char **argv)
           __e_acsl_assert(__gen_e_acsl_valid_read_3,(char *)"RTE",
                           (char *)"main",
                           (char *)"mem_access: \\valid_read(argv + i)",19);
-          __gen_e_acsl_valid_5 = __e_acsl_valid((void *)*(argv + i),
+          __gen_e_acsl_valid_3 = __e_acsl_valid((void *)*(argv + i),
                                                 sizeof(char),
                                                 (void *)*(argv + i),
                                                 (void *)(argv + i));
-          __gen_e_acsl_and_2 = __gen_e_acsl_valid_5;
+          __gen_e_acsl_and_2 = __gen_e_acsl_valid_3;
         }
         else __gen_e_acsl_and_2 = 0;
         __e_acsl_assert(__gen_e_acsl_and_2,(char *)"Assertion",
@@ -146,7 +134,7 @@ int main(int argc, char **argv)
           if (__gen_e_acsl_k_2 <= len) ; else break;
           {
             int __gen_e_acsl_valid_read_4;
-            int __gen_e_acsl_valid_6;
+            int __gen_e_acsl_valid_4;
             __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)(
                                                             argv + i),
                                                             sizeof(char *),
@@ -155,11 +143,11 @@ int main(int argc, char **argv)
             __e_acsl_assert(__gen_e_acsl_valid_read_4,(char *)"RTE",
                             (char *)"main",
                             (char *)"mem_access: \\valid_read(argv + i)",20);
-            __gen_e_acsl_valid_6 = __e_acsl_valid((void *)(*(argv + i) + __gen_e_acsl_k_2),
+            __gen_e_acsl_valid_4 = __e_acsl_valid((void *)(*(argv + i) + __gen_e_acsl_k_2),
                                                   sizeof(char),
                                                   (void *)*(argv + i),
                                                   (void *)(argv + i));
-            if (__gen_e_acsl_valid_6) ;
+            if (__gen_e_acsl_valid_4) ;
             else {
               __gen_e_acsl_forall_2 = 0;
               goto e_acsl_end_loop2;
@@ -178,7 +166,29 @@ int main(int argc, char **argv)
   }
   __retres = 0;
   __e_acsl_delete_block((void *)(& argv));
-  __e_acsl_delete_block((void *)(& argc));
+  return __retres;
+}
+
+/*@ requires \valid(&argc);
+    requires \valid(&argv); */
+int main(int argc, char **argv)
+{
+  int __retres;
+  __e_acsl_memory_init(& argc,& argv,(size_t)8);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_valid_2;
+    __gen_e_acsl_valid = __e_acsl_valid((void *)(& argc),sizeof(int),
+                                        (void *)(& argc),(void *)0);
+    __e_acsl_assert(__gen_e_acsl_valid,(char *)"Precondition",(char *)"main",
+                    (char *)"\\valid(&argc)",7);
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)(& argv),sizeof(char **),
+                                          (void *)(& argv),(void *)0);
+    __e_acsl_assert(__gen_e_acsl_valid_2,(char *)"Precondition",
+                    (char *)"main",(char *)"\\valid(&argv)",8);
+  }
+  __retres = __gen_e_acsl_main(argc,argv);
+  __e_acsl_delete_block((void *)(& argv));
   __e_acsl_memory_clean();
   return __retres;
 }
diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml
index c475f5398ba460fc68eb60321f3d0e6640c71ca3..6e8131899b5fe615af6ee8214354f25d66d028a3 100644
--- a/src/plugins/e-acsl/visit.ml
+++ b/src/plugins/e-acsl/visit.ml
@@ -370,8 +370,9 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]"
         vi.vghost <- false;
         Builtins.update vi.vname vi;
         (* remember that we have to remove the main later (see method
-           [vfile]) *)
-        if vi.vorig_name = Kernel.MainFunction.get () then
+           [vfile]); do not use the [vorig_name] since both [main] and
+           [__e_acsl_main] have the same [vorig_name]. *)
+        if vi.vname = Kernel.MainFunction.get () then
           main_fct <- Some fundec
       | GVarDecl(vi, _) | GFunDecl(_, vi, _) ->
         (* do not convert extern ghost variables, because they can't be linked,