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