From 237a95f6fbb6ca635d81895d40b4effc45885fb4 Mon Sep 17 00:00:00 2001
From: Basile Desloges <basile.desloges@cea.fr>
Date: Mon, 7 Jun 2021 18:21:23 +0200
Subject: [PATCH] [eacsl] Update memory model in E-ACSL built-ins

---
 .../e-acsl/libc_replacements/e_acsl_stdio.c   | 13 ++++++--
 .../e-acsl/libc_replacements/e_acsl_string.c  | 31 ++++++++++++++-----
 2 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.c b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.c
index ea0945d67dc..e8ed1afa825 100644
--- a/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.c
+++ b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_stdio.c
@@ -31,6 +31,7 @@
 #include "../internals/e_acsl_private_assert.h"
 #include "../internals/e_acsl_rtl_io.h"
 #include "../internals/e_acsl_rtl_string.h"
+#include "../observation_model/e_acsl_observation_model.h"
 #include "e_acsl_string.h"
 
 #include "e_acsl_stdio.h"
@@ -942,7 +943,11 @@ int eacsl_builtin_sprintf(const char *fmtdesc, char *buffer, const char *fmt, ..
   va_start(ap, fmt);
   validate_format(fmtdesc, fmt, ap, "sprintf", buffer, len + 1);
   va_start(ap, fmt);
-  return vsprintf(buffer, fmt, ap);
+  int res = vsprintf(buffer, fmt, ap);
+  if (res >= 0) {
+    eacsl_initialize(buffer, res + 1);
+  }
+  return res;
 }
 
 int eacsl_builtin_snprintf(const char *fmtdesc, char *buffer, size_t size,
@@ -956,7 +961,11 @@ int eacsl_builtin_snprintf(const char *fmtdesc, char *buffer, size_t size,
     private_abort("sprintf: output buffer is unallocated or has insufficient length "
       "to store %d characters and \\0 terminator or not writeable\n", size);
   va_start(ap, fmt);
-  return vsnprintf(buffer, size, fmt, ap);
+  int res = vsnprintf(buffer, size, fmt, ap);
+  if (res >= 0 && size > 0) {
+    eacsl_initialize(buffer, size <= res ? size : res + 1);
+  }
+  return res;
 }
 
 int eacsl_builtin_syslog(const char *fmtdesc, int priority, const char *fmt, ...) {
diff --git a/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.c b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.c
index 4ab59ec78ea..38a77111837 100644
--- a/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.c
+++ b/src/plugins/e-acsl/share/e-acsl/libc_replacements/e_acsl_string.c
@@ -160,7 +160,9 @@ char *eacsl_builtin_strcpy(char *dest, const char *src) {
   /* source and destination strings should not overlap */
   validate_overlapping_spaces
     ((uintptr_t)dest, size + 1, (uintptr_t)src, size + 1, "strcpy");
-  return strcpy(dest, src);
+  char * res = strcpy(dest, src);
+  eacsl_initialize(dest, size + 1);
+  return res;
 }
 
 char *eacsl_builtin_strncpy(char *dest, const char *src, size_t n) {
@@ -170,7 +172,9 @@ char *eacsl_builtin_strncpy(char *dest, const char *src, size_t n) {
   validate_writeable_space(dest, n, "strncpy", "destination string ");
   /* source and destination strings should not overlap */
   validate_overlapping_spaces((uintptr_t)dest, n, (uintptr_t)src, n, "strncpy");
-  return strncpy(dest, src, n);
+  char * res = strncpy(dest, src, n);
+  eacsl_initialize(dest, n);
+  return res;
 }
 
 int eacsl_builtin_strcmp(const char *s1, const char *s2) {
@@ -200,11 +204,14 @@ char *eacsl_builtin_strcat(char *dest, const char *src) {
   }
   validate_overlapping_spaces
     ((uintptr_t)src, src_sz + 1, (uintptr_t)dest, dest_sz + 1, "strcat");
-  return strcat(dest, src);
+  char * res = strcat(dest, src);
+  eacsl_initialize(&dest[dest_sz], src_sz + 1);
+  return res;
 }
 
 char *eacsl_builtin_strncat(char *dest, const char *src, size_t n) {
-  validate_allocated_string((char*)src, n, "strncat", "source string ");
+  long src_sz =
+    validate_allocated_string((char*)src, n, "strncat", "source string ");
   long dest_sz =
     validate_writeable_string((char*)dest, -1, "strcat", "destination string ");
   size_t avail_sz = eacsl_block_length(dest) - eacsl_offset(dest);
@@ -215,7 +222,9 @@ char *eacsl_builtin_strncat(char *dest, const char *src, size_t n) {
   }
   validate_overlapping_spaces
     ((uintptr_t)src, n, (uintptr_t)dest, dest_sz, "strcat");
-  return strncat(dest, src, n);
+  char * res = strncat(dest, src, n);
+  eacsl_initialize(&dest[dest_sz], src_sz + 1);
+  return res;
 }
 /* }}} */
 
@@ -227,12 +236,16 @@ void *eacsl_builtin_memcpy(void *dest, const void *src, size_t n) {
   validate_allocated_space((void*)src, n, "memcpy", "source space ");
   validate_writeable_space((void*)dest, n, "memcpy", "destination space ");
   validate_overlapping_spaces((uintptr_t)src, n, (uintptr_t)dest, n, "memcpy");
-  return memcpy(dest, src, n);
+  void * res = memcpy(dest, src, n);
+  eacsl_initialize(dest, n);
+  return res;
 }
 
 void *eacsl_builtin_memset(void *s, int c, size_t n) {
   validate_writeable_space((void*)s, n, "memset", "space ");
-  return memset(s, c, n);
+  void * res = memset(s, c, n);
+  eacsl_initialize(s, n);
+  return res;
 }
 
 int eacsl_builtin_memcmp(const void *s1, const void *s2, size_t n) {
@@ -245,7 +258,9 @@ int eacsl_builtin_memcmp(const void *s1, const void *s2, size_t n) {
 void *eacsl_builtin_memmove(void *dest, const void *src, size_t n) {
   validate_allocated_space((void*)src, n, "memcmp", "source space ");
   validate_writeable_space((void*)dest, n, "memcmp", "destination space ");
-  return memmove(dest, src, n);
+  void * res = memmove(dest, src, n);
+  eacsl_initialize(dest, n);
+  return res;
 }
 
 /* }}} */
-- 
GitLab