From 0217e3d94b4c472f30baa64262a3991d5cb6a36a Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Fri, 27 Mar 2020 09:56:10 +0100
Subject: [PATCH] [Instantiate] Fixes Memset for all bits to one

---
 src/plugins/instantiate/string/memset.ml      | 13 +++++++----
 .../tests/string/oracle/memset_FF.res.oracle  | 23 +++++++++----------
 2 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/src/plugins/instantiate/string/memset.ml b/src/plugins/instantiate/string/memset.ml
index f681aa0ef13..b62c37aa2ca 100644
--- a/src/plugins/instantiate/string/memset.ml
+++ b/src/plugins/instantiate/string/memset.ml
@@ -89,15 +89,18 @@ let pset_len_bytes_all_bits_to_one ?loc ptr bytes_len =
       papp ?loc ((find_nan_for_type t.term_type), [], [t])
     | Ctype(TPtr(_)) ->
       pnot ?loc (pvalid_read ?loc (here_label, t))
-    | Ctype(TInt(kind, _)) | Ctype(TEnum({ ekind = kind }, _)) ->
+    | Ctype((TInt(kind, _) | TEnum({ ekind = kind }, _)) as typ) ->
       let is_signed = Cil.isSigned kind in
       let bits = Cil.bitsSizeOfInt kind in
-      let value = if is_signed then
-          Cil.min_signed_number bits
+      let value =
+        if is_signed then
+          let zero = tinteger ?loc 0 in
+          let zero = Logic_utils.mk_cast ?loc typ zero in
+          term (TUnOp(BNot, zero)) t.term_type
         else
-          Cil.max_unsigned_number bits
+          let value = Cil.max_unsigned_number bits in
+          term ?loc (TConst (Integer (value,None))) Linteger
       in
-      let value = term ?loc (TConst (Integer (value,None))) Linteger in
       prel ?loc (Req, t, value)
     | _ ->
       unexpected "non atomic type during equality generation"
diff --git a/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle b/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle
index 7495743e8a2..0054f340577 100644
--- a/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle
+++ b/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle
@@ -97,7 +97,7 @@ void nested_chars(char (* /*[10]*/ dest)[10])
     ensures
       set_content:
         \let __fc_len = len / 4;
-        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ -2147483648;
+        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ ~((int)0);
     ensures result: \result ≡ ptr;
     assigns *(ptr + (0 .. len / 4 - 1)), \result;
     assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
@@ -176,7 +176,7 @@ void unsigned_integer(unsigned int * /*[10]*/ dest)
     ensures
       set_content:
         \let __fc_len = len / 4;
-        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ -2147483648;
+        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ ~((long)0);
     ensures result: \result ≡ ptr;
     assigns *(ptr + (0 .. len / 4 - 1)), \result;
     assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
@@ -229,8 +229,7 @@ void unsigned_long_integer(unsigned long * /*[10]*/ dest)
     ensures
       set_content:
         \let __fc_len = len / 8;
-        ∀ ℤ j0;
-          0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ -9223372036854775808;
+        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ ~((long long)0);
     ensures result: \result ≡ ptr;
     assigns *(ptr + (0 .. len / 8 - 1)), \result;
     assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
@@ -320,7 +319,7 @@ void with_named(named * /*[10]*/ dest)
         \let __fc_len = len / 8;
         ∀ ℤ j0;
           0 ≤ j0 < __fc_len ⇒
-          (ptr + j0)->x ≡ -2147483648 ∧ (ptr + j0)->y ≡ -2147483648;
+          (ptr + j0)->x ≡ ~((int)0) ∧ (ptr + j0)->y ≡ ~((int)0);
     ensures result: \result ≡ ptr;
     assigns *(ptr + (0 .. len / 8 - 1)), \result;
     assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
@@ -374,7 +373,7 @@ void pointers(int ** /*[10]*/ dest)
         \let __fc_len = len / 40;
         ∀ ℤ j0;
           0 ≤ j0 < __fc_len ⇒
-          (∀ ℤ j1; 0 ≤ j1 < 10 ⇒ (*(ptr + j0))[j1] ≡ -2147483648);
+          (∀ ℤ j1; 0 ≤ j1 < 10 ⇒ (*(ptr + j0))[j1] ≡ ~((int)0));
     ensures result: \result ≡ ptr;
     assigns (*(ptr + (0 .. len / 40 - 1)))[0 .. 10 - 1], \result;
     assigns (*(ptr + (0 .. len / 40 - 1)))[0 .. 10 - 1] \from \nothing;
@@ -505,7 +504,7 @@ void nested_chars(char (*dest)[10])
     ensures
       set_content:
         \let __fc_len = \old(len) / 4;
-        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ -2147483648;
+        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ ~((int)0);
     ensures result: \result ≡ \old(ptr);
     assigns *(ptr + (0 .. len / 4 - 1)), \result;
     assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
@@ -584,7 +583,7 @@ void unsigned_integer(unsigned int *dest)
     ensures
       set_content:
         \let __fc_len = \old(len) / 4;
-        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ -2147483648;
+        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ ~((long)0);
     ensures result: \result ≡ \old(ptr);
     assigns *(ptr + (0 .. len / 4 - 1)), \result;
     assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
@@ -638,7 +637,7 @@ void unsigned_long_integer(unsigned long *dest)
       set_content:
         \let __fc_len = \old(len) / 8;
         ∀ ℤ j0;
-          0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ -9223372036854775808;
+          0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ ~((long long)0);
     ensures result: \result ≡ \old(ptr);
     assigns *(ptr + (0 .. len / 8 - 1)), \result;
     assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
@@ -728,8 +727,8 @@ void with_named(named *dest)
         \let __fc_len = \old(len) / 8;
         ∀ ℤ j0;
           0 ≤ j0 < __fc_len ⇒
-          (\old(ptr) + j0)->x ≡ -2147483648 ∧
-          (\old(ptr) + j0)->y ≡ -2147483648;
+          (\old(ptr) + j0)->x ≡ ~((int)0) ∧
+          (\old(ptr) + j0)->y ≡ ~((int)0);
     ensures result: \result ≡ \old(ptr);
     assigns *(ptr + (0 .. len / 8 - 1)), \result;
     assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
@@ -784,7 +783,7 @@ void pointers(int **dest)
         ∀ ℤ j0;
           0 ≤ j0 < __fc_len ⇒
           (∀ ℤ j1;
-             0 ≤ j1 < 10 ⇒ (*(\old(ptr) + j0))[j1] ≡ -2147483648);
+             0 ≤ j1 < 10 ⇒ (*(\old(ptr) + j0))[j1] ≡ ~((int)0));
     ensures result: \result ≡ \old(ptr);
     assigns (*(ptr + (0 .. len / 40 - 1)))[0 .. 10 - 1], \result;
     assigns (*(ptr + (0 .. len / 40 - 1)))[0 .. 10 - 1] \from \nothing;
-- 
GitLab