From f160c5e6adb86678aa4fdb7c338af0eeded624bb Mon Sep 17 00:00:00 2001
From: Julien Signoles <julien.signoles@cea.fr>
Date: Mon, 23 May 2016 18:17:57 +0200
Subject: [PATCH] [tests] add test case for BTS #2191 which is solved by the
 new type system

---
 src/plugins/e-acsl/doc/Changelog              |  4 ++
 src/plugins/e-acsl/tests/bts/bts2191.c        | 20 +++++++
 .../tests/bts/oracle/bts2191.err.oracle       |  0
 .../tests/bts/oracle/bts2191.res.oracle       |  3 +
 .../e-acsl/tests/bts/oracle/gen_bts2191.c     | 55 +++++++++++++++++++
 5 files changed, 82 insertions(+)
 create mode 100644 src/plugins/e-acsl/tests/bts/bts2191.c
 create mode 100644 src/plugins/e-acsl/tests/bts/oracle/bts2191.err.oracle
 create mode 100644 src/plugins/e-acsl/tests/bts/oracle/bts2191.res.oracle
 create mode 100644 src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c

diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog
index 8412b2c5074..b7ee31318d8 100644
--- a/src/plugins/e-acsl/doc/Changelog
+++ b/src/plugins/e-acsl/doc/Changelog
@@ -15,6 +15,10 @@
 #   E-ACSL: the Whole E-ACSL plug-in
 ###############################################################################
 
+-  E-ACSL       [2016/05/23] Re-implementation of the type system which
+	        improves the efficiency of the generated code over integers.
+-* E-ACSL       [2016/05/23] Fix bug #2191 about complicate structs and
+	        literate string.
 -* E-ACSL       [2016/05/23] Fix bug #1395 about recursive functions.
 -* E-ACSL       [2016/04/07] Fix 'make install' when executed within Frama-C.
 -* E-ACSL       [2016/03/31] Improve performance of Patricia Trie memory model.
diff --git a/src/plugins/e-acsl/tests/bts/bts2191.c b/src/plugins/e-acsl/tests/bts/bts2191.c
new file mode 100644
index 00000000000..0291959acba
--- /dev/null
+++ b/src/plugins/e-acsl/tests/bts/bts2191.c
@@ -0,0 +1,20 @@
+struct ST {
+    char *str;
+    int num;
+};
+
+struct ST _G[] = {
+    {
+        .str = "Struct_G[0]",
+        .num = 99
+    },
+    {
+        .str = "Struct_G[1]",
+        .num = 147
+    }
+};
+
+int main(int argc, char **argv) {
+    /*@ assert \valid_read(_G[0].str); */
+    return 0;
+}
diff --git a/src/plugins/e-acsl/tests/bts/oracle/bts2191.err.oracle b/src/plugins/e-acsl/tests/bts/oracle/bts2191.err.oracle
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/plugins/e-acsl/tests/bts/oracle/bts2191.res.oracle b/src/plugins/e-acsl/tests/bts/oracle/bts2191.res.oracle
new file mode 100644
index 00000000000..2aefad1798b
--- /dev/null
+++ b/src/plugins/e-acsl/tests/bts/oracle/bts2191.res.oracle
@@ -0,0 +1,3 @@
+[e-acsl] beginning translation.
+[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.
diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c
new file mode 100644
index 00000000000..c274fbfcf2b
--- /dev/null
+++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c
@@ -0,0 +1,55 @@
+/* Generated by Frama-C */
+char *__gen_e_acsl_literal_string;
+char *__gen_e_acsl_literal_string_2;
+struct ST {
+   char *str ;
+   int num ;
+};
+struct ST _G[2] =
+  {{.str = (char *)"Struct_G[0]", .num = 99},
+   {.str = (char *)"Struct_G[1]", .num = 147}};
+void __e_acsl_globals_init(void)
+{
+  __gen_e_acsl_literal_string = "Struct_G[1]";
+  __e_acsl_store_block((void *)__gen_e_acsl_literal_string,
+                       sizeof("Struct_G[1]"));
+  __e_acsl_full_init((void *)__gen_e_acsl_literal_string);
+  __e_acsl_readonly((void *)__gen_e_acsl_literal_string);
+  __gen_e_acsl_literal_string_2 = "Struct_G[0]";
+  __e_acsl_store_block((void *)__gen_e_acsl_literal_string_2,
+                       sizeof("Struct_G[0]"));
+  __e_acsl_full_init((void *)__gen_e_acsl_literal_string_2);
+  __e_acsl_readonly((void *)__gen_e_acsl_literal_string_2);
+  __e_acsl_store_block((void *)(_G),32UL);
+  __e_acsl_full_init((void *)(& _G));
+  return;
+}
+
+int main(int argc, char **argv)
+{
+  int __retres;
+  __e_acsl_memory_init(& argc,& argv,8UL);
+  __e_acsl_globals_init();
+  /*@ assert \valid_read(_G[0].str); */
+  {
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& _G[0].str),
+                                                    sizeof(char *));
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid_read;
+      __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)_G[0].str,
+                                                    sizeof(char));
+      __gen_e_acsl_and = __gen_e_acsl_valid_read;
+    }
+    else __gen_e_acsl_and = 0;
+    __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion",(char *)"main",
+                    (char *)"\\valid_read(_G[0].str)",18);
+  }
+  __retres = 0;
+  __e_acsl_delete_block((void *)(_G));
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
-- 
GitLab