From fb50cf91277b93c122b52f68aeaffd246cb6f1e0 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Fri, 27 Sep 2019 14:00:08 +0200 Subject: [PATCH] [Override Std] Fix missing \result in memcpy/move --- src/plugins/override_std/memcpy.ml | 10 +++++++--- src/plugins/override_std/memmove.ml | 10 +++++++--- .../tests/functions/oracle/memcpy.res.oracle | 4 +++- .../tests/functions/oracle/memmove.res.oracle | 4 +++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/plugins/override_std/memcpy.ml b/src/plugins/override_std/memcpy.ml index b0cbffaf38c..f3a789cb2e7 100644 --- a/src/plugins/override_std/memcpy.ml +++ b/src/plugins/override_std/memcpy.ml @@ -46,6 +46,9 @@ let pcopied_memcpy ?loc p1 p2 len = let pcopied_len_bytes ?loc p1 p2 bytes_len = plet_len_div_size ?loc p1.term_type bytes_len (pcopied_memcpy ?loc p1 p2) +let presult_dest ?loc t dest = + prel ?loc (Req, (tresult ?loc t), dest) + let generate_requires loc dest src len = List.map new_predicate [ { (pcorrect_len_bytes ~loc dest.term_type len) with pred_name = ["aligned_end"] } ; @@ -63,9 +66,10 @@ let generate_assigns loc t dest src len = let res = result, From [dest] in Writes [ copy ; res ] -let generate_ensures loc dest src len = +let generate_ensures loc t dest src len = List.map (fun p -> Normal, new_predicate p) [ - { (pcopied_len_bytes ~loc dest src len) with pred_name = [ "copied"] } + { (pcopied_len_bytes ~loc dest src len) with pred_name = [ "copied"] } ; + { (presult_dest ~loc t dest) with pred_name = [ "result"] } ] let generate_spec vi loc = @@ -79,7 +83,7 @@ let generate_spec vi loc = let len = cvar_to_tvar clen in let requires = generate_requires loc dest src len in let assigns = generate_assigns loc t dest src len in - let ensures = generate_ensures loc dest src len in + let ensures = generate_ensures loc t dest src len in make_funspec [make_behavior ~requires ~assigns ~ensures ()] () let generate_prototype t = diff --git a/src/plugins/override_std/memmove.ml b/src/plugins/override_std/memmove.ml index f0ddef2df5c..a29ca3383e5 100644 --- a/src/plugins/override_std/memmove.ml +++ b/src/plugins/override_std/memmove.ml @@ -43,6 +43,9 @@ let pmoved_memmove ?loc dest src len = let pmoved_len_bytes ?loc dest src bytes_len = plet_len_div_size ?loc dest.term_type bytes_len (pmoved_memmove ?loc dest src) +let presult_dest ?loc t dest = + prel ?loc (Req, (tresult ?loc t), dest) + let generate_requires loc dest src len = List.map new_predicate [ { (pcorrect_len_bytes ~loc dest.term_type len) with pred_name = ["aligned_end"] } ; @@ -59,9 +62,10 @@ let generate_assigns loc t dest src len = let res = result, From [dest] in Writes [ copy ; res ] -let generate_ensures loc dest src len = +let generate_ensures loc t dest src len = List.map (fun p -> Normal, new_predicate p) [ - { (pmoved_len_bytes ~loc dest src len) with pred_name = [ "moved"] } + { (pmoved_len_bytes ~loc dest src len) with pred_name = [ "moved"] } ; + { (presult_dest ~loc t dest) with pred_name = [ "result"] } ] let generate_spec vi loc = @@ -75,7 +79,7 @@ let generate_spec vi loc = let len = cvar_to_tvar clen in let requires = generate_requires loc dest src len in let assigns = generate_assigns loc t dest src len in - let ensures = generate_ensures loc dest src len in + let ensures = generate_ensures loc t dest src len in make_funspec [make_behavior ~requires ~assigns ~ensures ()] () let generate_prototype t = diff --git a/src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle b/src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle index 974fd3a31a2..6bb3d9d1bb5 100644 --- a/src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle +++ b/src/plugins/override_std/tests/functions/oracle/memcpy.res.oracle @@ -17,6 +17,7 @@ copied: \let __fc_len = len / 4; ∀ ℤ j; 0 ≤ j < __fc_len ⇒ *(dest + j) ≡ *(src + j); + ensures result: \result ≡ dest; assigns *(dest + (0 .. len - 1)), \result; assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1)); assigns \result \from dest; @@ -37,7 +38,7 @@ int main(void) [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. + def'n of func main at tests/functions/memcpy.c:3 (sum 1968) conflicts with the one at tests/functions/result/memcpy.c:26 (sum 3742); keeping the one at tests/functions/result/memcpy.c:26. /* Generated by Frama-C */ #include "stddef.h" #include "string.h" @@ -57,6 +58,7 @@ int main(void) \let __fc_len = \old(len) / 4; ∀ ℤ j; 0 ≤ j < __fc_len ⇒ *(\old(dest) + j) ≡ *(\old(src) + j); + ensures result: \result ≡ \old(dest); assigns *(dest + (0 .. len - 1)), \result; assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1)); assigns \result \from dest; diff --git a/src/plugins/override_std/tests/functions/oracle/memmove.res.oracle b/src/plugins/override_std/tests/functions/oracle/memmove.res.oracle index d922f913cad..2db11ab0c0c 100644 --- a/src/plugins/override_std/tests/functions/oracle/memmove.res.oracle +++ b/src/plugins/override_std/tests/functions/oracle/memmove.res.oracle @@ -13,6 +13,7 @@ moved: \let __fc_len = len / 4; ∀ ℤ j; 0 ≤ j < __fc_len ⇒ *(dest + j) ≡ \at(*(src + j),Pre); + ensures result: \result ≡ dest; assigns *(dest + (0 .. len - 1)), \result; assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1)); assigns \result \from dest; @@ -33,7 +34,7 @@ int main(void) [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. + def'n of func main at tests/functions/memmove.c:3 (sum 1968) conflicts with the one at tests/functions/result/memmove.c:22 (sum 3742); keeping the one at tests/functions/result/memmove.c:22. /* Generated by Frama-C */ #include "stddef.h" #include "string.h" @@ -49,6 +50,7 @@ int main(void) \let __fc_len = \old(len) / 4; ∀ ℤ j; 0 ≤ j < __fc_len ⇒ *(\old(dest) + j) ≡ \at(*(src + j),Pre); + ensures result: \result ≡ \old(dest); assigns *(dest + (0 .. len - 1)), \result; assigns *(dest + (0 .. len - 1)) \from *(src + (0 .. len - 1)); assigns \result \from dest; -- GitLab