From 3edbdbf0d2214d4133e358bf62af15313e59d203 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Thu, 3 Oct 2019 17:00:44 +0200
Subject: [PATCH] [wp/typed] fixed error when shifting a single value

---
 src/plugins/wp/RefUsage.ml                    | 35 ++++++++----
 .../tests/wp_typed/oracle/mvar.0.res.oracle   |  9 +--
 .../tests/wp_typed/oracle/mvar.1.res.oracle   |  9 +--
 .../wp_typed/oracle_qualif/mvar.0.report.json | 14 +++++
 .../895ce5c124c30552810b4458d89f3885.json     |  2 +
 .../e5ffef57a0640be83d7c30f0890f6022.json     |  2 +
 .../wp_typed/oracle_qualif/mvar.res.oracle    | 56 ++++---------------
 7 files changed, 59 insertions(+), 68 deletions(-)
 create mode 100644 src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.report.json
 create mode 100644 src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/895ce5c124c30552810b4458d89f3885.json
 create mode 100644 src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/e5ffef57a0640be83d7c30f0890f6022.json

diff --git a/src/plugins/wp/RefUsage.ml b/src/plugins/wp/RefUsage.ml
index eedd0bb9bea..894b937dc12 100644
--- a/src/plugins/wp/RefUsage.ml
+++ b/src/plugins/wp/RefUsage.ml
@@ -145,6 +145,16 @@ type model =
   | Val_comp of varinfo * value (* x.f[_].g... *)
   | Val_shift of varinfo * value (* (x + E) *)
 
+[@@@ warning "-32" ]
+let pp_model fmt = function
+  | E v -> E.pretty fmt v
+  | Loc_var x -> Format.fprintf fmt "&%a" Varinfo.pretty x
+  | Loc_shift(x,v) -> Format.fprintf fmt "&%a.(%a)" Varinfo.pretty x E.pretty v
+  | Val_var x -> Varinfo.pretty fmt x
+  | Val_comp(x,v) -> Format.fprintf fmt "%a.(%a)" Varinfo.pretty x E.pretty v
+  | Val_shift(x,v) -> Format.fprintf fmt "%a+(%a)" Varinfo.pretty x E.pretty v
+[@@@ warning "+32" ]
+
 let nothing = E E.bot
 let v_model v = if E.is_bot v then nothing else E v
 
@@ -203,8 +213,12 @@ let field = function
   | m -> shift m E.bot
 
 let load = function
-  | Loc_var x -> Val_var x
-  | Loc_shift(x,e) -> E (E.access x ByValue e)
+  | Loc_var x -> Val_var x (* E.access x ByValue E.bot *)
+  | Loc_shift(x,e) ->
+      if Cil.isArithmeticOrPointerType x.vtype then
+        E (E.access x ByAddr e)
+      else
+        E (E.access x ByValue e)
   | Val_var x -> E (E.access x ByRef E.bot)
   | Val_comp(x,e) -> E (E.access x ByRef e)
   | Val_shift(x,e) -> E (E.access x ByArray e)
@@ -693,17 +707,17 @@ let param a m = match a with
   | ByArray -> e_value (load (shift m E.bot))
 
 let update_call_env (env:global_ctx) v =
-  let r,differ = E.cup_differ env.code v
-  in env.code <- r ;
-  differ
+  let r,differ = E.cup_differ env.code v in
+  env.code <- r ; differ
 
 let call_kf (env:global_ctx) (formals:access list) (models:model list) (reached:bool) =
   let unmodified = ref reached in
   let rec call xs ms = match xs, ms with
-    | [] , _ | _ , [] -> ()
     | x::xs , m::ms ->
-        if update_call_env env (param x m) then unmodified := false;
+        let actual = param x m in
+        if update_call_env env actual then unmodified := false;
         call xs ms
+    | _ -> ()
   in call formals models;
   !unmodified
 
@@ -748,10 +762,11 @@ let compute_usage () =
       in
       (* update from accesses of formals of the called spec for each calls*)
       let specs_formals = called.spec_formals in
-      let formals = Kernel_function.get_formals called_kf in
-      let formals = List.map (fun vi -> E.get vi specs_formals) formals in
+      let params = Kernel_function.get_formals called_kf in
+      let formals = List.map (fun vi -> E.get vi specs_formals) params in
       let kf_call reached call = call_kf env formals call reached in
-      List.fold_left kf_call reached calls in
+      List.fold_left kf_call reached calls
+    in
     state_fp.todo <- KFmap.remove kf state_fp.todo ;
     let cphi = env.cphi in
     let reached = KFmap.fold kf_calls cphi true in
diff --git a/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle
index 89f9259c209..b290830da12 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/mvar.0.res.oracle
@@ -10,15 +10,12 @@
 ------------------------------------------------------------
 
 Goal Post-condition (file tests/wp_typed/mvar.i, line 12) in 'Job':
-Let x = A[0].
-Let a = 1[0].
 Assume {
-  Type: is_sint8(x).
   (* Heap *)
-  Type: IsArray1_sint8(A).
+  Have: linked(Malloc_0) /\ sconst(Mchar_0).
   (* Call 'Write' *)
-  Have: x = a.
+  Have: A[0] = 1.
 }
-Prove: P_equal(a, 1).
+Prove: P_equal(1, 1).
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle
index cf4e0cdda57..c5ee1a264cf 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/mvar.1.res.oracle
@@ -10,15 +10,12 @@
 ------------------------------------------------------------
 
 Goal Post-condition (file tests/wp_typed/mvar.i, line 12) in 'Job':
-Let x = A[0].
-Let a = 1[0].
 Assume {
-  Type: is_sint8(x).
   (* Heap *)
-  Type: IsArray1_sint8(A).
+  Have: linked(Malloc_0) /\ sconst(Mchar_0).
   (* Call 'Write' *)
-  Have: x = a.
+  Have: A[0] = 1.
 }
-Prove: P_equal(a, 1).
+Prove: P_equal(1, 1).
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.report.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.report.json
new file mode 100644
index 00000000000..5d34a2aa148
--- /dev/null
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.report.json
@@ -0,0 +1,14 @@
+{ "wp:global": { "why3:Alt-Ergo,2.0.0": { "total": 1, "valid": 1, "rank": 1 },
+                 "wp:main": { "total": 1, "valid": 1, "rank": 1 } },
+  "wp:functions": { "Job": { "Job_ensures": { "why3:Alt-Ergo,2.0.0": 
+                                                { "total": 1, "valid": 1,
+                                                  "rank": 1 },
+                                              "wp:main": { "total": 1,
+                                                           "valid": 1,
+                                                           "rank": 1 } },
+                             "wp:section": { "why3:Alt-Ergo,2.0.0": { "total": 1,
+                                                                    "valid": 1,
+                                                                    "rank": 1 },
+                                             "wp:main": { "total": 1,
+                                                          "valid": 1,
+                                                          "rank": 1 } } } } }
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/895ce5c124c30552810b4458d89f3885.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/895ce5c124c30552810b4458d89f3885.json
new file mode 100644
index 00000000000..5230d4cfc10
--- /dev/null
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/895ce5c124c30552810b4458d89f3885.json
@@ -0,0 +1,2 @@
+{ "prover": "why3:Alt-Ergo,2.0.0", "verdict": "valid", "time": 0.0081,
+  "steps": 6 }
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/e5ffef57a0640be83d7c30f0890f6022.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/e5ffef57a0640be83d7c30f0890f6022.json
new file mode 100644
index 00000000000..8722bffd2aa
--- /dev/null
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.0.session/cache/e5ffef57a0640be83d7c30f0890f6022.json
@@ -0,0 +1,2 @@
+{ "prover": "why3:Alt-Ergo,2.0.0", "verdict": "valid", "time": 0.0089,
+  "steps": 5 }
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle
index d8be2b42eba..48f19a88154 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/mvar.res.oracle
@@ -6,49 +6,13 @@
   No code nor implicit assigns clause for function Write, generating default assigns from the prototype
 [wp] Warning: Missing RTE guards
 [wp] 1 goal scheduled
-[wp] Failure: Error in why3:anomaly: Not_found
-  Raised at file "src/plugins/qed/term.ml", line 2716, characters 11-26
-  Called from file "src/plugins/wp/Definitions.ml", line 357, characters 16-33
-  Called from file "src/plugins/wp/Definitions.ml", line 376, characters 10-19
-  Called from file "list.ml", line 100, characters 12-15
-  Called from file "src/plugins/qed/term.ml", line 331, characters 21-35
-  Called from file "src/plugins/wp/ProverWhy3.ml", line 961, characters 2-9
-  Called from file "src/plugins/wp/ProverWhy3.ml", line 978, characters 17-57
-  Called from file "src/plugins/wp/ProverWhy3.ml", line 1258, characters 19-34
-  Called from file "src/plugins/wp/wpContext.ml", line 136, characters 17-20
-  Re-raised at file "src/plugins/wp/wpContext.ml", line 141, characters 23-32
-  Called from file "src/plugins/wp/ProverWhy3.ml", line 1255, characters 4-1023
-[kernel] Current source was: tests/wp_typed/mvar.i:14
-  The full backtrace is:
-  Raised at file "src/kernel_services/plugin_entry_points/log.ml" (inlined), line 532, characters 24-31
-  Called from file "src/kernel_services/plugin_entry_points/log.ml", line 1098, characters 17-55
-  Called from file "src/kernel_services/plugin_entry_points/log.ml", line 525, characters 9-23
-  Re-raised at file "src/kernel_services/plugin_entry_points/log.ml", line 528, characters 9-16
-  Called from file "src/plugins/wp/prover.ml", line 64, characters 2-34
-  Called from file "src/libraries/utils/task.ml", line 93, characters 38-43
-  Called from file "src/libraries/utils/task.ml", line 93, characters 38-43
-  Called from file "src/libraries/utils/task.ml" (inlined), line 98, characters 19-29
-  Called from file "src/libraries/utils/task.ml", line 363, characters 14-36
-  Re-raised at file "src/libraries/utils/task.ml", line 369, characters 6-13
-  Called from file "src/libraries/utils/task.ml", line 463, characters 9-22
-  Called from file "array.ml", line 90, characters 31-48
-  Called from file "src/libraries/utils/task.ml", line 480, characters 4-45
-  Called from file "src/libraries/utils/task.ml", line 344, characters 14-18
-  Called from file "src/plugins/wp/register.ml", line 717, characters 4-35
-  Called from file "src/plugins/wp/register.ml", line 816, characters 8-23
-  Called from file "src/libraries/stdlib/extlib.ml", line 343, characters 14-17
-  Re-raised at file "src/libraries/stdlib/extlib.ml", line 343, characters 41-48
-  Called from file "src/libraries/stdlib/extlib.ml", line 344, characters 2-12
-  Called from file "src/libraries/stdlib/extlib.ml", line 344, characters 2-12
-  Called from file "queue.ml", line 105, characters 6-15
-  Called from file "src/kernel_internals/runtime/boot.ml", line 36, characters 4-20
-  Called from file "src/kernel_services/cmdline_parameters/cmdline.ml", line 792, characters 2-9
-  Called from file "src/kernel_services/cmdline_parameters/cmdline.ml", line 822, characters 18-64
-  Called from file "src/kernel_services/cmdline_parameters/cmdline.ml", line 229, characters 4-8
-  
-  Plug-in wp aborted: internal error.
-  Please report as 'crash' at http://bts.frama-c.com/.
-  Your Frama-C version is 19.1+dev (Potassium).
-  Note that a version and a backtrace alone often do not contain enough
-  information to understand the bug. Guidelines for reporting bugs are at:
-  http://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:bug_reporting_guidelines
+[wp] [Alt-Ergo 2.0.0] Goal typed_Job_ensures : Valid
+[wp] Proved goals:    1 / 1
+  Qed:               0 
+  Alt-Ergo 2.0.0:    1
+[wp] Report in:  'tests/wp_typed/oracle_qualif/mvar.0.report.json'
+[wp] Report out: 'tests/wp_typed/result_qualif/mvar.0.report.json'
+-------------------------------------------------------------
+Functions           WP     Alt-Ergo        Total   Success
+Job                 -       1 (1..12)        1       100%
+-------------------------------------------------------------
-- 
GitLab