From 9719d6794c0cb06d15ed618376da2ad95daac3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9cile=20RUET-CROS?= <cecile.ruet-cros@cea.fr> Date: Mon, 13 Jan 2025 09:22:49 +0100 Subject: [PATCH] [wp] copied (struct/array): None => Some lsrc --- src/plugins/wp/MemBytes.ml | 8 +------- src/plugins/wp/MemLoader.ml | 15 +++++++++++---- src/plugins/wp/MemMemory.ml | 3 +-- src/plugins/wp/Sigs.ml | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/plugins/wp/MemBytes.ml b/src/plugins/wp/MemBytes.ml index 5272d97dfde..eb593e762bf 100644 --- a/src/plugins/wp/MemBytes.ml +++ b/src/plugins/wp/MemBytes.ml @@ -40,13 +40,7 @@ struct let ty_fst_arg = function | Some l :: _ -> l | _ -> raise Not_found - (* - let l_havoc = Qed.Engine.F_call "havoc" - let f_havoc = - Lang.extern_f ~library ~typecheck:ty_fst_arg ~link:l_havoc "havoc" - let havoc fresh current loc n = - Lang.F.e_fun f_havoc [fresh;current;loc;n] - *) + let l_memcpy = Qed.Engine.F_call "memcpy" let f_memcpy = Lang.extern_f ~library ~typecheck:ty_fst_arg ~link:l_memcpy "memcpy" diff --git a/src/plugins/wp/MemLoader.ml b/src/plugins/wp/MemLoader.ml index 438544bbf54..d1bd6baa793 100644 --- a/src/plugins/wp/MemLoader.ml +++ b/src/plugins/wp/MemLoader.ml @@ -636,7 +636,13 @@ struct | C_comp _ | C_array _ -> Set(load_init seq.post obj loc, value) :: memcpy_init seq obj loc - let copied s obj p q = stored s obj p (load_value s.pre obj q) + let copied s obj p q = match obj with + | C_int _ | C_float _ | C_pointer _ -> + stored s obj p (load_value s.pre obj q) + | C_comp _ | C_array _ -> + Set(load_value s.post obj p, load_value s.pre obj q) + :: memcpy s obj ~lsrc:q p + let copied_init s obj p q = stored_init s obj p (load_init s.pre obj q) @@ -652,11 +658,12 @@ struct [ updated_init_atom seq obj loc (e_var init) ; updated_atom seq obj loc (e_var value) ] | C_comp _ | C_array _ -> - memcpy seq obj loc @ memcpy_init seq obj loc + memcpy seq obj ~lsrc:loc loc @ memcpy_init seq obj loc let assigned_range s obj l a b = - memcpy_length s obj (M.shift l obj a) (e_range a b) @ - memcpy_init_length s obj (M.shift l obj a) (e_range a b) + let loc = M.shift l obj a in + memcpy_length s obj loc (e_range a b) @ + memcpy_init_length s obj loc (e_range a b) let assigned seq obj sloc = (* Assert (M.monotonic_init seq.pre seq.post) :: *) diff --git a/src/plugins/wp/MemMemory.ml b/src/plugins/wp/MemMemory.ml index 93e0f2287f0..78a20c8d1fc 100644 --- a/src/plugins/wp/MemMemory.ml +++ b/src/plugins/wp/MemMemory.ml @@ -35,12 +35,11 @@ let ty_fst_arg = function | Some l :: _ -> l | _ -> raise Not_found -(* let l_havoc = Qed.Engine.F_call "havoc"*) + let l_memcpy = Qed.Engine.F_call "memcpy" let l_set_init = Qed.Engine.F_call "set_init" let p_eqmem = Lang.extern_fp ~library "eqmem" -(* let f_havoc = Lang.extern_f ~library ~typecheck:ty_fst_arg ~link:l_havoc "havoc" *) let f_memcpy = Lang.extern_f ~library ~typecheck:ty_fst_arg ~link:l_memcpy "memcpy" let p_framed = Lang.extern_fp ~coloring:true ~library "framed" (* m-pointer -> prop *) let p_sconst = Lang.extern_fp ~coloring:true ~library "sconst" (* int-memory -> prop *) diff --git a/src/plugins/wp/Sigs.ml b/src/plugins/wp/Sigs.ml index 609645de518..da6c1eb517d 100644 --- a/src/plugins/wp/Sigs.ml +++ b/src/plugins/wp/Sigs.ml @@ -195,7 +195,7 @@ sig Memory chunk variables are assigned lazily. Hence, the vector is empty unless a chunk is accessed. Pay attention to this - when you merge or havoc chunks. + when you merge or havoc chunks (using memcpy). New chunks are generated from the context pool of {!Lang.freshvar}. *) -- GitLab