From b4edc111c577efe7f48819971d55224d3c536ab2 Mon Sep 17 00:00:00 2001
From: Valentin Perrelle <valentin.perrelle@cea.fr>
Date: Thu, 21 Feb 2019 17:47:18 +0100
Subject: [PATCH] [Dive] Add an unevaluated precision type

---
 src/plugins/dive/graph_types.mli              |  2 +-
 src/plugins/dive/imprecision_graph.ml         | 11 +++++---
 src/plugins/dive/tests/dive/assigned_param.i  |  2 +-
 src/plugins/dive/tests/dive/const.i           |  2 +-
 .../dive/tests/dive/oracle/assigned_param.dot | 14 ++++++-----
 src/plugins/dive/tests/dive/oracle/const.dot  | 25 ++++++++++++-------
 .../dive/tests/dive/oracle/various.dot        | 11 ++++----
 src/plugins/dive/tests/dive/various.i         |  2 +-
 8 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/src/plugins/dive/graph_types.mli b/src/plugins/dive/graph_types.mli
index 59fd3707a55..cea36be39f2 100644
--- a/src/plugins/dive/graph_types.mli
+++ b/src/plugins/dive/graph_types.mli
@@ -32,7 +32,7 @@ type node_locality = {
   loc_function : Cil_types.kernel_function option;
 }
 
-type node_precision = Singleton | Normal | Wide | Critical
+type node_precision = Unevaluated | Singleton | Normal | Wide | Critical
 
 type node = {
   node_key : int;
diff --git a/src/plugins/dive/imprecision_graph.ml b/src/plugins/dive/imprecision_graph.ml
index 9c4aab6de23..3f0979ffefd 100644
--- a/src/plugins/dive/imprecision_graph.ml
+++ b/src/plugins/dive/imprecision_graph.ml
@@ -49,7 +49,7 @@ include G
 let next_node_key = ref 0
 let next_dependency_key = ref 0
 
-let create_node ?(node_precision=Singleton) ~node_kind ~node_locality g =
+let create_node ?(node_precision=Unevaluated) ~node_kind ~node_locality g =
   let node = {
     node_key = !next_node_key;
     node_kind;
@@ -68,7 +68,8 @@ let update_node_precision node new_precision =
     | Critical, _ | _, Critical -> Critical
     | Wide, _ | _, Wide -> Wide
     | Normal, _ | _, Normal -> Normal
-    | Singleton, Singleton -> Singleton
+    | Singleton, _ | _, Singleton -> Singleton
+    | Unevaluated, Unevaluated -> Unevaluated
 
 let create_dependency ~allow_folding g v1 dependency_kind v2 =
   let same_kind (_,e,_) =
@@ -143,13 +144,15 @@ let ouptput_to_dot out_channel g =
           | Alarm _ ->  [ `Shape `Doubleoctagon ; `Style `Bold ]
           | File -> [ `Style `Invis ]
         and precision = match v.node_precision with
+          | Unevaluated -> []
           | Singleton -> [`Color 0x88aaff ;
                           `Style `Filled ; `Fillcolor 0xaaccff]
-          | Normal -> []
+          | Normal -> [ `Color 0x004400 ;
+                        `Style `Filled ; `Fillcolor 0xeeffee ]
           | Wide -> [ `Color 0xff0000 ;
                       `Style `Filled ; `Fillcolor 0xffbbbb ]
           | Critical -> [ `Color 0xff0000 ; `Style `Bold ;
-                          `Style `Filled ; `Fillcolor 0xffbbbb ]
+                          `Style `Filled ; `Fillcolor 0xff0000 ]
         in
         l := precision @ kind @ !l;
         if not v.node_deps_computed then
diff --git a/src/plugins/dive/tests/dive/assigned_param.i b/src/plugins/dive/tests/dive/assigned_param.i
index 322aa200478..a5d5fd969b4 100644
--- a/src/plugins/dive/tests/dive/assigned_param.i
+++ b/src/plugins/dive/tests/dive/assigned_param.i
@@ -1,5 +1,5 @@
 /* run.config
-STDOPT: +"-dive-from main::w"
+STDOPT: +"-dive-from main::w -dive-depth-limit 5"
 */
 
 volatile int nondet;
diff --git a/src/plugins/dive/tests/dive/const.i b/src/plugins/dive/tests/dive/const.i
index adc5365c8c6..3534fa8e703 100644
--- a/src/plugins/dive/tests/dive/const.i
+++ b/src/plugins/dive/tests/dive/const.i
@@ -1,5 +1,5 @@
 /* run.config
-STDOPT: +"-dive-from main::res"
+STDOPT: +"-dive-from main::res -dive-depth-limit 5"
 */
 
 int f(int x, int y)
diff --git a/src/plugins/dive/tests/dive/oracle/assigned_param.dot b/src/plugins/dive/tests/dive/oracle/assigned_param.dot
index 460be6d9d72..e988a3cdc4a 100644
--- a/src/plugins/dive/tests/dive/oracle/assigned_param.dot
+++ b/src/plugins/dive/tests/dive/oracle/assigned_param.dot
@@ -1,12 +1,14 @@
 digraph G {
-  cp0 [fillcolor="#AACCFF", color="#88AAFF", style="invis,filled,dotted", ];
-  cp1 [label=<w>, shape=box, fillcolor="#AACCFF", color="#88AAFF",
-       style="filled", ];
+  cp0 [style="invis,dotted", ];
+  cp1 [label=<w>, shape=box, ];
   cp2 [label=<x>, shape=box, fillcolor="#AACCFF", color="#88AAFF",
        style="filled", ];
-  cp3 [label=<z>, shape=box, ];
-  cp4 [label=<x>, shape=box, ];
-  cp5 [label=<z>, shape=box, style="dotted", ];
+  cp3 [label=<z>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
+  cp4 [label=<x>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
+  cp5 [label=<z>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
   
   subgraph cluster_file_1 { label=<tests/dive/assigned_param.i>; cp0;
     subgraph cluster_function_19 { label=<f>; cp3;cp2;
diff --git a/src/plugins/dive/tests/dive/oracle/const.dot b/src/plugins/dive/tests/dive/oracle/const.dot
index cce0e10e5aa..ddf007a23e7 100644
--- a/src/plugins/dive/tests/dive/oracle/const.dot
+++ b/src/plugins/dive/tests/dive/oracle/const.dot
@@ -1,17 +1,22 @@
 digraph G {
-  cp0 [fillcolor="#AACCFF", color="#88AAFF", style="invis,filled,dotted", ];
-  cp1 [label=<res>, shape=box, fillcolor="#AACCFF", color="#88AAFF",
-       style="filled", ];
-  cp2 [fillcolor="#AACCFF", color="#88AAFF", style="invis,filled,dotted", ];
+  cp0 [style="invis,dotted", ];
+  cp1 [label=<res>, shape=box, ];
+  cp2 [style="invis,dotted", ];
   cp3 [label=<__retres>, shape=box, fillcolor="#AACCFF", color="#88AAFF",
        style="filled", ];
-  cp4 [label=<c>, shape=box, ];
-  cp5 [label=<w>, shape=box, ];
-  cp6 [label=<x>, shape=box, style="dotted", ];
-  cp7 [label=<y>, shape=box, style="dotted", ];
+  cp4 [label=<c>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
+  cp5 [label=<w>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
+  cp6 [label=<x>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
+  cp7 [label=<y>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
+  cp8 [label=<i>, shape=box, fillcolor="#EEFFEE", color="#004400",
+       style="filled", ];
   
   subgraph cluster_file_1 { label=<tests/dive/const.i>; cp0;
-    subgraph cluster_function_25 { label=<main>; cp1;
+    subgraph cluster_function_25 { label=<main>; cp8;cp1;
        };
      };
   subgraph cluster_file_2 { label=<>; cp2;
@@ -24,5 +29,7 @@ digraph G {
   cp5 -> cp3;
   cp6 -> cp4;
   cp7 -> cp5;
+  cp8 -> cp6;
+  cp8 -> cp7;
   
   }
\ No newline at end of file
diff --git a/src/plugins/dive/tests/dive/oracle/various.dot b/src/plugins/dive/tests/dive/oracle/various.dot
index acc4db37e9f..d8595e7b16c 100644
--- a/src/plugins/dive/tests/dive/oracle/various.dot
+++ b/src/plugins/dive/tests/dive/oracle/various.dot
@@ -1,5 +1,5 @@
 digraph G {
-  cp0 [fillcolor="#AACCFF", color="#88AAFF", style="invis,filled,dotted", ];
+  cp0 [style="invis,dotted", ];
   cp1 [label=<x2>, shape=box, fillcolor="#FFBBBB", color="#FF0000",
        style="filled", ];
   cp2 [label=<y>, shape=box, fillcolor="#FFBBBB", color="#FF0000",
@@ -8,8 +8,7 @@ digraph G {
        style="filled", ];
   cp4 [label=<g>, shape=box, fillcolor="#AACCFF", color="#88AAFF",
        style="filled", ];
-  cp5 [label=<z>, shape=box, fillcolor="#AACCFF", color="#88AAFF",
-       style="filled", ];
+  cp5 [label=<z>, shape=box, ];
   cp6 [label=<y>, shape=box, fillcolor="#FFBBBB", color="#FF0000",
        style="filled", ];
   cp7 [label=<w>, shape=box, fillcolor="#FFBBBB", color="#FF0000",
@@ -17,12 +16,12 @@ digraph G {
   cp8 [label=<tmp_0>, shape=box, fillcolor="#FFBBBB", color="#FF0000",
        style="filled", ];
   cp9 [label=<pf>, shape=box, fillcolor="#AACCFF", color="#88AAFF",
-       style="filled,dotted", ];
+       style="filled", ];
   cp10 [label=<is_nan_or_infinite: \is_finite((float)((double)((double)y * 2.0)))>,
-        shape=doubleoctagon, fillcolor="#FFBBBB", color="#FF0000",
+        shape=doubleoctagon, fillcolor="#FF0000", color="#FF0000",
         style="bold,filled,bold", ];
   cp11 [label=<is_nan_or_infinite: \is_finite((float)(y + w))>,
-        shape=doubleoctagon, fillcolor="#FFBBBB", color="#FF0000",
+        shape=doubleoctagon, fillcolor="#FF0000", color="#FF0000",
         style="bold,filled,bold", ];
   
   subgraph cluster_file_1 { label=<tests/dive/various.i>; cp4;cp0;
diff --git a/src/plugins/dive/tests/dive/various.i b/src/plugins/dive/tests/dive/various.i
index c8766e6a7ad..f89d87ed5c8 100644
--- a/src/plugins/dive/tests/dive/various.i
+++ b/src/plugins/dive/tests/dive/various.i
@@ -1,5 +1,5 @@
 /* run.config
-STDOPT: +"-dive-from main::z,f::x2 -dive-from-function-alarms f,main"
+STDOPT: +"-dive-from main::z,f::x2 -dive-from-function-alarms f,main -dive-depth-limit 5"
 */
 
 float g;
-- 
GitLab