From 89fb6ad291881609c856b85970c103cde7269f12 Mon Sep 17 00:00:00 2001 From: Basile Desloges <basile.desloges@cea.fr> Date: Wed, 16 Dec 2020 17:53:46 +0100 Subject: [PATCH] [eacsl] Add test for struct comparison --- .../e-acsl/tests/bts/issue-eacsl-139.c | 17 ++++++ .../tests/bts/oracle_ci/gen_issue-eacsl-139.c | 56 +++++++++++++++++++ .../bts/oracle_ci/issue-eacsl-139.res.oracle | 8 +++ .../oracle_dev/issue-eacsl-139.e-acsl.err.log | 0 4 files changed, 81 insertions(+) create mode 100644 src/plugins/e-acsl/tests/bts/issue-eacsl-139.c create mode 100644 src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-139.c create mode 100644 src/plugins/e-acsl/tests/bts/oracle_ci/issue-eacsl-139.res.oracle create mode 100644 src/plugins/e-acsl/tests/bts/oracle_dev/issue-eacsl-139.e-acsl.err.log diff --git a/src/plugins/e-acsl/tests/bts/issue-eacsl-139.c b/src/plugins/e-acsl/tests/bts/issue-eacsl-139.c new file mode 100644 index 00000000000..d08b64bccfe --- /dev/null +++ b/src/plugins/e-acsl/tests/bts/issue-eacsl-139.c @@ -0,0 +1,17 @@ +/* run.config_ci, run.config_dev + COMMENT: While unsupported, struct comparison should fail gracefully instead + COMMENT: of crashing Frama-C (issue frama-c/e-acsl#139). + */ +struct X { + int i ; +}; + +/*@ ensures *\old(item) == \old(*item); */ +void f(struct X *item){ +} + +int main() { + struct X x = {.i = 1}; + f(&x); + return 0; +} diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-139.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-139.c new file mode 100644 index 00000000000..4340159108f --- /dev/null +++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-139.c @@ -0,0 +1,56 @@ +/* Generated by Frama-C */ +#include "stddef.h" +#include "stdio.h" +extern int __e_acsl_sound_verdict; + +struct X { + int i ; +}; +/*@ ensures *\old(item) ≡ \old(*item); */ +void __gen_e_acsl_f(struct X *item); + +void f(struct X *item) +{ + __e_acsl_store_block((void *)(& item),(size_t)8); + __e_acsl_delete_block((void *)(& item)); + return; +} + +int main(void) +{ + int __retres; + __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); + struct X x = {.i = 1}; + __e_acsl_store_block((void *)(& x),(size_t)4); + __e_acsl_full_init((void *)(& x)); + __gen_e_acsl_f(& x); + __retres = 0; + __e_acsl_delete_block((void *)(& x)); + __e_acsl_memory_clean(); + return __retres; +} + +/*@ ensures *\old(item) ≡ \old(*item); */ +void __gen_e_acsl_f(struct X *item) +{ + struct X __gen_e_acsl_at_2; + struct X *__gen_e_acsl_at; + __e_acsl_store_block((void *)(& item),(size_t)8); + { + int __gen_e_acsl_valid_read; + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)item, + sizeof(struct X), + (void *)item, + (void *)(& item)); + __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","f", + "mem_access: \\valid_read(item)", + "tests/bts/issue-eacsl-139.c",9); + __gen_e_acsl_at_2 = *item; + } + __gen_e_acsl_at = item; + f(item); + __e_acsl_delete_block((void *)(& item)); + return; +} + + diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/issue-eacsl-139.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/issue-eacsl-139.res.oracle new file mode 100644 index 00000000000..ac3528903af --- /dev/null +++ b/src/plugins/e-acsl/tests/bts/oracle_ci/issue-eacsl-139.res.oracle @@ -0,0 +1,8 @@ +[e-acsl] beginning translation. +[e-acsl] tests/bts/issue-eacsl-139.c:9: Warning: + E-ACSL construct `comparison between two structs or unions' + is not yet supported. + Ignoring annotation. +[e-acsl] translation done in project "e-acsl". +[eva:alarm] tests/bts/issue-eacsl-139.c:9: Warning: + function __gen_e_acsl_f: postcondition got status unknown. diff --git a/src/plugins/e-acsl/tests/bts/oracle_dev/issue-eacsl-139.e-acsl.err.log b/src/plugins/e-acsl/tests/bts/oracle_dev/issue-eacsl-139.e-acsl.err.log new file mode 100644 index 00000000000..e69de29bb2d -- GitLab