From 09038ca5a9c20f3f6d5b99c0b04a4dfe3428a2b2 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Fri, 29 Mar 2024 15:28:51 +0100 Subject: [PATCH] [wp] type logic function _calls_ with C type --- src/plugins/wp/LogicSemantics.ml | 7 ++++++- .../wp_acsl/oracle/user_def_type_guard.res.oracle | 10 ++++++++-- .../user_def_type_guard.2.res.oracle | 15 ++++++++++----- .../wp/tests/wp_acsl/user_def_type_guard.i | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/plugins/wp/LogicSemantics.ml b/src/plugins/wp/LogicSemantics.ml index e1ae3720d51..aac2295277c 100644 --- a/src/plugins/wp/LogicSemantics.ml +++ b/src/plugins/wp/LogicSemantics.ml @@ -681,7 +681,12 @@ struct | ACSLDEF -> C.call_fun env result f ls vs | HACK phi -> phi vs | LFUN f -> e_fun ~result f vs - in Vexp r + in + begin match t.term_type with + | Ctype t -> Lang.assume (Cvalues.has_ctype t r) + | _ -> () + end ; + Vexp r | Tlambda _ -> Warning.error "Lambda-functions not yet implemented" diff --git a/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle index 37f7d58dc5b..d2766c72bfc 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/user_def_type_guard.res.oracle @@ -24,7 +24,13 @@ Prove: (0 <= L_t) /\ (L_t <= 127). ------------------------------------------------------------ Goal Post-condition 'A' in 'g': -Assume { (* Heap *) Type: region(p.base) <= 0. } -Prove: L_x(Mint_0, p) <= 255. +Let x = Mint_0[p]. +Let x_1 = L_x(Mint_0, p). +Assume { + Type: is_uint8(x) /\ is_uint8(x_1). + (* Heap *) + Type: region(p.base) <= 0. +} +Prove: (x = x_1) /\ (x_1 <= 255). ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.2.res.oracle index 4dd7571870e..1ab51dfc811 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.2.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/user_def_type_guard.2.res.oracle @@ -43,15 +43,20 @@ end (* use frama_c_wp.memaddr.MemAddr *) + (* use frama_c_wp.cint.Cint *) + (* use Axiomatic1 *) goal wp_goal : - forall t:addr -> int, a:addr. region (a.base) <= 0 -> L_x t a <= 255 + forall t:addr -> int, a:addr. + let x = get t a in + let x1 = L_x t a in + region (a.base) <= 0 -> is_uint8 x -> is_uint8 x1 -> x = x1 /\ x1 <= 255 end -[wp] [Unsuccess] typed_g_ensures_A (Alt-Ergo) (Cached) -[wp] Proved goals: 0 / 1 - Unsuccess: 1 +[wp] [Valid] typed_g_ensures_A (Alt-Ergo) (Cached) +[wp] Proved goals: 1 / 1 + Alt-Ergo: 1 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success - g - - 1 0.0% + g - 1 1 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/user_def_type_guard.i b/src/plugins/wp/tests/wp_acsl/user_def_type_guard.i index 6dd01e0b069..32606dca6f3 100644 --- a/src/plugins/wp/tests/wp_acsl/user_def_type_guard.i +++ b/src/plugins/wp/tests/wp_acsl/user_def_type_guard.i @@ -16,5 +16,5 @@ @ ensures qed_ko: 0<=t<128 ; */ void f(void) {return;} -//@ ensures A: x(p) <= 255 ; +//@ ensures A: *p == x(p) <= 255 ; void g(unsigned char* p){} -- GitLab