From efe0045964be2d1ebe2e3f0a01a0bb2a64c019a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Fri, 28 Feb 2020 14:38:10 +0100
Subject: [PATCH] [Eva] Adds a test for the alarm about the creation of invalid
 pointers.

---
 tests/value/invalid_pointer.c                 | 178 ++++++++
 .../value/oracle/invalid_pointer.0.res.oracle | 409 ++++++++++++++++++
 .../value/oracle/invalid_pointer.1.res.oracle | 337 +++++++++++++++
 3 files changed, 924 insertions(+)
 create mode 100644 tests/value/invalid_pointer.c
 create mode 100644 tests/value/oracle/invalid_pointer.0.res.oracle
 create mode 100644 tests/value/oracle/invalid_pointer.1.res.oracle

diff --git a/tests/value/invalid_pointer.c b/tests/value/invalid_pointer.c
new file mode 100644
index 00000000000..bde7ed009dc
--- /dev/null
+++ b/tests/value/invalid_pointer.c
@@ -0,0 +1,178 @@
+/* run.config*
+  STDOPT: +"-warn-invalid-pointer -absolute-valid-range=10-30"
+  STDOPT: +"-no-warn-invalid-pointer -absolute-valid-range=10-30"
+*/
+
+#include <__fc_builtin.h>
+#include <stdint.h>
+
+/* Tests the emission of \object_pointer alarms when -warn-invalid-pointer
+   is enabled. The second run should emit no alarm. */
+
+volatile int undet;
+
+/* Simple pointer computations. */
+void pointer_computation () {
+  int x;
+  int *p = &x;
+  if (undet)
+    p--; // Red alarm.
+  p++; // No alarm.
+  if (undet)
+    p++; // Red alarm.
+  int i = undet;
+  p += i; // Unknown alarm. [i] should be reduced to {-1, 0}.
+  int j = undet;
+  p -= j; // Unknown alarm. [j] should be reduced to {-1, 0, 1}.
+  p --;   // Unknown alarm. [p] should be exactly {&x}.
+  int array[25];
+  int *q = undet ? &x : &array[0];
+  int offset1 = Frama_C_interval(0, 10);
+  q += offset1; // Unknown alarm. [offset1] should not be reduced.
+  int offset2 = Frama_C_interval(0, 50);
+  q += offset2; // Unknown alarm. [offset2] should be reduced to [0..25].
+  q += 0; // No alarm.
+}
+
+/* Increment or decrement pointers in loops. */
+void pointer_in_loops () {
+  int t[128];
+  int *p = &t[0];
+  /*@ loop unroll 128; */
+  for (int i = 0; i < 128; i++) {
+    *p = i;
+    p++; // No alarm.
+  }
+  if (undet) {
+    int *q = &t[127];
+    /*@ loop unroll 128; */
+    for (int i = 0; i < 128; i++) {
+      *q = i;
+      q--; // Alarm in the last iteration: q points to t[-1].
+    }
+    Frama_C_show_each_bottom(q); // Should not be reached.
+  }
+}
+
+/* Conversion integer -> pointer. */
+void int_conversion () {
+  int x, *p;
+  p = (int *)0; // NULL pointer: always ok.
+  p = (int *) 20; // Inside -absolute-valid-range: no alarms.
+  if (undet) {
+    p = (int *) 42; // Outside -absolute-valid-range: red alarm.
+  }
+  x = Frama_C_interval(15, 25);
+  p = (int *) x; // Inside -absolute-valid-range: no alarms.
+  x = Frama_C_interval(100, 500);
+  if (undet) {
+    p = (int *) x; // Outside -absolute-valid-range: red alarm.
+  }
+  x = Frama_C_interval(15, 100);
+  p = (int *) x;     // Unknown alarm. [x] should be reduced to [15..31].
+  p = (int *) undet; // Unknown alarm. [p] should be have value in [0..31].
+}
+
+void addrof () {
+  int a[10], *p;
+  p = &(a[0]);
+  p = &(a[10]);
+  if (undet)
+    p = &(a[11]); // Invalid alarm
+  if (undet)
+    p = &(a[-1]); // Invalid alarm
+  int offset = undet;
+  p = &(a[offset]); /* Unknown alarm. [offset] should be reduced to [0..10]. */
+}
+
+typedef union {
+  uintptr_t integer;
+  int *pointer;
+} ptr_union;
+
+/* Creates invalid pointers through an union. */
+void union_pointer () {
+  int *p;
+  ptr_union u;
+  u.integer = 0;
+  p = u.pointer; // No alarm.
+  if (undet) {
+    u.integer = 42;
+    p = u.pointer; // Red alarm.
+  }
+  u.integer = undet;
+  p = u.pointer; // Unknown alarm. [u.integer] should be reduced to [0..31].
+}
+
+/* Creates invalid pointers through untyped writes. */
+void write_pointer () {
+  int x;
+  int *p = 0;
+  *((uintptr_t *) &p) = &x;
+  int *q = p; // No alarm.
+  *((uintptr_t *) &p) = (uintptr_t)p + undet;
+  q = p; // Unknown alarm.
+  *((uintptr_t *) &p) = 42;
+  if (undet) {
+    q = p; // Red alarm.
+  }
+}
+
+/* Tests the evaluation of the logical predicate \object_pointer when
+   -warn-invalid-pointer is disabled. */
+void object_pointer_predicate () {
+  int x, array[64];
+  int *p = &x;
+  /*@ assert \object_pointer(p); */
+  if (undet) {
+    p--;
+    /*@ assert \object_pointer(p); */
+  }
+  p++;
+  /*@ assert \object_pointer(p); */
+  if (undet) {
+    p++;
+    /*@ assert \object_pointer(p); */
+  }
+  p += undet;
+  /*@ assert \object_pointer(p); */
+  /*@ assert \object_pointer(p); */
+  Frama_C_show_each_object_pointer(p);
+  p = (int *)((uintptr_t)&x + undet);
+  /*@ assert \object_pointer(p); */
+  /*@ assert \object_pointer(p); */
+  Frama_C_show_each_object_pointer_char(p);
+  int i = Frama_C_interval(0, 20);
+  p = undet ? &x : &array[i];
+  /*@ assert \object_pointer(p); */
+  p += i;
+  /*@ assert \object_pointer(p); */
+  p += undet;
+  /*@ assert \object_pointer(p); */
+  Frama_C_show_each_object_pointer_array(p);
+  p = (int *) 0;
+  /*@ assert \object_pointer(p); */
+  if (undet)
+    p = (int *) 20;
+  /*@ assert \object_pointer(p); */
+  if (undet)
+    p = (int *) 50;
+  /*@ assert \object_pointer(p); */
+  p = (int *) undet;
+  /*@ assert \object_pointer(p); */
+  if (undet) {
+    p = (int *) 100;
+    /*@ assert \object_pointer(p); */
+  }
+}
+
+
+void main () {
+  pointer_computation ();
+  pointer_in_loops ();
+  int_conversion ();
+  addrof ();
+  union_pointer ();
+  write_pointer ();
+  object_pointer_predicate ();
+}
diff --git a/tests/value/oracle/invalid_pointer.0.res.oracle b/tests/value/oracle/invalid_pointer.0.res.oracle
new file mode 100644
index 00000000000..4f0f2133ff5
--- /dev/null
+++ b/tests/value/oracle/invalid_pointer.0.res.oracle
@@ -0,0 +1,409 @@
+[kernel] Parsing tests/value/invalid_pointer.c (with preprocessing)
+[kernel:typing:int-conversion] tests/value/invalid_pointer.c:111: Warning: 
+  Conversion from a pointer to an integer without an explicit cast
+[eva] Analyzing a complete application starting at main
+[eva] Computing initial state
+[eva] Initial state computed
+[eva:initial-state] Values of globals at initialization
+  NULL[rbits 80 to 247] ∈ [--..--]
+  undet ∈ [--..--]
+[eva] computing for function pointer_computation <- main.
+  Called from tests/value/invalid_pointer.c:171.
+[eva:alarm] tests/value/invalid_pointer.c:19: Warning: 
+  invalid pointer creation. assert \object_pointer(p - 1);
+[eva:alarm] tests/value/invalid_pointer.c:22: Warning: 
+  invalid pointer creation. assert \object_pointer(p + 1);
+[eva:alarm] tests/value/invalid_pointer.c:24: Warning: 
+  invalid pointer creation. assert \object_pointer(p + i);
+[eva:alarm] tests/value/invalid_pointer.c:26: Warning: 
+  invalid pointer creation. assert \object_pointer(p - j);
+[eva:alarm] tests/value/invalid_pointer.c:27: Warning: 
+  invalid pointer creation. assert \object_pointer(p - 1);
+[eva] computing for function Frama_C_interval <- pointer_computation <- main.
+  Called from tests/value/invalid_pointer.c:30.
+[eva] using specification for function Frama_C_interval
+[eva] tests/value/invalid_pointer.c:30: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva:alarm] tests/value/invalid_pointer.c:31: Warning: 
+  invalid pointer creation. assert \object_pointer(q + offset1);
+[eva] computing for function Frama_C_interval <- pointer_computation <- main.
+  Called from tests/value/invalid_pointer.c:32.
+[eva] tests/value/invalid_pointer.c:32: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva:alarm] tests/value/invalid_pointer.c:33: Warning: 
+  invalid pointer creation. assert \object_pointer(q + offset2);
+[eva] Recording results for pointer_computation
+[eva] Done for function pointer_computation
+[eva] computing for function pointer_in_loops <- main.
+  Called from tests/value/invalid_pointer.c:172.
+[eva] tests/value/invalid_pointer.c:42: 
+  Trace partitioning superposing up to 100 states
+[eva:alarm] tests/value/invalid_pointer.c:51: Warning: 
+  invalid pointer creation. assert \object_pointer(q - 1);
+[eva] Recording results for pointer_in_loops
+[eva] Done for function pointer_in_loops
+[eva] computing for function int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:173.
+[eva:alarm] tests/value/invalid_pointer.c:63: Warning: 
+  invalid pointer creation. assert \object_pointer((int *)42);
+[eva] computing for function Frama_C_interval <- int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:65.
+[eva] tests/value/invalid_pointer.c:65: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function Frama_C_interval <- int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:67.
+[eva] tests/value/invalid_pointer.c:67: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva:alarm] tests/value/invalid_pointer.c:69: Warning: 
+  invalid pointer creation. assert \object_pointer((int *)x);
+[eva] computing for function Frama_C_interval <- int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:71.
+[eva] tests/value/invalid_pointer.c:71: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva:alarm] tests/value/invalid_pointer.c:72: Warning: 
+  invalid pointer creation. assert \object_pointer((int *)x);
+[eva:alarm] tests/value/invalid_pointer.c:73: Warning: 
+  invalid pointer creation. assert \object_pointer((int *)undet);
+[eva] Recording results for int_conversion
+[eva] Done for function int_conversion
+[eva] computing for function addrof <- main.
+  Called from tests/value/invalid_pointer.c:174.
+[eva:alarm] tests/value/invalid_pointer.c:81: Warning: 
+  invalid pointer creation. assert \object_pointer(&a[11]);
+[eva:alarm] tests/value/invalid_pointer.c:83: Warning: 
+  invalid pointer creation. assert \object_pointer(&a[(int)(-1)]);
+[eva:alarm] tests/value/invalid_pointer.c:85: Warning: 
+  invalid pointer creation. assert \object_pointer(&a[offset]);
+[eva] Recording results for addrof
+[eva] Done for function addrof
+[eva] computing for function union_pointer <- main.
+  Called from tests/value/invalid_pointer.c:175.
+[eva:alarm] tests/value/invalid_pointer.c:101: Warning: 
+  invalid pointer creation. assert \object_pointer(u.pointer);
+[eva:alarm] tests/value/invalid_pointer.c:104: Warning: 
+  invalid pointer creation. assert \object_pointer(u.pointer);
+[eva] Recording results for union_pointer
+[eva] Done for function union_pointer
+[eva] computing for function write_pointer <- main.
+  Called from tests/value/invalid_pointer.c:176.
+[eva:alarm] tests/value/invalid_pointer.c:114: Warning: 
+  invalid pointer creation. assert \object_pointer(p);
+[eva:alarm] tests/value/invalid_pointer.c:117: Warning: 
+  invalid pointer creation. assert \object_pointer(p);
+[eva] Recording results for write_pointer
+[eva] Done for function write_pointer
+[eva] computing for function object_pointer_predicate <- main.
+  Called from tests/value/invalid_pointer.c:177.
+[eva] tests/value/invalid_pointer.c:126: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:128: Warning: 
+  invalid pointer creation. assert \object_pointer(p - 1);
+[eva] tests/value/invalid_pointer.c:132: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:134: Warning: 
+  invalid pointer creation. assert \object_pointer(p + 1);
+[eva:alarm] tests/value/invalid_pointer.c:137: Warning: 
+  invalid pointer creation. assert \object_pointer(p + undet);
+[eva] tests/value/invalid_pointer.c:138: assertion got status valid.
+[eva] tests/value/invalid_pointer.c:139: assertion got status valid.
+[eva] tests/value/invalid_pointer.c:140: 
+  Frama_C_show_each_object_pointer: {{ &x + {0; 4} }}
+[eva:alarm] tests/value/invalid_pointer.c:141: Warning: 
+  invalid pointer creation.
+  assert
+  \object_pointer((int *)((unsigned int)((unsigned int)(&x) +
+                                         (unsigned int)undet)));
+[eva] tests/value/invalid_pointer.c:142: assertion got status valid.
+[eva] tests/value/invalid_pointer.c:143: assertion got status valid.
+[eva] tests/value/invalid_pointer.c:144: 
+  Frama_C_show_each_object_pointer_char: {{ &x + {0; 1; 2; 3; 4} }}
+[eva] computing for function Frama_C_interval <- object_pointer_predicate <- main.
+  Called from tests/value/invalid_pointer.c:145.
+[eva] tests/value/invalid_pointer.c:145: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] tests/value/invalid_pointer.c:147: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:148: Warning: 
+  invalid pointer creation. assert \object_pointer(p + i);
+[eva] tests/value/invalid_pointer.c:149: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:150: Warning: 
+  invalid pointer creation. assert \object_pointer(p + undet);
+[eva] tests/value/invalid_pointer.c:151: assertion got status valid.
+[eva] tests/value/invalid_pointer.c:152: 
+  Frama_C_show_each_object_pointer_array:
+  {{ &x + {0; 4} ; &array + [0..256],0%4 }}
+[eva] tests/value/invalid_pointer.c:154: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:157: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/value/invalid_pointer.c:159: Warning: 
+  invalid pointer creation. assert \object_pointer((int *)50);
+[eva:alarm] tests/value/invalid_pointer.c:160: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/value/invalid_pointer.c:161: Warning: 
+  invalid pointer creation. assert \object_pointer((int *)undet);
+[eva:alarm] tests/value/invalid_pointer.c:162: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/value/invalid_pointer.c:164: Warning: 
+  invalid pointer creation. assert \object_pointer((int *)100);
+[eva] Recording results for object_pointer_predicate
+[eva] Done for function object_pointer_predicate
+[eva] Recording results for main
+[eva] done for function main
+[eva] tests/value/invalid_pointer.c:19: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:22: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:63: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:69: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:81: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:83: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:101: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:117: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:128: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:134: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:159: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[eva] tests/value/invalid_pointer.c:164: 
+  assertion 'Eva,pointer_value' got final status invalid.
+[scope:rm_asserts] removing 2 assertion(s)
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function addrof:
+  p ∈ {{ &a + [0..40],0%4 }}
+  offset ∈ [--..--]
+[eva:final-states] Values at end of function int_conversion:
+  Frama_C_entropy_source ∈ [--..--]
+  x ∈ [15..31]
+  p ∈ [0..31]
+[eva:final-states] Values at end of function object_pointer_predicate:
+  Frama_C_entropy_source ∈ [--..--]
+  p ∈ [0..31]
+  i ∈ [0..20]
+[eva:final-states] Values at end of function pointer_computation:
+  Frama_C_entropy_source ∈ [--..--]
+  p ∈ {{ &x }}
+  i ∈ {-1; 0}
+  j ∈ {-1; 0; 1}
+  q ∈ {{ &x + {0; 4} ; &array + [0..100],0%4 }}
+  offset1 ∈ [0..10]
+  offset2 ∈ [0..25]
+[eva:final-states] Values at end of function pointer_in_loops:
+  t[0] ∈ {0}
+   [1] ∈ {1}
+   [2] ∈ {2}
+   [3] ∈ {3}
+   [4] ∈ {4}
+   [5] ∈ {5}
+   [6] ∈ {6}
+   [7] ∈ {7}
+   [8] ∈ {8}
+   [9] ∈ {9}
+   [10] ∈ {10}
+   [11] ∈ {11}
+   [12] ∈ {12}
+   [13] ∈ {13}
+   [14] ∈ {14}
+   [15] ∈ {15}
+   [16] ∈ {16}
+   [17] ∈ {17}
+   [18] ∈ {18}
+   [19] ∈ {19}
+   [20] ∈ {20}
+   [21] ∈ {21}
+   [22] ∈ {22}
+   [23] ∈ {23}
+   [24] ∈ {24}
+   [25] ∈ {25}
+   [26] ∈ {26}
+   [27] ∈ {27}
+   [28] ∈ {28}
+   [29] ∈ {29}
+   [30] ∈ {30}
+   [31] ∈ {31}
+   [32] ∈ {32}
+   [33] ∈ {33}
+   [34] ∈ {34}
+   [35] ∈ {35}
+   [36] ∈ {36}
+   [37] ∈ {37}
+   [38] ∈ {38}
+   [39] ∈ {39}
+   [40] ∈ {40}
+   [41] ∈ {41}
+   [42] ∈ {42}
+   [43] ∈ {43}
+   [44] ∈ {44}
+   [45] ∈ {45}
+   [46] ∈ {46}
+   [47] ∈ {47}
+   [48] ∈ {48}
+   [49] ∈ {49}
+   [50] ∈ {50}
+   [51] ∈ {51}
+   [52] ∈ {52}
+   [53] ∈ {53}
+   [54] ∈ {54}
+   [55] ∈ {55}
+   [56] ∈ {56}
+   [57] ∈ {57}
+   [58] ∈ {58}
+   [59] ∈ {59}
+   [60] ∈ {60}
+   [61] ∈ {61}
+   [62] ∈ {62}
+   [63] ∈ {63}
+   [64] ∈ {64}
+   [65] ∈ {65}
+   [66] ∈ {66}
+   [67] ∈ {67}
+   [68] ∈ {68}
+   [69] ∈ {69}
+   [70] ∈ {70}
+   [71] ∈ {71}
+   [72] ∈ {72}
+   [73] ∈ {73}
+   [74] ∈ {74}
+   [75] ∈ {75}
+   [76] ∈ {76}
+   [77] ∈ {77}
+   [78] ∈ {78}
+   [79] ∈ {79}
+   [80] ∈ {80}
+   [81] ∈ {81}
+   [82] ∈ {82}
+   [83] ∈ {83}
+   [84] ∈ {84}
+   [85] ∈ {85}
+   [86] ∈ {86}
+   [87] ∈ {87}
+   [88] ∈ {88}
+   [89] ∈ {89}
+   [90] ∈ {90}
+   [91] ∈ {91}
+   [92] ∈ {92}
+   [93] ∈ {93}
+   [94] ∈ {94}
+   [95] ∈ {95}
+   [96] ∈ {96}
+   [97] ∈ {97}
+   [98] ∈ {98}
+   [99] ∈ {99}
+   [100] ∈ {100}
+   [101] ∈ {101}
+   [102] ∈ {102}
+   [103] ∈ {103}
+   [104] ∈ {104}
+   [105] ∈ {105}
+   [106] ∈ {106}
+   [107] ∈ {107}
+   [108] ∈ {108}
+   [109] ∈ {109}
+   [110] ∈ {110}
+   [111] ∈ {111}
+   [112] ∈ {112}
+   [113] ∈ {113}
+   [114] ∈ {114}
+   [115] ∈ {115}
+   [116] ∈ {116}
+   [117] ∈ {117}
+   [118] ∈ {118}
+   [119] ∈ {119}
+   [120] ∈ {120}
+   [121] ∈ {121}
+   [122] ∈ {122}
+   [123] ∈ {123}
+   [124] ∈ {124}
+   [125] ∈ {125}
+   [126] ∈ {126}
+   [127] ∈ {127}
+  p ∈ {{ &t[128] }}
+[eva:final-states] Values at end of function union_pointer:
+  p ∈ [0..31]
+  u{.integer; .pointer} ∈ [0..31]
+[eva:final-states] Values at end of function write_pointer:
+  p ∈ {42}
+  q ∈ {{ &x + {0; 1; 2; 3; 4} }}
+[eva:final-states] Values at end of function main:
+  Frama_C_entropy_source ∈ [--..--]
+[from] Computing for function addrof
+[from] Done for function addrof
+[from] Computing for function int_conversion
+[from] Computing for function Frama_C_interval <-int_conversion
+[from] Done for function Frama_C_interval
+[from] Done for function int_conversion
+[from] Computing for function object_pointer_predicate
+[from] Done for function object_pointer_predicate
+[from] Computing for function pointer_computation
+[from] Done for function pointer_computation
+[from] Computing for function pointer_in_loops
+[from] Done for function pointer_in_loops
+[from] Computing for function union_pointer
+[from] Done for function union_pointer
+[from] Computing for function write_pointer
+[from] Done for function write_pointer
+[from] Computing for function main
+[from] Done for function main
+[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 addrof:
+  NO EFFECTS
+[from] Function int_conversion:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] Function object_pointer_predicate:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] Function pointer_computation:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] Function pointer_in_loops:
+  NO EFFECTS
+[from] Function union_pointer:
+  NO EFFECTS
+[from] Function write_pointer:
+  NO EFFECTS
+[from] Function main:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] ====== END OF DEPENDENCIES ======
+[inout] Out (internal) for function addrof:
+    p; offset
+[inout] Inputs for function addrof:
+    undet
+[inout] Out (internal) for function int_conversion:
+    Frama_C_entropy_source; x; p
+[inout] Inputs for function int_conversion:
+    Frama_C_entropy_source; undet
+[inout] Out (internal) for function object_pointer_predicate:
+    Frama_C_entropy_source; p; i
+[inout] Inputs for function object_pointer_predicate:
+    Frama_C_entropy_source; undet
+[inout] Out (internal) for function pointer_computation:
+    Frama_C_entropy_source; p; i; j; q; tmp; offset1; offset2
+[inout] Inputs for function pointer_computation:
+    Frama_C_entropy_source; undet
+[inout] Out (internal) for function pointer_in_loops:
+    t[0..127]; p; i; q; i_0
+[inout] Inputs for function pointer_in_loops:
+    undet
+[inout] Out (internal) for function union_pointer:
+    p; u
+[inout] Inputs for function union_pointer:
+    undet
+[inout] Out (internal) for function write_pointer:
+    p; q
+[inout] Inputs for function write_pointer:
+    undet
+[inout] Out (internal) for function main:
+    Frama_C_entropy_source
+[inout] Inputs for function main:
+    Frama_C_entropy_source; undet
diff --git a/tests/value/oracle/invalid_pointer.1.res.oracle b/tests/value/oracle/invalid_pointer.1.res.oracle
new file mode 100644
index 00000000000..ccb4096a72d
--- /dev/null
+++ b/tests/value/oracle/invalid_pointer.1.res.oracle
@@ -0,0 +1,337 @@
+[kernel] Parsing tests/value/invalid_pointer.c (with preprocessing)
+[kernel:typing:int-conversion] tests/value/invalid_pointer.c:111: Warning: 
+  Conversion from a pointer to an integer without an explicit cast
+[eva] Analyzing a complete application starting at main
+[eva] Computing initial state
+[eva] Initial state computed
+[eva:initial-state] Values of globals at initialization
+  NULL[rbits 80 to 247] ∈ [--..--]
+  undet ∈ [--..--]
+[eva] computing for function pointer_computation <- main.
+  Called from tests/value/invalid_pointer.c:171.
+[eva] computing for function Frama_C_interval <- pointer_computation <- main.
+  Called from tests/value/invalid_pointer.c:30.
+[eva] using specification for function Frama_C_interval
+[eva] tests/value/invalid_pointer.c:30: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function Frama_C_interval <- pointer_computation <- main.
+  Called from tests/value/invalid_pointer.c:32.
+[eva] tests/value/invalid_pointer.c:32: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] Recording results for pointer_computation
+[eva] Done for function pointer_computation
+[eva] computing for function pointer_in_loops <- main.
+  Called from tests/value/invalid_pointer.c:172.
+[eva] tests/value/invalid_pointer.c:42: 
+  Trace partitioning superposing up to 100 states
+[eva] tests/value/invalid_pointer.c:53: 
+  Frama_C_show_each_bottom: {{ &t + {-4} }}
+[eva] Recording results for pointer_in_loops
+[eva] Done for function pointer_in_loops
+[eva] computing for function int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:173.
+[eva] computing for function Frama_C_interval <- int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:65.
+[eva] tests/value/invalid_pointer.c:65: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function Frama_C_interval <- int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:67.
+[eva] tests/value/invalid_pointer.c:67: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] computing for function Frama_C_interval <- int_conversion <- main.
+  Called from tests/value/invalid_pointer.c:71.
+[eva] tests/value/invalid_pointer.c:71: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] Recording results for int_conversion
+[eva] Done for function int_conversion
+[eva] computing for function addrof <- main.
+  Called from tests/value/invalid_pointer.c:174.
+[eva] Recording results for addrof
+[eva] Done for function addrof
+[eva] computing for function union_pointer <- main.
+  Called from tests/value/invalid_pointer.c:175.
+[eva] Recording results for union_pointer
+[eva] Done for function union_pointer
+[eva] computing for function write_pointer <- main.
+  Called from tests/value/invalid_pointer.c:176.
+[eva] Recording results for write_pointer
+[eva] Done for function write_pointer
+[eva] computing for function object_pointer_predicate <- main.
+  Called from tests/value/invalid_pointer.c:177.
+[eva] tests/value/invalid_pointer.c:126: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:129: Warning: 
+  assertion got status invalid (stopping propagation).
+[eva] tests/value/invalid_pointer.c:132: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:135: Warning: 
+  assertion got status invalid (stopping propagation).
+[eva:alarm] tests/value/invalid_pointer.c:138: Warning: 
+  assertion got status unknown.
+[eva] tests/value/invalid_pointer.c:139: assertion got status valid.
+[eva] tests/value/invalid_pointer.c:140: 
+  Frama_C_show_each_object_pointer: {{ &x + {0; 4} }}
+[eva:alarm] tests/value/invalid_pointer.c:142: Warning: 
+  assertion got status unknown.
+[eva] tests/value/invalid_pointer.c:143: assertion got status valid.
+[eva] tests/value/invalid_pointer.c:144: 
+  Frama_C_show_each_object_pointer_char: {{ &x + {0; 1; 2; 3; 4} }}
+[eva] computing for function Frama_C_interval <- object_pointer_predicate <- main.
+  Called from tests/value/invalid_pointer.c:145.
+[eva] tests/value/invalid_pointer.c:145: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva] tests/value/invalid_pointer.c:147: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:149: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/value/invalid_pointer.c:151: Warning: 
+  assertion got status unknown.
+[eva] tests/value/invalid_pointer.c:152: 
+  Frama_C_show_each_object_pointer_array:
+  {{ &x + {0; 4} ; &array + [0..256],0%4 }}
+[eva] tests/value/invalid_pointer.c:154: assertion got status valid.
+[eva:alarm] tests/value/invalid_pointer.c:157: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/value/invalid_pointer.c:160: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/value/invalid_pointer.c:162: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/value/invalid_pointer.c:165: Warning: 
+  assertion got status invalid (stopping propagation).
+[eva] Recording results for object_pointer_predicate
+[eva] Done for function object_pointer_predicate
+[eva] Recording results for main
+[eva] done for function main
+[scope:rm_asserts] removing 2 assertion(s)
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function addrof:
+  p ∈ {{ &a + [-8589934592..8589934588],0%4 }}
+  offset ∈ [--..--]
+[eva:final-states] Values at end of function int_conversion:
+  Frama_C_entropy_source ∈ [--..--]
+  x ∈ [15..100]
+  p ∈ [--..--]
+[eva:final-states] Values at end of function object_pointer_predicate:
+  Frama_C_entropy_source ∈ [--..--]
+  p ∈ [0..31]
+  i ∈ [0..20]
+[eva:final-states] Values at end of function pointer_computation:
+  Frama_C_entropy_source ∈ [--..--]
+  p ∈ {{ &x + [-17179869184..17179869184],0%4 }}
+  i ∈ [--..--]
+  j ∈ [--..--]
+  q ∈ {{ &x + [0..240],0%4 ; &array + [0..240],0%4 }}
+  offset1 ∈ [0..10]
+  offset2 ∈ [0..50]
+[eva:final-states] Values at end of function pointer_in_loops:
+  t[0] ∈ {0; 127}
+   [1] ∈ {1; 126}
+   [2] ∈ {2; 125}
+   [3] ∈ {3; 124}
+   [4] ∈ {4; 123}
+   [5] ∈ {5; 122}
+   [6] ∈ {6; 121}
+   [7] ∈ {7; 120}
+   [8] ∈ {8; 119}
+   [9] ∈ {9; 118}
+   [10] ∈ {10; 117}
+   [11] ∈ {11; 116}
+   [12] ∈ {12; 115}
+   [13] ∈ {13; 114}
+   [14] ∈ {14; 113}
+   [15] ∈ {15; 112}
+   [16] ∈ {16; 111}
+   [17] ∈ {17; 110}
+   [18] ∈ {18; 109}
+   [19] ∈ {19; 108}
+   [20] ∈ {20; 107}
+   [21] ∈ {21; 106}
+   [22] ∈ {22; 105}
+   [23] ∈ {23; 104}
+   [24] ∈ {24; 103}
+   [25] ∈ {25; 102}
+   [26] ∈ {26; 101}
+   [27] ∈ {27; 100}
+   [28] ∈ {28; 99}
+   [29] ∈ {29; 98}
+   [30] ∈ {30; 97}
+   [31] ∈ {31; 96}
+   [32] ∈ {32; 95}
+   [33] ∈ {33; 94}
+   [34] ∈ {34; 93}
+   [35] ∈ {35; 92}
+   [36] ∈ {36; 91}
+   [37] ∈ {37; 90}
+   [38] ∈ {38; 89}
+   [39] ∈ {39; 88}
+   [40] ∈ {40; 87}
+   [41] ∈ {41; 86}
+   [42] ∈ {42; 85}
+   [43] ∈ {43; 84}
+   [44] ∈ {44; 83}
+   [45] ∈ {45; 82}
+   [46] ∈ {46; 81}
+   [47] ∈ {47; 80}
+   [48] ∈ {48; 79}
+   [49] ∈ {49; 78}
+   [50] ∈ {50; 77}
+   [51] ∈ {51; 76}
+   [52] ∈ {52; 75}
+   [53] ∈ {53; 74}
+   [54] ∈ {54; 73}
+   [55] ∈ {55; 72}
+   [56] ∈ {56; 71}
+   [57] ∈ {57; 70}
+   [58] ∈ {58; 69}
+   [59] ∈ {59; 68}
+   [60] ∈ {60; 67}
+   [61] ∈ {61; 66}
+   [62] ∈ {62; 65}
+   [63..64] ∈ {63; 64}
+   [65] ∈ {62; 65}
+   [66] ∈ {61; 66}
+   [67] ∈ {60; 67}
+   [68] ∈ {59; 68}
+   [69] ∈ {58; 69}
+   [70] ∈ {57; 70}
+   [71] ∈ {56; 71}
+   [72] ∈ {55; 72}
+   [73] ∈ {54; 73}
+   [74] ∈ {53; 74}
+   [75] ∈ {52; 75}
+   [76] ∈ {51; 76}
+   [77] ∈ {50; 77}
+   [78] ∈ {49; 78}
+   [79] ∈ {48; 79}
+   [80] ∈ {47; 80}
+   [81] ∈ {46; 81}
+   [82] ∈ {45; 82}
+   [83] ∈ {44; 83}
+   [84] ∈ {43; 84}
+   [85] ∈ {42; 85}
+   [86] ∈ {41; 86}
+   [87] ∈ {40; 87}
+   [88] ∈ {39; 88}
+   [89] ∈ {38; 89}
+   [90] ∈ {37; 90}
+   [91] ∈ {36; 91}
+   [92] ∈ {35; 92}
+   [93] ∈ {34; 93}
+   [94] ∈ {33; 94}
+   [95] ∈ {32; 95}
+   [96] ∈ {31; 96}
+   [97] ∈ {30; 97}
+   [98] ∈ {29; 98}
+   [99] ∈ {28; 99}
+   [100] ∈ {27; 100}
+   [101] ∈ {26; 101}
+   [102] ∈ {25; 102}
+   [103] ∈ {24; 103}
+   [104] ∈ {23; 104}
+   [105] ∈ {22; 105}
+   [106] ∈ {21; 106}
+   [107] ∈ {20; 107}
+   [108] ∈ {19; 108}
+   [109] ∈ {18; 109}
+   [110] ∈ {17; 110}
+   [111] ∈ {16; 111}
+   [112] ∈ {15; 112}
+   [113] ∈ {14; 113}
+   [114] ∈ {13; 114}
+   [115] ∈ {12; 115}
+   [116] ∈ {11; 116}
+   [117] ∈ {10; 117}
+   [118] ∈ {9; 118}
+   [119] ∈ {8; 119}
+   [120] ∈ {7; 120}
+   [121] ∈ {6; 121}
+   [122] ∈ {5; 122}
+   [123] ∈ {4; 123}
+   [124] ∈ {3; 124}
+   [125] ∈ {2; 125}
+   [126] ∈ {1; 126}
+   [127] ∈ {0; 127}
+  p ∈ {{ &t[128] }}
+[eva:final-states] Values at end of function union_pointer:
+  p ∈ [--..--]
+  u ∈ [--..--]
+[eva:final-states] Values at end of function write_pointer:
+  p ∈ {42}
+  q ∈ {{ NULL + {42} ; &x + [0..4294967295] }}
+[eva:final-states] Values at end of function main:
+  Frama_C_entropy_source ∈ [--..--]
+[from] Computing for function addrof
+[from] Done for function addrof
+[from] Computing for function int_conversion
+[from] Computing for function Frama_C_interval <-int_conversion
+[from] Done for function Frama_C_interval
+[from] Done for function int_conversion
+[from] Computing for function object_pointer_predicate
+[from] Done for function object_pointer_predicate
+[from] Computing for function pointer_computation
+[from] Done for function pointer_computation
+[from] Computing for function pointer_in_loops
+[from] Done for function pointer_in_loops
+[from] Computing for function union_pointer
+[from] Done for function union_pointer
+[from] Computing for function write_pointer
+[from] Done for function write_pointer
+[from] Computing for function main
+[from] Done for function main
+[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 addrof:
+  NO EFFECTS
+[from] Function int_conversion:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] Function object_pointer_predicate:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] Function pointer_computation:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] Function pointer_in_loops:
+  NO EFFECTS
+[from] Function union_pointer:
+  NO EFFECTS
+[from] Function write_pointer:
+  NO EFFECTS
+[from] Function main:
+  Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF)
+[from] ====== END OF DEPENDENCIES ======
+[inout] Out (internal) for function addrof:
+    p; offset
+[inout] Inputs for function addrof:
+    undet
+[inout] Out (internal) for function int_conversion:
+    Frama_C_entropy_source; x; p
+[inout] Inputs for function int_conversion:
+    Frama_C_entropy_source; undet
+[inout] Out (internal) for function object_pointer_predicate:
+    Frama_C_entropy_source; p; i
+[inout] Inputs for function object_pointer_predicate:
+    Frama_C_entropy_source; undet
+[inout] Out (internal) for function pointer_computation:
+    Frama_C_entropy_source; p; i; j; q; tmp; offset1; offset2
+[inout] Inputs for function pointer_computation:
+    Frama_C_entropy_source; undet
+[inout] Out (internal) for function pointer_in_loops:
+    t[0..127]; p; i; q; i_0
+[inout] Inputs for function pointer_in_loops:
+    undet
+[inout] Out (internal) for function union_pointer:
+    p; u
+[inout] Inputs for function union_pointer:
+    undet
+[inout] Out (internal) for function write_pointer:
+    p; q
+[inout] Inputs for function write_pointer:
+    undet
+[inout] Out (internal) for function main:
+    Frama_C_entropy_source
+[inout] Inputs for function main:
+    Frama_C_entropy_source; undet
-- 
GitLab