From 513e5b95ee89723f3a2ef52852e5edfd13225526 Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Fri, 25 Sep 2020 19:13:51 +0200
Subject: [PATCH] [aorai] fixes bug in generation of transition functions

when an action is required for a transition in non-deterministic mode, it was
done before the test for updating the boolean variables representing active
state, leading to a possibly incorrect decision when said test depends on the
value of the variable modified by the action
---
 src/plugins/aorai/aorai_utils.ml              | 19 +++++++++++--------
 .../aorai/oracle/loop_bts1050.res.oracle      |  6 +++---
 .../aorai/tests/aorai/oracle/seq.res.oracle   |  8 ++++----
 .../tests/aorai/oracle/seq_loop.res.oracle    |  6 +++---
 .../oracle_prove/loop_bts1050.res.oracle      |  2 --
 .../tests/aorai/oracle_prove/seq.res.oracle   |  2 --
 .../aorai/oracle_prove/seq_loop.res.oracle    |  2 --
 7 files changed, 21 insertions(+), 24 deletions(-)

diff --git a/src/plugins/aorai/aorai_utils.ml b/src/plugins/aorai/aorai_utils.ml
index c4a7cda302f..44ef64c7d1d 100644
--- a/src/plugins/aorai/aorai_utils.ml
+++ b/src/plugins/aorai/aorai_utils.ml
@@ -1822,14 +1822,17 @@ let mk_stmt loc (states, tr) f fst status ((st,_) as state) res =
         (List.rev exp_from_trans)
         (List.rev stmt_from_action)
     else
-      List.fold_left2
-        (fun acc cond stmt_act ->
-           if stmt_act = [] then acc
-           else
-             (mkIfStmt cond (mkBlock stmt_act) (mkBlock []))::acc)
-        [mkIfStmt if_cond (mkBlock [then_stmt]) (mkBlock else_stmt)]
-        (List.rev exp_from_trans)
-        (List.rev stmt_from_action)
+      let actions =
+        List.fold_left2
+          (fun acc cond stmt_act ->
+             if stmt_act = [] then acc
+             else
+               (mkIfStmt cond (mkBlock stmt_act) (mkBlock []))::acc)
+          []
+          (List.rev exp_from_trans)
+          (List.rev stmt_from_action)
+      in
+      mkIfStmt if_cond (mkBlock [then_stmt]) (mkBlock else_stmt) :: actions
   end else
   if Aorai_option.Deterministic.get () then []
   else [is_out_of_state_stmt state loc]
diff --git a/src/plugins/aorai/tests/aorai/oracle/loop_bts1050.res.oracle b/src/plugins/aorai/tests/aorai/oracle/loop_bts1050.res.oracle
index f4ec0edda45..be1dc66d50a 100644
--- a/src/plugins/aorai/tests/aorai/oracle/loop_bts1050.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/loop_bts1050.res.oracle
@@ -91,15 +91,15 @@ enum aorai_OpStatusList {
     aorai_intermediate_state_3_tmp = aorai_intermediate_state_3;
     aorai_intermediate_state_3_tmp = 0;
     aorai_intermediate_state_2_tmp = 0;
-    if (aorai_intermediate_state_0 == 1) 
-      if (aorai_counter < 5) aorai_counter ++;
-    if (aorai_intermediate_state == 1) aorai_counter = 1;
     if (aorai_intermediate_state == 1) aorai_intermediate_state_1_tmp = 1;
     else 
       if (aorai_intermediate_state_0 == 1) 
         if (aorai_counter < 5) aorai_intermediate_state_1_tmp = 1;
         else aorai_intermediate_state_1_tmp = 0;
       else aorai_intermediate_state_1_tmp = 0;
+    if (aorai_intermediate_state_0 == 1) 
+      if (aorai_counter < 5) aorai_counter ++;
+    if (aorai_intermediate_state == 1) aorai_counter = 1;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
     Sf_tmp = 0;
diff --git a/src/plugins/aorai/tests/aorai/oracle/seq.res.oracle b/src/plugins/aorai/tests/aorai/oracle/seq.res.oracle
index 5fc4bc1ae7b..a5cacc4f933 100644
--- a/src/plugins/aorai/tests/aorai/oracle/seq.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/seq.res.oracle
@@ -273,10 +273,6 @@ void f(void)
     aorai_intermediate_state_1_tmp = aorai_intermediate_state_1;
     aorai_intermediate_state_2_tmp = aorai_intermediate_state_2;
     aorai_intermediate_state_3_tmp = aorai_intermediate_state_3;
-    if (aorai_intermediate_state_2 == 1) 
-      if (aorai_counter < 2) aorai_counter ++;
-    if (aorai_intermediate_state_0 == 1) aorai_counter = 1;
-    if (aorai_intermediate_state == 1) aorai_counter = 1;
     if (aorai_intermediate_state == 1) aorai_intermediate_state_3_tmp = 1;
     else 
       if (aorai_intermediate_state_0 == 1) aorai_intermediate_state_3_tmp = 1;
@@ -285,6 +281,10 @@ void f(void)
           if (aorai_counter < 2) aorai_intermediate_state_3_tmp = 1;
           else aorai_intermediate_state_3_tmp = 0;
         else aorai_intermediate_state_3_tmp = 0;
+    if (aorai_intermediate_state_2 == 1) 
+      if (aorai_counter < 2) aorai_counter ++;
+    if (aorai_intermediate_state_0 == 1) aorai_counter = 1;
+    if (aorai_intermediate_state == 1) aorai_counter = 1;
     aorai_intermediate_state_2_tmp = 0;
     aorai_intermediate_state_1_tmp = 0;
     aorai_intermediate_state_0_tmp = 0;
diff --git a/src/plugins/aorai/tests/aorai/oracle/seq_loop.res.oracle b/src/plugins/aorai/tests/aorai/oracle/seq_loop.res.oracle
index d2de21821b3..ee365599dac 100644
--- a/src/plugins/aorai/tests/aorai/oracle/seq_loop.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle/seq_loop.res.oracle
@@ -91,15 +91,15 @@ enum aorai_OpStatusList {
     aorai_intermediate_state_3_tmp = aorai_intermediate_state_3;
     aorai_intermediate_state_3_tmp = 0;
     aorai_intermediate_state_2_tmp = 0;
-    if (aorai_intermediate_state_0 == 1) 
-      if (aorai_counter < 5) aorai_counter ++;
-    if (aorai_intermediate_state == 1) aorai_counter = 1;
     if (aorai_intermediate_state == 1) aorai_intermediate_state_1_tmp = 1;
     else 
       if (aorai_intermediate_state_0 == 1) 
         if (aorai_counter < 5) aorai_intermediate_state_1_tmp = 1;
         else aorai_intermediate_state_1_tmp = 0;
       else aorai_intermediate_state_1_tmp = 0;
+    if (aorai_intermediate_state_0 == 1) 
+      if (aorai_counter < 5) aorai_counter ++;
+    if (aorai_intermediate_state == 1) aorai_counter = 1;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
     Sf_tmp = 0;
diff --git a/src/plugins/aorai/tests/aorai/oracle_prove/loop_bts1050.res.oracle b/src/plugins/aorai/tests/aorai/oracle_prove/loop_bts1050.res.oracle
index 7800d93810c..92104920d5c 100644
--- a/src/plugins/aorai/tests/aorai/oracle_prove/loop_bts1050.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle_prove/loop_bts1050.res.oracle
@@ -2,5 +2,3 @@
 [aorai] Welcome to the Aorai plugin
 [kernel] Parsing /tmp/aorai_loop_bts1050_0.i (no preprocessing)
 [wp] Warning: Missing RTE guards
-[aorai-test] Warning: Could not prove ensures
-  1 ≡ aorai_intermediate_state_1 in automaton function f_pre_func
diff --git a/src/plugins/aorai/tests/aorai/oracle_prove/seq.res.oracle b/src/plugins/aorai/tests/aorai/oracle_prove/seq.res.oracle
index 7c1aab1abe4..ab5514b69d2 100644
--- a/src/plugins/aorai/tests/aorai/oracle_prove/seq.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle_prove/seq.res.oracle
@@ -2,5 +2,3 @@
 [aorai] Welcome to the Aorai plugin
 [kernel] Parsing /tmp/aorai_seq_0.i (no preprocessing)
 [wp] Warning: Missing RTE guards
-[aorai-test] Warning: Could not prove ensures
-  1 ≡ aorai_intermediate_state_3 in automaton function g_pre_func
diff --git a/src/plugins/aorai/tests/aorai/oracle_prove/seq_loop.res.oracle b/src/plugins/aorai/tests/aorai/oracle_prove/seq_loop.res.oracle
index 91bbf9123ac..64b2e8b3540 100644
--- a/src/plugins/aorai/tests/aorai/oracle_prove/seq_loop.res.oracle
+++ b/src/plugins/aorai/tests/aorai/oracle_prove/seq_loop.res.oracle
@@ -2,5 +2,3 @@
 [aorai] Welcome to the Aorai plugin
 [kernel] Parsing /tmp/aorai_seq_loop_0.i (no preprocessing)
 [wp] Warning: Missing RTE guards
-[aorai-test] Warning: Could not prove ensures
-  1 ≡ aorai_intermediate_state_1 in automaton function f_pre_func
-- 
GitLab