From b95f378cd7d3a42755a8f1d301c691d36dd0f849 Mon Sep 17 00:00:00 2001 From: Kostyantyn Vorobyov <kostyantyn.vorobyov@cea.fr> Date: Tue, 17 Jan 2017 13:03:48 +0100 Subject: [PATCH] Test case for bypassed variables --- .../e-acsl/tests/runtime/bypassed_var.c | 32 +++++++++ .../runtime/oracle/bypassed_var.err.oracle | 0 .../runtime/oracle/bypassed_var.res.oracle | 6 ++ .../tests/runtime/oracle/gen_bypassed_var.c | 71 +++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 src/plugins/e-acsl/tests/runtime/bypassed_var.c create mode 100644 src/plugins/e-acsl/tests/runtime/oracle/bypassed_var.err.oracle create mode 100644 src/plugins/e-acsl/tests/runtime/oracle/bypassed_var.res.oracle create mode 100644 src/plugins/e-acsl/tests/runtime/oracle/gen_bypassed_var.c diff --git a/src/plugins/e-acsl/tests/runtime/bypassed_var.c b/src/plugins/e-acsl/tests/runtime/bypassed_var.c new file mode 100644 index 00000000000..58b31bc3917 --- /dev/null +++ b/src/plugins/e-acsl/tests/runtime/bypassed_var.c @@ -0,0 +1,32 @@ +/* run.config + COMMENT: Variable, which declaration is bypassed by a goto jump +*/ + +int bypassed_var(int i) { + int lst [2]; + if (i) + goto L; + + { + int *p; + p = &lst; + /* assert \valid(p); */ + + L: + p++; /* Important to keep this statement here to make sure + initialize is ran after store_block */ + + if (!i) { + /*@ assert \valid(p); */ + } else { + /*@ assert !\valid(p); */ + } + } + return i; +} + +int main(int argc, char const **argv) { + bypassed_var(0); + bypassed_var(1); + return 0; +} diff --git a/src/plugins/e-acsl/tests/runtime/oracle/bypassed_var.err.oracle b/src/plugins/e-acsl/tests/runtime/oracle/bypassed_var.err.oracle new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/plugins/e-acsl/tests/runtime/oracle/bypassed_var.res.oracle b/src/plugins/e-acsl/tests/runtime/oracle/bypassed_var.res.oracle new file mode 100644 index 00000000000..76ae740a2df --- /dev/null +++ b/src/plugins/e-acsl/tests/runtime/oracle/bypassed_var.res.oracle @@ -0,0 +1,6 @@ +[e-acsl] beginning translation. +FRAMAC_SHARE/libc/stdlib.h:276:[kernel] warning: No code nor implicit assigns clause for function calloc, generating default assigns from the prototype +[e-acsl] warning: Declaration of local variable p at tests/runtime/bypassed_var.c:11 is bypassed by agoto statement at tests/runtime/bypassed_var.c:8 +[e-acsl] translation done in project "e-acsl". +FRAMAC_SHARE/e-acsl/e_acsl.h:43:[value] warning: function __e_acsl_assert: precondition got status unknown. +tests/runtime/bypassed_var.c:16:[value] warning: accessing uninitialized left-value. assert \initialized(&p); diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_bypassed_var.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_bypassed_var.c new file mode 100644 index 00000000000..a1eb4fce0d0 --- /dev/null +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_bypassed_var.c @@ -0,0 +1,71 @@ +/* Generated by Frama-C */ +int bypassed_var(int i) +{ + int lst[2]; + __e_acsl_store_block((void *)(lst),8UL); + if (i) goto L; + { + int *p; + __e_acsl_store_block((void *)(& p),8UL); + __e_acsl_full_init((void *)(& p)); + p = (int *)(& lst); + L: __e_acsl_store_block_duplicate((void *)(& p),8UL); + __e_acsl_full_init((void *)(& p)); + /*@ assert Value: initialisation: \initialized(&p); */ + p ++; + if (! i) { + /*@ assert \valid(p); */ + { + { + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid; + __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int)); + __gen_e_acsl_and = __gen_e_acsl_valid; + } + else __gen_e_acsl_and = 0; + __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion", + (char *)"bypassed_var",(char *)"\\valid(p)",20); + } + } + } + else { + /*@ assert ¬\valid(p); */ + { + { + int __gen_e_acsl_initialized_2; + int __gen_e_acsl_and_2; + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& p), + sizeof(int *)); + if (__gen_e_acsl_initialized_2) { + int __gen_e_acsl_valid_2; + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)p,sizeof(int)); + __gen_e_acsl_and_2 = __gen_e_acsl_valid_2; + } + else __gen_e_acsl_and_2 = 0; + __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion", + (char *)"bypassed_var",(char *)"!\\valid(p)",22); + } + } + } + __e_acsl_delete_block((void *)(& p)); + } + __e_acsl_delete_block((void *)(lst)); + return i; +} + +int main(int argc, char const **argv) +{ + int __retres; + __e_acsl_memory_init(& argc,(char ***)(& argv),8UL); + bypassed_var(0); + bypassed_var(1); + __retres = 0; + __e_acsl_memory_clean(); + return __retres; +} + + -- GitLab