From 064abc1f300f3e88facc3966b16cb56208c5052a Mon Sep 17 00:00:00 2001
From: Erwan Jahier <jahier@imag.fr>
Date: Wed, 3 Sep 2014 09:17:58 +0200
Subject: [PATCH] -exec: don't crash when integers overflow when reading inputs
 and try to behave as scanf("%d")

(the function that perform this job is actually in rdbg-plugin so that it is shared
with lutin and rdbg)
---
 src/lv6util.ml             |  2 ++
 src/myGenlex.ml            | 18 +-------------
 src/socExecValue.ml        |  6 +++--
 test/lus2lic.sum           | 48 +++++++++++++++++++++-----------------
 test/lus2lic.time          | 18 +++++++-------
 test/should_work/PCOND.lus | 18 +++++++++-----
 todo.org                   | 43 +++++++++++++++++-----------------
 7 files changed, 77 insertions(+), 76 deletions(-)

diff --git a/src/lv6util.ml b/src/lv6util.ml
index 34be9498..00615b38 100644
--- a/src/lv6util.ml
+++ b/src/lv6util.ml
@@ -40,3 +40,5 @@ let rec pos_in_list i x l =
   match l with
     | e::l -> if e=x then i else pos_in_list (i+1) x l
     | [] -> assert false (* should not occur *)
+
+let my_int_of_string = LocalGenlex.local_int_of_string
diff --git a/src/myGenlex.ml b/src/myGenlex.ml
index 1a27d89b..d1fa2ac9 100644
--- a/src/myGenlex.ml
+++ b/src/myGenlex.ml
@@ -53,22 +53,6 @@ let get_string () =
 
 (* The lexer *)
 
-(* Avoid crashing if int are too big *)
-let my_int_of_string str = 
-  try int_of_string str
-  with _ -> 
-    let i64 = Int64.of_string str in
-    let i = if i64 > (Int64.of_int max_int) then 
-      max_int / 4 
-    else if i64 < (Int64.of_int min_int) then 
-      min_int / 4 
-    else 
-      Int64.to_int i64 (* deadcode IMHO *) 
-    in
-      Printf.eprintf "Warning: The integer %s is too big: truncate it to %i\n" str i;
-      flush stderr;
-      i
-    
 
 let make_lexer keywords =
   let kwd_table = Hashtbl.create 17 in
@@ -162,7 +146,7 @@ let make_lexer keywords =
 	| _ ->
 	    let s = (get_string ()) in
 	      Some (Int ((debut,(Stream.count strm__)), 
-                         (my_int_of_string s)
+                         (lv6Util.my_int_of_string s)
                         ))
     and decimal_part (strm__ : _ Stream.t) =
       let debut = Stream.count strm__ in
diff --git a/src/socExecValue.ml b/src/socExecValue.ml
index 689ad1f4..c5362f74 100644
--- a/src/socExecValue.ml
+++ b/src/socExecValue.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 22/08/2014 (at 15:08) by Erwan Jahier> *)
+(* Time-stamp: <modified the 02/09/2014 (at 14:03) by Erwan Jahier> *)
 
 let dbg = (Verbose.get_flag "exec")
 
@@ -245,13 +245,15 @@ fun id ctx ->
       print_string ("get_enum '" ^ (val_to_string string_of_float o) ^"' failed\n"); flush stdout;
       assert false (* should not fail *) 
 
+
+
 let rec (get_value : ctx -> var_expr -> Data.v) =
   fun ctx v -> 
     match v with
       | Var(id,_) -> get_val id ctx
       | Const(("true"|"t"|"_true"),  Bool) -> B true
       | Const(("false"|"f"|"_false"), Bool) -> B false
-      | Const(id_in,Int)  -> I (int_of_string id_in)
+      | Const(id_in,Int)  -> I (Lv6util.my_int_of_string id_in)
       | Const(id_in,Real) -> F (float_of_string id_in)
       | Const(id,Enum(_,idl)) -> E(id, Lv6util.pos_in_list 0 id idl)
       | Const(id,Array(_vt,i)) -> get_val id ctx
diff --git a/test/lus2lic.sum b/test/lus2lic.sum
index f3544988..6c3bd004 100644
--- a/test/lus2lic.sum
+++ b/test/lus2lic.sum
@@ -1,5 +1,5 @@
 ==> lus2lic0.sum <==
-Test Run By jahier on Tue Sep  2 10:30:37 
+Test Run By jahier on Wed Sep  3 09:14:01 
 Native configuration is i686-pc-linux-gnu
 
 		=== lus2lic0 tests ===
@@ -63,7 +63,7 @@ XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/s.lus
 XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/eq1.lus
 
 ==> lus2lic1.sum <==
-Test Run By jahier on Tue Sep  2 10:30:37 
+Test Run By jahier on Wed Sep  3 09:14:01 
 Native configuration is i686-pc-linux-gnu
 
 		=== lus2lic1 tests ===
@@ -402,7 +402,7 @@ PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c Gyroscope.lus  {}
 PASS: ./lus2lic  {-2c Int.lus -n Int}
 
 ==> lus2lic2.sum <==
-Test Run By jahier on Tue Sep  2 10:30:39 
+Test Run By jahier on Wed Sep  3 09:14:01 
 Native configuration is i686-pc-linux-gnu
 
 		=== lus2lic2 tests ===
@@ -599,7 +599,7 @@ PASS: gcc -o test.exec test_test.c test_test_loop.c
 PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c test.lus  {}
 PASS: ./lus2lic  {-2c test_node_expand.lus -n test_node_expand}
 PASS: gcc -o test_node_expand.exec test_node_expand_test_node_expand.c test_node_expand_test_node_expand_loop.c 
-FAIL: Try to compare lus2lic -exec and -2c: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c test_node_expand.lus  {}
+PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c test_node_expand.lus  {}
 PASS: ./lus2lic  {-2c test_clash.lus -n test_clash}
 PASS: ./lus2lic  {-2c trivial.lus -n trivial}
 PASS: gcc -o trivial.exec trivial_trivial.c trivial_trivial_loop.c 
@@ -690,6 +690,9 @@ PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c zzz.lus  {}
 PASS: ./lus2lic  {-2c PCOND1.lus -n PCOND1}
 PASS: gcc -o PCOND1.exec PCOND1_PCOND1.c PCOND1_PCOND1_loop.c 
 PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c PCOND1.lus  {}
+PASS: ./lus2lic  {-2c PCOND.lus -n PCOND}
+PASS: gcc -o PCOND.exec PCOND_PCOND.c PCOND_PCOND_loop.c 
+FAIL: Try to compare lus2lic -exec and -2c: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c PCOND.lus  {}
 PASS: ./lus2lic  {-2c SWITCH.lus -n SWITCH}
 PASS: gcc -o SWITCH.exec SWITCH_SWITCH.c SWITCH_SWITCH_loop.c 
 PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c SWITCH.lus  {}
@@ -720,7 +723,7 @@ PASS: gcc -o X.exec X_X.c X_X_loop.c
 PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c X.lus  {}
 
 ==> lus2lic3.sum <==
-Test Run By jahier on Tue Sep  2 10:30:39 
+Test Run By jahier on Wed Sep  3 09:14:04 
 Native configuration is i686-pc-linux-gnu
 
 		=== lus2lic3 tests ===
@@ -1220,7 +1223,7 @@ PASS: ./lus2lic {-ec -o Int.ec Int.lus}
 PASS: ./myec2c {-o Int.c Int.ec}
 
 ==> lus2lic4.sum <==
-Test Run By jahier on Tue Sep  2 10:30:39 
+Test Run By jahier on Wed Sep  3 09:14:10 
 Native configuration is i686-pc-linux-gnu
 
 		=== lus2lic4 tests ===
@@ -1502,7 +1505,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node test.lus {}
 PASS: ./lus2lic {-o test_node_expand.lic test_node_expand.lus}
 PASS: ./lus2lic {-ec -o test_node_expand.ec test_node_expand.lus}
 PASS: ./myec2c {-o test_node_expand.c test_node_expand.ec}
-FAIL: Try to compare lus2lic -exec and ecexe: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node test_node_expand.lus {}
+PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node test_node_expand.lus {}
 PASS: ./lus2lic {-o test_clash.lic test_clash.lus}
 PASS: ./lus2lic {-ec -o test_clash.ec test_clash.lus}
 PASS: ./myec2c {-o test_clash.c test_clash.ec}
@@ -1625,7 +1628,10 @@ PASS: ./lus2lic {-o PCOND1.lic PCOND1.lus}
 PASS: ./lus2lic {-ec -o PCOND1.ec PCOND1.lus}
 PASS: ./myec2c {-o PCOND1.c PCOND1.ec}
 PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node PCOND1.lus {}
-FAIL: without any option: ./lus2lic {-o PCOND.lic PCOND.lus}
+PASS: ./lus2lic {-o PCOND.lic PCOND.lus}
+PASS: ./lus2lic {-ec -o PCOND.ec PCOND.lus}
+PASS: ./myec2c {-o PCOND.c PCOND.ec}
+FAIL: Try to compare lus2lic -exec and ecexe: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node PCOND.lus {}
 PASS: ./lus2lic {-o SWITCH.lic SWITCH.lus}
 PASS: ./lus2lic {-ec -o SWITCH.ec SWITCH.lus}
 PASS: ./myec2c {-o SWITCH.c SWITCH.ec}
@@ -1683,7 +1689,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node X.lus {}
 
 		=== lus2lic2 Summary ===
 
-# of expected passes		304
+# of expected passes		307
 # of unexpected failures	2
 
 ==> lus2lic3.sum <==
@@ -1697,18 +1703,18 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node X.lus {}
 
 		=== lus2lic4 Summary ===
 
-# of expected passes		431
-# of unexpected failures	4
+# of expected passes		435
+# of unexpected failures	3
 ===============================
-# Total number of failures: 23
-lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 1 seconds
-lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 57 seconds
-lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 87 seconds
-lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 43 seconds
-lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 103 seconds
+# Total number of failures: 22
+lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 6 seconds
+lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 75 seconds
+lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 110 seconds
+lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 72 seconds
+lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 130 seconds
 * Ref time: 
-0.10user 0.08system 3:18.04elapsed 0%CPU (0avgtext+0avgdata 2460maxresident)k
-0inputs+0outputs (0major+12500minor)pagefaults 0swaps
+0.11user 0.08system 3:14.15elapsed 0%CPU (0avgtext+0avgdata 2460maxresident)k
+0inputs+0outputs (0major+12501minor)pagefaults 0swaps
 * Quick time (-j 4):
-0.07user 0.06system 1:44.70elapsed 0%CPU (0avgtext+0avgdata 2460maxresident)k
-0inputs+0outputs (0major+12495minor)pagefaults 0swaps
+0.07user 0.08system 2:22.70elapsed 0%CPU (0avgtext+0avgdata 2464maxresident)k
+1696inputs+0outputs (4major+12518minor)pagefaults 0swaps
diff --git a/test/lus2lic.time b/test/lus2lic.time
index 62ca4b4a..48bf3a07 100644
--- a/test/lus2lic.time
+++ b/test/lus2lic.time
@@ -1,11 +1,11 @@
-lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 1 seconds
-lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 57 seconds
-lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 87 seconds
-lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 43 seconds
-lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 103 seconds
+lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 6 seconds
+lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 75 seconds
+lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 110 seconds
+lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 72 seconds
+lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 130 seconds
 * Ref time: 
-0.10user 0.08system 3:18.04elapsed 0%CPU (0avgtext+0avgdata 2460maxresident)k
-0inputs+0outputs (0major+12500minor)pagefaults 0swaps
+0.11user 0.08system 3:14.15elapsed 0%CPU (0avgtext+0avgdata 2460maxresident)k
+0inputs+0outputs (0major+12501minor)pagefaults 0swaps
 * Quick time (-j 4):
-0.07user 0.06system 1:44.70elapsed 0%CPU (0avgtext+0avgdata 2460maxresident)k
-0inputs+0outputs (0major+12495minor)pagefaults 0swaps
+0.07user 0.08system 2:22.70elapsed 0%CPU (0avgtext+0avgdata 2464maxresident)k
+1696inputs+0outputs (4major+12518minor)pagefaults 0swaps
diff --git a/test/should_work/PCOND.lus b/test/should_work/PCOND.lus
index e9b8080c..a7e65a0c 100644
--- a/test/should_work/PCOND.lus
+++ b/test/should_work/PCOND.lus
@@ -10,19 +10,25 @@ returns (hX:bool; X:int);
 var
   hX1 : bool when h0;
   X1 : int when hX1; 
+  hA_when_h0,hB_when_h0,hC_when_h0 : bool  when h0;
+  hD_when_hC_when_h0  : bool when hC_when_h0;
 let
   hX = current(hX1);
   X = current(current(X1));
+  hA_when_h0 = hA when h0;
+  hB_when_h0 = hB when h0;
+  hC_when_h0 = hC when h0;
+  hD_when_hC_when_h0 = hD  when hC_when_h0;
   hX1, X1 = PCOND_clk( 
            h0,
-           hA when h0,
+           hA_when_h0,
            hB when h0, 
            hC when h0,
-           A when hA,
-           B when hB, 
-           C when hC,
-           hD when hC, 
-           D when hD);
+           A when hA_when_h0,
+           B when hB_when_h0, 
+           C when hC_when_h0,
+           hD when hC_when_h0, 
+           D when hD_when_hC_when_h0);
 tel
 
 node PCOND_clk( 
diff --git a/todo.org b/todo.org
index 50397976..26e2964f 100644
--- a/todo.org
+++ b/todo.org
@@ -3,7 +3,7 @@
 
 * Failures spotted by non reg tests (26)
 
-** TODO Front-end error (2)
+** TODO Front-end error (1)
    - State "TODO"       from ""           [2014-08-26 Tue 10:20]
 
  cat lus2lic*.log | grep "FAIL: without any option:" | sed s/'FAIL: without any option:'/-/
@@ -11,8 +11,6 @@
 1. ./lus2lic -o bug_map_fby.lic bug_map_fby.lus
  map<<fby, n>> pas supporté
 
-2.  ./lus2lic should_work/PCOND.lus -n PCOND
-clock error.
 
 ** TODO soc2c (7)
    - State "TODO"       from ""           [2014-08-26 Tue 10:20]
@@ -46,12 +44,12 @@ cat lus2lic*.log | grep "FAIL: Generate c code  :" | sed s/'FAIL: Generate c cod
 
  cat lus2lic*.log | grep "FAIL: Try ec2c on the result:" | sed s/'FAIL: Try ec2c on the result:'/-/
 
-1. ./myec2c {-o array_concat.c array_concat.ec}
-2. ./myec2c {-o modes3x2_v4.c modes3x2_v4.ec}
-3. ./myec2c {-o modes3x2_v3.c modes3x2_v3.ec}
-4. ./myec2c {-o test_merge.c test_merge.ec}
+1. ./myec2c -o array_concat.c array_concat.ec
+2. ./myec2c -o modes3x2_v4.c modes3x2_v4.ec
+3. ./myec2c -o modes3x2_v3.c modes3x2_v3.ec
+4. ./myec2c -o test_merge.c test_merge.ec
    
-** TODO Divergences -exec et ecexe (7)
+** TODO Divergences -exec et ecexe (6)
    - State "TODO"       from ""           [2014-07-11 Fri 16:54]
 
  grep "FAIL:" lus2lic*.log | grep "exec" | grep "ecexe" | sed s/'FAIL: Try to compare lus2lic -exec and ecexe:'/-/
@@ -60,30 +58,33 @@ cat lus2lic*.log | grep "FAIL: Generate c code  :" | sed s/'FAIL: Generate c cod
    -> ecexe : "#ERROR: Output takes on nil"
 
 2) ../utils/test_lus2lic_no_node should_work/test_node_expand2.lus
-3) ../utils/test_lus2lic_no_node should_work/test_node_expand.lus
-4) ../utils/test_lus2lic_no_node should_work/filter.lus
-5) ../utils/test_lus2lic_no_node should_work/multipar.lus
-   deja vu
+   int too big! (truncation error)
+   cf file:~/rdbg/src/localGenlex.ml
+   
+
+3) ../utils/test_lus2lic_no_node should_work/filter.lus
+  spurious cycle detected 
+
+4) ../utils/test_lus2lic_no_node should_work/multipar.lus
+   int too big! (truncation error)
 
-6) ../utils/test_lus2lic_no_node should_work/Gyroscope.lus
+5) ../utils/test_lus2lic_no_node should_work/Gyroscope.lus
   #ERROR: Output takes on nil
 
-7) ../utils/test_lus2lic_no_node should_work/cond01.lus
-   deja vu
+6) ../utils/test_lus2lic_no_node should_work/cond01.lus
+   cf plus haut (polymorphisme et iterateur)
 
-** TODO divergence -exec et -2c (3)
+** TODO divergence -exec et -2c (2)
    - State "TODO"       from ""           [2014-07-11 Fri 12:02]
 
 grep "FAIL:" lus2lic*.log | grep "exec" | grep "\-2c" | sed s/'FAIL: Try to compare lus2lic -exec and -2c:'/-/
 
 1. ../utils/compare_exec_and_2c should_work/test_node_expand2.lus 2000
-  -> -2110104000 est n'est pas un entier acceptable pour lutin sur les machines 32 bits...
+   int too big! (truncation error)
 
-2. ../utils/compare_exec_and_2c should_work/test_node_expand.lus 2000
-  -> idem
+2. ../utils/compare_exec_and_2c should_work/multipar.lus 2000
+   int too big! (truncation error)
 
-3. ../utils/compare_exec_and_2c should_work/multipar.lus 2000
-  -> idem
 
 
 * lus2lic -2C
-- 
GitLab