From 57c8e5094dad03537791f512b96130a7ccbc247e Mon Sep 17 00:00:00 2001 From: Patrick Baudin <patrick.baudin@cea.fr> Date: Thu, 21 Feb 2019 13:55:54 +0100 Subject: [PATCH] [WP/test] adding a test initializing multidimentianal arrays --- .../wp_typed/oracle/user_init.0.res.oracle | 777 ++++++++++++++++++ .../wp_typed/oracle/user_init.1.res.oracle | 777 ++++++++++++++++++ .../oracle_qualif/user_init.0.report.json | 217 ++++- .../oracle_qualif/user_init.i.0.report.json | 217 ++++- .../oracle_qualif/user_init.res.oracle | 59 +- src/plugins/wp/tests/wp_typed/user_init.i | 60 ++ 6 files changed, 2095 insertions(+), 12 deletions(-) diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle index 6002f927642..7b2ee670197 100644 --- a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle @@ -2,6 +2,8 @@ [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing) [wp] Running WP plugin... [wp] Loading driver 'share/wp.driver' +[wp] [CFG] Goal init_t1_exits : Valid (Unreachable) +[wp] [CFG] Goal init_t2_exits : Valid (Unreachable) [wp] Warning: Missing RTE guards ------------------------------------------------------------ Function init @@ -116,3 +118,778 @@ Effect at line 12 Prove: true. ------------------------------------------------------------ +------------------------------------------------------------ + Function init_t1 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 16) in 'init_t1': +Assume { + Type: is_uint32(i_1). + (* Goal *) + When: (0 <= i) /\ (i <= 9). + (* Invariant 'Partial' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) -> (t1_0[i_2] = v))). + (* Invariant 'Range' *) + Have: (0 <= i_1) /\ (i_1 <= 10). + (* Else *) + Have: 10 <= i_1. +} +Prove: t1_0[i] = v. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 23): +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)). + (* Invariant 'Partial' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> (t1_0[i_2] = v))). + (* Invariant 'Range' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. +} +Prove: t1_0[i <- v][i_1] = v. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 23): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range' (file tests/wp_typed/user_init.i, line 22): +Assume { + Type: is_uint32(i). + (* Invariant 'Partial' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))). + (* Invariant 'Range' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. +} +Prove: to_uint32(1 + i) <= 10. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range' (file tests/wp_typed/user_init.i, line 22): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 24): +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 18) in 'init_t1' (1/2): +Effect at line 26 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 18) in 'init_t1' (2/2): +Effect at line 26 +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function init_t2 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 30) in 'init_t2': +Assume { + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> (t2_0[i_3][i_2] = v))))). +} +Prove: t2_0[i][i_1] = v. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 39): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_2[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_2[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). +} +Prove: m[0] = t2_0[i_1][i_2]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 39): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 38): +Assume { + Type: is_uint32(i). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Previous_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + (* Invariant 'Partial_j' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))). +} +Prove: to_uint32(1 + i) <= 10. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 38): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 44): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_1[i_3][i_2] = t2_2[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_2[i_3][i_2] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_0[i_3][i_2] = t2_2[i_3][i_2])))))). + (* Invariant 'Previous_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_2[i_3][i_2]))))). + (* Invariant 'Partial_j' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: m[j <- v][i_1] = v. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 44): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 45): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: t2_0[i <- m[j <- v]][i_1][i_2] = t2_1[i_1][i_2]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 45): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 43): +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Previous_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + (* Invariant 'Partial_j' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: to_uint32(1 + j) <= 20. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 43): +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'j' (file tests/wp_typed/user_init.i, line 50): +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'i' (file tests/wp_typed/user_init.i, line 53): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 37) (1/3): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 37) (2/3): +Effect at line 41 +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (t2_2[i][i_3] = v))). +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 37) (3/3): +Effect at line 47 +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (t2_2[i][i_3] = v))). +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 42) (1/3): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 42) (2/3): +Effect at line 47 +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (t2_2[i][i_3] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 42) (3/3): +Effect at line 48 +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: i <= 10. + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Previous_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + (* Invariant 'Partial_j' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + (* Invariant 'Range_j' *) + Have: j <= 20. +} +Prove: exists i_2,i_1 : Z. (i_2 <= i) /\ (i_1 <= j) /\ (0 <= i_1) /\ + (j <= i_1) /\ (0 <= i_2) /\ (i <= i_2) /\ (i_2 <= 9) /\ (i_1 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 32) in 'init_t2' (1/2): +Effect at line 41 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 32) in 'init_t2' (2/2): +Effect at line 41 +Assume { + Have: 0 <= i_2. + Have: 0 <= i_3. + Have: i_2 <= 9. + Have: i_3 <= 19. + Have: 0 <= i. + Have: 0 <= i_1. + Have: i <= 9. + Have: i_1 <= 19. + (* Loop assigns ... *) + Have: forall i_5,i_4 : Z. ((0 <= i_4) -> ((0 <= i_5) -> ((i_5 <= 9) -> + ((i_4 <= 19) -> + (((i_4 < 0) \/ (i_5 < 0) \/ (10 <= i_5) \/ (20 <= i_4)) -> + (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). +} +Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_4) /\ + (i_1 <= i_4) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_5 <= 9) /\ (i_4 <= 19). + +------------------------------------------------------------ +------------------------------------------------------------ + Function init_t2_bis +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 57) in 'init_t2_bis': +Assume { + Type: is_sint32(v). + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> (t2_0[i_3][i_2] = v))))). +} +Prove: t2_0[i][i_1] = v. + +------------------------------------------------------------ + +Goal Exit-condition (file tests/wp_typed/user_init.i, line 59) in 'init_t2_bis': +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Exit Effects *) + Have: (forall i_1 : Z. ((i_1 != i) -> (t2_2[i_1] = t2_1[i_1]))) /\ + (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> + (((i_1 < 0) \/ (20 <= i_1)) -> (t2_2[i][i_1] = t2_1[i][i_1]))))). +} +Prove: false. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 66): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Call 'init' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). + (* Call Effects *) + Have: (forall i_3 : Z. ((i_3 != i) -> (t2_2[i_3] = t2_0[i_3]))) /\ + (forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> + (((i_3 < 0) \/ (20 <= i_3)) -> (t2_2[i][i_3] = m[i_3]))))). +} +Prove: m[0] = t2_0[i_1][i_2]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 66): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 65): +Let m = t2_2[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Call 'init' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (m[i_1] = v))). + (* Call Effects *) + Have: (forall i_1 : Z. ((i_1 != i) -> (t2_1[i_1] = t2_2[i_1]))) /\ + (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> + (((i_1 < 0) \/ (20 <= i_1)) -> (t2_1[i][i_1] = m[i_1]))))). +} +Prove: to_uint32(1 + i) <= 10. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 65): +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'i' (file tests/wp_typed/user_init.i, line 71): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 64) (1/3): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 64) (2/3): +Effect at line 68 +Let m = t2_2[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Call 'init' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). + (* Call Effects *) + Have: (forall i_3 : Z. ((i_3 != i) -> (t2_1[i_3] = t2_2[i_3]))) /\ + (forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> + (((i_3 < 0) \/ (20 <= i_3)) -> (t2_1[i][i_3] = m[i_3]))))). +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 64) (3/3): +Call Effect at line 69 +Let m = t2_2[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_0[i_3][i_2] = t2_1[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))). + (* Invariant 'Range_i' *) + Have: i <= 10. + (* Call 'init' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) -> (m[i_2] = v))). + (* Call Effects *) + Have: (forall i_2 : Z. ((i_2 != i) -> (t2_1[i_2] = t2_2[i_2]))) /\ + (forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) -> + (((i_2 < 0) \/ (20 <= i_2)) -> (t2_1[i][i_2] = m[i_2]))))). +} +Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_2) /\ + (i_1 <= i_2) /\ (0 <= i_3) /\ (i <= i_3) /\ (i_3 <= 9) /\ (i_2 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (1/3): +Effect at line 68 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (2/3): +Effect at line 68 +Assume { + Have: 0 <= i_2. + Have: 0 <= i_3. + Have: i_2 <= 9. + Have: i_3 <= 19. + Have: 0 <= i. + Have: 0 <= i_1. + Have: i <= 9. + Have: i_1 <= 19. + (* Loop assigns ... *) + Have: forall i_5,i_4 : Z. ((0 <= i_4) -> ((0 <= i_5) -> ((i_5 <= 9) -> + ((i_4 <= 19) -> + (((i_4 < 0) \/ (i_5 < 0) \/ (10 <= i_5) \/ (20 <= i_4)) -> + (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). +} +Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_4) /\ + (i_1 <= i_4) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_5 <= 9) /\ (i_4 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (3/3): +Call Effect at line 69 +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_0[i_3][i_2] = t2_1[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))). + (* Invariant 'Range_i' *) + Have: i <= 10. + (* Exit Effects *) + Have: (forall i_2 : Z. ((i_2 != i) -> (t2_2[i_2] = t2_1[i_2]))) /\ + (forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) -> + (((i_2 < 0) \/ (20 <= i_2)) -> (t2_2[i][i_2] = t2_1[i][i_2]))))). +} +Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_2) /\ + (i_1 <= i_2) /\ (0 <= i_3) /\ (i <= i_3) /\ (i_3 <= 9) /\ (i_2 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (1/2): +Effect at line 68 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (2/2): +Effect at line 68 +Assume { + Have: 0 <= i_2. + Have: 0 <= i_3. + Have: i_2 <= 9. + Have: i_3 <= 19. + Have: 0 <= i. + Have: 0 <= i_1. + Have: i <= 9. + Have: i_1 <= 19. + (* Loop assigns ... *) + Have: forall i_5,i_4 : Z. ((0 <= i_4) -> ((0 <= i_5) -> ((i_5 <= 9) -> + ((i_4 <= 19) -> + (((i_4 < 0) \/ (i_5 < 0) \/ (10 <= i_5) \/ (20 <= i_4)) -> + (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). +} +Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_4) /\ + (i_1 <= i_4) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_5 <= 9) /\ (i_4 <= 19). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_init.i, line 1) in 'init'' in 'init_t2_bis' at call 'init' (file tests/wp_typed/user_init.i, line 69) +: +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_init.i, line 2) in 'init'' in 'init_t2_bis' at call 'init' (file tests/wp_typed/user_init.i, line 69) +: +Prove: true. + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle index 69788521bcf..fa09d252394 100644 --- a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle @@ -2,6 +2,8 @@ [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing) [wp] Running WP plugin... [wp] Loading driver 'share/wp.driver' +[wp] [CFG] Goal init_t1_exits : Valid (Unreachable) +[wp] [CFG] Goal init_t2_exits : Valid (Unreachable) [wp] Warning: Missing RTE guards ------------------------------------------------------------ Function init @@ -116,3 +118,778 @@ Effect at line 12 Prove: true. ------------------------------------------------------------ +------------------------------------------------------------ + Function init_t1 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 16) in 'init_t1': +Assume { + Type: is_uint32(i_1). + (* Goal *) + When: (0 <= i) /\ (i <= 9). + (* Invariant 'Partial' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) -> (t1_0[i_2] = v))). + (* Invariant 'Range' *) + Have: (0 <= i_1) /\ (i_1 <= 10). + (* Else *) + Have: 10 <= i_1. +} +Prove: t1_0[i] = v. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 23): +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)). + (* Invariant 'Partial' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> (t1_0[i_2] = v))). + (* Invariant 'Range' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. +} +Prove: t1_0[i <- v][i_1] = v. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial' (file tests/wp_typed/user_init.i, line 23): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range' (file tests/wp_typed/user_init.i, line 22): +Assume { + Type: is_uint32(i). + (* Invariant 'Partial' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> (t1_0[i_1] = v))). + (* Invariant 'Range' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. +} +Prove: to_uint32(1 + i) <= 10. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range' (file tests/wp_typed/user_init.i, line 22): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 24): +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 18) in 'init_t1' (1/2): +Effect at line 26 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 18) in 'init_t1' (2/2): +Effect at line 26 +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function init_t2 +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 30) in 'init_t2': +Assume { + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> (t2_0[i_3][i_2] = v))))). +} +Prove: t2_0[i][i_1] = v. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 39): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_2[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_2[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). +} +Prove: m[0] = t2_0[i_1][i_2]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 39): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 38): +Assume { + Type: is_uint32(i). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Previous_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + (* Invariant 'Partial_j' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))). +} +Prove: to_uint32(1 + i) <= 10. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 38): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 44): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_1[i_3][i_2] = t2_2[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_2[i_3][i_2] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_0[i_3][i_2] = t2_2[i_3][i_2])))))). + (* Invariant 'Previous_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_2[i_3][i_2]))))). + (* Invariant 'Partial_j' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: m[j <- v][i_1] = v. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, line 44): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 45): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (m[i_3] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: t2_0[i <- m[j <- v]][i_1][i_2] = t2_1[i_1][i_2]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Previous_i' (file tests/wp_typed/user_init.i, line 45): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 43): +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Previous_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + (* Invariant 'Partial_j' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: to_uint32(1 + j) <= 20. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 43): +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'j' (file tests/wp_typed/user_init.i, line 50): +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'i' (file tests/wp_typed/user_init.i, line 53): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 37) (1/3): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 37) (2/3): +Effect at line 41 +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (t2_2[i][i_3] = v))). +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 37) (3/3): +Effect at line 47 +Assume { + Type: is_uint32(i). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (t2_2[i][i_3] = v))). +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 42) (1/3): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 42) (2/3): +Effect at line 47 +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Previous_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = t2_1[i_4][i_3]))))). + (* Invariant 'Partial_j' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 < j) -> (t2_2[i][i_3] = v))). + (* Invariant 'Range_j' *) + Have: (0 <= j) /\ (j <= 20). + (* Then *) + Have: j <= 19. +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 42) (3/3): +Effect at line 48 +Assume { + Type: is_uint32(i) /\ is_uint32(j). + (* Goal *) + When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: i <= 10. + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Previous_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + (* Invariant 'Partial_j' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + (* Invariant 'Range_j' *) + Have: j <= 20. +} +Prove: exists i_2,i_1 : Z. (i_2 <= i) /\ (i_1 <= j) /\ (0 <= i_1) /\ + (j <= i_1) /\ (0 <= i_2) /\ (i <= i_2) /\ (i_2 <= 9) /\ (i_1 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 32) in 'init_t2' (1/2): +Effect at line 41 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 32) in 'init_t2' (2/2): +Effect at line 41 +Assume { + Have: 0 <= i_2. + Have: 0 <= i_3. + Have: i_2 <= 9. + Have: i_3 <= 19. + Have: 0 <= i. + Have: 0 <= i_1. + Have: i <= 9. + Have: i_1 <= 19. + (* Loop assigns ... *) + Have: forall i_5,i_4 : Z. ((0 <= i_4) -> ((0 <= i_5) -> ((i_5 <= 9) -> + ((i_4 <= 19) -> + (((i_4 < 0) \/ (i_5 < 0) \/ (10 <= i_5) \/ (20 <= i_4)) -> + (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). +} +Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_4) /\ + (i_1 <= i_4) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_5 <= 9) /\ (i_4 <= 19). + +------------------------------------------------------------ +------------------------------------------------------------ + Function init_t2_bis +------------------------------------------------------------ + +Goal Post-condition (file tests/wp_typed/user_init.i, line 57) in 'init_t2_bis': +Assume { + Type: is_sint32(v). + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> (t2_0[i_3][i_2] = v))))). +} +Prove: t2_0[i][i_1] = v. + +------------------------------------------------------------ + +Goal Exit-condition (file tests/wp_typed/user_init.i, line 59) in 'init_t2_bis': +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Exit Effects *) + Have: (forall i_1 : Z. ((i_1 != i) -> (t2_2[i_1] = t2_1[i_1]))) /\ + (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> + (((i_1 < 0) \/ (20 <= i_1)) -> (t2_2[i][i_1] = t2_1[i][i_1]))))). +} +Prove: false. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 66): +Let m = t2_0[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Call 'init' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). + (* Call Effects *) + Have: (forall i_3 : Z. ((i_3 != i) -> (t2_2[i_3] = t2_0[i_3]))) /\ + (forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> + (((i_3 < 0) \/ (20 <= i_3)) -> (t2_2[i][i_3] = m[i_3]))))). +} +Prove: m[0] = t2_0[i_1][i_2]. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Partial_i' (file tests/wp_typed/user_init.i, line 66): +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 65): +Let m = t2_2[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Loop assigns ... *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 <= 9) -> + ((i_1 <= 19) -> + (((i_1 < 0) \/ (i_2 < 0) \/ (10 <= i_2) \/ (20 <= i_1)) -> + (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). + (* Invariant 'Partial_i' *) + Have: forall i_2,i_1 : Z. ((0 <= i_1) -> ((0 <= i_2) -> ((i_2 < i) -> + ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Call 'init' *) + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (m[i_1] = v))). + (* Call Effects *) + Have: (forall i_1 : Z. ((i_1 != i) -> (t2_1[i_1] = t2_2[i_1]))) /\ + (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> + (((i_1 < 0) \/ (20 <= i_1)) -> (t2_1[i][i_1] = m[i_1]))))). +} +Prove: to_uint32(1 + i) <= 10. + +------------------------------------------------------------ + +Goal Establishment of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 65): +Prove: true. + +------------------------------------------------------------ + +Goal Assertion 'i' (file tests/wp_typed/user_init.i, line 71): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 64) (1/3): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 64) (2/3): +Effect at line 68 +Let m = t2_2[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 <= 9) /\ (i_2 <= 19). + (* Loop assigns ... *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (((i_3 < 0) \/ (i_4 < 0) \/ (10 <= i_4) \/ (20 <= i_3)) -> + (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). + (* Invariant 'Partial_i' *) + Have: forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 < i) -> + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). + (* Invariant 'Range_i' *) + Have: (0 <= i) /\ (i <= 10). + (* Then *) + Have: i <= 9. + (* Call 'init' *) + Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). + (* Call Effects *) + Have: (forall i_3 : Z. ((i_3 != i) -> (t2_1[i_3] = t2_2[i_3]))) /\ + (forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> + (((i_3 < 0) \/ (20 <= i_3)) -> (t2_1[i][i_3] = m[i_3]))))). +} +Prove: (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> false))))) \/ + (forall i_4,i_3 : Z. ((0 <= i_3) -> ((0 <= i_4) -> ((i_4 <= 9) -> + ((i_3 <= 19) -> + (exists i_6,i_5 : Z. (0 <= i_5) /\ (i_3 <= i_5) /\ (0 <= i_6) /\ + (i_4 <= i_6) /\ (i_5 <= i_3) /\ (i_6 <= i_4) /\ (i_6 <= 9) /\ + (i_5 <= 19))))))). + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_typed/user_init.i, line 64) (3/3): +Call Effect at line 69 +Let m = t2_2[i]. +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_0[i_3][i_2] = t2_1[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))). + (* Invariant 'Range_i' *) + Have: i <= 10. + (* Call 'init' *) + Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) -> (m[i_2] = v))). + (* Call Effects *) + Have: (forall i_2 : Z. ((i_2 != i) -> (t2_1[i_2] = t2_2[i_2]))) /\ + (forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) -> + (((i_2 < 0) \/ (20 <= i_2)) -> (t2_1[i][i_2] = m[i_2]))))). +} +Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_2) /\ + (i_1 <= i_2) /\ (0 <= i_3) /\ (i <= i_3) /\ (i_3 <= 9) /\ (i_2 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (1/3): +Effect at line 68 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (2/3): +Effect at line 68 +Assume { + Have: 0 <= i_2. + Have: 0 <= i_3. + Have: i_2 <= 9. + Have: i_3 <= 19. + Have: 0 <= i. + Have: 0 <= i_1. + Have: i <= 9. + Have: i_1 <= 19. + (* Loop assigns ... *) + Have: forall i_5,i_4 : Z. ((0 <= i_4) -> ((0 <= i_5) -> ((i_5 <= 9) -> + ((i_4 <= 19) -> + (((i_4 < 0) \/ (i_5 < 0) \/ (10 <= i_5) \/ (20 <= i_4)) -> + (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). +} +Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_4) /\ + (i_1 <= i_4) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_5 <= 9) /\ (i_4 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (3/3): +Call Effect at line 69 +Assume { + Type: is_uint32(i) /\ is_sint32(v). + (* Goal *) + When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). + (* Loop assigns ... *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 <= 9) -> + ((i_2 <= 19) -> + (((i_2 < 0) \/ (i_3 < 0) \/ (10 <= i_3) \/ (20 <= i_2)) -> + (t2_0[i_3][i_2] = t2_1[i_3][i_2])))))). + (* Invariant 'Partial_i' *) + Have: forall i_3,i_2 : Z. ((0 <= i_2) -> ((0 <= i_3) -> ((i_3 < i) -> + ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))). + (* Invariant 'Range_i' *) + Have: i <= 10. + (* Exit Effects *) + Have: (forall i_2 : Z. ((i_2 != i) -> (t2_2[i_2] = t2_1[i_2]))) /\ + (forall i_2 : Z. ((0 <= i_2) -> ((i_2 <= 19) -> + (((i_2 < 0) \/ (20 <= i_2)) -> (t2_2[i][i_2] = t2_1[i][i_2]))))). +} +Prove: exists i_3,i_2 : Z. (i_3 <= i) /\ (i_2 <= i_1) /\ (0 <= i_2) /\ + (i_1 <= i_2) /\ (0 <= i_3) /\ (i <= i_3) /\ (i_3 <= 9) /\ (i_2 <= 19). + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (1/2): +Effect at line 68 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_typed/user_init.i, line 58) in 'init_t2_bis' (2/2): +Effect at line 68 +Assume { + Have: 0 <= i_2. + Have: 0 <= i_3. + Have: i_2 <= 9. + Have: i_3 <= 19. + Have: 0 <= i. + Have: 0 <= i_1. + Have: i <= 9. + Have: i_1 <= 19. + (* Loop assigns ... *) + Have: forall i_5,i_4 : Z. ((0 <= i_4) -> ((0 <= i_5) -> ((i_5 <= 9) -> + ((i_4 <= 19) -> + (((i_4 < 0) \/ (i_5 < 0) \/ (10 <= i_5) \/ (20 <= i_4)) -> + (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). +} +Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_4) /\ + (i_1 <= i_4) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_5 <= 9) /\ (i_4 <= 19). + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_init.i, line 1) in 'init'' in 'init_t2_bis' at call 'init' (file tests/wp_typed/user_init.i, line 69) +: +Prove: true. + +------------------------------------------------------------ + +Goal Instance of 'Pre-condition (file tests/wp_typed/user_init.i, line 2) in 'init'' in 'init_t2_bis' at call 'init' (file tests/wp_typed/user_init.i, line 69) +: +Prove: true. + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.report.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.report.json index ab542867843..7bfbab0fa17 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.report.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.report.json @@ -1,6 +1,8 @@ -{ "wp:global": { "alt-ergo": { "total": 4, "valid": 4, "rank": 19 }, - "qed": { "total": 4, "valid": 4 }, - "wp:main": { "total": 8, "valid": 8, "rank": 19 } }, +{ "wp:global": { "alt-ergo": { "total": 27, "valid": 16, "unknown": 11, + "rank": 19 }, + "qed": { "total": 27, "valid": 27 }, + "wp:main": { "total": 54, "valid": 43, "unknown": 11, + "rank": 19 } }, "wp:functions": { "init": { "init_loop_invariant_Partial": { "alt-ergo": { "total": 1, "valid": 1, @@ -47,4 +49,211 @@ "valid": 4 }, "wp:main": { "total": 8, "valid": 8, - "rank": 19 } } } } } + "rank": 19 } } }, + "init_t1": { "init_t1_loop_invariant_Partial": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 4 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 4 } }, + "init_t1_loop_invariant_Range": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 2 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 2 } }, + "init_t1_assigns": { "qed": { "total": 2, + "valid": 2 }, + "wp:main": { "total": 2, + "valid": 2 } }, + "init_t1_loop_assigns": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 1, + "valid": 1 } }, + "init_t1_ensures": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 3 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 3 } }, + "wp:section": { "alt-ergo": { "total": 3, + "valid": 3, + "rank": 4 }, + "qed": { "total": 5, + "valid": 5 }, + "wp:main": { "total": 8, + "valid": 8, + "rank": 4 } } }, + "init_t2": { "init_t2_assert_i": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "init_t2_assert_j": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "init_t2_loop_invariant_Previous_i": + { "alt-ergo": { "total": 1, "valid": 1, + "rank": 5 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 5 } }, + "init_t2_loop_invariant_Partial_j": + { "alt-ergo": { "total": 1, "valid": 1, + "rank": 8 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 8 } }, + "init_t2_loop_invariant_Range_j": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 3 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 3 } }, + "init_t2_loop_invariant_Partial_i": + { "alt-ergo": { "total": 1, "valid": 1, + "rank": 11 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 11 } }, + "init_t2_loop_invariant_Range_i": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 2 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 2 } }, + "init_t2_assigns": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 2, + "valid": 1, + "unknown": 1 } }, + "init_t2_loop_assigns_2": { "alt-ergo": + { "total": 2, + "unknown": 2 }, + "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 3, + "valid": 1, + "unknown": 2 } }, + "init_t2_loop_assigns": { "alt-ergo": + { "total": 2, + "unknown": 2 }, + "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 3, + "valid": 1, + "unknown": 2 } }, + "init_t2_ensures": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 2 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 2 } }, + "wp:section": { "alt-ergo": { "total": 11, + "valid": 6, + "unknown": 5, + "rank": 11 }, + "qed": { "total": 10, + "valid": 10 }, + "wp:main": { "total": 21, + "valid": 16, + "unknown": 5, + "rank": 11 } } }, + "init_t2_bis": { "init_requires_2": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 1, + "valid": 1 } }, + "init_requires": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "init_t2_bis_assert_i": { "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 1, + "valid": 1 } }, + "init_t2_bis_loop_invariant_Partial_i": + { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 10 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 10 } }, + "init_t2_bis_loop_invariant_Range_i": + { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 3 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 3 } }, + "init_t2_bis_assigns": { "alt-ergo": + { "total": 3, + "unknown": 3 }, + "qed": + { "total": 2, + "valid": 2 }, + "wp:main": + { "total": 5, + "valid": 2, + "unknown": 3 } }, + "init_t2_bis_loop_assigns": { "alt-ergo": + { "total": 2, + "unknown": 2 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 3, + "valid": 1, + "unknown": 2 } }, + "init_t2_bis_exits": { "alt-ergo": + { "total": 1, + "unknown": 1 }, + "wp:main": + { "total": 1, + "unknown": 1 } }, + "init_t2_bis_ensures": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 3 }, + "wp:main": + { "total": 1, + "valid": 1, + "rank": 3 } }, + "wp:section": { "alt-ergo": { "total": 9, + "valid": 3, + "unknown": 6, + "rank": 10 }, + "qed": { "total": 8, + "valid": 8 }, + "wp:main": { "total": 17, + "valid": 11, + "unknown": 6, + "rank": 10 } } } } } diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.i.0.report.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.i.0.report.json index 1651d4db136..0b74bede002 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.i.0.report.json +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.i.0.report.json @@ -1,6 +1,8 @@ -{ "wp:global": { "alt-ergo": { "total": 4, "valid": 4, "rank": 19 }, - "qed": { "total": 4, "valid": 4 }, - "wp:main": { "total": 8, "valid": 8, "rank": 19 } }, +{ "wp:global": { "alt-ergo": { "total": 27, "valid": 16, "unknown": 11, + "rank": 19 }, + "qed": { "total": 27, "valid": 27 }, + "wp:main": { "total": 54, "valid": 43, "unknown": 11, + "rank": 19 } }, "wp:functions": { "init": { "init_loop_invariant_Partial": { "alt-ergo": { "total": 1, "valid": 1, @@ -47,4 +49,211 @@ "valid": 4 }, "wp:main": { "total": 8, "valid": 8, - "rank": 19 } } } } } + "rank": 19 } } }, + "init_t1": { "init_t1_loop_invariant_Partial": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 4 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 4 } }, + "init_t1_loop_invariant_Range": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 2 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 2 } }, + "init_t1_assigns": { "qed": { "total": 2, + "valid": 2 }, + "wp:main": { "total": 2, + "valid": 2 } }, + "init_t1_loop_assigns": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 1, + "valid": 1 } }, + "init_t1_ensures": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 3 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 3 } }, + "wp:section": { "alt-ergo": { "total": 3, + "valid": 3, + "rank": 4 }, + "qed": { "total": 5, + "valid": 5 }, + "wp:main": { "total": 8, + "valid": 8, + "rank": 4 } } }, + "init_t2": { "init_t2_assert_i": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "init_t2_assert_j": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "init_t2_loop_invariant_Previous_i": + { "alt-ergo": { "total": 1, "valid": 1, + "rank": 5 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 5 } }, + "init_t2_loop_invariant_Partial_j": + { "alt-ergo": { "total": 1, "valid": 1, + "rank": 8 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 8 } }, + "init_t2_loop_invariant_Range_j": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 3 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 3 } }, + "init_t2_loop_invariant_Partial_i": + { "alt-ergo": { "total": 1, "valid": 1, + "rank": 11 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 11 } }, + "init_t2_loop_invariant_Range_i": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 2 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 2, + "valid": 2, + "rank": 2 } }, + "init_t2_assigns": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 2, + "valid": 1, + "unknown": 1 } }, + "init_t2_loop_assigns_2": { "alt-ergo": + { "total": 2, + "unknown": 2 }, + "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 3, + "valid": 1, + "unknown": 2 } }, + "init_t2_loop_assigns": { "alt-ergo": + { "total": 2, + "unknown": 2 }, + "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 3, + "valid": 1, + "unknown": 2 } }, + "init_t2_ensures": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 2 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 2 } }, + "wp:section": { "alt-ergo": { "total": 11, + "valid": 6, + "unknown": 5, + "rank": 11 }, + "qed": { "total": 10, + "valid": 10 }, + "wp:main": { "total": 21, + "valid": 16, + "unknown": 5, + "rank": 11 } } }, + "init_t2_bis": { "init_requires_2": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 1, + "valid": 1 } }, + "init_requires": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "init_t2_bis_assert_i": { "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 1, + "valid": 1 } }, + "init_t2_bis_loop_invariant_Partial_i": + { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 10 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 10 } }, + "init_t2_bis_loop_invariant_Range_i": + { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 3 }, + "qed": { "total": 1, "valid": 1 }, + "wp:main": { "total": 2, "valid": 2, + "rank": 3 } }, + "init_t2_bis_assigns": { "alt-ergo": + { "total": 3, + "unknown": 3 }, + "qed": + { "total": 2, + "valid": 2 }, + "wp:main": + { "total": 5, + "valid": 2, + "unknown": 3 } }, + "init_t2_bis_loop_assigns": { "alt-ergo": + { "total": 2, + "unknown": 2 }, + "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 3, + "valid": 1, + "unknown": 2 } }, + "init_t2_bis_exits": { "alt-ergo": + { "total": 1, + "unknown": 1 }, + "wp:main": + { "total": 1, + "unknown": 1 } }, + "init_t2_bis_ensures": { "alt-ergo": + { "total": 1, + "valid": 1, + "rank": 3 }, + "wp:main": + { "total": 1, + "valid": 1, + "rank": 3 } }, + "wp:section": { "alt-ergo": { "total": 9, + "valid": 3, + "unknown": 6, + "rank": 10 }, + "qed": { "total": 8, + "valid": 8 }, + "wp:main": { "total": 17, + "valid": 11, + "unknown": 6, + "rank": 10 } } } } } diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle index 6f23e12122e..4166c7752ea 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.res.oracle @@ -2,8 +2,10 @@ [kernel] Parsing tests/wp_typed/user_init.i (no preprocessing) [wp] Running WP plugin... [wp] Loading driver 'share/wp.driver' +[wp] [CFG] Goal init_t1_exits : Valid (Unreachable) +[wp] [CFG] Goal init_t2_exits : Valid (Unreachable) [wp] Warning: Missing RTE guards -[wp] 8 goals scheduled +[wp] 54 goals scheduled [wp] [Alt-Ergo] Goal typed_init_ensures : Valid [wp] [Alt-Ergo] Goal typed_init_loop_invariant_Partial_preserved : Valid [wp] [Qed] Goal typed_init_loop_invariant_Partial_established : Valid @@ -12,12 +14,61 @@ [wp] [Qed] Goal typed_init_loop_assigns_part1 : Valid [wp] [Alt-Ergo] Goal typed_init_loop_assigns_part2 : Valid [wp] [Qed] Goal typed_init_assigns : Valid -[wp] Proved goals: 8 / 8 - Qed: 4 - Alt-Ergo: 4 +[wp] [Alt-Ergo] Goal typed_init_t1_ensures : Valid +[wp] [Alt-Ergo] Goal typed_init_t1_loop_invariant_Partial_preserved : Valid +[wp] [Qed] Goal typed_init_t1_loop_invariant_Partial_established : Valid +[wp] [Alt-Ergo] Goal typed_init_t1_loop_invariant_Range_preserved : Valid +[wp] [Qed] Goal typed_init_t1_loop_invariant_Range_established : Valid +[wp] [Qed] Goal typed_init_t1_loop_assigns : Valid +[wp] [Qed] Goal typed_init_t1_assigns_part1 : Valid +[wp] [Qed] Goal typed_init_t1_assigns_part2 : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_ensures : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_loop_invariant_Partial_i_preserved : Valid +[wp] [Qed] Goal typed_init_t2_loop_invariant_Partial_i_established : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_loop_invariant_Range_i_preserved : Valid +[wp] [Qed] Goal typed_init_t2_loop_invariant_Range_i_established : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_loop_invariant_Partial_j_preserved : Valid +[wp] [Qed] Goal typed_init_t2_loop_invariant_Partial_j_established : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_loop_invariant_Previous_i_preserved : Valid +[wp] [Qed] Goal typed_init_t2_loop_invariant_Previous_i_established : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_loop_invariant_Range_j_preserved : Valid +[wp] [Qed] Goal typed_init_t2_loop_invariant_Range_j_established : Valid +[wp] [Qed] Goal typed_init_t2_assert_j : Valid +[wp] [Qed] Goal typed_init_t2_assert_i : Valid +[wp] [Qed] Goal typed_init_t2_loop_assigns_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_loop_assigns_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_init_t2_loop_assigns_part3 : Unsuccess +[wp] [Qed] Goal typed_init_t2_loop_assigns_2_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_loop_assigns_2_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_init_t2_loop_assigns_2_part3 : Unsuccess +[wp] [Qed] Goal typed_init_t2_assigns_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_assigns_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_init_t2_bis_ensures : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_bis_exits : Unsuccess +[wp] [Alt-Ergo] Goal typed_init_t2_bis_loop_invariant_Partial_i_preserved : Valid +[wp] [Qed] Goal typed_init_t2_bis_loop_invariant_Partial_i_established : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_bis_loop_invariant_Range_i_preserved : Valid +[wp] [Qed] Goal typed_init_t2_bis_loop_invariant_Range_i_established : Valid +[wp] [Qed] Goal typed_init_t2_bis_assert_i : Valid +[wp] [Qed] Goal typed_init_t2_bis_loop_assigns_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_bis_loop_assigns_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_init_t2_bis_loop_assigns_part3 : Unsuccess +[wp] [Qed] Goal typed_init_t2_bis_assigns_exit_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_bis_assigns_exit_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_init_t2_bis_assigns_exit_part3 : Unsuccess +[wp] [Qed] Goal typed_init_t2_bis_assigns_normal_part1 : Valid +[wp] [Alt-Ergo] Goal typed_init_t2_bis_assigns_normal_part2 : Unsuccess +[wp] [Qed] Goal typed_init_t2_bis_call_init_requires : Valid +[wp] [Qed] Goal typed_init_t2_bis_call_init_requires_2 : Valid +[wp] Proved goals: 43 / 54 + Qed: 27 + Alt-Ergo: 16 (unsuccess: 11) [wp] Report in: 'tests/wp_typed/oracle_qualif/user_init.0.report.json' [wp] Report out: 'tests/wp_typed/result_qualif/user_init.0.report.json' ------------------------------------------------------------- Functions WP Alt-Ergo Total Success init 4 4 (80..104) 8 100% +init_t1 5 3 (12..24) 8 100% +init_t2 10 6 (40..52) 21 76.2% +init_t2_bis 8 3 (36..48) 17 64.7% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_typed/user_init.i b/src/plugins/wp/tests/wp_typed/user_init.i index a7ab761501f..416a94e97e0 100644 --- a/src/plugins/wp/tests/wp_typed/user_init.i +++ b/src/plugins/wp/tests/wp_typed/user_init.i @@ -11,3 +11,63 @@ void init( int * a , int n , int v ) */ for (int i = 0 ; i < n ; i++) a[i] = v ; } +//------------------------- +int t1[10]; +/*@ ensures \forall integer k; 0 <= k < 10 ==> t1[k] == v ; + @ exits \false; + @ assigns t1[0..9] ; +*/ +void init_t1(int v) { + unsigned i; + /*@ loop invariant Range: 0 <= i <= 10 ; + @ loop invariant Partial: \forall integer k ; 0 <= k < i ==> t1[k] ≡ v ; + @ loop assigns i,t1[0..9] ; + */ + for (i = 0 ; i < 10 ; i++) t1[i] = v ; +} +//------------------------- +int t2[10][20]; +/*@ ensures \forall integer k, l; 0 <= k < 10 && 0 <= l < 20 ==> t2[k][l] == v; + @ exits \false; + @ assigns t2[0..9][0..19]; + */ +void init_t2(int v) { + + unsigned i,j; + /*@ loop assigns i, j, t2[0..9][0..19]; + @ loop invariant Range_i: 0 <= i <= 10 ; + @ loop invariant Partial_i: \forall integer k,l; 0 <= k < i && 0 <= l < 20 ==> t2[k][l] == v; + */ + for(i = 0; i <= 9; i++) { + /*@ loop assigns j, t2[0..9][0..19]; + @ loop invariant Range_j: 0 <= j <= 20 ; + @ loop invariant Partial_j: \forall integer l; 0 <= l < j ==> t2[i][l] == v; + @ loop invariant Previous_i: \forall integer k,l; 0 <= k < i && 0 <= l < 20 ==> t2[k][l] == \at(t2[k][l], LoopEntry); + */ + for(j = 0; j <= 19; j++) { + t2[i][j] = v; + } + //@ assert j: j==20; + ; + } + //@ assert i: i==10; + ; +} +//------------------------- +/*@ ensures \forall integer k, l; 0 <= k < 10 && 0 <= l < 20 ==> t2[k][l] == v; + @ assigns t2[0..9][0..19]; + @ exits \false; + */ +void init_t2_bis(int v) { + + unsigned i; + /*@ loop assigns i, t2[0..9][0..19]; + @ loop invariant Range_i: 0 <= i <= 10 ; + @ loop invariant Partial_i: \forall integer k,l; 0 <= k < i && 0 <= l < 20 ==> t2[k][l] == v; + */ + for(i = 0; i <= 9; i++) { + init(&t2[i][0], 20, v); + } + //@ assert i: i==10; + ; +} -- GitLab