From be34f0591944039e53fdf5d55a08cebf08c18d10 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Wed, 1 Apr 2020 14:38:32 +0200 Subject: [PATCH] [wp] Adds a test for Memvar initialized and fixes bugs with ranges --- src/plugins/wp/MemVar.ml | 58 ++-- src/plugins/wp/ProverWhy3.ml | 7 +- .../wp/tests/wp_acsl/initialized_memvar.i | 109 +++++++ .../oracle/initialized_memvar.res.oracle | 292 ++++++++++++++++++ .../initialized_memvar.res.oracle | 68 ++++ 5 files changed, 502 insertions(+), 32 deletions(-) create mode 100644 src/plugins/wp/tests/wp_acsl/initialized_memvar.i create mode 100644 src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle diff --git a/src/plugins/wp/MemVar.ml b/src/plugins/wp/MemVar.ml index 176e1e8eb7c..34f1609ad93 100644 --- a/src/plugins/wp/MemVar.ml +++ b/src/plugins/wp/MemVar.ml @@ -726,20 +726,20 @@ struct (* --- Memory Store --- *) (* -------------------------------------------------------------------------- *) - let rec initialization_value value obj = + let rec init_value value obj = match obj with | C_int _ | C_float _ | C_pointer _ -> value | C_comp ci -> let make_term f = - Cfield (f, KInit), initialization_value value (object_of f.ftype) + Cfield (f, KInit), init_value value (object_of f.ftype) in Lang.F.e_record (List.map make_term ci.cfields) | C_array _ as arr -> Lang.F.e_const Lang.t_int - (initialization_value value (object_of_array_elem arr)) + (init_value value (object_of_array_elem arr)) - let initialized_obj = initialization_value e_true - let uninitialized_obj = initialization_value e_false + let initialized_obj = init_value e_true + let uninitialized_obj = init_value e_false let stored seq obj l v = match l with | Ref x -> noref ~op:"write to" x @@ -1030,7 +1030,7 @@ struct let rec initialized_loc sigma obj x ofs = match obj with | C_int _ | C_float _ | C_pointer _ -> - e_eq e_true (access_init (get_init_term sigma x) ofs) + p_bool (access_init (get_init_term sigma x) ofs) | C_array { arr_flat=flat } -> let size = match flat with | None -> unsized_array () @@ -1043,30 +1043,27 @@ struct let ofs = ofs @ [Field f] in initialized_loc sigma obj x ofs in - Lang.F.e_and (List.map mk_pred ci.cfields) + Lang.F.p_conj (List.map mk_pred ci.cfields) and initialized_range sigma obj x ofs low up = match obj with | C_array { arr_element=t } -> let v = Lang.freshvar ~basename:"i" Lang.t_int in - let hyp = p_bool (e_and [ (e_leq low (e_var v)) ; - (e_leq (e_var v) up) ]) - in + let hyp = p_and (p_leq low (e_var v)) (p_leq (e_var v) up) in let obj = Ctypes.object_of t in let ofs = ofs @ [ Shift(obj, e_var v) ] in - let sub = p_bool (initialized_loc sigma obj x ofs) in - e_prop (p_forall [v] (p_imply hyp sub)) - | _ -> raise ShiftMismatch - - let insert_in_array_bounds obj low up p = - match obj with - | C_array { arr_flat = Some { arr_size } } -> - let hyp = - e_and [ (e_leq (e_int 0) low) ; - (e_leq up (e_int (arr_size - 1))) ] - in p_imply (p_bool hyp) p - | C_array { arr_flat = None } -> - unsized_array () - | _ -> raise ShiftMismatch + let sub = initialized_loc sigma obj x ofs in + Lang.F.p_forall [v] (p_imply hyp sub) + | C_comp _ -> + let leaf = match Extlib.last ofs with + | Field f -> Ctypes.object_of f.ftype + | Shift(obj, _) -> obj + in + begin match leaf with + | C_array _ -> initialized_range sigma leaf x ofs low up + | _ -> raise ShiftMismatch + end + | _ -> + raise ShiftMismatch let initialized sigma l = match l with @@ -1076,11 +1073,12 @@ struct | Loc l -> M.initialized sigma.mem (Rloc(obj,l)) | Val(m,x,p) -> if (x.vformal || x.vglob) then - p_true + try valid_offset RW (vobject m x) p + with ShiftMismatch -> shift_mismatch l else if is_heap_allocated m then M.initialized sigma.mem (Rloc(obj,mloc_of_loc l)) else - p_bool (initialized_loc sigma obj x p) + initialized_loc sigma obj x p end | Rrange(l,elt, Some a, Some b) -> begin match l with @@ -1088,12 +1086,12 @@ struct | Loc l -> M.initialized sigma.mem (Rrange(l,elt,Some a, Some b)) | Val(m,x,p) -> try - let guard = insert_in_array_bounds (vobject m x) a b in - let p = + let in_array = valid_range RW (vobject m x) p (elt, a, b) in + let initialized = if x.vformal || x.vglob then p_true - else p_bool (initialized_range sigma (vobject m x) x p a b) + else initialized_range sigma (vobject m x) x p a b in - F.p_imply (F.p_leq a b) (guard p) + F.p_imply (F.p_leq a b) (p_and in_array initialized) with ShiftMismatch -> if is_heap_allocated m then let l = mloc_of_loc l in diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml index 2ce0d949afd..b0fbcf69d08 100644 --- a/src/plugins/wp/ProverWhy3.ml +++ b/src/plugins/wp/ProverWhy3.ml @@ -574,9 +574,12 @@ let rec of_term ~cnv expected t : Why3.Term.term = | ls -> Why3.Term.t_app ls [of_term' cnv a] (of_tau cnv expected) | exception Not_found -> why3_failure "Can't find '%s' in why3 namespace" s end - | Rdef(l), Data(Comp (c, _),_) , _ -> begin + | Rdef(l), Data(Comp (c, k),_) , _ -> begin (* l is already sorted by field *) - let s = Lang.comp_id c in + let s = match k with + | KValue -> Lang.comp_id c + | KInit -> Lang.comp_init_id c + in match Why3.Theory.(ns_find_ls (get_namespace cnv.th) (cut_path s)) with | ls -> let l = List.map (fun (_,t) -> of_term' cnv t) l in diff --git a/src/plugins/wp/tests/wp_acsl/initialized_memvar.i b/src/plugins/wp/tests/wp_acsl/initialized_memvar.i new file mode 100644 index 00000000000..a5b3f6a265e --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/initialized_memvar.i @@ -0,0 +1,109 @@ +struct S { + int x ; + int y ; +} ; +struct C { + int x ; + struct S s ; + int a[10] ; +} ; + +int x ; +int a[10] ; + +struct C c ; +struct C ac [10]; + +void globals(void){ + // Simple type + //@ check qed_ok: \initialized(&x) ; + + // Array type + //@ check qed_ok: \initialized(&a) ; + + //@ check qed_ok: \initialized(&a[4]) ; + //@ check qed_ko: \initialized(&a[10]) ; + + //@ check qed_ok: \initialized(&a[0 .. 9]) ; + //@ check qed_ko: \initialized(&a[0 .. 10]) ; + + // Nested struct type + //@ check qed_ok: \initialized(&c) ; + //@ check qed_ok: \initialized(&c.s) ; + //@ check qed_ok: \initialized(&c.s.y) ; + + //@ check qed_ok: \initialized(&c.a) ; + //@ check qed_ok: \initialized(&c.a[4]) ; + //@ check qed_ko: \initialized(&c.a[10]) ; + //@ check qed_ok: \initialized(&c.a[0 .. 9]) ; + //@ check qed_ko: \initialized(&c.a[0 .. 10]) ; + + // Complex accesses + // OK + //@ check qed_ok: \initialized(&ac[0]); + //@ check qed_ok: \initialized(&ac[1].s); + //@ check qed_ok: \initialized(&ac[2].s.y); + //@ check qed_ok: \initialized(&ac[3].a); + //@ check qed_ok: \initialized(&ac[4].a[5]); + //@ check qed_ok: \initialized(&ac[1 .. 2]); + //@ check provable: \initialized(&ac[2 .. 4].s); + //@ check provable: \initialized(&ac[2 .. 6].s.y); + //@ check provable: \initialized(&ac[3 .. 7].a); + //@ check provable: \initialized(&ac[2 .. 9].a[5 .. 8]); + + // KO + //@ check qed_ko: \initialized(&ac[10]); + //@ check qed_ko: \initialized(&ac[10].a); + //@ check qed_ko: \initialized(&ac[4].a[12]); + //@ check qed_ko: \initialized(&ac[0 .. 10]); + //@ check not_provable: \initialized(&ac[0 .. 10].s); + //@ check not_provable: \initialized(&ac[0 .. 10].a); + //@ check not_provable: \initialized(&ac[0 .. 9].a[0 .. 10]); +} + +void locals(void){ + int x ; + int a[2] ; + + struct C c ; + + //@ check qed_ok: !\initialized(&x); + //@ check qed_ok: !\initialized(&a); + //@ check qed_ok: !\initialized(&c); + + x = 1 ; + //@ check qed_ok: \initialized(&x); + + a[0] = 1 ; + //@ check qed_ok: \initialized(&a[0]); + //@ check qed_ok: !\initialized(&a[1]); + //@ check qed_ok: !\initialized(&a); + + a[1] = 2 ; + //@ check qed_ok: \initialized(&a[0]); + //@ check qed_ok: \initialized(&a[1]); + //@ check provable: \initialized(&a); + + c.x = 1 ; + //@ check qed_ok: \initialized(&c.x); + //@ check qed_ok: !\initialized(&c.s); + //@ check qed_ok: !\initialized(&c.a); + //@ check qed_ok: !\initialized(&c); + + c.s.x = 1; + //@ check qed_ok: \initialized(&c.s.x); + //@ check qed_ok: !\initialized(&c.s.y); + //@ check qed_ok: !\initialized(&c.s); + //@ check qed_ok: !\initialized(&c); + + c.s.y = 1 ; + //@ check qed_ok: \initialized(&c.s); + //@ check qed_ok: !\initialized(&c); + + c.a[0] = c.a[1] = c.a[2] = c.a[3] = c.a[4] = c.a[5] = c.a[6] = c.a[7] = c.a[8] = 1; + //@ check provable: \initialized(&c.a[0..8]) ; + //@ check qed_ok: !\initialized(&c); + + c.a[9] = 1 ; + //@ check qed_ok: \initialized(&c); +} diff --git a/src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle new file mode 100644 index 00000000000..a243863d16a --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle/initialized_memvar.res.oracle @@ -0,0 +1,292 @@ +# frama-c -wp [...] +[kernel] Parsing tests/wp_acsl/initialized_memvar.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function globals +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 19): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 22): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 24): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 25): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 27): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 28): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 31): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 32): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 33): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 35): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 36): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 37): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 38): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 39): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 43): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 44): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 45): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 46): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 47): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 48): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'provable' (file tests/wp_acsl/initialized_memvar.i, line 49): +Assume { (* Goal *) When: (2 <= i) /\ (i <= 4). } +Prove: (0 <= i) /\ (i <= 9). + +------------------------------------------------------------ + +Goal Check 'provable' (file tests/wp_acsl/initialized_memvar.i, line 50): +Assume { (* Goal *) When: (2 <= i) /\ (i <= 6). } +Prove: (0 <= i) /\ (i <= 9). + +------------------------------------------------------------ + +Goal Check 'provable' (file tests/wp_acsl/initialized_memvar.i, line 51): +Assume { (* Goal *) When: (3 <= i) /\ (i <= 7). } +Prove: (0 <= i) /\ (i <= 9). + +------------------------------------------------------------ + +Goal Check 'provable' (file tests/wp_acsl/initialized_memvar.i, line 52): +Assume { (* Goal *) When: (2 <= i) /\ (5 <= i_1) /\ (i_1 <= 8) /\ (i <= 9). } +Prove: (0 <= i) /\ (0 <= i_1) /\ (i_1 <= 9). + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 55): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 56): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 57): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'qed_ko' (file tests/wp_acsl/initialized_memvar.i, line 58): +Prove: false. + +------------------------------------------------------------ + +Goal Check 'not_provable' (file tests/wp_acsl/initialized_memvar.i, line 59): +Assume { (* Goal *) When: (0 <= i) /\ (i <= 10). } +Prove: i <= 9. + +------------------------------------------------------------ + +Goal Check 'not_provable' (file tests/wp_acsl/initialized_memvar.i, line 60): +Assume { (* Goal *) When: (0 <= i) /\ (i <= 10). } +Prove: i <= 9. + +------------------------------------------------------------ + +Goal Check 'not_provable' (file tests/wp_acsl/initialized_memvar.i, line 61): +Assume { (* Goal *) When: (0 <= i_1) /\ (0 <= i) /\ (i_1 <= 9) /\ (i <= 10). +} +Prove: i <= 9. + +------------------------------------------------------------ +------------------------------------------------------------ + Function locals +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 70): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 71): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 72): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 75): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 78): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 79): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 80): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 83): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 84): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'provable' (file tests/wp_acsl/initialized_memvar.i, line 85): +Assume { (* Goal *) When: (0 <= i) /\ (i <= 1). } +Prove: (([false..])[0 <- true][1 <- true][i]=true). + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 88): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 89): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 90): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 91): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 94): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 95): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 96): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 97): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 100): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 101): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'provable' (file tests/wp_acsl/initialized_memvar.i, line 104): +Assume { (* Goal *) When: (0 <= i) /\ (i <= 8). } +Prove: (([false..])[8 <- true][7 <- true][6 <- true][5 <- true][4 <- true][3 + <- true][2 <- true][1 <- true][0 <- true][i]=true). + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 105): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'qed_ok' (file tests/wp_acsl/initialized_memvar.i, line 108): +Prove: true. + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle new file mode 100644 index 00000000000..ea40fb15e88 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle @@ -0,0 +1,68 @@ +# frama-c -wp [...] +[kernel] Parsing tests/wp_acsl/initialized_memvar.i (no preprocessing) +[wp] Running WP plugin... +[wp] Loading driver 'share/wp.driver' +[wp] Warning: Missing RTE guards +[wp] 54 goals scheduled +[wp] [Qed] Goal typed_globals_check_qed_ok : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_2 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_3 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko : Unsuccess +[wp] [Qed] Goal typed_globals_check_qed_ok_4 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_2 : Unsuccess +[wp] [Qed] Goal typed_globals_check_qed_ok_5 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_6 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_7 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_8 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_9 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_3 : Unsuccess +[wp] [Qed] Goal typed_globals_check_qed_ok_10 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_4 : Unsuccess +[wp] [Qed] Goal typed_globals_check_qed_ok_11 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_12 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_13 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_14 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_15 : Valid +[wp] [Qed] Goal typed_globals_check_qed_ok_16 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_provable : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_provable_2 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_provable_3 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_provable_4 : Valid +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_5 : Unsuccess +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_6 : Unsuccess +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_7 : Unsuccess +[wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_8 : Unsuccess +[wp] [Alt-Ergo] Goal typed_globals_check_not_provable : Unsuccess +[wp] [Alt-Ergo] Goal typed_globals_check_not_provable_2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_globals_check_not_provable_3 : Unsuccess +[wp] [Qed] Goal typed_locals_check_qed_ok : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_2 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_3 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_4 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_5 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_6 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_7 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_8 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_9 : Valid +[wp] [Alt-Ergo] Goal typed_locals_check_provable : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_10 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_11 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_12 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_13 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_14 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_15 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_16 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_17 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_18 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_19 : Valid +[wp] [Alt-Ergo] Goal typed_locals_check_provable_2 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_20 : Valid +[wp] [Qed] Goal typed_locals_check_qed_ok_21 : Valid +[wp] Proved goals: 43 / 54 + Qed: 37 + Alt-Ergo: 6 (unsuccess: 11) +------------------------------------------------------------ + Functions WP Alt-Ergo Total Success + globals 16 4 31 64.5% + locals 21 2 23 100% +------------------------------------------------------------ -- GitLab