From eb549a95d89764af140472f91c45b7666cde2341 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Tue, 4 Apr 2023 10:26:28 +0200
Subject: [PATCH] [Eva] Adds a test of printing large integer sets.

---
 tests/value/ilevel.c                          | 17 ++++-
 ...{ilevel.res.oracle => ilevel.0.res.oracle} |  0
 tests/value/oracle/ilevel.1.res.oracle        | 63 +++++++++++++++++++
 3 files changed, 79 insertions(+), 1 deletion(-)
 rename tests/value/oracle/{ilevel.res.oracle => ilevel.0.res.oracle} (100%)
 create mode 100644 tests/value/oracle/ilevel.1.res.oracle

diff --git a/tests/value/ilevel.c b/tests/value/ilevel.c
index ce5de2ecd5f..cd68ed54ea8 100644
--- a/tests/value/ilevel.c
+++ b/tests/value/ilevel.c
@@ -1,7 +1,7 @@
 /* run.config*
    PLUGIN: @EVA_MAIN_PLUGINS@ inout,slicing
    OPT: -eva @EVA_CONFIG@ -slice-return main -then-on "Slicing export" -eva -eva-ilevel 16 -eva-show-progress -then-on "default" -eva-ilevel 17 -then -eva-ilevel 48
-
+   STDOPT: +"-eva-ilevel 400 -main large_ilevel"
 */
 
 // Test in particular that ilevel is by-project, even though it is an ocaml ref
@@ -31,3 +31,18 @@ int main () {
 
   return i+j+k+l;
 }
+
+/* Tests printing large integer sets. */
+void large_ilevel (void) {
+  int i = Frama_C_interval(0, 10);
+  int j = nondet ? i : i - 25;
+  int k = Frama_C_interval(100, 200);
+  if (k == 128) return;
+
+  int a[11] = {53, 17, 64, 99, 25, 12, 72, 81, 404, 303, -101};
+
+  int s2 = nondet ? 40 : (nondet ? 41 : 42);
+  int s1 = a[i];
+
+  int x = nondet ? (nondet ? j : k) : (nondet ? s1 : s2);
+}
diff --git a/tests/value/oracle/ilevel.res.oracle b/tests/value/oracle/ilevel.0.res.oracle
similarity index 100%
rename from tests/value/oracle/ilevel.res.oracle
rename to tests/value/oracle/ilevel.0.res.oracle
diff --git a/tests/value/oracle/ilevel.1.res.oracle b/tests/value/oracle/ilevel.1.res.oracle
new file mode 100644
index 00000000000..af0704f7b5d
--- /dev/null
+++ b/tests/value/oracle/ilevel.1.res.oracle
@@ -0,0 +1,63 @@
+[kernel] Parsing ilevel.c (with preprocessing)
+[eva] Analyzing a complete application starting at large_ilevel
+[eva] Computing initial state
+[eva] Initial state computed
+[eva:initial-state] Values of globals at initialization
+  nondet ∈ [--..--]
+  i ∈ {0}
+  j ∈ {0}
+  k ∈ {0}
+  l ∈ {0}
+[eva] computing for function Frama_C_interval <- large_ilevel.
+  Called from ilevel.c:37.
+[eva] using specification for function Frama_C_interval
+[eva] ilevel.c:37: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function Frama_C_interval <- large_ilevel.
+  Called from ilevel.c:39.
+[eva] ilevel.c:39: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] Recording results for large_ilevel
+[eva] done for function large_ilevel
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function large_ilevel:
+  Frama_C_entropy_source ∈ [--..--]
+  i_0 ∈ [0..10]
+  j_0 ∈ [-25..-15] ∪ [0..10]
+  k_0 ∈ [100..200]
+  a[0] ∈ {53}
+   [1] ∈ {17}
+   [2] ∈ {64}
+   [3] ∈ {99}
+   [4] ∈ {25}
+   [5] ∈ {12}
+   [6] ∈ {72}
+   [7] ∈ {81}
+   [8] ∈ {404}
+   [9] ∈ {303}
+   [10] ∈ {-101}
+  s2 ∈ {40; 41; 42}
+  s1 ∈ {-101; 12; 17; 25; 53; 64; 72; 81; 99; 303; 404}
+  x ∈
+   {-101} ∪ [-25..-15] ∪ [0..10]
+    ∪ {12; 17; 25; 40; 41; 42; 53; 64; 72; 81} ∪ [99..127] ∪ [129..200]
+    ∪ {303; 404}
+[from] Computing for function large_ilevel
+[from] Computing for function Frama_C_interval <-large_ilevel
+[from] Done for function Frama_C_interval
+[from] Done for function large_ilevel
+[from] ====== DEPENDENCIES COMPUTED ======
+  These dependencies hold at termination for the executions that terminate:
+[from] Function Frama_C_interval:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+  \result FROM Frama_C_entropy_source; min; max
+[from] Function large_ilevel:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] ====== END OF DEPENDENCIES ======
+[inout] Out (internal) for function large_ilevel:
+    Frama_C_entropy_source; i_0; j_0; tmp_0; k_0; a[0..10]; s2; tmp_2; 
+    tmp_3; s1; x; tmp_4; tmp_5; tmp_6
+[inout] Inputs for function large_ilevel:
+    Frama_C_entropy_source; nondet
-- 
GitLab