From 1fd955e101184eea25d5a1e1894eebeb161eb014 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Fri, 7 Jan 2022 09:53:42 +0100
Subject: [PATCH] [wp] Warns on user defined variant relations

---
 src/plugins/wp/cfgAnnot.ml                               | 9 ++++++++-
 src/plugins/wp/cfgWP.ml                                  | 5 +++--
 .../wp/tests/wp_acsl/oracle/decreases.0.res.oracle       | 2 ++
 .../wp/tests/wp_acsl/oracle/decreases.1.res.oracle       | 2 ++
 .../tests/wp_acsl/oracle/terminates_formulae.res.oracle  | 2 ++
 .../tests/wp_acsl/oracle_qualif/decreases.0.res.oracle   | 2 ++
 .../tests/wp_acsl/oracle_qualif/decreases.1.res.oracle   | 2 ++
 .../wp_acsl/oracle_qualif/terminates_formulae.res.oracle | 2 ++
 8 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/plugins/wp/cfgAnnot.ml b/src/plugins/wp/cfgAnnot.ml
index d6bc77f086a..12bdacececd 100644
--- a/src/plugins/wp/cfgAnnot.ml
+++ b/src/plugins/wp/cfgAnnot.ml
@@ -244,11 +244,17 @@ let get_terminates_hyp kf =
   | Defined (_, p) -> false, p
   | Assumed p -> true, p
 
+let check_variant_relation = function
+  | (_, None) -> ()
+  | (_, Some rel) ->
+      Wp_parameters.hypothesis ~once:true
+        "'%a' relation must be well-founded" Cil_printer.pp_logic_info rel
+
 let get_decreases_goal kf =
   let defined t = WpPropId.mk_decrease_id kf Kglobal t, t in
   match Annotations.decreases ~populate:false kf with
   | None -> None
-  | Some v -> Some (defined v)
+  | Some v -> check_variant_relation v ; Some (defined v)
 
 let get_decreases_hyp kf =
   Annotations.decreases ~populate:false kf
@@ -475,6 +481,7 @@ let mk_variant_properties kf s ca v =
   (vpos_id, vpos), (vdecr_id, vdecr)
 
 let mk_variant_relation_property kf s ca v li =
+  check_variant_relation (v, Some li) ;
   let vid = WpPropId.mk_var_id kf s ca in
   let loc = v.term_loc in
   let lcurr = Clabels.to_logic (Clabels.loop_current s) in
diff --git a/src/plugins/wp/cfgWP.ml b/src/plugins/wp/cfgWP.ml
index a0ce9b9ceb9..1bece5f01ae 100644
--- a/src/plugins/wp/cfgWP.ml
+++ b/src/plugins/wp/cfgWP.ml
@@ -1153,11 +1153,12 @@ struct
                      Kernel_function.pretty kf
                | (_, r), Some (_, r')
                  when not @@ Option.equal Logic_utils.is_same_logic_info r r' ->
+                   let none : Pretty_utils.sformat = "<None>" in
                    Warning.error
                      "On call to %a, relation (%a) does not match caller (%a)"
                      Kernel_function.pretty kf
-                     (Pretty_utils.pp_opt Cil_printer.pp_logic_info) r
-                     (Pretty_utils.pp_opt Cil_printer.pp_logic_info) r'
+                     (Pretty_utils.pp_opt ~none Cil_printer.pp_logic_info) r
+                     (Pretty_utils.pp_opt ~none Cil_printer.pp_logic_info) r'
                | (caller_d, rel), Some (callee_d,_ ) ->
                    let rel caller callee = match rel with
                      | None ->
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle
index 767145c220c..1c0241e1df5 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle
@@ -2,7 +2,9 @@
 [kernel] Parsing decreases.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded
 [wp] decreases.i:71: Warning: No decreases clause for missing_2
+[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded
 [wp] decreases.i:109: Warning: 
   On call to mw1, relation (Wrong) does not match caller (Rel)
 [wp] decreases.i:105: Warning: 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle
index 337093493a9..503c4176882 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle
@@ -2,7 +2,9 @@
 [kernel] Parsing decreases.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded
 [wp] decreases.i:71: Warning: No decreases clause for missing_2
+[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded
 [wp] decreases.i:109: Warning: 
   On call to mw1, relation (Wrong) does not match caller (Rel)
 [wp] decreases.i:105: Warning: 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle
index 7f2d6c08cd7..d9bd70618f7 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle
@@ -2,6 +2,8 @@
 [kernel] Parsing terminates_formulae.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+[wp:hypothesis] terminates_formulae.i:90: Warning: 
+  'Rel' relation must be well-founded
 [wp] [CFG] Goal general_variant_terminates : Valid (Trivial)
 [wp] [CFG] Goal variant_terminates : Valid (Trivial)
 [wp] terminates_formulae.i:90: Warning: 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.0.res.oracle
index a1c4020be5c..62e79688690 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.0.res.oracle
@@ -2,7 +2,9 @@
 [kernel] Parsing decreases.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded
 [wp] decreases.i:71: Warning: No decreases clause for missing_2
+[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded
 [wp] decreases.i:109: Warning: 
   On call to mw1, relation (Wrong) does not match caller (Rel)
 [wp] decreases.i:105: Warning: 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle
index 915be052f0a..63e3fba1f74 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle
@@ -2,7 +2,9 @@
 [kernel] Parsing decreases.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded
 [wp] decreases.i:71: Warning: No decreases clause for missing_2
+[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded
 [wp] decreases.i:109: Warning: 
   On call to mw1, relation (Wrong) does not match caller (Rel)
 [wp] decreases.i:105: Warning: 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle
index 06ea7290c29..cf90d39ba3f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle
@@ -2,6 +2,8 @@
 [kernel] Parsing terminates_formulae.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+[wp:hypothesis] terminates_formulae.i:90: Warning: 
+  'Rel' relation must be well-founded
 [wp] [CFG] Goal general_variant_terminates : Valid (Trivial)
 [wp] [CFG] Goal variant_terminates : Valid (Trivial)
 [wp] terminates_formulae.i:90: Warning: 
-- 
GitLab