From f3e22890932239adb5d95d16a8f12478ac539920 Mon Sep 17 00:00:00 2001
From: Basile Desloges <basile.desloges@cea.fr>
Date: Tue, 9 Nov 2021 16:03:58 +0100
Subject: [PATCH] [eacsl] Add concurrency tests

---
 src/plugins/e-acsl/Makefile.in                |    5 +-
 src/plugins/e-acsl/headers/header_spec.txt    |    2 +
 .../concurrency/oracle/gen_parallel_threads.c | 1963 +++++++++++++++++
 .../oracle/gen_sequential_threads.c           |  547 +++++
 .../concurrency/oracle/gen_threads_debug.c    | 1652 ++++++++++++++
 .../oracle/gen_threads_safe_locations.c       |  573 +++++
 .../oracle/parallel_threads.res.oracle        |  171 ++
 .../oracle/sequential_threads.res.oracle      |   51 +
 .../oracle/threads_debug.res.oracle           |  171 ++
 .../oracle/threads_safe_locations.res.oracle  |   42 +
 .../parallel_threads.e-acsl.err.log           |    0
 .../sequential_threads.e-acsl.err.log         |    0
 .../oracle_dev/threads_debug.e-acsl.err.log   |  181 ++
 .../threads_safe_locations.e-acsl.err.log     |    0
 .../tests/concurrency/parallel_threads.c      |  143 ++
 .../tests/concurrency/sequential_threads.c    |   37 +
 .../e-acsl/tests/concurrency/test_config      |    1 +
 .../e-acsl/tests/concurrency/test_config_dev  |    1 +
 .../e-acsl/tests/concurrency/threads_debug.c  |   11 +
 .../concurrency/threads_safe_locations.c      |   19 +
 20 files changed, 5569 insertions(+), 1 deletion(-)
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/gen_sequential_threads.c
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_safe_locations.c
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/parallel_threads.res.oracle
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/sequential_threads.res.oracle
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/threads_debug.res.oracle
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle/threads_safe_locations.res.oracle
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle_dev/parallel_threads.e-acsl.err.log
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle_dev/sequential_threads.e-acsl.err.log
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_debug.e-acsl.err.log
 create mode 100644 src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_safe_locations.e-acsl.err.log
 create mode 100644 src/plugins/e-acsl/tests/concurrency/parallel_threads.c
 create mode 100644 src/plugins/e-acsl/tests/concurrency/sequential_threads.c
 create mode 100644 src/plugins/e-acsl/tests/concurrency/test_config
 create mode 100644 src/plugins/e-acsl/tests/concurrency/test_config_dev
 create mode 100644 src/plugins/e-acsl/tests/concurrency/threads_debug.c
 create mode 100644 src/plugins/e-acsl/tests/concurrency/threads_safe_locations.c

diff --git a/src/plugins/e-acsl/Makefile.in b/src/plugins/e-acsl/Makefile.in
index 996b34f14ad..d1e1b4015f0 100644
--- a/src/plugins/e-acsl/Makefile.in
+++ b/src/plugins/e-acsl/Makefile.in
@@ -180,6 +180,7 @@ ifeq (@MAY_RUN_TESTS@,yes)
 PLUGIN_TESTS_DIRS := \
 	examples \
 	bts \
+	concurrency \
 	constructs \
 	arith \
 	memory \
@@ -354,7 +355,9 @@ EACSL_TEST_FILES = \
 	tests/temporal/test_config_dev \
 	tests/format/test_config \
 	tests/format/test_config_dev \
-	tests/E_ACSL_test.ml \
+	tests/concurrency/test_config \
+	tests/concurrency/test_config_dev \
+	tests/E_ACSL_test.ml
 
 EACSL_TESTS_C_FILES = \
   $(foreach dir, $(addprefix tests/,$(PLUGIN_TESTS_DIRS)), \
diff --git a/src/plugins/e-acsl/headers/header_spec.txt b/src/plugins/e-acsl/headers/header_spec.txt
index 33989f466fa..7830de6a9bf 100644
--- a/src/plugins/e-acsl/headers/header_spec.txt
+++ b/src/plugins/e-acsl/headers/header_spec.txt
@@ -185,6 +185,8 @@ tests/test_config.in: .ignore
 tests/test_config_dev.in: .ignore
 tests/builtin/test_config: .ignore
 tests/builtin/test_config_dev: .ignore
+tests/concurrency/test_config: .ignore
+tests/concurrency/test_config_dev: .ignore
 tests/format/test_config: .ignore
 tests/format/test_config_dev: .ignore
 tests/full-mtracking/test_config: .ignore
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c
new file mode 100644
index 00000000000..0883dc14bc1
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c
@@ -0,0 +1,1963 @@
+/* Generated by Frama-C */
+#include "errno.h"
+#include "pthread.h"
+#include "sched.h"
+#include "signal.h"
+#include "stddef.h"
+#include "stdint.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "time.h"
+#include "unistd.h"
+char *__gen_e_acsl_literal_string_2;
+char *__gen_e_acsl_literal_string_5;
+char *__gen_e_acsl_literal_string_3;
+char *__gen_e_acsl_literal_string_6;
+char *__gen_e_acsl_literal_string_11;
+char *__gen_e_acsl_literal_string_12;
+char *__gen_e_acsl_literal_string;
+char *__gen_e_acsl_literal_string_4;
+char *__gen_e_acsl_literal_string_7;
+char *__gen_e_acsl_literal_string_8;
+char *__gen_e_acsl_literal_string_9;
+char *__gen_e_acsl_literal_string_10;
+char *__gen_e_acsl_literal_string_13;
+char *__gen_e_acsl_literal_string_14;
+extern  __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict;
+
+/*@ requires valid_cond: \valid(cond);
+    ensures sucess: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    ensures initialization: cond: \initialized(\old(cond));
+    ensures success: \result == 0;
+    assigns *cond, \result;
+    assigns *cond \from *attr;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond,
+                                   pthread_condattr_t const * restrict attr);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_mutex: \valid(mutex);
+    ensures success: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond,
+                                   pthread_mutex_t * restrict mutex);
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg);
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval);
+
+/*@ requires mutex_valid: \valid(mutex);
+    requires attrs_valid_or_null: attrs == \null || \valid_read(attrs);
+    ensures
+      initialization: success_or_error:
+        (\result == 0 && \initialized(\old(mutex))) || \result == 11 ||
+        \result == 12 || \result == 1 || \result == 22;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex, *attrs;
+    assigns \result \from (indirect: *mutex), (indirect: *attrs);
+ */
+int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex,
+                                    pthread_mutexattr_t const * restrict attrs);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 35;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures success_or_error: \result == 0 || \result == 1;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns __fc_stdout;
+    assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s)));
+ */
+void __gen_e_acsl_perror(char const *s);
+
+/*@ exits status: \exit_status == \old(status);
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from status;
+ */
+void __gen_e_acsl_exit(int status);
+
+/*@ ensures result_ok_or_error: \result == 0 || \result == -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: usec), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int __gen_e_acsl_usleep(useconds_t usec);
+
+int *values[10];
+int write_count = 0;
+int read_count = 0;
+pthread_cond_t write_cond;
+pthread_cond_t read_cond;
+pthread_mutex_t write_mutex;
+pthread_mutex_t read_mutex;
+/*@ ensures
+      \let idx = *((int *)\old(arg));
+        \valid(values[idx]) && \initialized(values[idx]);
+ */
+void *__gen_e_acsl_write_value(void *arg);
+
+void *write_value(void *arg)
+{
+  void *__retres;
+  int tmp;
+  int tmp_0;
+  int tmp_1;
+  __e_acsl_store_block((void *)(& tmp_1),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_0),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp),(size_t)4);
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  __e_acsl_store_block((void *)(& arg),(size_t)8);
+  __e_acsl_full_init((void *)(& tmp));
+  tmp = __gen_e_acsl_pthread_mutex_lock(& write_mutex);
+  if (tmp != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string);
+    __gen_e_acsl_exit(1);
+  }
+  write_count ++;
+  __e_acsl_full_init((void *)(& tmp_0));
+  tmp_0 = __gen_e_acsl_pthread_cond_wait(& write_cond,& write_mutex);
+  if (tmp_0 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_2);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_1));
+  tmp_1 = __gen_e_acsl_pthread_mutex_unlock(& write_mutex);
+  if (tmp_1 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_3);
+    __gen_e_acsl_exit(1);
+  }
+  __gen_e_acsl_usleep((unsigned int)100);
+  int idx = *((int *)arg);
+  __e_acsl_store_block((void *)(& idx),(size_t)4);
+  __e_acsl_full_init((void *)(& idx));
+  __e_acsl_initialize((void *)(& values[idx]),sizeof(int *));
+  values[idx] = (int *)malloc(sizeof(int));
+  __e_acsl_initialize((void *)values[idx],sizeof(int));
+  *(values[idx]) = idx;
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = (void *)0;
+  __e_acsl_delete_block((void *)(& arg));
+  __e_acsl_delete_block((void *)(& idx));
+  __e_acsl_delete_block((void *)(& tmp_1));
+  __e_acsl_delete_block((void *)(& tmp_0));
+  __e_acsl_delete_block((void *)(& tmp));
+  __e_acsl_delete_block((void *)(& __retres));
+  return __retres;
+}
+
+/*@ requires
+      !(\let idx = *((int *)arg);
+          \valid_read(values[idx]) && \initialized(values[idx]));
+ */
+void *__gen_e_acsl_read_value(void *arg);
+
+void *read_value(void *arg)
+{
+  void *__retres;
+  int tmp;
+  int tmp_0;
+  int tmp_1;
+  __e_acsl_store_block((void *)(& tmp_1),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_0),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp),(size_t)4);
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  __e_acsl_store_block((void *)(& arg),(size_t)8);
+  __e_acsl_full_init((void *)(& tmp));
+  tmp = __gen_e_acsl_pthread_mutex_lock(& read_mutex);
+  if (tmp != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_4);
+    __gen_e_acsl_exit(1);
+  }
+  read_count ++;
+  __e_acsl_full_init((void *)(& tmp_0));
+  tmp_0 = __gen_e_acsl_pthread_cond_wait(& read_cond,& read_mutex);
+  if (tmp_0 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_5);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_1));
+  tmp_1 = __gen_e_acsl_pthread_mutex_unlock(& read_mutex);
+  if (tmp_1 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_6);
+    __gen_e_acsl_exit(1);
+  }
+  __gen_e_acsl_usleep((unsigned int)100);
+  {
+    int __gen_e_acsl_idx;
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    int __gen_e_acsl_and_2;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*((int *)arg)",
+                                 0,*((int *)arg));
+    __gen_e_acsl_idx = *((int *)arg);
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]",
+                                 (void *)(& values[__gen_e_acsl_idx]));
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(int *)",0,sizeof(int *));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]),
+                                                    sizeof(int *));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\initialized(&values[idx])",0,
+                                 __gen_e_acsl_initialized);
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_2.blocking = 1;
+      __gen_e_acsl_assert_data_2.kind = "RTE";
+      __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_2.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_2.fct = "read_value";
+      __gen_e_acsl_assert_data_2.line = 82;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_3.blocking = 1;
+      __gen_e_acsl_assert_data_3.kind = "RTE";
+      __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_3.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_3.fct = "read_value";
+      __gen_e_acsl_assert_data_3.line = 82;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[__gen_e_acsl_idx],
+                                                    sizeof(int),
+                                                    (void *)values[__gen_e_acsl_idx],
+                                                    (void *)(& values[__gen_e_acsl_idx]));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid_read(values[idx])",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_and = __gen_e_acsl_valid_read;
+    }
+    else __gen_e_acsl_and = 0;
+    if (__gen_e_acsl_and) {
+      int __gen_e_acsl_initialized_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_4.blocking = 1;
+      __gen_e_acsl_assert_data_4.kind = "RTE";
+      __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_4.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_4.fct = "read_value";
+      __gen_e_acsl_assert_data_4.line = 82;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_5.blocking = 1;
+      __gen_e_acsl_assert_data_5.kind = "RTE";
+      __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_5.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_5.fct = "read_value";
+      __gen_e_acsl_assert_data_5.line = 82;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx],
+                                                        sizeof(int));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\initialized(values[idx])",0,
+                                   __gen_e_acsl_initialized_2);
+      __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2;
+    }
+    else __gen_e_acsl_and_2 = 0;
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "\\let idx = *((int *)arg);\n  \\valid_read(values[idx]) && \\initialized(values[idx])";
+    __gen_e_acsl_assert_data.file = "parallel_threads.c";
+    __gen_e_acsl_assert_data.fct = "read_value";
+    __gen_e_acsl_assert_data.line = 81;
+    __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  /*@ requires
+        \let idx = *((int *)arg);
+          \valid_read(values[idx]) && \initialized(values[idx]);
+  */
+  {
+    int idx = *((int *)arg);
+    __e_acsl_store_block((void *)(& idx),(size_t)4);
+    __e_acsl_full_init((void *)(& idx));
+    {
+      int __gen_e_acsl_initialized_3;
+      int __gen_e_acsl_and_3;
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_6 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_6,
+                                   "*(values[idx])",0,*(values[idx]));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_6,"idx",0,idx);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_7 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_7,
+                                   "&values[idx]",(void *)(& values[idx]));
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_7,
+                                     "sizeof(int *)",0,sizeof(int *));
+      __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& values[idx]),
+                                                        sizeof(int *));
+      if (__gen_e_acsl_initialized_3) {
+        int __gen_e_acsl_valid_read_2;
+        __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_7,
+                                     "values[idx]",(void *)values[idx]);
+        __e_acsl_assert_data_t __gen_e_acsl_assert_data_8 =
+          {.values = (void *)0};
+        __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_8,"idx",0,
+                                     idx);
+        __gen_e_acsl_assert_data_8.blocking = 1;
+        __gen_e_acsl_assert_data_8.kind = "RTE";
+        __gen_e_acsl_assert_data_8.pred_txt = "index_bound: idx < 10";
+        __gen_e_acsl_assert_data_8.file = "parallel_threads.c";
+        __gen_e_acsl_assert_data_8.fct = "read_value";
+        __gen_e_acsl_assert_data_8.line = 85;
+        __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_8);
+        __e_acsl_assert_clean(& __gen_e_acsl_assert_data_8);
+        __e_acsl_assert_data_t __gen_e_acsl_assert_data_9 =
+          {.values = (void *)0};
+        __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_9,"idx",0,
+                                     idx);
+        __gen_e_acsl_assert_data_9.blocking = 1;
+        __gen_e_acsl_assert_data_9.kind = "RTE";
+        __gen_e_acsl_assert_data_9.pred_txt = "index_bound: 0 <= idx";
+        __gen_e_acsl_assert_data_9.file = "parallel_threads.c";
+        __gen_e_acsl_assert_data_9.fct = "read_value";
+        __gen_e_acsl_assert_data_9.line = 85;
+        __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_9);
+        __e_acsl_assert_clean(& __gen_e_acsl_assert_data_9);
+        __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_7,
+                                       "sizeof(int)",0,sizeof(int));
+        __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)values[idx],
+                                                        sizeof(int),
+                                                        (void *)values[idx],
+                                                        (void *)(& values[idx]));
+        __gen_e_acsl_and_3 = __gen_e_acsl_valid_read_2;
+      }
+      else __gen_e_acsl_and_3 = 0;
+      __gen_e_acsl_assert_data_7.blocking = 1;
+      __gen_e_acsl_assert_data_7.kind = "RTE";
+      __gen_e_acsl_assert_data_7.pred_txt = "mem_access: \\valid_read(values[idx])";
+      __gen_e_acsl_assert_data_7.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_7.fct = "read_value";
+      __gen_e_acsl_assert_data_7.line = 85;
+      __e_acsl_assert(__gen_e_acsl_and_3,& __gen_e_acsl_assert_data_7);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_7);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_10 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_10,"idx",0,idx);
+      __gen_e_acsl_assert_data_10.blocking = 1;
+      __gen_e_acsl_assert_data_10.kind = "RTE";
+      __gen_e_acsl_assert_data_10.pred_txt = "index_bound: idx < 10";
+      __gen_e_acsl_assert_data_10.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_10.fct = "read_value";
+      __gen_e_acsl_assert_data_10.line = 85;
+      __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_10);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_10);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_11 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_11,"idx",0,idx);
+      __gen_e_acsl_assert_data_11.blocking = 1;
+      __gen_e_acsl_assert_data_11.kind = "RTE";
+      __gen_e_acsl_assert_data_11.pred_txt = "index_bound: 0 <= idx";
+      __gen_e_acsl_assert_data_11.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_11.fct = "read_value";
+      __gen_e_acsl_assert_data_11.line = 85;
+      __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_11);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_11);
+      __gen_e_acsl_assert_data_6.blocking = 1;
+      __gen_e_acsl_assert_data_6.kind = "Assertion";
+      __gen_e_acsl_assert_data_6.pred_txt = "*(values[idx]) == idx";
+      __gen_e_acsl_assert_data_6.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_6.fct = "read_value";
+      __gen_e_acsl_assert_data_6.line = 85;
+      __e_acsl_assert(*(values[idx]) == idx,& __gen_e_acsl_assert_data_6);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6);
+    }
+    /*@ assert *(values[idx]) == idx; */ ;
+    free((void *)values[idx]);
+    __e_acsl_full_init((void *)(& __retres));
+    __retres = (void *)0;
+    __e_acsl_delete_block((void *)(& idx));
+    goto return_label;
+    __e_acsl_delete_block((void *)(& idx));
+  }
+  return_label:
+  {
+    __e_acsl_delete_block((void *)(& arg));
+    __e_acsl_delete_block((void *)(& tmp_1));
+    __e_acsl_delete_block((void *)(& tmp_0));
+    __e_acsl_delete_block((void *)(& tmp));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires
+      !(\let idx = *((int *)arg);
+          \valid_read(values[idx]) && \initialized(values[idx]));
+ */
+void *__gen_e_acsl_read_value(void *arg)
+{
+  void *__retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  {
+    int __gen_e_acsl_idx;
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    int __gen_e_acsl_and_2;
+    __e_acsl_store_block((void *)(& arg),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*((int *)arg)",
+                                 0,*((int *)arg));
+    __gen_e_acsl_idx = *((int *)arg);
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]",
+                                 (void *)(& values[__gen_e_acsl_idx]));
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(int *)",0,sizeof(int *));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]),
+                                                    sizeof(int *));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\initialized(&values[idx])",0,
+                                 __gen_e_acsl_initialized);
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_2.blocking = 1;
+      __gen_e_acsl_assert_data_2.kind = "RTE";
+      __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_2.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_2.fct = "read_value";
+      __gen_e_acsl_assert_data_2.line = 61;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_3.blocking = 1;
+      __gen_e_acsl_assert_data_3.kind = "RTE";
+      __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_3.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_3.fct = "read_value";
+      __gen_e_acsl_assert_data_3.line = 61;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[__gen_e_acsl_idx],
+                                                    sizeof(int),
+                                                    (void *)values[__gen_e_acsl_idx],
+                                                    (void *)(& values[__gen_e_acsl_idx]));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid_read(values[idx])",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_and = __gen_e_acsl_valid_read;
+    }
+    else __gen_e_acsl_and = 0;
+    if (__gen_e_acsl_and) {
+      int __gen_e_acsl_initialized_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_4.blocking = 1;
+      __gen_e_acsl_assert_data_4.kind = "RTE";
+      __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_4.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_4.fct = "read_value";
+      __gen_e_acsl_assert_data_4.line = 61;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_5.blocking = 1;
+      __gen_e_acsl_assert_data_5.kind = "RTE";
+      __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_5.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_5.fct = "read_value";
+      __gen_e_acsl_assert_data_5.line = 61;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx],
+                                                        sizeof(int));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\initialized(values[idx])",0,
+                                   __gen_e_acsl_initialized_2);
+      __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2;
+    }
+    else __gen_e_acsl_and_2 = 0;
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "!(\\let idx = *((int *)arg);\n    \\valid_read(values[idx]) && \\initialized(values[idx]))";
+    __gen_e_acsl_assert_data.file = "parallel_threads.c";
+    __gen_e_acsl_assert_data.fct = "read_value";
+    __gen_e_acsl_assert_data.line = 60;
+    __e_acsl_assert(! __gen_e_acsl_and_2,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = read_value(arg);
+  __e_acsl_delete_block((void *)(& arg));
+  __e_acsl_delete_block((void *)(& __retres));
+  return __retres;
+}
+
+/*@ ensures
+      \let idx = *((int *)\old(arg));
+        \valid(values[idx]) && \initialized(values[idx]);
+ */
+void *__gen_e_acsl_write_value(void *arg)
+{
+  void *__gen_e_acsl_at;
+  void *__retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  __e_acsl_store_block((void *)(& arg),(size_t)8);
+  __gen_e_acsl_at = arg;
+  __retres = write_value(arg);
+  {
+    int __gen_e_acsl_idx;
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    int __gen_e_acsl_and_2;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "*((int *)\\old(arg))",0,
+                                 *((int *)__gen_e_acsl_at));
+    __gen_e_acsl_idx = *((int *)__gen_e_acsl_at);
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]",
+                                 (void *)(& values[__gen_e_acsl_idx]));
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(int *)",0,sizeof(int *));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]),
+                                                    sizeof(int *));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\initialized(&values[idx])",0,
+                                 __gen_e_acsl_initialized);
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_2.blocking = 1;
+      __gen_e_acsl_assert_data_2.kind = "RTE";
+      __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_2.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_2.fct = "write_value";
+      __gen_e_acsl_assert_data_2.line = 32;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_3.blocking = 1;
+      __gen_e_acsl_assert_data_3.kind = "RTE";
+      __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_3.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_3.fct = "write_value";
+      __gen_e_acsl_assert_data_3.line = 32;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_valid = __e_acsl_valid((void *)values[__gen_e_acsl_idx],
+                                          sizeof(int),
+                                          (void *)values[__gen_e_acsl_idx],
+                                          (void *)(& values[__gen_e_acsl_idx]));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid(values[idx])",0,
+                                   __gen_e_acsl_valid);
+      __gen_e_acsl_and = __gen_e_acsl_valid;
+    }
+    else __gen_e_acsl_and = 0;
+    if (__gen_e_acsl_and) {
+      int __gen_e_acsl_initialized_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_4.blocking = 1;
+      __gen_e_acsl_assert_data_4.kind = "RTE";
+      __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_4.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_4.fct = "write_value";
+      __gen_e_acsl_assert_data_4.line = 32;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_5.blocking = 1;
+      __gen_e_acsl_assert_data_5.kind = "RTE";
+      __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_5.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_5.fct = "write_value";
+      __gen_e_acsl_assert_data_5.line = 32;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx],
+                                                        sizeof(int));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\initialized(values[idx])",0,
+                                   __gen_e_acsl_initialized_2);
+      __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2;
+    }
+    else __gen_e_acsl_and_2 = 0;
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Postcondition";
+    __gen_e_acsl_assert_data.pred_txt = "\\let idx = *((int *)\\old(arg));\n  \\valid(values[idx]) && \\initialized(values[idx])";
+    __gen_e_acsl_assert_data.file = "parallel_threads.c";
+    __gen_e_acsl_assert_data.fct = "write_value";
+    __gen_e_acsl_assert_data.line = 31;
+    __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_delete_block((void *)(& arg));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ ensures result_ok_or_error: \result == 0 || \result == -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: usec), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int __gen_e_acsl_usleep(useconds_t usec)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  __e_acsl_store_block((void *)(& usec),(size_t)4);
+  __retres = usleep(usec);
+  {
+    int __gen_e_acsl_or;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or = __retres == -1;
+    }
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Postcondition";
+    __gen_e_acsl_assert_data.pred_txt = "result_ok_or_error: \\result == 0 || \\result == -1";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/unistd.h";
+    __gen_e_acsl_assert_data.fct = "usleep";
+    __gen_e_acsl_assert_data.line = 1119;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_delete_block((void *)(& usec));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ exits status: \exit_status == \old(status);
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from status;
+ */
+void __gen_e_acsl_exit(int status)
+{
+  __e_acsl_store_block((void *)(& status),(size_t)4);
+  exit(status);
+  {
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Postcondition";
+    __gen_e_acsl_assert_data.pred_txt = "never_terminates: \\false";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/stdlib.h";
+    __gen_e_acsl_assert_data.fct = "exit";
+    __gen_e_acsl_assert_data.line = 473;
+    __e_acsl_assert(0,& __gen_e_acsl_assert_data);
+    __e_acsl_delete_block((void *)(& status));
+    return;
+  }
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns __fc_stdout;
+    assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s)));
+ */
+void __gen_e_acsl_perror(char const *s)
+{
+  __e_acsl_store_block((void *)(& s),(size_t)8);
+  perror(s);
+  __e_acsl_delete_block((void *)(& s));
+  return;
+}
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures success_or_error: \result == 0 || \result == 1;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)mutex,
+                                        sizeof(pthread_mutex_t),
+                                        (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_mutex_unlock";
+    __gen_e_acsl_assert_data.line = 313;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = pthread_mutex_unlock(mutex);
+  {
+    int __gen_e_acsl_or;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or = __retres == 1;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error: \\result == 0 || \\result == 1";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_mutex_unlock";
+    __gen_e_acsl_assert_data_2.line = 316;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 35;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)mutex,
+                                        sizeof(pthread_mutex_t),
+                                        (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_mutex_lock";
+    __gen_e_acsl_assert_data.line = 295;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = pthread_mutex_lock(mutex);
+  {
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or = __retres == 11;
+    }
+    if (__gen_e_acsl_or) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 35;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 11 || \\result == 22 || \\result == 35";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_mutex_lock";
+    __gen_e_acsl_assert_data_2.line = 299;
+    __e_acsl_assert(__gen_e_acsl_or_3,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires mutex_valid: \valid(mutex);
+    requires attrs_valid_or_null: attrs == \null || \valid_read(attrs);
+    ensures
+      initialization: success_or_error:
+        (\result == 0 && \initialized(\old(mutex))) || \result == 11 ||
+        \result == 12 || \result == 1 || \result == 22;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex, *attrs;
+    assigns \result \from (indirect: *mutex), (indirect: *attrs);
+ */
+int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex,
+                                    pthread_mutexattr_t const * restrict attrs)
+{
+  pthread_mutex_t *__gen_e_acsl_at;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    __e_acsl_store_block((void *)(& attrs),(size_t)8);
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)mutex,
+                                        sizeof(pthread_mutex_t),
+                                        (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_mutex_init";
+    __gen_e_acsl_assert_data.line = 279;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs",
+                                 (void *)attrs);
+    if (attrs == (pthread_mutexattr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs",
+                                   (void *)attrs);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_mutexattr_t const)",0,
+                                     sizeof(pthread_mutexattr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attrs,
+                                                    sizeof(pthread_mutexattr_t const),
+                                                    (void *)attrs,
+                                                    (void *)(& attrs));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attrs)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "attrs_valid_or_null: attrs == \\null || \\valid_read(attrs)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_mutex_init";
+    __gen_e_acsl_assert_data_2.line = 280;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+  }
+  __gen_e_acsl_at = mutex;
+  __retres = pthread_mutex_init(mutex,attrs);
+  {
+    int __gen_e_acsl_and;
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    int __gen_e_acsl_or_5;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                 __retres);
+    if (__retres == 0) {
+      int __gen_e_acsl_initialized;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,
+                                   "\\old(mutex)",(void *)__gen_e_acsl_at);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3,
+                                     "sizeof(pthread_mutex_t)",0,
+                                     sizeof(pthread_mutex_t));
+      __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at,
+                                                      sizeof(pthread_mutex_t));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "\\initialized(\\old(mutex))",0,
+                                   __gen_e_acsl_initialized);
+      __gen_e_acsl_and = __gen_e_acsl_initialized;
+    }
+    else __gen_e_acsl_and = 0;
+    if (__gen_e_acsl_and) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 11;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 12;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 1;
+    }
+    if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_5 = __retres == 22;
+    }
+    __gen_e_acsl_assert_data_3.blocking = 1;
+    __gen_e_acsl_assert_data_3.kind = "Postcondition";
+    __gen_e_acsl_assert_data_3.pred_txt = "initialization: success_or_error:\n  (\\result == 0 && \\initialized(\\old(mutex))) || \\result == 11 ||\n  \\result == 12 || \\result == 1 || \\result == 22";
+    __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_3.fct = "pthread_mutex_init";
+    __gen_e_acsl_assert_data_3.line = 285;
+    __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+    __e_acsl_delete_block((void *)(& attrs));
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval)
+{
+  __e_acsl_contract_t *__gen_e_acsl_contract;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_valid_2;
+    __e_acsl_store_block((void *)(& retval),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)4);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                 (void *)retval);
+    if (retval == (void **)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                   (void *)retval);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(void *)",0,sizeof(void *));
+      __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid(retval)",0,__gen_e_acsl_valid);
+      __gen_e_acsl_or = __gen_e_acsl_valid;
+    }
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_join";
+    __gen_e_acsl_assert_data.line = 247;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           retval == (void **)0);
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_valid_2);
+  }
+  __retres = pthread_join(thread,retval);
+  {
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 35;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 3;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_join";
+    __gen_e_acsl_assert_data_2.line = 251;
+    __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    __e_acsl_delete_block((void *)(& retval));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_or_2;
+    __e_acsl_store_block((void *)(& arg),(size_t)8);
+    __e_acsl_store_block((void *)(& start_routine),(size_t)8);
+    __e_acsl_store_block((void *)(& attr),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread",
+                                 (void *)thread);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_t)",0,sizeof(pthread_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t),
+                                        (void *)thread,(void *)(& thread));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\valid(thread)",0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_create";
+    __gen_e_acsl_assert_data.line = 223;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                 (void *)attr);
+    if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                   (void *)attr);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_attr_t const)",0,
+                                     sizeof(pthread_attr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr,
+                                                    sizeof(pthread_attr_t const),
+                                                    (void *)attr,
+                                                    (void *)(& attr));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attr)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_create";
+    __gen_e_acsl_assert_data_2.line = 224;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+    if (arg == (void *)0) __gen_e_acsl_or_2 = 1;
+    else {
+      int __gen_e_acsl_valid_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4,
+                                     "sizeof(char)",0,sizeof(char));
+      __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg,
+                                            (void *)(& arg));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "\\valid((char *)arg)",0,
+                                   __gen_e_acsl_valid_2);
+      __gen_e_acsl_or_2 = __gen_e_acsl_valid_2;
+    }
+    __gen_e_acsl_assert_data_4.blocking = 1;
+    __gen_e_acsl_assert_data_4.kind = "Precondition";
+    __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)";
+    __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_4.fct = "pthread_create";
+    __gen_e_acsl_assert_data_4.line = 226;
+    __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+  }
+  __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg);
+  {
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    int __gen_e_acsl_or_5;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 11;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_5 = __retres == 1;
+    }
+    __gen_e_acsl_assert_data_5.blocking = 1;
+    __gen_e_acsl_assert_data_5.kind = "Postcondition";
+    __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1";
+    __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_5.fct = "pthread_create";
+    __gen_e_acsl_assert_data_5.line = 230;
+    __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+    __e_acsl_delete_block((void *)(& arg));
+    __e_acsl_delete_block((void *)(& start_routine));
+    __e_acsl_delete_block((void *)(& attr));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_mutex: \valid(mutex);
+    ensures success: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond,
+                                   pthread_mutex_t * restrict mutex)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_valid_2;
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_store_block((void *)(& cond),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond",
+                                 (void *)cond);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t),
+                                        (void *)cond,(void *)(& cond));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_cond_wait";
+    __gen_e_acsl_assert_data.line = 203;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)mutex,
+                                          sizeof(pthread_mutex_t),
+                                          (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                 "\\valid(mutex)",0,__gen_e_acsl_valid_2);
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_mutex: \\valid(mutex)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_cond_wait";
+    __gen_e_acsl_assert_data_2.line = 204;
+    __e_acsl_assert(__gen_e_acsl_valid_2,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+  }
+  __retres = pthread_cond_wait(cond,mutex);
+  {
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                 __retres);
+    __gen_e_acsl_assert_data_3.blocking = 1;
+    __gen_e_acsl_assert_data_3.kind = "Postcondition";
+    __gen_e_acsl_assert_data_3.pred_txt = "success: \\result == 0";
+    __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_3.fct = "pthread_cond_wait";
+    __gen_e_acsl_assert_data_3.line = 206;
+    __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& cond));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    ensures initialization: cond: \initialized(\old(cond));
+    ensures success: \result == 0;
+    assigns *cond, \result;
+    assigns *cond \from *attr;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond,
+                                   pthread_condattr_t const * restrict attr)
+{
+  pthread_cond_t *__gen_e_acsl_at;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    __e_acsl_store_block((void *)(& attr),(size_t)8);
+    __e_acsl_store_block((void *)(& cond),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond",
+                                 (void *)cond);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t),
+                                        (void *)cond,(void *)(& cond));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data.line = 187;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                 (void *)attr);
+    if (attr == (pthread_condattr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                   (void *)attr);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_condattr_t const)",0,
+                                     sizeof(pthread_condattr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr,
+                                                    sizeof(pthread_condattr_t const),
+                                                    (void *)attr,
+                                                    (void *)(& attr));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attr)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data_2.line = 188;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+  }
+  __gen_e_acsl_at = cond;
+  __retres = pthread_cond_init(cond,attr);
+  {
+    int __gen_e_acsl_initialized;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"\\old(cond)",
+                                 (void *)__gen_e_acsl_at);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at,
+                                                    sizeof(pthread_cond_t));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                 "initialization: cond: \\initialized(\\old(cond))",
+                                 0,__gen_e_acsl_initialized);
+    __gen_e_acsl_assert_data_3.blocking = 1;
+    __gen_e_acsl_assert_data_3.kind = "Postcondition";
+    __gen_e_acsl_assert_data_3.pred_txt = "initialization: cond: \\initialized(\\old(cond))";
+    __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_3.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data_3.line = 191;
+    __e_acsl_assert(__gen_e_acsl_initialized,& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,"\\result",0,
+                                 __retres);
+    __gen_e_acsl_assert_data_4.blocking = 1;
+    __gen_e_acsl_assert_data_4.kind = "Postcondition";
+    __gen_e_acsl_assert_data_4.pred_txt = "success: \\result == 0";
+    __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_4.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data_4.line = 192;
+    __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_4);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+    __e_acsl_delete_block((void *)(& attr));
+    __e_acsl_delete_block((void *)(& cond));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_cond: \valid(cond);
+    ensures sucess: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    __e_acsl_store_block((void *)(& cond),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond",
+                                 (void *)cond);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t),
+                                        (void *)cond,(void *)(& cond));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_cond_broadcast";
+    __gen_e_acsl_assert_data.line = 173;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = pthread_cond_broadcast(cond);
+  {
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "sucess: \\result == 0";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_cond_broadcast";
+    __gen_e_acsl_assert_data_2.line = 175;
+    __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_delete_block((void *)(& cond));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+void __e_acsl_globals_init(void)
+{
+  static char __e_acsl_already_run = 0;
+  if (! __e_acsl_already_run) {
+    __e_acsl_already_run = 1;
+    __gen_e_acsl_literal_string_2 = "Unable to wait on condvar in write_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_2,
+                         sizeof("Unable to wait on condvar in write_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_2);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_2);
+    __gen_e_acsl_literal_string_5 = "Unable to wait on condvar in read_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_5,
+                         sizeof("Unable to wait on condvar in read_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_5);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_5);
+    __gen_e_acsl_literal_string_3 = "Unable to unlock mutex in write_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_3,
+                         sizeof("Unable to unlock mutex in write_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_3);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_3);
+    __gen_e_acsl_literal_string_6 = "Unable to unlock mutex in read_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_6,
+                         sizeof("Unable to unlock mutex in read_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_6);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_6);
+    __gen_e_acsl_literal_string_11 = "Unable to lock write_mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11,
+                         sizeof("Unable to lock write_mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11);
+    __gen_e_acsl_literal_string_12 = "Unable to lock read_mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12,
+                         sizeof("Unable to lock read_mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12);
+    __gen_e_acsl_literal_string = "Unable to lock mutex in write_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string,
+                         sizeof("Unable to lock mutex in write_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string);
+    __gen_e_acsl_literal_string_4 = "Unable to lock mutex in read_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_4,
+                         sizeof("Unable to lock mutex in read_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_4);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_4);
+    __gen_e_acsl_literal_string_7 = "Unable to initialize write mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_7,
+                         sizeof("Unable to initialize write mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_7);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_7);
+    __gen_e_acsl_literal_string_8 = "Unable to initialize write cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_8,
+                         sizeof("Unable to initialize write cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_8);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_8);
+    __gen_e_acsl_literal_string_9 = "Unable to initialize read mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9,
+                         sizeof("Unable to initialize read mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9);
+    __gen_e_acsl_literal_string_10 = "Unable to initialize read cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10,
+                         sizeof("Unable to initialize read cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10);
+    __gen_e_acsl_literal_string_13 = "Unable to broadcast to write cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13,
+                         sizeof("Unable to broadcast to write cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13);
+    __gen_e_acsl_literal_string_14 = "Unable to broadcast to read cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14,
+                         sizeof("Unable to broadcast to read cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14);
+    __e_acsl_store_block((void *)(& __gen_e_acsl_read_value),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_read_value));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_write_value),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_write_value));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_usleep),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_usleep));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_exit),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_exit));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_perror),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_perror));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_unlock),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_unlock));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_lock),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_lock));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_init),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_init));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_wait),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_wait));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_init),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_init));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_broadcast),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_broadcast));
+    __e_acsl_store_block((void *)(& read_value),(size_t)1);
+    __e_acsl_full_init((void *)(& read_value));
+    __e_acsl_store_block((void *)(& write_value),(size_t)1);
+    __e_acsl_full_init((void *)(& write_value));
+    __e_acsl_store_block((void *)(& read_mutex),(size_t)4);
+    __e_acsl_full_init((void *)(& read_mutex));
+    __e_acsl_store_block((void *)(& write_mutex),(size_t)4);
+    __e_acsl_full_init((void *)(& write_mutex));
+    __e_acsl_store_block((void *)(& read_cond),(size_t)4);
+    __e_acsl_full_init((void *)(& read_cond));
+    __e_acsl_store_block((void *)(& write_cond),(size_t)4);
+    __e_acsl_full_init((void *)(& write_cond));
+    __e_acsl_store_block((void *)(& read_count),(size_t)4);
+    __e_acsl_full_init((void *)(& read_count));
+    __e_acsl_store_block((void *)(& write_count),(size_t)4);
+    __e_acsl_full_init((void *)(& write_count));
+    __e_acsl_store_block((void *)(values),(size_t)80);
+    __e_acsl_full_init((void *)(& values));
+    __e_acsl_store_block((void *)(& usleep),(size_t)1);
+    __e_acsl_full_init((void *)(& usleep));
+    __e_acsl_store_block((void *)(& __fc_p_ttyname),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_ttyname));
+    __e_acsl_store_block((void *)(ttyname),(size_t)32);
+    __e_acsl_full_init((void *)(& ttyname));
+    __e_acsl_store_block((void *)(& Frama_C_entropy_source),(size_t)4);
+    __e_acsl_full_init((void *)(& Frama_C_entropy_source));
+    __e_acsl_store_block((void *)(& exit),(size_t)1);
+    __e_acsl_full_init((void *)(& exit));
+    __e_acsl_store_block((void *)(& free),(size_t)1);
+    __e_acsl_full_init((void *)(& free));
+    __e_acsl_store_block((void *)(& malloc),(size_t)1);
+    __e_acsl_full_init((void *)(& malloc));
+    __e_acsl_store_block((void *)(& __fc_p_random48_counter),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_random48_counter));
+    __e_acsl_store_block((void *)(random48_counter),(size_t)6);
+    __e_acsl_full_init((void *)(& random48_counter));
+    __e_acsl_store_block((void *)(& __fc_random48_init),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_random48_init));
+    __e_acsl_store_block((void *)(& __fc_rand_max),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_rand_max));
+    __e_acsl_store_block((void *)(& perror),(size_t)1);
+    __e_acsl_full_init((void *)(& perror));
+    __e_acsl_store_block((void *)(& __fc_p_tmpnam),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_tmpnam));
+    __e_acsl_store_block((void *)(__fc_tmpnam),(size_t)2048);
+    __e_acsl_full_init((void *)(& __fc_tmpnam));
+    __e_acsl_store_block((void *)(& __fc_p_fopen),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_fopen));
+    __e_acsl_store_block((void *)(__fc_fopen),(size_t)128);
+    __e_acsl_full_init((void *)(& __fc_fopen));
+    __e_acsl_store_block((void *)(& stdout),(size_t)8);
+    __e_acsl_full_init((void *)(& stdout));
+    __e_acsl_store_block((void *)(& stdin),(size_t)8);
+    __e_acsl_full_init((void *)(& stdin));
+    __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_interrupted));
+    __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_time_tm));
+    __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36);
+    __e_acsl_full_init((void *)(& __fc_time_tm));
+    __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_ctime));
+    __e_acsl_store_block((void *)(__fc_ctime),(size_t)26);
+    __e_acsl_full_init((void *)(& __fc_ctime));
+    __e_acsl_store_block((void *)(& __fc_time),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_time));
+    __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_sigaction));
+    __e_acsl_store_block((void *)(sigaction),(size_t)2080);
+    __e_acsl_full_init((void *)(& sigaction));
+    __e_acsl_store_block((void *)(& pthread_mutex_unlock),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_unlock));
+    __e_acsl_store_block((void *)(& pthread_mutex_trylock),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_trylock));
+    __e_acsl_store_block((void *)(& pthread_mutex_lock),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_lock));
+    __e_acsl_store_block((void *)(& pthread_mutex_init),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_init));
+    __e_acsl_store_block((void *)(& pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_join));
+    __e_acsl_store_block((void *)(& pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_create));
+    __e_acsl_store_block((void *)(& pthread_cond_wait),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_cond_wait));
+    __e_acsl_store_block((void *)(& pthread_cond_init),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_cond_init));
+    __e_acsl_store_block((void *)(& pthread_cond_broadcast),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_cond_broadcast));
+    __e_acsl_store_block((void *)(& errno),(size_t)4);
+    __e_acsl_full_init((void *)(& errno));
+  }
+  return;
+}
+
+void __e_acsl_globals_clean(void)
+{
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_read_value));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_write_value));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_usleep));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_exit));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_perror));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_unlock));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_lock));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_init));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_wait));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_init));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_broadcast));
+  __e_acsl_delete_block((void *)(& read_value));
+  __e_acsl_delete_block((void *)(& write_value));
+  __e_acsl_delete_block((void *)(& read_mutex));
+  __e_acsl_delete_block((void *)(& write_mutex));
+  __e_acsl_delete_block((void *)(& read_cond));
+  __e_acsl_delete_block((void *)(& write_cond));
+  __e_acsl_delete_block((void *)(& read_count));
+  __e_acsl_delete_block((void *)(& write_count));
+  __e_acsl_delete_block((void *)(values));
+  __e_acsl_delete_block((void *)(& usleep));
+  __e_acsl_delete_block((void *)(& __fc_p_ttyname));
+  __e_acsl_delete_block((void *)(ttyname));
+  __e_acsl_delete_block((void *)(& Frama_C_entropy_source));
+  __e_acsl_delete_block((void *)(& exit));
+  __e_acsl_delete_block((void *)(& free));
+  __e_acsl_delete_block((void *)(& malloc));
+  __e_acsl_delete_block((void *)(& __fc_p_random48_counter));
+  __e_acsl_delete_block((void *)(random48_counter));
+  __e_acsl_delete_block((void *)(& __fc_random48_init));
+  __e_acsl_delete_block((void *)(& __fc_rand_max));
+  __e_acsl_delete_block((void *)(& perror));
+  __e_acsl_delete_block((void *)(& __fc_p_tmpnam));
+  __e_acsl_delete_block((void *)(__fc_tmpnam));
+  __e_acsl_delete_block((void *)(& __fc_p_fopen));
+  __e_acsl_delete_block((void *)(__fc_fopen));
+  __e_acsl_delete_block((void *)(& stdout));
+  __e_acsl_delete_block((void *)(& stdin));
+  __e_acsl_delete_block((void *)(& __fc_interrupted));
+  __e_acsl_delete_block((void *)(& __fc_p_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_p_ctime));
+  __e_acsl_delete_block((void *)(__fc_ctime));
+  __e_acsl_delete_block((void *)(& __fc_time));
+  __e_acsl_delete_block((void *)(& __fc_p_sigaction));
+  __e_acsl_delete_block((void *)(sigaction));
+  __e_acsl_delete_block((void *)(& pthread_mutex_unlock));
+  __e_acsl_delete_block((void *)(& pthread_mutex_trylock));
+  __e_acsl_delete_block((void *)(& pthread_mutex_lock));
+  __e_acsl_delete_block((void *)(& pthread_mutex_init));
+  __e_acsl_delete_block((void *)(& pthread_join));
+  __e_acsl_delete_block((void *)(& pthread_create));
+  __e_acsl_delete_block((void *)(& pthread_cond_wait));
+  __e_acsl_delete_block((void *)(& pthread_cond_init));
+  __e_acsl_delete_block((void *)(& pthread_cond_broadcast));
+  __e_acsl_delete_block((void *)(& errno));
+  return;
+}
+
+int main(void)
+{
+  int __retres;
+  pthread_t writers[10];
+  pthread_t readers[10];
+  int args[10];
+  int tmp;
+  int tmp_0;
+  int tmp_1;
+  int tmp_2;
+  int tmp_5;
+  int tmp_6;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  __e_acsl_globals_init();
+  __e_acsl_store_block((void *)(& tmp_6),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_5),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_2),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_1),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_0),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp),(size_t)4);
+  __e_acsl_store_block((void *)(args),(size_t)40);
+  __e_acsl_store_block((void *)(readers),(size_t)40);
+  __e_acsl_store_block((void *)(writers),(size_t)40);
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  __e_acsl_full_init((void *)(& tmp));
+  tmp = __gen_e_acsl_pthread_mutex_init(& write_mutex,
+                                        (pthread_mutexattr_t const *)0);
+  if (tmp != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_7);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_0));
+  tmp_0 = __gen_e_acsl_pthread_cond_init(& write_cond,
+                                         (pthread_condattr_t const *)0);
+  if (tmp_0 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_8);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_1));
+  tmp_1 = __gen_e_acsl_pthread_mutex_init(& read_mutex,
+                                          (pthread_mutexattr_t const *)0);
+  if (tmp_1 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_9);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_2));
+  tmp_2 = __gen_e_acsl_pthread_cond_init(& read_cond,
+                                         (pthread_condattr_t const *)0);
+  if (tmp_2 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_10);
+    __gen_e_acsl_exit(1);
+  }
+  {
+    int i = 0;
+    __e_acsl_store_block((void *)(& i),(size_t)4);
+    __e_acsl_full_init((void *)(& i));
+    while (i < 10) {
+      __e_acsl_initialize((void *)(& args[i]),sizeof(int));
+      args[i] = i;
+      __gen_e_acsl_pthread_create(& writers[i],(pthread_attr_t const *)0,
+                                  & __gen_e_acsl_write_value,
+                                  (void *)(& args[i]));
+      __gen_e_acsl_pthread_create(& readers[i],(pthread_attr_t const *)0,
+                                  & __gen_e_acsl_read_value,
+                                  (void *)(& args[i]));
+      __e_acsl_full_init((void *)(& i));
+      i ++;
+    }
+    __e_acsl_delete_block((void *)(& i));
+  }
+  while (1) {
+    int res = pthread_mutex_trylock(& write_mutex);
+    __e_acsl_store_block((void *)(& res),(size_t)4);
+    __e_acsl_full_init((void *)(& res));
+    if (res == 0) {
+      int done = write_count == 10;
+      __e_acsl_store_block((void *)(& done),(size_t)4);
+      __e_acsl_full_init((void *)(& done));
+      __gen_e_acsl_pthread_mutex_unlock(& write_mutex);
+      if (done) {
+        __e_acsl_delete_block((void *)(& res));
+        __e_acsl_delete_block((void *)(& done));
+        break;
+      }
+      __e_acsl_delete_block((void *)(& done));
+    }
+    else 
+      if (res != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_11);
+    __gen_e_acsl_usleep((unsigned int)100);
+    __e_acsl_delete_block((void *)(& res));
+  }
+  while (1) {
+    int res_0 = pthread_mutex_trylock(& read_mutex);
+    __e_acsl_store_block((void *)(& res_0),(size_t)4);
+    __e_acsl_full_init((void *)(& res_0));
+    if (res_0 == 0) {
+      int done_0 = read_count == 10;
+      __e_acsl_store_block((void *)(& done_0),(size_t)4);
+      __e_acsl_full_init((void *)(& done_0));
+      __gen_e_acsl_pthread_mutex_unlock(& read_mutex);
+      if (done_0) {
+        __e_acsl_delete_block((void *)(& res_0));
+        __e_acsl_delete_block((void *)(& done_0));
+        break;
+      }
+      __e_acsl_delete_block((void *)(& done_0));
+    }
+    else 
+      if (res_0 != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_12);
+    __gen_e_acsl_usleep((unsigned int)100);
+    __e_acsl_delete_block((void *)(& res_0));
+  }
+  __e_acsl_full_init((void *)(& tmp_5));
+  tmp_5 = __gen_e_acsl_pthread_cond_broadcast(& write_cond);
+  if (tmp_5 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_13);
+    __gen_e_acsl_exit(11);
+  }
+  {
+    int i_0 = 0;
+    __e_acsl_store_block((void *)(& i_0),(size_t)4);
+    __e_acsl_full_init((void *)(& i_0));
+    while (i_0 < 10) {
+      __gen_e_acsl_pthread_join(writers[i_0],(void **)0);
+      __e_acsl_full_init((void *)(& i_0));
+      i_0 ++;
+    }
+    __e_acsl_delete_block((void *)(& i_0));
+  }
+  __e_acsl_full_init((void *)(& tmp_6));
+  tmp_6 = __gen_e_acsl_pthread_cond_broadcast(& read_cond);
+  if (tmp_6 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_14);
+    __gen_e_acsl_exit(12);
+  }
+  {
+    int i_1 = 0;
+    __e_acsl_store_block((void *)(& i_1),(size_t)4);
+    __e_acsl_full_init((void *)(& i_1));
+    while (i_1 < 10) {
+      __gen_e_acsl_pthread_join(readers[i_1],(void **)0);
+      __e_acsl_full_init((void *)(& i_1));
+      i_1 ++;
+    }
+    __e_acsl_delete_block((void *)(& i_1));
+  }
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = 0;
+  __e_acsl_delete_block((void *)(& tmp_6));
+  __e_acsl_delete_block((void *)(& tmp_5));
+  __e_acsl_delete_block((void *)(& tmp_2));
+  __e_acsl_delete_block((void *)(& tmp_1));
+  __e_acsl_delete_block((void *)(& tmp_0));
+  __e_acsl_delete_block((void *)(& tmp));
+  __e_acsl_delete_block((void *)(args));
+  __e_acsl_delete_block((void *)(readers));
+  __e_acsl_delete_block((void *)(writers));
+  __e_acsl_delete_block((void *)(& __retres));
+  __e_acsl_globals_clean();
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_sequential_threads.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_sequential_threads.c
new file mode 100644
index 00000000000..7f1c616d434
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_sequential_threads.c
@@ -0,0 +1,547 @@
+/* Generated by Frama-C */
+#include "pthread.h"
+#include "sched.h"
+#include "signal.h"
+#include "stddef.h"
+#include "stdint.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "time.h"
+extern  __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict;
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg);
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval);
+
+int *values[10];
+void *write_value(void *arg)
+{
+  void *__retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  __e_acsl_store_block((void *)(& arg),(size_t)8);
+  int idx = *((int *)arg);
+  __e_acsl_store_block((void *)(& idx),(size_t)4);
+  __e_acsl_full_init((void *)(& idx));
+  __e_acsl_initialize((void *)(& values[idx]),sizeof(int *));
+  values[idx] = (int *)malloc(sizeof(int));
+  __e_acsl_initialize((void *)values[idx],sizeof(int));
+  *(values[idx]) = idx;
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = (void *)0;
+  __e_acsl_delete_block((void *)(& arg));
+  __e_acsl_delete_block((void *)(& idx));
+  __e_acsl_delete_block((void *)(& __retres));
+  return __retres;
+}
+
+void *read_value(void *arg)
+{
+  void *__retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  __e_acsl_store_block((void *)(& arg),(size_t)8);
+  int idx = *((int *)arg);
+  __e_acsl_store_block((void *)(& idx),(size_t)4);
+  __e_acsl_full_init((void *)(& idx));
+  {
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*(values[idx])",
+                                 0,*(values[idx]));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"idx",0,idx);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"&values[idx]",
+                                 (void *)(& values[idx]));
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                   "sizeof(int *)",0,sizeof(int *));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[idx]),
+                                                    sizeof(int *));
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,
+                                   "values[idx]",(void *)values[idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"idx",0,idx);
+      __gen_e_acsl_assert_data_3.blocking = 1;
+      __gen_e_acsl_assert_data_3.kind = "RTE";
+      __gen_e_acsl_assert_data_3.pred_txt = "index_bound: idx < 10";
+      __gen_e_acsl_assert_data_3.file = "sequential_threads.c";
+      __gen_e_acsl_assert_data_3.fct = "read_value";
+      __gen_e_acsl_assert_data_3.line = 17;
+      __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,"idx",0,idx);
+      __gen_e_acsl_assert_data_4.blocking = 1;
+      __gen_e_acsl_assert_data_4.kind = "RTE";
+      __gen_e_acsl_assert_data_4.pred_txt = "index_bound: 0 <= idx";
+      __gen_e_acsl_assert_data_4.file = "sequential_threads.c";
+      __gen_e_acsl_assert_data_4.fct = "read_value";
+      __gen_e_acsl_assert_data_4.line = 17;
+      __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[idx],
+                                                    sizeof(int),
+                                                    (void *)values[idx],
+                                                    (void *)(& values[idx]));
+      __gen_e_acsl_and = __gen_e_acsl_valid_read;
+    }
+    else __gen_e_acsl_and = 0;
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "RTE";
+    __gen_e_acsl_assert_data_2.pred_txt = "mem_access: \\valid_read(values[idx])";
+    __gen_e_acsl_assert_data_2.file = "sequential_threads.c";
+    __gen_e_acsl_assert_data_2.fct = "read_value";
+    __gen_e_acsl_assert_data_2.line = 17;
+    __e_acsl_assert(__gen_e_acsl_and,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"idx",0,idx);
+    __gen_e_acsl_assert_data_5.blocking = 1;
+    __gen_e_acsl_assert_data_5.kind = "RTE";
+    __gen_e_acsl_assert_data_5.pred_txt = "index_bound: idx < 10";
+    __gen_e_acsl_assert_data_5.file = "sequential_threads.c";
+    __gen_e_acsl_assert_data_5.fct = "read_value";
+    __gen_e_acsl_assert_data_5.line = 17;
+    __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_5);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_6 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_6,"idx",0,idx);
+    __gen_e_acsl_assert_data_6.blocking = 1;
+    __gen_e_acsl_assert_data_6.kind = "RTE";
+    __gen_e_acsl_assert_data_6.pred_txt = "index_bound: 0 <= idx";
+    __gen_e_acsl_assert_data_6.file = "sequential_threads.c";
+    __gen_e_acsl_assert_data_6.fct = "read_value";
+    __gen_e_acsl_assert_data_6.line = 17;
+    __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_6);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Assertion";
+    __gen_e_acsl_assert_data.pred_txt = "*(values[idx]) == idx";
+    __gen_e_acsl_assert_data.file = "sequential_threads.c";
+    __gen_e_acsl_assert_data.fct = "read_value";
+    __gen_e_acsl_assert_data.line = 17;
+    __e_acsl_assert(*(values[idx]) == idx,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  /*@ assert *(values[idx]) == idx; */ ;
+  free((void *)values[idx]);
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = (void *)0;
+  __e_acsl_delete_block((void *)(& arg));
+  __e_acsl_delete_block((void *)(& idx));
+  __e_acsl_delete_block((void *)(& __retres));
+  return __retres;
+}
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval)
+{
+  __e_acsl_contract_t *__gen_e_acsl_contract;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_valid_2;
+    __e_acsl_store_block((void *)(& retval),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)4);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                 (void *)retval);
+    if (retval == (void **)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                   (void *)retval);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(void *)",0,sizeof(void *));
+      __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid(retval)",0,__gen_e_acsl_valid);
+      __gen_e_acsl_or = __gen_e_acsl_valid;
+    }
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_join";
+    __gen_e_acsl_assert_data.line = 247;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           retval == (void **)0);
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_valid_2);
+  }
+  __retres = pthread_join(thread,retval);
+  {
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 35;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 3;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_join";
+    __gen_e_acsl_assert_data_2.line = 251;
+    __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    __e_acsl_delete_block((void *)(& retval));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_or_2;
+    __e_acsl_store_block((void *)(& arg),(size_t)8);
+    __e_acsl_store_block((void *)(& start_routine),(size_t)8);
+    __e_acsl_store_block((void *)(& attr),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread",
+                                 (void *)thread);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_t)",0,sizeof(pthread_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t),
+                                        (void *)thread,(void *)(& thread));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\valid(thread)",0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_create";
+    __gen_e_acsl_assert_data.line = 223;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                 (void *)attr);
+    if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                   (void *)attr);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_attr_t const)",0,
+                                     sizeof(pthread_attr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr,
+                                                    sizeof(pthread_attr_t const),
+                                                    (void *)attr,
+                                                    (void *)(& attr));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attr)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_create";
+    __gen_e_acsl_assert_data_2.line = 224;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+    if (arg == (void *)0) __gen_e_acsl_or_2 = 1;
+    else {
+      int __gen_e_acsl_valid_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4,
+                                     "sizeof(char)",0,sizeof(char));
+      __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg,
+                                            (void *)(& arg));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "\\valid((char *)arg)",0,
+                                   __gen_e_acsl_valid_2);
+      __gen_e_acsl_or_2 = __gen_e_acsl_valid_2;
+    }
+    __gen_e_acsl_assert_data_4.blocking = 1;
+    __gen_e_acsl_assert_data_4.kind = "Precondition";
+    __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)";
+    __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_4.fct = "pthread_create";
+    __gen_e_acsl_assert_data_4.line = 226;
+    __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+  }
+  __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg);
+  {
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    int __gen_e_acsl_or_5;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 11;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_5 = __retres == 1;
+    }
+    __gen_e_acsl_assert_data_5.blocking = 1;
+    __gen_e_acsl_assert_data_5.kind = "Postcondition";
+    __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1";
+    __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_5.fct = "pthread_create";
+    __gen_e_acsl_assert_data_5.line = 230;
+    __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+    __e_acsl_delete_block((void *)(& arg));
+    __e_acsl_delete_block((void *)(& start_routine));
+    __e_acsl_delete_block((void *)(& attr));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+void __e_acsl_globals_init(void)
+{
+  static char __e_acsl_already_run = 0;
+  if (! __e_acsl_already_run) {
+    __e_acsl_already_run = 1;
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create));
+    __e_acsl_store_block((void *)(& read_value),(size_t)1);
+    __e_acsl_full_init((void *)(& read_value));
+    __e_acsl_store_block((void *)(& write_value),(size_t)1);
+    __e_acsl_full_init((void *)(& write_value));
+    __e_acsl_store_block((void *)(values),(size_t)80);
+    __e_acsl_full_init((void *)(& values));
+    __e_acsl_store_block((void *)(& free),(size_t)1);
+    __e_acsl_full_init((void *)(& free));
+    __e_acsl_store_block((void *)(& malloc),(size_t)1);
+    __e_acsl_full_init((void *)(& malloc));
+    __e_acsl_store_block((void *)(& __fc_p_random48_counter),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_random48_counter));
+    __e_acsl_store_block((void *)(random48_counter),(size_t)6);
+    __e_acsl_full_init((void *)(& random48_counter));
+    __e_acsl_store_block((void *)(& __fc_random48_init),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_random48_init));
+    __e_acsl_store_block((void *)(& __fc_rand_max),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_rand_max));
+    __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_interrupted));
+    __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_time_tm));
+    __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36);
+    __e_acsl_full_init((void *)(& __fc_time_tm));
+    __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_ctime));
+    __e_acsl_store_block((void *)(__fc_ctime),(size_t)26);
+    __e_acsl_full_init((void *)(& __fc_ctime));
+    __e_acsl_store_block((void *)(& __fc_time),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_time));
+    __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_sigaction));
+    __e_acsl_store_block((void *)(sigaction),(size_t)2080);
+    __e_acsl_full_init((void *)(& sigaction));
+    __e_acsl_store_block((void *)(& pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_join));
+    __e_acsl_store_block((void *)(& pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_create));
+  }
+  return;
+}
+
+void __e_acsl_globals_clean(void)
+{
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create));
+  __e_acsl_delete_block((void *)(& read_value));
+  __e_acsl_delete_block((void *)(& write_value));
+  __e_acsl_delete_block((void *)(values));
+  __e_acsl_delete_block((void *)(& free));
+  __e_acsl_delete_block((void *)(& malloc));
+  __e_acsl_delete_block((void *)(& __fc_p_random48_counter));
+  __e_acsl_delete_block((void *)(random48_counter));
+  __e_acsl_delete_block((void *)(& __fc_random48_init));
+  __e_acsl_delete_block((void *)(& __fc_rand_max));
+  __e_acsl_delete_block((void *)(& __fc_interrupted));
+  __e_acsl_delete_block((void *)(& __fc_p_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_p_ctime));
+  __e_acsl_delete_block((void *)(__fc_ctime));
+  __e_acsl_delete_block((void *)(& __fc_time));
+  __e_acsl_delete_block((void *)(& __fc_p_sigaction));
+  __e_acsl_delete_block((void *)(sigaction));
+  __e_acsl_delete_block((void *)(& pthread_join));
+  __e_acsl_delete_block((void *)(& pthread_create));
+  return;
+}
+
+int main(void)
+{
+  int __retres;
+  pthread_t t;
+  int args[10];
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  __e_acsl_globals_init();
+  __e_acsl_store_block((void *)(args),(size_t)40);
+  __e_acsl_store_block((void *)(& t),(size_t)4);
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int i = 0;
+    __e_acsl_store_block((void *)(& i),(size_t)4);
+    __e_acsl_full_init((void *)(& i));
+    while (i < 10) {
+      __e_acsl_initialize((void *)(& args[i]),sizeof(int));
+      args[i] = i;
+      __gen_e_acsl_pthread_create(& t,(pthread_attr_t const *)0,
+                                  & write_value,(void *)(& args[i]));
+      __gen_e_acsl_pthread_join(t,(void **)0);
+      __e_acsl_full_init((void *)(& i));
+      i ++;
+    }
+    __e_acsl_delete_block((void *)(& i));
+  }
+  {
+    int i_0 = 0;
+    __e_acsl_store_block((void *)(& i_0),(size_t)4);
+    __e_acsl_full_init((void *)(& i_0));
+    while (i_0 < 10) {
+      __gen_e_acsl_pthread_create(& t,(pthread_attr_t const *)0,& read_value,
+                                  (void *)(& args[i_0]));
+      __gen_e_acsl_pthread_join(t,(void **)0);
+      __e_acsl_full_init((void *)(& i_0));
+      i_0 ++;
+    }
+    __e_acsl_delete_block((void *)(& i_0));
+  }
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = 0;
+  __e_acsl_delete_block((void *)(args));
+  __e_acsl_delete_block((void *)(& t));
+  __e_acsl_delete_block((void *)(& __retres));
+  __e_acsl_globals_clean();
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c
new file mode 100644
index 00000000000..5de16ad24bd
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c
@@ -0,0 +1,1652 @@
+/* Generated by Frama-C */
+#include "errno.h"
+#include "pthread.h"
+#include "sched.h"
+#include "signal.h"
+#include "stddef.h"
+#include "stdint.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "time.h"
+#include "unistd.h"
+char *__gen_e_acsl_literal_string_2;
+char *__gen_e_acsl_literal_string_5;
+char *__gen_e_acsl_literal_string_3;
+char *__gen_e_acsl_literal_string_6;
+char *__gen_e_acsl_literal_string_11;
+char *__gen_e_acsl_literal_string_12;
+char *__gen_e_acsl_literal_string;
+char *__gen_e_acsl_literal_string_4;
+char *__gen_e_acsl_literal_string_7;
+char *__gen_e_acsl_literal_string_8;
+char *__gen_e_acsl_literal_string_9;
+char *__gen_e_acsl_literal_string_10;
+char *__gen_e_acsl_literal_string_13;
+char *__gen_e_acsl_literal_string_14;
+extern  __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict;
+
+/*@ requires valid_cond: \valid(cond);
+    ensures sucess: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    ensures initialization: cond: \initialized(\old(cond));
+    ensures success: \result == 0;
+    assigns *cond, \result;
+    assigns *cond \from *attr;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond,
+                                   pthread_condattr_t const * restrict attr);
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_mutex: \valid(mutex);
+    ensures success: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond,
+                                   pthread_mutex_t * restrict mutex);
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg);
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval);
+
+/*@ requires mutex_valid: \valid(mutex);
+    requires attrs_valid_or_null: attrs == \null || \valid_read(attrs);
+    ensures
+      initialization: success_or_error:
+        (\result == 0 && \initialized(\old(mutex))) || \result == 11 ||
+        \result == 12 || \result == 1 || \result == 22;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex, *attrs;
+    assigns \result \from (indirect: *mutex), (indirect: *attrs);
+ */
+int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex,
+                                    pthread_mutexattr_t const * restrict attrs);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 35;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex);
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures success_or_error: \result == 0 || \result == 1;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex);
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns __fc_stdout;
+    assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s)));
+ */
+void __gen_e_acsl_perror(char const *s);
+
+/*@ exits status: \exit_status == \old(status);
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from status;
+ */
+void __gen_e_acsl_exit(int status);
+
+/*@ ensures result_ok_or_error: \result == 0 || \result == -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: usec), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int __gen_e_acsl_usleep(useconds_t usec);
+
+/*@ ensures
+      \let idx = *((int *)\old(arg));
+        \valid(values[idx]) && \initialized(values[idx]);
+ */
+void *__gen_e_acsl_write_value(void *arg);
+
+/*@ requires
+      !(\let idx = *((int *)arg);
+          \valid_read(values[idx]) && \initialized(values[idx]));
+ */
+void *__gen_e_acsl_read_value(void *arg);
+
+/*@ requires
+      !(\let idx = *((int *)arg);
+          \valid_read(values[idx]) && \initialized(values[idx]));
+ */
+void *__gen_e_acsl_read_value(void *arg)
+{
+  void *__retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  {
+    int __gen_e_acsl_idx;
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    int __gen_e_acsl_and_2;
+    __e_acsl_store_block((void *)(& arg),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*((int *)arg)",
+                                 0,*((int *)arg));
+    __gen_e_acsl_idx = *((int *)arg);
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]",
+                                 (void *)(& values[__gen_e_acsl_idx]));
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(int *)",0,sizeof(int *));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]),
+                                                    sizeof(int *));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\initialized(&values[idx])",0,
+                                 __gen_e_acsl_initialized);
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_2.blocking = 1;
+      __gen_e_acsl_assert_data_2.kind = "RTE";
+      __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_2.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_2.fct = "read_value";
+      __gen_e_acsl_assert_data_2.line = 61;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_3.blocking = 1;
+      __gen_e_acsl_assert_data_3.kind = "RTE";
+      __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_3.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_3.fct = "read_value";
+      __gen_e_acsl_assert_data_3.line = 61;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[__gen_e_acsl_idx],
+                                                    sizeof(int),
+                                                    (void *)values[__gen_e_acsl_idx],
+                                                    (void *)(& values[__gen_e_acsl_idx]));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid_read(values[idx])",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_and = __gen_e_acsl_valid_read;
+    }
+    else __gen_e_acsl_and = 0;
+    if (__gen_e_acsl_and) {
+      int __gen_e_acsl_initialized_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_4.blocking = 1;
+      __gen_e_acsl_assert_data_4.kind = "RTE";
+      __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_4.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_4.fct = "read_value";
+      __gen_e_acsl_assert_data_4.line = 61;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_5.blocking = 1;
+      __gen_e_acsl_assert_data_5.kind = "RTE";
+      __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_5.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_5.fct = "read_value";
+      __gen_e_acsl_assert_data_5.line = 61;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx],
+                                                        sizeof(int));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\initialized(values[idx])",0,
+                                   __gen_e_acsl_initialized_2);
+      __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2;
+    }
+    else __gen_e_acsl_and_2 = 0;
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "!(\\let idx = *((int *)arg);\n    \\valid_read(values[idx]) && \\initialized(values[idx]))";
+    __gen_e_acsl_assert_data.file = "parallel_threads.c";
+    __gen_e_acsl_assert_data.fct = "read_value";
+    __gen_e_acsl_assert_data.line = 60;
+    __e_acsl_assert(! __gen_e_acsl_and_2,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = read_value(arg);
+  __e_acsl_delete_block((void *)(& arg));
+  __e_acsl_delete_block((void *)(& __retres));
+  return __retres;
+}
+
+/*@ ensures
+      \let idx = *((int *)\old(arg));
+        \valid(values[idx]) && \initialized(values[idx]);
+ */
+void *__gen_e_acsl_write_value(void *arg)
+{
+  void *__gen_e_acsl_at;
+  void *__retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  __e_acsl_store_block((void *)(& arg),(size_t)8);
+  __gen_e_acsl_at = arg;
+  __retres = write_value(arg);
+  {
+    int __gen_e_acsl_idx;
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    int __gen_e_acsl_and_2;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "*((int *)\\old(arg))",0,
+                                 *((int *)__gen_e_acsl_at));
+    __gen_e_acsl_idx = *((int *)__gen_e_acsl_at);
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]",
+                                 (void *)(& values[__gen_e_acsl_idx]));
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(int *)",0,sizeof(int *));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]),
+                                                    sizeof(int *));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\initialized(&values[idx])",0,
+                                 __gen_e_acsl_initialized);
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_2.blocking = 1;
+      __gen_e_acsl_assert_data_2.kind = "RTE";
+      __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_2.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_2.fct = "write_value";
+      __gen_e_acsl_assert_data_2.line = 32;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_3.blocking = 1;
+      __gen_e_acsl_assert_data_3.kind = "RTE";
+      __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_3.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_3.fct = "write_value";
+      __gen_e_acsl_assert_data_3.line = 32;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_valid = __e_acsl_valid((void *)values[__gen_e_acsl_idx],
+                                          sizeof(int),
+                                          (void *)values[__gen_e_acsl_idx],
+                                          (void *)(& values[__gen_e_acsl_idx]));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid(values[idx])",0,
+                                   __gen_e_acsl_valid);
+      __gen_e_acsl_and = __gen_e_acsl_valid;
+    }
+    else __gen_e_acsl_and = 0;
+    if (__gen_e_acsl_and) {
+      int __gen_e_acsl_initialized_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]",
+                                   (void *)values[__gen_e_acsl_idx]);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_4.blocking = 1;
+      __gen_e_acsl_assert_data_4.kind = "RTE";
+      __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10";
+      __gen_e_acsl_assert_data_4.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_4.fct = "write_value";
+      __gen_e_acsl_assert_data_4.line = 32;
+      __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+      __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+        {.values = (void *)0};
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,
+                                   "__gen_e_acsl_idx",0,__gen_e_acsl_idx);
+      __gen_e_acsl_assert_data_5.blocking = 1;
+      __gen_e_acsl_assert_data_5.kind = "RTE";
+      __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx";
+      __gen_e_acsl_assert_data_5.file = "parallel_threads.c";
+      __gen_e_acsl_assert_data_5.fct = "write_value";
+      __gen_e_acsl_assert_data_5.line = 32;
+      __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx],
+                                                        sizeof(int));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\initialized(values[idx])",0,
+                                   __gen_e_acsl_initialized_2);
+      __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2;
+    }
+    else __gen_e_acsl_and_2 = 0;
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Postcondition";
+    __gen_e_acsl_assert_data.pred_txt = "\\let idx = *((int *)\\old(arg));\n  \\valid(values[idx]) && \\initialized(values[idx])";
+    __gen_e_acsl_assert_data.file = "parallel_threads.c";
+    __gen_e_acsl_assert_data.fct = "write_value";
+    __gen_e_acsl_assert_data.line = 31;
+    __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_delete_block((void *)(& arg));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ ensures result_ok_or_error: \result == 0 || \result == -1;
+    assigns \result, Frama_C_entropy_source;
+    assigns \result
+      \from (indirect: usec), (indirect: Frama_C_entropy_source);
+    assigns Frama_C_entropy_source \from Frama_C_entropy_source;
+ */
+int __gen_e_acsl_usleep(useconds_t usec)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  __e_acsl_store_block((void *)(& usec),(size_t)4);
+  __retres = usleep(usec);
+  {
+    int __gen_e_acsl_or;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or = __retres == -1;
+    }
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Postcondition";
+    __gen_e_acsl_assert_data.pred_txt = "result_ok_or_error: \\result == 0 || \\result == -1";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/unistd.h";
+    __gen_e_acsl_assert_data.fct = "usleep";
+    __gen_e_acsl_assert_data.line = 1119;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_delete_block((void *)(& usec));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ exits status: \exit_status == \old(status);
+    ensures never_terminates: \false;
+    
+    assigns \exit_status \from status;
+ */
+void __gen_e_acsl_exit(int status)
+{
+  __e_acsl_store_block((void *)(& status),(size_t)4);
+  exit(status);
+  {
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Postcondition";
+    __gen_e_acsl_assert_data.pred_txt = "never_terminates: \\false";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/stdlib.h";
+    __gen_e_acsl_assert_data.fct = "exit";
+    __gen_e_acsl_assert_data.line = 473;
+    __e_acsl_assert(0,& __gen_e_acsl_assert_data);
+    __e_acsl_delete_block((void *)(& status));
+    return;
+  }
+}
+
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns __fc_stdout;
+    assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s)));
+ */
+void __gen_e_acsl_perror(char const *s)
+{
+  __e_acsl_store_block((void *)(& s),(size_t)8);
+  perror(s);
+  __e_acsl_delete_block((void *)(& s));
+  return;
+}
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures success_or_error: \result == 0 || \result == 1;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)mutex,
+                                        sizeof(pthread_mutex_t),
+                                        (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_mutex_unlock";
+    __gen_e_acsl_assert_data.line = 313;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = pthread_mutex_unlock(mutex);
+  {
+    int __gen_e_acsl_or;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or = __retres == 1;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error: \\result == 0 || \\result == 1";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_mutex_unlock";
+    __gen_e_acsl_assert_data_2.line = 316;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires mutex_valid: \valid(mutex);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 35;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex;
+    assigns \result \from (indirect: *mutex);
+ */
+int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)mutex,
+                                        sizeof(pthread_mutex_t),
+                                        (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_mutex_lock";
+    __gen_e_acsl_assert_data.line = 295;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = pthread_mutex_lock(mutex);
+  {
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or = __retres == 11;
+    }
+    if (__gen_e_acsl_or) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 35;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 11 || \\result == 22 || \\result == 35";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_mutex_lock";
+    __gen_e_acsl_assert_data_2.line = 299;
+    __e_acsl_assert(__gen_e_acsl_or_3,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires mutex_valid: \valid(mutex);
+    requires attrs_valid_or_null: attrs == \null || \valid_read(attrs);
+    ensures
+      initialization: success_or_error:
+        (\result == 0 && \initialized(\old(mutex))) || \result == 11 ||
+        \result == 12 || \result == 1 || \result == 22;
+    assigns *mutex, \result;
+    assigns *mutex \from *mutex, *attrs;
+    assigns \result \from (indirect: *mutex), (indirect: *attrs);
+ */
+int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex,
+                                    pthread_mutexattr_t const * restrict attrs)
+{
+  pthread_mutex_t *__gen_e_acsl_at;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    __e_acsl_store_block((void *)(& attrs),(size_t)8);
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)mutex,
+                                        sizeof(pthread_mutex_t),
+                                        (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_mutex_init";
+    __gen_e_acsl_assert_data.line = 279;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs",
+                                 (void *)attrs);
+    if (attrs == (pthread_mutexattr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs",
+                                   (void *)attrs);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_mutexattr_t const)",0,
+                                     sizeof(pthread_mutexattr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attrs,
+                                                    sizeof(pthread_mutexattr_t const),
+                                                    (void *)attrs,
+                                                    (void *)(& attrs));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attrs)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "attrs_valid_or_null: attrs == \\null || \\valid_read(attrs)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_mutex_init";
+    __gen_e_acsl_assert_data_2.line = 280;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+  }
+  __gen_e_acsl_at = mutex;
+  __retres = pthread_mutex_init(mutex,attrs);
+  {
+    int __gen_e_acsl_and;
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    int __gen_e_acsl_or_5;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                 __retres);
+    if (__retres == 0) {
+      int __gen_e_acsl_initialized;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,
+                                   "\\old(mutex)",(void *)__gen_e_acsl_at);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3,
+                                     "sizeof(pthread_mutex_t)",0,
+                                     sizeof(pthread_mutex_t));
+      __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at,
+                                                      sizeof(pthread_mutex_t));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "\\initialized(\\old(mutex))",0,
+                                   __gen_e_acsl_initialized);
+      __gen_e_acsl_and = __gen_e_acsl_initialized;
+    }
+    else __gen_e_acsl_and = 0;
+    if (__gen_e_acsl_and) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 11;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 12;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 1;
+    }
+    if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_5 = __retres == 22;
+    }
+    __gen_e_acsl_assert_data_3.blocking = 1;
+    __gen_e_acsl_assert_data_3.kind = "Postcondition";
+    __gen_e_acsl_assert_data_3.pred_txt = "initialization: success_or_error:\n  (\\result == 0 && \\initialized(\\old(mutex))) || \\result == 11 ||\n  \\result == 12 || \\result == 1 || \\result == 22";
+    __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_3.fct = "pthread_mutex_init";
+    __gen_e_acsl_assert_data_3.line = 285;
+    __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+    __e_acsl_delete_block((void *)(& attrs));
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval)
+{
+  __e_acsl_contract_t *__gen_e_acsl_contract;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_valid_2;
+    __e_acsl_store_block((void *)(& retval),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)4);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                 (void *)retval);
+    if (retval == (void **)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                   (void *)retval);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(void *)",0,sizeof(void *));
+      __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid(retval)",0,__gen_e_acsl_valid);
+      __gen_e_acsl_or = __gen_e_acsl_valid;
+    }
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_join";
+    __gen_e_acsl_assert_data.line = 247;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           retval == (void **)0);
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_valid_2);
+  }
+  __retres = pthread_join(thread,retval);
+  {
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 35;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 3;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_join";
+    __gen_e_acsl_assert_data_2.line = 251;
+    __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    __e_acsl_delete_block((void *)(& retval));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_or_2;
+    __e_acsl_store_block((void *)(& arg),(size_t)8);
+    __e_acsl_store_block((void *)(& start_routine),(size_t)8);
+    __e_acsl_store_block((void *)(& attr),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread",
+                                 (void *)thread);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_t)",0,sizeof(pthread_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t),
+                                        (void *)thread,(void *)(& thread));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\valid(thread)",0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_create";
+    __gen_e_acsl_assert_data.line = 223;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                 (void *)attr);
+    if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                   (void *)attr);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_attr_t const)",0,
+                                     sizeof(pthread_attr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr,
+                                                    sizeof(pthread_attr_t const),
+                                                    (void *)attr,
+                                                    (void *)(& attr));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attr)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_create";
+    __gen_e_acsl_assert_data_2.line = 224;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+    if (arg == (void *)0) __gen_e_acsl_or_2 = 1;
+    else {
+      int __gen_e_acsl_valid_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4,
+                                     "sizeof(char)",0,sizeof(char));
+      __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg,
+                                            (void *)(& arg));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "\\valid((char *)arg)",0,
+                                   __gen_e_acsl_valid_2);
+      __gen_e_acsl_or_2 = __gen_e_acsl_valid_2;
+    }
+    __gen_e_acsl_assert_data_4.blocking = 1;
+    __gen_e_acsl_assert_data_4.kind = "Precondition";
+    __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)";
+    __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_4.fct = "pthread_create";
+    __gen_e_acsl_assert_data_4.line = 226;
+    __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+  }
+  __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg);
+  {
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    int __gen_e_acsl_or_5;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 11;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_5 = __retres == 1;
+    }
+    __gen_e_acsl_assert_data_5.blocking = 1;
+    __gen_e_acsl_assert_data_5.kind = "Postcondition";
+    __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1";
+    __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_5.fct = "pthread_create";
+    __gen_e_acsl_assert_data_5.line = 230;
+    __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+    __e_acsl_delete_block((void *)(& arg));
+    __e_acsl_delete_block((void *)(& start_routine));
+    __e_acsl_delete_block((void *)(& attr));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_mutex: \valid(mutex);
+    ensures success: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond,
+                                   pthread_mutex_t * restrict mutex)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_valid_2;
+    __e_acsl_store_block((void *)(& mutex),(size_t)8);
+    __e_acsl_store_block((void *)(& cond),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond",
+                                 (void *)cond);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t),
+                                        (void *)cond,(void *)(& cond));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_cond_wait";
+    __gen_e_acsl_assert_data.line = 203;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"mutex",
+                                 (void *)mutex);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                   "sizeof(pthread_mutex_t)",0,
+                                   sizeof(pthread_mutex_t));
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)mutex,
+                                          sizeof(pthread_mutex_t),
+                                          (void *)mutex,(void *)(& mutex));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                 "\\valid(mutex)",0,__gen_e_acsl_valid_2);
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_mutex: \\valid(mutex)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_cond_wait";
+    __gen_e_acsl_assert_data_2.line = 204;
+    __e_acsl_assert(__gen_e_acsl_valid_2,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+  }
+  __retres = pthread_cond_wait(cond,mutex);
+  {
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0,
+                                 __retres);
+    __gen_e_acsl_assert_data_3.blocking = 1;
+    __gen_e_acsl_assert_data_3.kind = "Postcondition";
+    __gen_e_acsl_assert_data_3.pred_txt = "success: \\result == 0";
+    __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_3.fct = "pthread_cond_wait";
+    __gen_e_acsl_assert_data_3.line = 206;
+    __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+    __e_acsl_delete_block((void *)(& mutex));
+    __e_acsl_delete_block((void *)(& cond));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_cond: \valid(cond);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    ensures initialization: cond: \initialized(\old(cond));
+    ensures success: \result == 0;
+    assigns *cond, \result;
+    assigns *cond \from *attr;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond,
+                                   pthread_condattr_t const * restrict attr)
+{
+  pthread_cond_t *__gen_e_acsl_at;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    __e_acsl_store_block((void *)(& attr),(size_t)8);
+    __e_acsl_store_block((void *)(& cond),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond",
+                                 (void *)cond);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t),
+                                        (void *)cond,(void *)(& cond));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data.line = 187;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                 (void *)attr);
+    if (attr == (pthread_condattr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                   (void *)attr);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_condattr_t const)",0,
+                                     sizeof(pthread_condattr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr,
+                                                    sizeof(pthread_condattr_t const),
+                                                    (void *)attr,
+                                                    (void *)(& attr));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attr)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data_2.line = 188;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+  }
+  __gen_e_acsl_at = cond;
+  __retres = pthread_cond_init(cond,attr);
+  {
+    int __gen_e_acsl_initialized;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"\\old(cond)",
+                                 (void *)__gen_e_acsl_at);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at,
+                                                    sizeof(pthread_cond_t));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                 "initialization: cond: \\initialized(\\old(cond))",
+                                 0,__gen_e_acsl_initialized);
+    __gen_e_acsl_assert_data_3.blocking = 1;
+    __gen_e_acsl_assert_data_3.kind = "Postcondition";
+    __gen_e_acsl_assert_data_3.pred_txt = "initialization: cond: \\initialized(\\old(cond))";
+    __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_3.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data_3.line = 191;
+    __e_acsl_assert(__gen_e_acsl_initialized,& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,"\\result",0,
+                                 __retres);
+    __gen_e_acsl_assert_data_4.blocking = 1;
+    __gen_e_acsl_assert_data_4.kind = "Postcondition";
+    __gen_e_acsl_assert_data_4.pred_txt = "success: \\result == 0";
+    __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_4.fct = "pthread_cond_init";
+    __gen_e_acsl_assert_data_4.line = 192;
+    __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_4);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+    __e_acsl_delete_block((void *)(& attr));
+    __e_acsl_delete_block((void *)(& cond));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_cond: \valid(cond);
+    ensures sucess: \result == 0;
+    assigns \result;
+    assigns \result \from \nothing;
+ */
+int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    __e_acsl_store_block((void *)(& cond),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond",
+                                 (void *)cond);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_cond_t)",0,
+                                   sizeof(pthread_cond_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t),
+                                        (void *)cond,(void *)(& cond));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)",
+                                 0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_cond_broadcast";
+    __gen_e_acsl_assert_data.line = 173;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  __retres = pthread_cond_broadcast(cond);
+  {
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "sucess: \\result == 0";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_cond_broadcast";
+    __gen_e_acsl_assert_data_2.line = 175;
+    __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_delete_block((void *)(& cond));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+void __e_acsl_globals_init(void)
+{
+  static char __e_acsl_already_run = 0;
+  if (! __e_acsl_already_run) {
+    __e_acsl_already_run = 1;
+    __gen_e_acsl_literal_string_2 = "Unable to wait on condvar in write_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_2,
+                         sizeof("Unable to wait on condvar in write_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_2);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_2);
+    __gen_e_acsl_literal_string_5 = "Unable to wait on condvar in read_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_5,
+                         sizeof("Unable to wait on condvar in read_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_5);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_5);
+    __gen_e_acsl_literal_string_3 = "Unable to unlock mutex in write_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_3,
+                         sizeof("Unable to unlock mutex in write_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_3);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_3);
+    __gen_e_acsl_literal_string_6 = "Unable to unlock mutex in read_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_6,
+                         sizeof("Unable to unlock mutex in read_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_6);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_6);
+    __gen_e_acsl_literal_string_11 = "Unable to lock write_mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11,
+                         sizeof("Unable to lock write_mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11);
+    __gen_e_acsl_literal_string_12 = "Unable to lock read_mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12,
+                         sizeof("Unable to lock read_mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12);
+    __gen_e_acsl_literal_string = "Unable to lock mutex in write_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string,
+                         sizeof("Unable to lock mutex in write_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string);
+    __gen_e_acsl_literal_string_4 = "Unable to lock mutex in read_value()";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_4,
+                         sizeof("Unable to lock mutex in read_value()"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_4);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_4);
+    __gen_e_acsl_literal_string_7 = "Unable to initialize write mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_7,
+                         sizeof("Unable to initialize write mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_7);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_7);
+    __gen_e_acsl_literal_string_8 = "Unable to initialize write cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_8,
+                         sizeof("Unable to initialize write cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_8);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_8);
+    __gen_e_acsl_literal_string_9 = "Unable to initialize read mutex";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9,
+                         sizeof("Unable to initialize read mutex"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9);
+    __gen_e_acsl_literal_string_10 = "Unable to initialize read cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10,
+                         sizeof("Unable to initialize read cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10);
+    __gen_e_acsl_literal_string_13 = "Unable to broadcast to write cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13,
+                         sizeof("Unable to broadcast to write cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13);
+    __gen_e_acsl_literal_string_14 = "Unable to broadcast to read cond var";
+    __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14,
+                         sizeof("Unable to broadcast to read cond var"));
+    __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14);
+    __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14);
+    __e_acsl_store_block((void *)(& __gen_e_acsl_read_value),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_read_value));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_write_value),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_write_value));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_usleep),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_usleep));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_exit),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_exit));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_perror),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_perror));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_unlock),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_unlock));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_lock),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_lock));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_init),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_init));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_wait),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_wait));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_init),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_init));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_broadcast),
+                         (size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_broadcast));
+    __e_acsl_store_block((void *)(& read_value),(size_t)1);
+    __e_acsl_full_init((void *)(& read_value));
+    __e_acsl_store_block((void *)(& write_value),(size_t)1);
+    __e_acsl_full_init((void *)(& write_value));
+    __e_acsl_store_block((void *)(& read_mutex),(size_t)4);
+    __e_acsl_full_init((void *)(& read_mutex));
+    __e_acsl_store_block((void *)(& write_mutex),(size_t)4);
+    __e_acsl_full_init((void *)(& write_mutex));
+    __e_acsl_store_block((void *)(& read_cond),(size_t)4);
+    __e_acsl_full_init((void *)(& read_cond));
+    __e_acsl_store_block((void *)(& write_cond),(size_t)4);
+    __e_acsl_full_init((void *)(& write_cond));
+    __e_acsl_store_block((void *)(& read_count),(size_t)4);
+    __e_acsl_full_init((void *)(& read_count));
+    __e_acsl_store_block((void *)(& write_count),(size_t)4);
+    __e_acsl_full_init((void *)(& write_count));
+    __e_acsl_store_block((void *)(values),(size_t)80);
+    __e_acsl_full_init((void *)(& values));
+    __e_acsl_store_block((void *)(& usleep),(size_t)1);
+    __e_acsl_full_init((void *)(& usleep));
+    __e_acsl_store_block((void *)(& __fc_p_ttyname),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_ttyname));
+    __e_acsl_store_block((void *)(ttyname),(size_t)32);
+    __e_acsl_full_init((void *)(& ttyname));
+    __e_acsl_store_block((void *)(& Frama_C_entropy_source),(size_t)4);
+    __e_acsl_full_init((void *)(& Frama_C_entropy_source));
+    __e_acsl_store_block((void *)(& exit),(size_t)1);
+    __e_acsl_full_init((void *)(& exit));
+    __e_acsl_store_block((void *)(& free),(size_t)1);
+    __e_acsl_full_init((void *)(& free));
+    __e_acsl_store_block((void *)(& malloc),(size_t)1);
+    __e_acsl_full_init((void *)(& malloc));
+    __e_acsl_store_block((void *)(& __fc_p_random48_counter),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_random48_counter));
+    __e_acsl_store_block((void *)(random48_counter),(size_t)6);
+    __e_acsl_full_init((void *)(& random48_counter));
+    __e_acsl_store_block((void *)(& __fc_random48_init),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_random48_init));
+    __e_acsl_store_block((void *)(& __fc_rand_max),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_rand_max));
+    __e_acsl_store_block((void *)(& perror),(size_t)1);
+    __e_acsl_full_init((void *)(& perror));
+    __e_acsl_store_block((void *)(& __fc_p_tmpnam),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_tmpnam));
+    __e_acsl_store_block((void *)(__fc_tmpnam),(size_t)2048);
+    __e_acsl_full_init((void *)(& __fc_tmpnam));
+    __e_acsl_store_block((void *)(& __fc_p_fopen),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_fopen));
+    __e_acsl_store_block((void *)(__fc_fopen),(size_t)128);
+    __e_acsl_full_init((void *)(& __fc_fopen));
+    __e_acsl_store_block((void *)(& stdout),(size_t)8);
+    __e_acsl_full_init((void *)(& stdout));
+    __e_acsl_store_block((void *)(& stdin),(size_t)8);
+    __e_acsl_full_init((void *)(& stdin));
+    __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_interrupted));
+    __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_time_tm));
+    __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36);
+    __e_acsl_full_init((void *)(& __fc_time_tm));
+    __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_ctime));
+    __e_acsl_store_block((void *)(__fc_ctime),(size_t)26);
+    __e_acsl_full_init((void *)(& __fc_ctime));
+    __e_acsl_store_block((void *)(& __fc_time),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_time));
+    __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_sigaction));
+    __e_acsl_store_block((void *)(sigaction),(size_t)2080);
+    __e_acsl_full_init((void *)(& sigaction));
+    __e_acsl_store_block((void *)(& pthread_mutex_unlock),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_unlock));
+    __e_acsl_store_block((void *)(& pthread_mutex_trylock),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_trylock));
+    __e_acsl_store_block((void *)(& pthread_mutex_lock),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_lock));
+    __e_acsl_store_block((void *)(& pthread_mutex_init),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_mutex_init));
+    __e_acsl_store_block((void *)(& pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_join));
+    __e_acsl_store_block((void *)(& pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_create));
+    __e_acsl_store_block((void *)(& pthread_cond_wait),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_cond_wait));
+    __e_acsl_store_block((void *)(& pthread_cond_init),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_cond_init));
+    __e_acsl_store_block((void *)(& pthread_cond_broadcast),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_cond_broadcast));
+    __e_acsl_store_block((void *)(& errno),(size_t)4);
+    __e_acsl_full_init((void *)(& errno));
+  }
+  return;
+}
+
+void __e_acsl_globals_clean(void)
+{
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_read_value));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_write_value));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_usleep));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_exit));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_perror));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_unlock));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_lock));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_init));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_wait));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_init));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_broadcast));
+  __e_acsl_delete_block((void *)(& read_value));
+  __e_acsl_delete_block((void *)(& write_value));
+  __e_acsl_delete_block((void *)(& read_mutex));
+  __e_acsl_delete_block((void *)(& write_mutex));
+  __e_acsl_delete_block((void *)(& read_cond));
+  __e_acsl_delete_block((void *)(& write_cond));
+  __e_acsl_delete_block((void *)(& read_count));
+  __e_acsl_delete_block((void *)(& write_count));
+  __e_acsl_delete_block((void *)(values));
+  __e_acsl_delete_block((void *)(& usleep));
+  __e_acsl_delete_block((void *)(& __fc_p_ttyname));
+  __e_acsl_delete_block((void *)(ttyname));
+  __e_acsl_delete_block((void *)(& Frama_C_entropy_source));
+  __e_acsl_delete_block((void *)(& exit));
+  __e_acsl_delete_block((void *)(& free));
+  __e_acsl_delete_block((void *)(& malloc));
+  __e_acsl_delete_block((void *)(& __fc_p_random48_counter));
+  __e_acsl_delete_block((void *)(random48_counter));
+  __e_acsl_delete_block((void *)(& __fc_random48_init));
+  __e_acsl_delete_block((void *)(& __fc_rand_max));
+  __e_acsl_delete_block((void *)(& perror));
+  __e_acsl_delete_block((void *)(& __fc_p_tmpnam));
+  __e_acsl_delete_block((void *)(__fc_tmpnam));
+  __e_acsl_delete_block((void *)(& __fc_p_fopen));
+  __e_acsl_delete_block((void *)(__fc_fopen));
+  __e_acsl_delete_block((void *)(& stdout));
+  __e_acsl_delete_block((void *)(& stdin));
+  __e_acsl_delete_block((void *)(& __fc_interrupted));
+  __e_acsl_delete_block((void *)(& __fc_p_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_p_ctime));
+  __e_acsl_delete_block((void *)(__fc_ctime));
+  __e_acsl_delete_block((void *)(& __fc_time));
+  __e_acsl_delete_block((void *)(& __fc_p_sigaction));
+  __e_acsl_delete_block((void *)(sigaction));
+  __e_acsl_delete_block((void *)(& pthread_mutex_unlock));
+  __e_acsl_delete_block((void *)(& pthread_mutex_trylock));
+  __e_acsl_delete_block((void *)(& pthread_mutex_lock));
+  __e_acsl_delete_block((void *)(& pthread_mutex_init));
+  __e_acsl_delete_block((void *)(& pthread_join));
+  __e_acsl_delete_block((void *)(& pthread_create));
+  __e_acsl_delete_block((void *)(& pthread_cond_wait));
+  __e_acsl_delete_block((void *)(& pthread_cond_init));
+  __e_acsl_delete_block((void *)(& pthread_cond_broadcast));
+  __e_acsl_delete_block((void *)(& errno));
+  return;
+}
+
+int main(void)
+{
+  int __retres;
+  pthread_t writers[10];
+  pthread_t readers[10];
+  int args[10];
+  int tmp;
+  int tmp_0;
+  int tmp_1;
+  int tmp_2;
+  int tmp_5;
+  int tmp_6;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  __e_acsl_globals_init();
+  __e_acsl_store_block((void *)(& tmp_6),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_5),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_2),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_1),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp_0),(size_t)4);
+  __e_acsl_store_block((void *)(& tmp),(size_t)4);
+  __e_acsl_store_block((void *)(args),(size_t)40);
+  __e_acsl_store_block((void *)(readers),(size_t)40);
+  __e_acsl_store_block((void *)(writers),(size_t)40);
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  __e_acsl_full_init((void *)(& tmp));
+  tmp = __gen_e_acsl_pthread_mutex_init(& write_mutex,
+                                        (pthread_mutexattr_t const *)0);
+  if (tmp != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_7);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_0));
+  tmp_0 = __gen_e_acsl_pthread_cond_init(& write_cond,
+                                         (pthread_condattr_t const *)0);
+  if (tmp_0 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_8);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_1));
+  tmp_1 = __gen_e_acsl_pthread_mutex_init(& read_mutex,
+                                          (pthread_mutexattr_t const *)0);
+  if (tmp_1 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_9);
+    __gen_e_acsl_exit(1);
+  }
+  __e_acsl_full_init((void *)(& tmp_2));
+  tmp_2 = __gen_e_acsl_pthread_cond_init(& read_cond,
+                                         (pthread_condattr_t const *)0);
+  if (tmp_2 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_10);
+    __gen_e_acsl_exit(1);
+  }
+  {
+    int i = 0;
+    __e_acsl_store_block((void *)(& i),(size_t)4);
+    __e_acsl_full_init((void *)(& i));
+    while (i < 10) {
+      __e_acsl_initialize((void *)(& args[i]),sizeof(int));
+      args[i] = i;
+      __gen_e_acsl_pthread_create(& writers[i],(pthread_attr_t const *)0,
+                                  & __gen_e_acsl_write_value,
+                                  (void *)(& args[i]));
+      __gen_e_acsl_pthread_create(& readers[i],(pthread_attr_t const *)0,
+                                  & __gen_e_acsl_read_value,
+                                  (void *)(& args[i]));
+      __e_acsl_full_init((void *)(& i));
+      i ++;
+    }
+    __e_acsl_delete_block((void *)(& i));
+  }
+  while (1) {
+    int res = pthread_mutex_trylock(& write_mutex);
+    __e_acsl_store_block((void *)(& res),(size_t)4);
+    __e_acsl_full_init((void *)(& res));
+    if (res == 0) {
+      int done = write_count == 10;
+      __e_acsl_store_block((void *)(& done),(size_t)4);
+      __e_acsl_full_init((void *)(& done));
+      __gen_e_acsl_pthread_mutex_unlock(& write_mutex);
+      if (done) {
+        __e_acsl_delete_block((void *)(& res));
+        __e_acsl_delete_block((void *)(& done));
+        break;
+      }
+      __e_acsl_delete_block((void *)(& done));
+    }
+    else 
+      if (res != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_11);
+    __gen_e_acsl_usleep((unsigned int)100);
+    __e_acsl_delete_block((void *)(& res));
+  }
+  while (1) {
+    int res_0 = pthread_mutex_trylock(& read_mutex);
+    __e_acsl_store_block((void *)(& res_0),(size_t)4);
+    __e_acsl_full_init((void *)(& res_0));
+    if (res_0 == 0) {
+      int done_0 = read_count == 10;
+      __e_acsl_store_block((void *)(& done_0),(size_t)4);
+      __e_acsl_full_init((void *)(& done_0));
+      __gen_e_acsl_pthread_mutex_unlock(& read_mutex);
+      if (done_0) {
+        __e_acsl_delete_block((void *)(& res_0));
+        __e_acsl_delete_block((void *)(& done_0));
+        break;
+      }
+      __e_acsl_delete_block((void *)(& done_0));
+    }
+    else 
+      if (res_0 != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_12);
+    __gen_e_acsl_usleep((unsigned int)100);
+    __e_acsl_delete_block((void *)(& res_0));
+  }
+  __e_acsl_full_init((void *)(& tmp_5));
+  tmp_5 = __gen_e_acsl_pthread_cond_broadcast(& write_cond);
+  if (tmp_5 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_13);
+    __gen_e_acsl_exit(11);
+  }
+  {
+    int i_0 = 0;
+    __e_acsl_store_block((void *)(& i_0),(size_t)4);
+    __e_acsl_full_init((void *)(& i_0));
+    while (i_0 < 10) {
+      __gen_e_acsl_pthread_join(writers[i_0],(void **)0);
+      __e_acsl_full_init((void *)(& i_0));
+      i_0 ++;
+    }
+    __e_acsl_delete_block((void *)(& i_0));
+  }
+  __e_acsl_full_init((void *)(& tmp_6));
+  tmp_6 = __gen_e_acsl_pthread_cond_broadcast(& read_cond);
+  if (tmp_6 != 0) {
+    __gen_e_acsl_perror(__gen_e_acsl_literal_string_14);
+    __gen_e_acsl_exit(12);
+  }
+  {
+    int i_1 = 0;
+    __e_acsl_store_block((void *)(& i_1),(size_t)4);
+    __e_acsl_full_init((void *)(& i_1));
+    while (i_1 < 10) {
+      __gen_e_acsl_pthread_join(readers[i_1],(void **)0);
+      __e_acsl_full_init((void *)(& i_1));
+      i_1 ++;
+    }
+    __e_acsl_delete_block((void *)(& i_1));
+  }
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = 0;
+  __e_acsl_delete_block((void *)(& tmp_6));
+  __e_acsl_delete_block((void *)(& tmp_5));
+  __e_acsl_delete_block((void *)(& tmp_2));
+  __e_acsl_delete_block((void *)(& tmp_1));
+  __e_acsl_delete_block((void *)(& tmp_0));
+  __e_acsl_delete_block((void *)(& tmp));
+  __e_acsl_delete_block((void *)(args));
+  __e_acsl_delete_block((void *)(readers));
+  __e_acsl_delete_block((void *)(writers));
+  __e_acsl_delete_block((void *)(& __retres));
+  __e_acsl_globals_clean();
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_safe_locations.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_safe_locations.c
new file mode 100644
index 00000000000..504891d5736
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_safe_locations.c
@@ -0,0 +1,573 @@
+/* Generated by Frama-C */
+#include "errno.h"
+#include "pthread.h"
+#include "sched.h"
+#include "signal.h"
+#include "stddef.h"
+#include "stdint.h"
+#include "stdio.h"
+#include "time.h"
+extern  __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict;
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg);
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval);
+
+void *thread_start(void *arg)
+{
+  void *__retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)8);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_and;
+    __e_acsl_store_block((void *)(& arg),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"__fc_stdout",
+                                 (void *)stdout);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,"sizeof(FILE)",
+                                   0,sizeof(FILE));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)stdout,sizeof(FILE),
+                                        (void *)stdout,(void *)(& stdout));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\valid(__fc_stdout)",0,__gen_e_acsl_valid);
+    if (__gen_e_acsl_valid) {
+      int __gen_e_acsl_initialized;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"__fc_stdout",
+                                   (void *)stdout);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(FILE)",0,sizeof(FILE));
+      __gen_e_acsl_initialized = __e_acsl_initialized((void *)stdout,
+                                                      sizeof(FILE));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\initialized(__fc_stdout)",0,
+                                   __gen_e_acsl_initialized);
+      __gen_e_acsl_and = __gen_e_acsl_initialized;
+    }
+    else __gen_e_acsl_and = 0;
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Assertion";
+    __gen_e_acsl_assert_data.pred_txt = "\\valid(__fc_stdout) && \\initialized(__fc_stdout)";
+    __gen_e_acsl_assert_data.file = "threads_safe_locations.c";
+    __gen_e_acsl_assert_data.fct = "thread_start";
+    __gen_e_acsl_assert_data.line = 6;
+    __e_acsl_assert(__gen_e_acsl_and,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+  }
+  /*@ assert \valid(__fc_stdout) && \initialized(__fc_stdout); */ ;
+  {
+    int __gen_e_acsl_valid_2;
+    int __gen_e_acsl_and_2;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"__fc_stderr",
+                                 (void *)stderr);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                   "sizeof(FILE)",0,sizeof(FILE));
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)stderr,sizeof(FILE),
+                                          (void *)stderr,(void *)(& stderr));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                 "\\valid(__fc_stderr)",0,
+                                 __gen_e_acsl_valid_2);
+    if (__gen_e_acsl_valid_2) {
+      int __gen_e_acsl_initialized_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,
+                                   "__fc_stderr",(void *)stderr);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(FILE)",0,sizeof(FILE));
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)stderr,
+                                                        sizeof(FILE));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\initialized(__fc_stderr)",0,
+                                   __gen_e_acsl_initialized_2);
+      __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2;
+    }
+    else __gen_e_acsl_and_2 = 0;
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Assertion";
+    __gen_e_acsl_assert_data_2.pred_txt = "\\valid(__fc_stderr) && \\initialized(__fc_stderr)";
+    __gen_e_acsl_assert_data_2.file = "threads_safe_locations.c";
+    __gen_e_acsl_assert_data_2.fct = "thread_start";
+    __gen_e_acsl_assert_data_2.line = 7;
+    __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+  }
+  /*@ assert \valid(__fc_stderr) && \initialized(__fc_stderr); */ ;
+  {
+    int __gen_e_acsl_valid_3;
+    int __gen_e_acsl_and_3;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"__fc_stdin",
+                                 (void *)stdin);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3,
+                                   "sizeof(FILE)",0,sizeof(FILE));
+    __gen_e_acsl_valid_3 = __e_acsl_valid((void *)stdin,sizeof(FILE),
+                                          (void *)stdin,(void *)(& stdin));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                 "\\valid(__fc_stdin)",0,
+                                 __gen_e_acsl_valid_3);
+    if (__gen_e_acsl_valid_3) {
+      int __gen_e_acsl_initialized_3;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"__fc_stdin",
+                                   (void *)stdin);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3,
+                                     "sizeof(FILE)",0,sizeof(FILE));
+      __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)stdin,
+                                                        sizeof(FILE));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                   "\\initialized(__fc_stdin)",0,
+                                   __gen_e_acsl_initialized_3);
+      __gen_e_acsl_and_3 = __gen_e_acsl_initialized_3;
+    }
+    else __gen_e_acsl_and_3 = 0;
+    __gen_e_acsl_assert_data_3.blocking = 1;
+    __gen_e_acsl_assert_data_3.kind = "Assertion";
+    __gen_e_acsl_assert_data_3.pred_txt = "\\valid(__fc_stdin) && \\initialized(__fc_stdin)";
+    __gen_e_acsl_assert_data_3.file = "threads_safe_locations.c";
+    __gen_e_acsl_assert_data_3.fct = "thread_start";
+    __gen_e_acsl_assert_data_3.line = 8;
+    __e_acsl_assert(__gen_e_acsl_and_3,& __gen_e_acsl_assert_data_3);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
+  }
+  /*@ assert \valid(__fc_stdin) && \initialized(__fc_stdin); */ ;
+  int *addrof_errno = & errno;
+  __e_acsl_store_block((void *)(& addrof_errno),(size_t)8);
+  __e_acsl_full_init((void *)(& addrof_errno));
+  {
+    int __gen_e_acsl_initialized_4;
+    int __gen_e_acsl_and_4;
+    int __gen_e_acsl_and_5;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,
+                                 "&addrof_errno",(void *)(& addrof_errno));
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4,
+                                   "sizeof(int *)",0,sizeof(int *));
+    __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& addrof_errno),
+                                                      sizeof(int *));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                 "\\initialized(&addrof_errno)",0,
+                                 __gen_e_acsl_initialized_4);
+    if (__gen_e_acsl_initialized_4) {
+      int __gen_e_acsl_valid_4;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,
+                                   "addrof_errno",(void *)addrof_errno);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_valid_4 = __e_acsl_valid((void *)addrof_errno,sizeof(int),
+                                            (void *)addrof_errno,
+                                            (void *)(& addrof_errno));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "\\valid(addrof_errno)",0,
+                                   __gen_e_acsl_valid_4);
+      __gen_e_acsl_and_4 = __gen_e_acsl_valid_4;
+    }
+    else __gen_e_acsl_and_4 = 0;
+    if (__gen_e_acsl_and_4) {
+      int __gen_e_acsl_initialized_5;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,
+                                   "addrof_errno",(void *)addrof_errno);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4,
+                                     "sizeof(int)",0,sizeof(int));
+      __gen_e_acsl_initialized_5 = __e_acsl_initialized((void *)addrof_errno,
+                                                        sizeof(int));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "\\initialized(addrof_errno)",0,
+                                   __gen_e_acsl_initialized_5);
+      __gen_e_acsl_and_5 = __gen_e_acsl_initialized_5;
+    }
+    else __gen_e_acsl_and_5 = 0;
+    __gen_e_acsl_assert_data_4.blocking = 1;
+    __gen_e_acsl_assert_data_4.kind = "Assertion";
+    __gen_e_acsl_assert_data_4.pred_txt = "\\valid(addrof_errno) && \\initialized(addrof_errno)";
+    __gen_e_acsl_assert_data_4.file = "threads_safe_locations.c";
+    __gen_e_acsl_assert_data_4.fct = "thread_start";
+    __gen_e_acsl_assert_data_4.line = 10;
+    __e_acsl_assert(__gen_e_acsl_and_5,& __gen_e_acsl_assert_data_4);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+  }
+  /*@ assert \valid(addrof_errno) && \initialized(addrof_errno); */ ;
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = (void *)0;
+  __e_acsl_delete_block((void *)(& arg));
+  __e_acsl_delete_block((void *)(& addrof_errno));
+  __e_acsl_delete_block((void *)(& __retres));
+  return __retres;
+}
+
+/*@ requires valid_or_null_retval: retval == \null || \valid(retval);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 35 || \result == 22 || \result == 3;
+    assigns *retval, \result;
+    assigns *retval \from thread;
+    assigns \result \from (indirect: thread);
+    
+    behavior ignore_retval:
+      assumes null_retval: retval == \null;
+      assigns \result;
+      assigns \result \from (indirect: thread);
+    
+    behavior use_retval:
+      assumes valid_retval: \valid(retval);
+      assigns *retval, \result;
+      assigns *retval \from thread;
+      assigns \result \from (indirect: thread);
+ */
+int __gen_e_acsl_pthread_join(pthread_t thread, void **retval)
+{
+  __e_acsl_contract_t *__gen_e_acsl_contract;
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_valid_2;
+    __e_acsl_store_block((void *)(& retval),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)4);
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                 (void *)retval);
+    if (retval == (void **)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval",
+                                   (void *)retval);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                     "sizeof(void *)",0,sizeof(void *));
+      __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                   "\\valid(retval)",0,__gen_e_acsl_valid);
+      __gen_e_acsl_or = __gen_e_acsl_valid;
+    }
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_join";
+    __gen_e_acsl_assert_data.line = 247;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           retval == (void **)0);
+    __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *),
+                                          (void *)retval,(void *)(& retval));
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1,
+                                           __gen_e_acsl_valid_2);
+  }
+  __retres = pthread_join(thread,retval);
+  {
+    int __gen_e_acsl_or_2;
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_2 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_2 = __retres == 35;
+    }
+    if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 3;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Postcondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_join";
+    __gen_e_acsl_assert_data_2.line = 251;
+    __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    __e_acsl_delete_block((void *)(& retval));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+/*@ requires valid_thread: \valid(thread);
+    requires valid_null_attr: attr == \null || \valid_read(attr);
+    requires valid_routine: \valid_function(start_routine);
+    requires valid_null_arg: arg == \null || \valid((char *)arg);
+    ensures
+      success_or_error:
+        \result == 0 || \result == 11 || \result == 22 || \result == 1;
+    assigns *thread, \result;
+    assigns *thread \from *attr;
+    assigns \result \from (indirect: *attr);
+ */
+int __gen_e_acsl_pthread_create(pthread_t * restrict thread,
+                                pthread_attr_t const * restrict attr,
+                                void *(*start_routine)(void *),
+                                void * restrict arg)
+{
+  int __retres;
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  {
+    int __gen_e_acsl_valid;
+    int __gen_e_acsl_or;
+    int __gen_e_acsl_or_2;
+    __e_acsl_store_block((void *)(& arg),(size_t)8);
+    __e_acsl_store_block((void *)(& start_routine),(size_t)8);
+    __e_acsl_store_block((void *)(& attr),(size_t)8);
+    __e_acsl_store_block((void *)(& thread),(size_t)8);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread",
+                                 (void *)thread);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,
+                                   "sizeof(pthread_t)",0,sizeof(pthread_t));
+    __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t),
+                                        (void *)thread,(void *)(& thread));
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,
+                                 "\\valid(thread)",0,__gen_e_acsl_valid);
+    __gen_e_acsl_assert_data.blocking = 1;
+    __gen_e_acsl_assert_data.kind = "Precondition";
+    __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)";
+    __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data.fct = "pthread_create";
+    __gen_e_acsl_assert_data.line = 223;
+    __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                 (void *)attr);
+    if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1;
+    else {
+      int __gen_e_acsl_valid_read;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr",
+                                   (void *)attr);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2,
+                                     "sizeof(pthread_attr_t const)",0,
+                                     sizeof(pthread_attr_t const));
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr,
+                                                    sizeof(pthread_attr_t const),
+                                                    (void *)attr,
+                                                    (void *)(& attr));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,
+                                   "\\valid_read(attr)",0,
+                                   __gen_e_acsl_valid_read);
+      __gen_e_acsl_or = __gen_e_acsl_valid_read;
+    }
+    __gen_e_acsl_assert_data_2.blocking = 1;
+    __gen_e_acsl_assert_data_2.kind = "Precondition";
+    __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)";
+    __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_2.fct = "pthread_create";
+    __gen_e_acsl_assert_data_2.line = 224;
+    __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+    if (arg == (void *)0) __gen_e_acsl_or_2 = 1;
+    else {
+      int __gen_e_acsl_valid_2;
+      __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg);
+      __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4,
+                                     "sizeof(char)",0,sizeof(char));
+      __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg,
+                                            (void *)(& arg));
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,
+                                   "\\valid((char *)arg)",0,
+                                   __gen_e_acsl_valid_2);
+      __gen_e_acsl_or_2 = __gen_e_acsl_valid_2;
+    }
+    __gen_e_acsl_assert_data_4.blocking = 1;
+    __gen_e_acsl_assert_data_4.kind = "Precondition";
+    __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)";
+    __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_4.fct = "pthread_create";
+    __gen_e_acsl_assert_data_4.line = 226;
+    __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
+  }
+  __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg);
+  {
+    int __gen_e_acsl_or_3;
+    int __gen_e_acsl_or_4;
+    int __gen_e_acsl_or_5;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+      {.values = (void *)0};
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                 __retres);
+    if (__retres == 0) __gen_e_acsl_or_3 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_3 = __retres == 11;
+    }
+    if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_4 = __retres == 22;
+    }
+    if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1;
+    else {
+      __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0,
+                                   __retres);
+      __gen_e_acsl_or_5 = __retres == 1;
+    }
+    __gen_e_acsl_assert_data_5.blocking = 1;
+    __gen_e_acsl_assert_data_5.kind = "Postcondition";
+    __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n  \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1";
+    __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h";
+    __gen_e_acsl_assert_data_5.fct = "pthread_create";
+    __gen_e_acsl_assert_data_5.line = 230;
+    __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+    __e_acsl_delete_block((void *)(& arg));
+    __e_acsl_delete_block((void *)(& start_routine));
+    __e_acsl_delete_block((void *)(& attr));
+    __e_acsl_delete_block((void *)(& thread));
+    __e_acsl_delete_block((void *)(& __retres));
+    return __retres;
+  }
+}
+
+void __e_acsl_globals_init(void)
+{
+  static char __e_acsl_already_run = 0;
+  if (! __e_acsl_already_run) {
+    __e_acsl_already_run = 1;
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join));
+    __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create));
+    __e_acsl_store_block((void *)(& thread_start),(size_t)1);
+    __e_acsl_full_init((void *)(& thread_start));
+    __e_acsl_store_block((void *)(& __fc_p_tmpnam),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_tmpnam));
+    __e_acsl_store_block((void *)(__fc_tmpnam),(size_t)2048);
+    __e_acsl_full_init((void *)(& __fc_tmpnam));
+    __e_acsl_store_block((void *)(& __fc_p_fopen),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_fopen));
+    __e_acsl_store_block((void *)(__fc_fopen),(size_t)128);
+    __e_acsl_full_init((void *)(& __fc_fopen));
+    __e_acsl_store_block((void *)(& stdout),(size_t)8);
+    __e_acsl_full_init((void *)(& stdout));
+    __e_acsl_store_block((void *)(& stdin),(size_t)8);
+    __e_acsl_full_init((void *)(& stdin));
+    __e_acsl_store_block((void *)(& stderr),(size_t)8);
+    __e_acsl_full_init((void *)(& stderr));
+    __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_interrupted));
+    __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_time_tm));
+    __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36);
+    __e_acsl_full_init((void *)(& __fc_time_tm));
+    __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_ctime));
+    __e_acsl_store_block((void *)(__fc_ctime),(size_t)26);
+    __e_acsl_full_init((void *)(& __fc_ctime));
+    __e_acsl_store_block((void *)(& __fc_time),(size_t)4);
+    __e_acsl_full_init((void *)(& __fc_time));
+    __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8);
+    __e_acsl_full_init((void *)(& __fc_p_sigaction));
+    __e_acsl_store_block((void *)(sigaction),(size_t)2080);
+    __e_acsl_full_init((void *)(& sigaction));
+    __e_acsl_store_block((void *)(& pthread_join),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_join));
+    __e_acsl_store_block((void *)(& pthread_create),(size_t)1);
+    __e_acsl_full_init((void *)(& pthread_create));
+    __e_acsl_store_block((void *)(& errno),(size_t)4);
+    __e_acsl_full_init((void *)(& errno));
+  }
+  return;
+}
+
+void __e_acsl_globals_clean(void)
+{
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join));
+  __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create));
+  __e_acsl_delete_block((void *)(& thread_start));
+  __e_acsl_delete_block((void *)(& __fc_p_tmpnam));
+  __e_acsl_delete_block((void *)(__fc_tmpnam));
+  __e_acsl_delete_block((void *)(& __fc_p_fopen));
+  __e_acsl_delete_block((void *)(__fc_fopen));
+  __e_acsl_delete_block((void *)(& stdout));
+  __e_acsl_delete_block((void *)(& stdin));
+  __e_acsl_delete_block((void *)(& stderr));
+  __e_acsl_delete_block((void *)(& __fc_interrupted));
+  __e_acsl_delete_block((void *)(& __fc_p_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_time_tm));
+  __e_acsl_delete_block((void *)(& __fc_p_ctime));
+  __e_acsl_delete_block((void *)(__fc_ctime));
+  __e_acsl_delete_block((void *)(& __fc_time));
+  __e_acsl_delete_block((void *)(& __fc_p_sigaction));
+  __e_acsl_delete_block((void *)(sigaction));
+  __e_acsl_delete_block((void *)(& pthread_join));
+  __e_acsl_delete_block((void *)(& pthread_create));
+  __e_acsl_delete_block((void *)(& errno));
+  return;
+}
+
+int main(void)
+{
+  int __retres;
+  pthread_t t;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  __e_acsl_globals_init();
+  __e_acsl_store_block((void *)(& t),(size_t)4);
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  __gen_e_acsl_pthread_create(& t,(pthread_attr_t const *)0,& thread_start,
+                              (void *)0);
+  __gen_e_acsl_pthread_join(t,(void **)0);
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = 0;
+  __e_acsl_delete_block((void *)(& t));
+  __e_acsl_delete_block((void *)(& __retres));
+  __e_acsl_globals_clean();
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/parallel_threads.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/parallel_threads.res.oracle
new file mode 100644
index 00000000000..8f495131885
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/parallel_threads.res.oracle
@@ -0,0 +1,171 @@
+[e-acsl] beginning translation.
+[e-acsl] Due to the large number of function pointers in concurrent
+  code, the memory tracking dataflow analysis is deactivated
+  when activating the concurrency support of E-ACSL.
+[e-acsl] Warning: annotating undefined function `pthread_cond_broadcast':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_cond_init':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_cond_wait':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_create':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_join':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_mutex_init':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_mutex_lock':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_mutex_unlock':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `perror':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `exit':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `usleep':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] FRAMAC_SHARE/libc/unistd.h:1116: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:472: Warning: 
+  E-ACSL construct `abnormal termination case in behavior'
+  is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdio.h:484: Warning: 
+  E-ACSL construct `predicates with labels' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdio.h:483: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:312: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:294: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:278: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: 
+  E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:203: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:186: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:173: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] translation done in project "e-acsl".
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert_register_ptr: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:286: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:287: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:288: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:289: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_ptr: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[kernel:annot:missing-spec] parallel_threads.c:121: Warning: 
+  Neither code nor specification for function pthread_mutex_trylock, generating default assigns from the prototype
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:316: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/unistd.h:1119: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/sequential_threads.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/sequential_threads.res.oracle
new file mode 100644
index 00000000000..11df192b2e4
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/sequential_threads.res.oracle
@@ -0,0 +1,51 @@
+[e-acsl] beginning translation.
+[e-acsl] Due to the large number of function pointers in concurrent
+  code, the memory tracking dataflow analysis is deactivated
+  when activating the concurrency support of E-ACSL.
+[e-acsl] Warning: annotating undefined function `pthread_create':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_join':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: 
+  E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] translation done in project "e-acsl".
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_ptr: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/threads_debug.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/threads_debug.res.oracle
new file mode 100644
index 00000000000..8f495131885
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/threads_debug.res.oracle
@@ -0,0 +1,171 @@
+[e-acsl] beginning translation.
+[e-acsl] Due to the large number of function pointers in concurrent
+  code, the memory tracking dataflow analysis is deactivated
+  when activating the concurrency support of E-ACSL.
+[e-acsl] Warning: annotating undefined function `pthread_cond_broadcast':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_cond_init':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_cond_wait':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_create':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_join':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_mutex_init':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_mutex_lock':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_mutex_unlock':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `perror':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `exit':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `usleep':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] FRAMAC_SHARE/libc/unistd.h:1116: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdlib.h:472: Warning: 
+  E-ACSL construct `abnormal termination case in behavior'
+  is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdio.h:484: Warning: 
+  E-ACSL construct `predicates with labels' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/stdio.h:483: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:312: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:294: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:278: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: 
+  E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:203: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:186: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:173: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] translation done in project "e-acsl".
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert_register_ptr: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:286: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:287: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:288: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:289: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_ptr: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[kernel:annot:missing-spec] parallel_threads.c:121: Warning: 
+  Neither code nor specification for function pthread_mutex_trylock, generating default assigns from the prototype
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:316: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/unistd.h:1119: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/threads_safe_locations.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/threads_safe_locations.res.oracle
new file mode 100644
index 00000000000..e4d7cbce644
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle/threads_safe_locations.res.oracle
@@ -0,0 +1,42 @@
+[e-acsl] beginning translation.
+[e-acsl] Due to the large number of function pointers in concurrent
+  code, the memory tracking dataflow analysis is deactivated
+  when activating the concurrency support of E-ACSL.
+[e-acsl] Warning: annotating undefined function `pthread_create':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] Warning: annotating undefined function `pthread_join':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: 
+  E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation.
+[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  E-ACSL construct `assigns clause in behavior' is not yet supported.
+  Ignoring annotation.
+[e-acsl] translation done in project "e-acsl".
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_ulong: precondition data->values == \null ||
+                                                        \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: 
+  function __e_acsl_assert_register_int: precondition data->values == \null ||
+                                                      \valid(data->values) got status unknown.
+[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/parallel_threads.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/parallel_threads.e-acsl.err.log
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/sequential_threads.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/sequential_threads.e-acsl.err.log
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_debug.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_debug.e-acsl.err.log
new file mode 100644
index 00000000000..b45ae94e6e9
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_debug.e-acsl.err.log
@@ -0,0 +1,181 @@
+>>> HEAP ---------------------
+   Application: 128 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 128 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> STACK --------------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> GLOBAL -------------------
+   Application: xxxkB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> TLS ----------------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> VDSO ---------------------
+   Application: xxxkB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> --------------------------
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread stack -------------
+   Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+>>> Thread TLS ---------------
+   Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000]
+   Primary    : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
+   Secondary  : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx }
diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_safe_locations.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_safe_locations.e-acsl.err.log
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/plugins/e-acsl/tests/concurrency/parallel_threads.c b/src/plugins/e-acsl/tests/concurrency/parallel_threads.c
new file mode 100644
index 00000000000..bc492e28d8b
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/parallel_threads.c
@@ -0,0 +1,143 @@
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define SIZE 10
+
+int *values[SIZE];
+
+int write_count = 0;
+int read_count = 0;
+pthread_cond_t write_cond, read_cond;
+pthread_mutex_t write_mutex, read_mutex;
+
+#define WAIT_UNTIL_CONDVAR(count_var, mutex_var)                               \
+  do {                                                                         \
+    int res = pthread_mutex_trylock(&mutex_var);                               \
+    if (res == 0) {                                                            \
+      int done = count_var == SIZE;                                            \
+      pthread_mutex_unlock(&mutex_var);                                        \
+      if (done) {                                                              \
+        break;                                                                 \
+      }                                                                        \
+    } else if (res != EBUSY) {                                                 \
+      perror("Unable to lock " #mutex_var);                                    \
+    }                                                                          \
+    usleep(100);                                                               \
+  } while (1)
+
+/*@ ensures \let idx = *(int*)arg;
+            \valid(values[idx]) && \initialized(values[idx]); */
+void *write_value(void *arg) {
+  if (pthread_mutex_lock(&write_mutex) != 0) {
+    perror("Unable to lock mutex in write_value()");
+    exit(1);
+  }
+  ++write_count;
+  if (pthread_cond_wait(&write_cond, &write_mutex) != 0) {
+    perror("Unable to wait on condvar in write_value()");
+    exit(1);
+  }
+  if (pthread_mutex_unlock(&write_mutex) != 0) {
+    perror("Unable to unlock mutex in write_value()");
+    exit(1);
+  }
+  usleep(100);
+
+  int idx = *(int *)arg;
+  values[idx] = malloc(sizeof(int));
+  *values[idx] = idx;
+  return NULL;
+}
+
+/* The checks `\valid(values[idx])` and `\initialized(values[idx])` fail because
+ * even if `read_value()` waits for ̀write_value()` to be finished before
+ * reading the value, the generated code will check the specification before
+ * calling `read_value()`, where we do not know if `write_value()` is finished.
+ */
+/*@ requires !(\let idx = *(int*)arg;
+               \valid_read(values[idx]) && \initialized(values[idx])); */
+void *read_value(void *arg) {
+  if (pthread_mutex_lock(&read_mutex) != 0) {
+    perror("Unable to lock mutex in read_value()");
+    exit(1);
+  }
+  ++read_count;
+  if (pthread_cond_wait(&read_cond, &read_mutex) != 0) {
+    perror("Unable to wait on condvar in read_value()");
+    exit(1);
+  }
+  if (pthread_mutex_unlock(&read_mutex) != 0) {
+    perror("Unable to unlock mutex in read_value()");
+    exit(1);
+  }
+  usleep(100);
+
+  /* The contract can instead be written here so that the synchronisation
+   * between `read_value()` and `write_value()` is done before evaluating the
+   * specification. */
+  /*@ requires \let idx = *(int*)arg;
+               \valid_read(values[idx]) && \initialized(values[idx]); */
+  {
+    int idx = *(int *)arg;
+    //@ assert *values[idx] == idx;
+    free(values[idx]);
+    return NULL;
+  }
+}
+
+int main() {
+  pthread_t writers[SIZE];
+  pthread_t readers[SIZE];
+  int args[SIZE];
+
+  if (pthread_mutex_init(&write_mutex, NULL) != 0) {
+    perror("Unable to initialize write mutex");
+    exit(1);
+  }
+  if (pthread_cond_init(&write_cond, NULL) != 0) {
+    perror("Unable to initialize write cond var");
+    exit(1);
+  }
+  if (pthread_mutex_init(&read_mutex, NULL) != 0) {
+    perror("Unable to initialize read mutex");
+    exit(1);
+  }
+  if (pthread_cond_init(&read_cond, NULL) != 0) {
+    perror("Unable to initialize read cond var");
+    exit(1);
+  }
+
+  // Create all threads
+  for (int i = 0; i < SIZE; ++i) {
+    args[i] = i;
+    pthread_create(&writers[i], NULL, write_value, &args[i]);
+    pthread_create(&readers[i], NULL, read_value, &args[i]);
+  }
+
+  // Wait for every thread to be waiting on their condvar
+  WAIT_UNTIL_CONDVAR(write_count, write_mutex);
+  WAIT_UNTIL_CONDVAR(read_count, read_mutex);
+
+  // Wake up writers and wait for completion
+  if (pthread_cond_broadcast(&write_cond) != 0) {
+    perror("Unable to broadcast to write cond var");
+    exit(11);
+  }
+  for (int i = 0; i < SIZE; ++i) {
+    pthread_join(writers[i], NULL);
+  }
+
+  // Wake up readers and wait for completion
+  if (pthread_cond_broadcast(&read_cond) != 0) {
+    perror("Unable to broadcast to read cond var");
+    exit(12);
+  }
+  for (int i = 0; i < SIZE; ++i) {
+    pthread_join(readers[i], NULL);
+  }
+
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/concurrency/sequential_threads.c b/src/plugins/e-acsl/tests/concurrency/sequential_threads.c
new file mode 100644
index 00000000000..4ac916dc00e
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/sequential_threads.c
@@ -0,0 +1,37 @@
+#include <pthread.h>
+#include <stdlib.h>
+
+#define SIZE 10
+
+int *values[SIZE];
+
+void *write_value(void *arg) {
+  int idx = *(int *)arg;
+  values[idx] = malloc(sizeof(int));
+  *values[idx] = idx;
+  return NULL;
+}
+
+void *read_value(void *arg) {
+  int idx = *(int *)arg;
+  //@ assert *values[idx] == idx;
+  free(values[idx]);
+  return NULL;
+}
+
+int main() {
+  pthread_t t;
+  int args[SIZE];
+
+  for (int i = 0; i < SIZE; ++i) {
+    args[i] = i;
+    pthread_create(&t, NULL, write_value, &args[i]);
+    pthread_join(t, NULL);
+  }
+  for (int i = 0; i < SIZE; ++i) {
+    pthread_create(&t, NULL, read_value, &args[i]);
+    pthread_join(t, NULL);
+  }
+
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/concurrency/test_config b/src/plugins/e-acsl/tests/concurrency/test_config
new file mode 100644
index 00000000000..96bf5fb8d3b
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/test_config
@@ -0,0 +1 @@
+STDOPT: #"-e-acsl-concurrency"
diff --git a/src/plugins/e-acsl/tests/concurrency/test_config_dev b/src/plugins/e-acsl/tests/concurrency/test_config_dev
new file mode 100644
index 00000000000..a34bd15a2df
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/test_config_dev
@@ -0,0 +1 @@
+MACRO: ROOT_EACSL_GCC_OPTS_EXT --concurrency
diff --git a/src/plugins/e-acsl/tests/concurrency/threads_debug.c b/src/plugins/e-acsl/tests/concurrency/threads_debug.c
new file mode 100644
index 00000000000..ff3efa65c70
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/threads_debug.c
@@ -0,0 +1,11 @@
+/* run.config, run.config_dev
+  COMMENT: This test is identical to `parallel_thread.c` but with RTL debug code
+  COMMENT: activated.
+  MACRO: ROOT_EACSL_GCC_OPTS_EXT --rt-debug --rt-verbose --concurrency
+
+  COMMENT: Filter the addresses of the output so that the test is deterministic.
+  MACRO: ROOT_EACSL_EXEC_FILTER @SEDCMD@ -e s_0x[0-9a-f-]*_0x0000-0000-0000_g | @SEDCMD@ -e s_Offset:\s[0-9-]*_Offset:xxxxx_g | @SEDCMD@ -e s/[0-9]*\skB/xxxkB/g
+*/
+
+// Include existing test
+#include "parallel_threads.c"
diff --git a/src/plugins/e-acsl/tests/concurrency/threads_safe_locations.c b/src/plugins/e-acsl/tests/concurrency/threads_safe_locations.c
new file mode 100644
index 00000000000..52850ca6aed
--- /dev/null
+++ b/src/plugins/e-acsl/tests/concurrency/threads_safe_locations.c
@@ -0,0 +1,19 @@
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+
+void *thread_start(void *arg) {
+  //@ assert \valid(stdout) && \initialized(stdout);
+  //@ assert \valid(stderr) && \initialized(stderr);
+  //@ assert \valid(stdin) && \initialized(stdin);
+  int *addrof_errno = &errno;
+  //@ assert \valid(addrof_errno) && \initialized(addrof_errno);
+  return NULL;
+}
+
+int main() {
+  pthread_t t;
+  pthread_create(&t, NULL, thread_start, NULL);
+  pthread_join(t, NULL);
+  return 0;
+}
-- 
GitLab