From 86acae470f39a77eef1d91598e40a8ef8ab9ad32 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Fri, 27 Sep 2019 11:07:07 +0200
Subject: [PATCH] [Override Std] Some tests for the generated contracts

---
 src/plugins/override_std/Makefile.in          |  2 +-
 .../override_std/tests/functions/memcmp.c     |  8 ++
 .../override_std/tests/functions/memcpy.c     |  8 ++
 .../override_std/tests/functions/memmove.c    |  8 ++
 .../tests/functions/oracle/memcmp.res.oracle  | 74 ++++++++++++++++++
 .../tests/functions/oracle/memcpy.res.oracle  | 76 +++++++++++++++++++
 .../tests/functions/oracle/memmove.res.oracle | 68 +++++++++++++++++
 src/plugins/override_std/tests/test_config    |  1 +
 8 files changed, 244 insertions(+), 1 deletion(-)
 create mode 100644 src/plugins/override_std/tests/functions/memcmp.c
 create mode 100644 src/plugins/override_std/tests/functions/memcpy.c
 create mode 100644 src/plugins/override_std/tests/functions/memmove.c
 create mode 100644 src/plugins/override_std/tests/functions/oracle/memcmp.res.oracle
 create mode 100644 src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle
 create mode 100644 src/plugins/override_std/tests/functions/oracle/memmove.res.oracle
 create mode 100644 src/plugins/override_std/tests/test_config

diff --git a/src/plugins/override_std/Makefile.in b/src/plugins/override_std/Makefile.in
index 9d9ab06f2db..65767093708 100644
--- a/src/plugins/override_std/Makefile.in
+++ b/src/plugins/override_std/Makefile.in
@@ -41,7 +41,7 @@ PLUGIN_CMO := options transform override_table basic_blocks memcpy memcmp memmov
 PLUGIN_DISTRIBUTED := $(PLUGIN_ENABLE)
 PLUGIN_DISTRIB_EXTERNAL:= Makefile.in configure.ac configure
 #PLUGIN_NO_DEFAULT_TEST := no
-PLUGIN_TESTS_DIRS := 
+PLUGIN_TESTS_DIRS := functions
 
 ################
 # Generic part #
diff --git a/src/plugins/override_std/tests/functions/memcmp.c b/src/plugins/override_std/tests/functions/memcmp.c
new file mode 100644
index 00000000000..1da39df89a5
--- /dev/null
+++ b/src/plugins/override_std/tests/functions/memcmp.c
@@ -0,0 +1,8 @@
+#include <string.h>
+
+int main(void){
+  int s1[10] = { 0 } ;
+  int s2[10] = { 0 };
+
+  int res = memcmp(s1, s2, sizeof(s1));
+}
\ No newline at end of file
diff --git a/src/plugins/override_std/tests/functions/memcpy.c b/src/plugins/override_std/tests/functions/memcpy.c
new file mode 100644
index 00000000000..7dda713ac6d
--- /dev/null
+++ b/src/plugins/override_std/tests/functions/memcpy.c
@@ -0,0 +1,8 @@
+#include <string.h>
+
+int main(void){
+  int src[10] = { 0 } ;
+  int dest[10] ;
+
+  int *p = memcpy(dest, src, sizeof(src));
+}
\ No newline at end of file
diff --git a/src/plugins/override_std/tests/functions/memmove.c b/src/plugins/override_std/tests/functions/memmove.c
new file mode 100644
index 00000000000..33338d2d312
--- /dev/null
+++ b/src/plugins/override_std/tests/functions/memmove.c
@@ -0,0 +1,8 @@
+#include <string.h>
+
+int main(void){
+  int src[10] = { 0 } ;
+  int dest[10] ;
+
+  int *p = memmove(dest, src, sizeof(src));
+}
\ No newline at end of file
diff --git a/src/plugins/override_std/tests/functions/oracle/memcmp.res.oracle b/src/plugins/override_std/tests/functions/oracle/memcmp.res.oracle
new file mode 100644
index 00000000000..7ece1fdb389
--- /dev/null
+++ b/src/plugins/override_std/tests/functions/oracle/memcmp.res.oracle
@@ -0,0 +1,74 @@
+[kernel] Parsing tests/functions/memcmp.c (with preprocessing)
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "string.h"
+#include "strings.h"
+/*@ requires aligned_end: len % 4 ≡ 0;
+    requires
+      valid_read_s1:
+        \let __fc_len = len / 4; \valid_read(s1 + (0 .. __fc_len - 1));
+    requires
+      valid_read_s2:
+        \let __fc_len = len / 4; \valid_read(s2 + (0 .. __fc_len - 1));
+    ensures
+      equals:
+        \let __fc_len = len / 4;
+          \result ≡ 0 ⇔
+          (∀ ℤ j; 0 ≤ j < __fc_len ⇒ *(s1 + j) ≡ *(s2 + j));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. len - 1))),
+            (indirect: *(s2 + (0 .. len - 1)));
+ */
+int memcmp_int(int const *s1, int const *s2, size_t len);
+
+int main(void)
+{
+  int __retres;
+  int s1[10] = {0};
+  int s2[10] = {0};
+  int res = memcmp_int(s1,s2,sizeof(s1));
+  __retres = 0;
+  return __retres;
+}
+
+
+[kernel] Parsing tests/functions/result/memcmp.c (with preprocessing)
+[kernel] Parsing tests/functions/memcmp.c (with preprocessing)
+[kernel] tests/functions/memcmp.c:3: Warning: 
+  def'n of func main at tests/functions/memcmp.c:3 (sum 2855) conflicts with the one at tests/functions/result/memcmp.c:24 (sum 4629); keeping the one at tests/functions/result/memcmp.c:24.
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "string.h"
+#include "strings.h"
+/*@ requires aligned_end: len % 4 ≡ 0;
+    requires
+      valid_read_s1:
+        \let __fc_len = len / 4; \valid_read(s1 + (0 .. __fc_len - 1));
+    requires
+      valid_read_s2:
+        \let __fc_len = len / 4; \valid_read(s2 + (0 .. __fc_len - 1));
+    ensures
+      equals:
+        \let __fc_len = \old(len) / 4;
+          \result ≡ 0 ⇔
+          (∀ ℤ j;
+             0 ≤ j < __fc_len ⇒ *(\old(s1) + j) ≡ *(\old(s2) + j));
+    assigns \result;
+    assigns \result
+      \from (indirect: *(s1 + (0 .. len - 1))),
+            (indirect: *(s2 + (0 .. len - 1)));
+ */
+int memcmp_int(int const *s1, int const *s2, size_t len);
+
+int main(void)
+{
+  int __retres;
+  int s1[10] = {0};
+  int s2[10] = {0};
+  int res = memcmp_int((int const *)(s1),(int const *)(s2),sizeof(s1));
+  __retres = 0;
+  return __retres;
+}
+
+
diff --git a/src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle b/src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle
new file mode 100644
index 00000000000..974fd3a31a2
--- /dev/null
+++ b/src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle
@@ -0,0 +1,76 @@
+[kernel] Parsing tests/functions/memcpy.c (with preprocessing)
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "string.h"
+#include "strings.h"
+/*@ requires aligned_end: len % 4 ≡ 0;
+    requires
+      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+    requires
+      valid_read_src:
+        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+    requires
+      separation:
+        \let __fc_len = len / 4;
+          \separated(dest + (0 .. __fc_len - 1), src + (0 .. __fc_len - 1));
+    ensures
+      copied:
+        \let __fc_len = len / 4;
+        ∀ ℤ j; 0 ≤ j < __fc_len ⇒ *(dest + j) ≡ *(src + j);
+    assigns *(dest + (0 .. len - 1)), \result;
+    assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1));
+    assigns \result \from dest;
+ */
+int *memcpy_int(int *dest, int const *src, size_t len);
+
+int main(void)
+{
+  int __retres;
+  int dest[10];
+  int src[10] = {0};
+  int *p = memcpy_int(dest,src,sizeof(src));
+  __retres = 0;
+  return __retres;
+}
+
+
+[kernel] Parsing tests/functions/result/memcpy.c (with preprocessing)
+[kernel] Parsing tests/functions/memcpy.c (with preprocessing)
+[kernel] tests/functions/memcpy.c:3: Warning: 
+  def'n of func main at tests/functions/memcpy.c:3 (sum 1968) conflicts with the one at tests/functions/result/memcpy.c:25 (sum 3742); keeping the one at tests/functions/result/memcpy.c:25.
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "string.h"
+#include "strings.h"
+/*@ requires aligned_end: len % 4 ≡ 0;
+    requires
+      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+    requires
+      valid_read_src:
+        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+    requires
+      separation:
+        \let __fc_len = len / 4;
+          \separated(dest + (0 .. __fc_len - 1), src + (0 .. __fc_len - 1));
+    ensures
+      copied:
+        \let __fc_len = \old(len) / 4;
+        ∀ ℤ j;
+          0 ≤ j < __fc_len ⇒ *(\old(dest) + j) ≡ *(\old(src) + j);
+    assigns *(dest + (0 .. len - 1)), \result;
+    assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1));
+    assigns \result \from dest;
+ */
+int *memcpy_int(int *dest, int const *src, size_t len);
+
+int main(void)
+{
+  int __retres;
+  int dest[10];
+  int src[10] = {0};
+  int *p = memcpy_int(dest,(int const *)(src),sizeof(src));
+  __retres = 0;
+  return __retres;
+}
+
+
diff --git a/src/plugins/override_std/tests/functions/oracle/memmove.res.oracle b/src/plugins/override_std/tests/functions/oracle/memmove.res.oracle
new file mode 100644
index 00000000000..d922f913cad
--- /dev/null
+++ b/src/plugins/override_std/tests/functions/oracle/memmove.res.oracle
@@ -0,0 +1,68 @@
+[kernel] Parsing tests/functions/memmove.c (with preprocessing)
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "string.h"
+#include "strings.h"
+/*@ requires aligned_end: len % 4 ≡ 0;
+    requires
+      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+    requires
+      valid_read_src:
+        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+    ensures
+      moved:
+        \let __fc_len = len / 4;
+        ∀ ℤ j; 0 ≤ j < __fc_len ⇒ *(dest + j) ≡ \at(*(src + j),Pre);
+    assigns *(dest + (0 .. len - 1)), \result;
+    assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1));
+    assigns \result \from dest;
+ */
+int *memmove_int(int *dest, int const *src, size_t len);
+
+int main(void)
+{
+  int __retres;
+  int dest[10];
+  int src[10] = {0};
+  int *p = memmove_int(dest,src,sizeof(src));
+  __retres = 0;
+  return __retres;
+}
+
+
+[kernel] Parsing tests/functions/result/memmove.c (with preprocessing)
+[kernel] Parsing tests/functions/memmove.c (with preprocessing)
+[kernel] tests/functions/memmove.c:3: Warning: 
+  def'n of func main at tests/functions/memmove.c:3 (sum 1968) conflicts with the one at tests/functions/result/memmove.c:21 (sum 3742); keeping the one at tests/functions/result/memmove.c:21.
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "string.h"
+#include "strings.h"
+/*@ requires aligned_end: len % 4 ≡ 0;
+    requires
+      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+    requires
+      valid_read_src:
+        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+    ensures
+      moved:
+        \let __fc_len = \old(len) / 4;
+        ∀ ℤ j;
+          0 ≤ j < __fc_len ⇒ *(\old(dest) + j) ≡ \at(*(src + j),Pre);
+    assigns *(dest + (0 .. len - 1)), \result;
+    assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1));
+    assigns \result \from dest;
+ */
+int *memmove_int(int *dest, int const *src, size_t len);
+
+int main(void)
+{
+  int __retres;
+  int dest[10];
+  int src[10] = {0};
+  int *p = memmove_int(dest,(int const *)(src),sizeof(src));
+  __retres = 0;
+  return __retres;
+}
+
+
diff --git a/src/plugins/override_std/tests/test_config b/src/plugins/override_std/tests/test_config
new file mode 100644
index 00000000000..ac3b92b43ff
--- /dev/null
+++ b/src/plugins/override_std/tests/test_config
@@ -0,0 +1 @@
+OPT: @PTEST_FILE@ -override-std -print -check -then -ocode @PTEST_DIR@/result/@PTEST_NAME@.c -print -then @PTEST_DIR@/result/@PTEST_NAME@.c @PTEST_FILE@ -ocode="" -print
\ No newline at end of file
-- 
GitLab