From e7e1e2ed84c33e58103fcc0fc977b3e97adb8a58 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Wed, 18 Sep 2024 10:46:22 +0200
Subject: [PATCH] [wp] plug the MemBytes model

---
 src/plugins/wp/Factory.ml      | 19 ++++++++++++++++++-
 src/plugins/wp/Factory.mli     |  2 +-
 src/plugins/wp/gui/GuiPanel.ml |  6 +++++-
 src/plugins/wp/wp.ml           |  1 +
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/src/plugins/wp/Factory.ml b/src/plugins/wp/Factory.ml
index 488ce673bc4..f173e8b2e0b 100644
--- a/src/plugins/wp/Factory.ml
+++ b/src/plugins/wp/Factory.ml
@@ -24,7 +24,7 @@
 (* --- Model Factory                                                      --- *)
 (* -------------------------------------------------------------------------- *)
 
-type mheap = Hoare | ZeroAlias | Typed of MemTyped.pointer | Eva
+type mheap = Hoare | ZeroAlias | Typed of MemTyped.pointer | Eva | Bytes
 type mvar = Raw | Var | Ref | Caveat
 
 type setup = {
@@ -68,6 +68,7 @@ let descr_mheap d = function
   | Hoare -> main d "hoare"
   | Typed p -> main d "typed" ; descr_mtyped d p
   | Eva -> main d "eva"
+  | Bytes -> main d "bytes"
 
 let descr_mvar d = function
   | Var -> ()
@@ -205,6 +206,8 @@ module Model_Hoare_Raw = Register(MemVar.Raw)(MemEmpty)
 module Model_Hoare_Ref = Register(Ref)(MemEmpty)
 module Model_Typed_Var = Register(Var)(MemTyped)
 module Model_Typed_Ref = Register(Ref)(MemTyped)
+module Model_Bytes_Var = Register(Var)(MemBytes)
+module Model_Bytes_Ref = Register(Ref)(MemBytes)
 module Model_Caveat = Register(Caveat)(MemTyped)
 
 module MemVal = MemVal.Make(MemVal.Eva)
@@ -218,12 +221,20 @@ struct
 end
 
 module Comp_MemZeroAlias = MakeCompiler(MemZeroAlias)
+
 module Comp_Hoare_Raw = MakeCompiler(Model_Hoare_Raw)
 module Comp_Hoare_Ref = MakeCompiler(Model_Hoare_Ref)
+
 module Comp_MemTyped = MakeCompiler(MemTyped)
 module Comp_Typed_Var = MakeCompiler(Model_Typed_Var)
 module Comp_Typed_Ref = MakeCompiler(Model_Typed_Ref)
+
 module Comp_Caveat = MakeCompiler(Model_Caveat)
+
+module Comp_MemBytes = MakeCompiler(MemBytes)
+module Comp_Bytes_Var = MakeCompiler(Model_Bytes_Var)
+module Comp_Bytes_Ref = MakeCompiler(Model_Bytes_Ref)
+
 module Comp_MemVal = MakeCompiler(MemVal)
 
 
@@ -237,6 +248,10 @@ let compiler mheap mvar : (module Sigs.Compiler) =
   | Typed _ , Var     -> (module Comp_Typed_Var)
   | Typed _ , Ref     -> (module Comp_Typed_Ref)
   | Eva, _            -> (module Comp_MemVal)
+  | Bytes, Raw        -> (module Comp_MemBytes)
+  | Bytes, Var        -> (module Comp_Bytes_Var)
+  | Bytes, Ref        -> (module Comp_Bytes_Ref)
+
 
 (* -------------------------------------------------------------------------- *)
 (* --- Tuning                                                             --- *)
@@ -246,6 +261,7 @@ let configure_mheap = function
   | Hoare -> MemEmpty.configure ()
   | ZeroAlias -> MemZeroAlias.configure ()
   | Eva -> MemVal.configure ()
+  | Bytes -> MemBytes.configure ()
   | Typed p ->
     let rollback_memtyped = MemTyped.configure () in
     let orig_memtyped_pointer = Context.push MemTyped.pointer p in
@@ -330,6 +346,7 @@ let update_config ~warning m s = function
   | "CAST" -> { s with mheap = Typed MemTyped.Unsafe }
   | "NOCAST" -> { s with mheap = Typed MemTyped.NoCast }
   | "EVA" -> { s with mheap = Eva }
+  | "BYTES" -> { s with mheap = Bytes }
   | "CAVEAT" -> { s with mvar = Caveat }
   | "RAW" -> { s with mvar = Raw }
   | "REF" -> { s with mvar = Ref }
diff --git a/src/plugins/wp/Factory.mli b/src/plugins/wp/Factory.mli
index dc9e29707e3..1b9ac3843c2 100644
--- a/src/plugins/wp/Factory.mli
+++ b/src/plugins/wp/Factory.mli
@@ -24,7 +24,7 @@
 (* --- Model Factory                                                      --- *)
 (* -------------------------------------------------------------------------- *)
 
-type mheap = Hoare | ZeroAlias | Typed of MemTyped.pointer | Eva
+type mheap = Hoare | ZeroAlias | Typed of MemTyped.pointer | Eva | Bytes
 type mvar = Raw | Var | Ref | Caveat
 
 type setup = {
diff --git a/src/plugins/wp/gui/GuiPanel.ml b/src/plugins/wp/gui/GuiPanel.ml
index 8292028a5c6..fb7171d4252 100644
--- a/src/plugins/wp/gui/GuiPanel.ml
+++ b/src/plugins/wp/gui/GuiPanel.ml
@@ -99,7 +99,7 @@ let run_and_prove
 (* ---  Model Panel                                                     --- *)
 (* ------------------------------------------------------------------------ *)
 
-type memory = TREE | HOARE | TYPED | EVA
+type memory = TREE | HOARE | TYPED | EVA | BYTES
 
 class model_selector (main : Design.main_window_extension_points) =
   let dialog = new Wpane.dialog
@@ -107,6 +107,7 @@ class model_selector (main : Design.main_window_extension_points) =
   let memory = new Widget.group HOARE in
   let r_hoare  = memory#add_radio ~label:"Hoare Memory Model" ~value:HOARE () in
   let r_typed  = memory#add_radio ~label:"Typed Memory Model" ~value:TYPED () in
+  let r_bytes  = memory#add_radio ~label:"Bytes Memory Model" ~value:BYTES () in
   let r_eva    = memory#add_radio ~label:"Eva Memory Model" ~value:EVA () in
   let c_casts  = new Widget.checkbox ~label:"Unsafe casts" () in
   let c_byref  = new Widget.checkbox ~label:"Reference Arguments" () in
@@ -120,6 +121,7 @@ class model_selector (main : Design.main_window_extension_points) =
       begin
         dialog#add_row r_hoare#coerce ;
         dialog#add_row r_typed#coerce ;
+        dialog#add_row r_bytes#coerce ;
         dialog#add_row r_eva#coerce ;
         dialog#add_row c_casts#coerce ;
         dialog#add_row c_byref#coerce ;
@@ -148,6 +150,7 @@ class model_selector (main : Design.main_window_extension_points) =
          | Hoare -> memory#set HOARE
          | Typed m -> memory#set TYPED ; c_casts#set (m = MemTyped.Unsafe)
          | Eva -> memory#set EVA
+         | Bytes -> memory#set BYTES
         ) ;
         c_byref#set (s.mvar = Ref) ;
         c_ctxt#set (s.mvar = Caveat) ;
@@ -162,6 +165,7 @@ class model_selector (main : Design.main_window_extension_points) =
         | TYPED -> Typed
                      (if c_casts#get then MemTyped.Unsafe else MemTyped.Fits)
         | EVA -> Eva
+        | BYTES -> Bytes
       in {
         mheap = m ;
         mvar = if c_ctxt#get then Caveat else if c_byref#get then Ref else Var ;
diff --git a/src/plugins/wp/wp.ml b/src/plugins/wp/wp.ml
index c10ae35f535..89dfaae71cb 100644
--- a/src/plugins/wp/wp.ml
+++ b/src/plugins/wp/wp.ml
@@ -95,6 +95,7 @@ module MemDebug = MemDebug
 module MemEmpty = MemEmpty
 module MemLoader = MemLoader
 module MemMemory = MemMemory
+module MemBytes = MemBytes
 module MemTyped = MemTyped
 module MemVal = MemVal
 module MemVar = MemVar
-- 
GitLab