diff --git a/src/plugins/wp/CodeSemantics.ml b/src/plugins/wp/CodeSemantics.ml index e7dacab67bf5ee7a8fb910ca905891cea21f3ce2..d1c55685ea4d7add16b3f3e43080df932afe60c3 100644 --- a/src/plugins/wp/CodeSemantics.ml +++ b/src/plugins/wp/CodeSemantics.ml @@ -32,6 +32,26 @@ open Sigs open Lang open Lang.F +module WpLog = Wp_parameters +let constfold_ctyp = function + | TArray (_,Some {enode = (Const CInt64 _) },_,_) as ct -> ct + | TArray (ty,Some len,cache,attr) as ct -> begin + match Cil.constFold true len with + | {enode = (Const CInt64 _) } as len -> + TArray(ty,Some len,cache,attr) + | _ -> ct + end + | ct -> ct + +let constfold_coffset = function + | Index({enode=Const (CInt64 _)}, _) as off -> off + | Index(idx, next) as off -> begin + match Cil.constFold true idx with + | {enode = (Const CInt64 _) } as idx -> Index(idx, next) + | _ -> off + end + | off -> off + module Make(M : Sigs.Model) = struct @@ -448,22 +468,18 @@ struct init_value ~sigma lv (Cil.typeOfLval lv) (Some exp) :: acc | CompoundInit ( ct , initl ) -> - - let len = List.length initl in - let acc = + let ct = constfold_ctyp ct in + let acc = (* updated acc with default init of structure *) match ct with - | TArray (ty,Some {enode = (Const CInt64 (size,_,_))},_,_) - when Integer.lt (Integer.of_int len) size -> - init_range ~sigma lv ty (Integer.of_int len) size None :: acc - - | TComp (cp,_,_) when len < (List.length cp.cfields) -> - + | TComp (cp,_,_) when cp.cstruct && (* not for union... *) + (List.length initl) < (List.length cp.cfields) -> + (* default init for unintialized field of a struct *) List.fold_left (fun acc f -> if List.exists (function | Field(g,_),_ -> Fieldinfo.equal f g - | _ -> false) + | _ -> WpLog.fatal "Kernel invariant broken into an initializer") initl then acc else @@ -477,47 +493,80 @@ struct | _ -> acc in match ct with - | TArray (ty,_,_,_) - when Wp_parameters.InitWithForall.get () -> - (* delayed: the last consecutive index have the same value - and are not yet initialized. - (i0,pred,il) =def \forall x. x \in [il;i0] t[x] == pred - *) + | TArray (ty,len,_,_) -> + let delayed = + match len with (* number of required elements *) + | Some {enode = (Const CInt64 (size,_,_))} -> + (size, None) + | _ -> (* CIL invariant broken. *) + WpLog.fatal "CIL invariant broken: unknown initialized array size" + in let make_quant acc = function - | None -> acc - | Some (Index({enode=Const (CInt64 (i0,_,_))}, NoOffset),exp,il) - when Integer.lt il i0 -> + (* adds delayed initializations from info about + the last consecutive indices having + the same value, but that have not yet initialized. *) + | (_,None) -> acc (* nothing was delayed *) + | (il,Some (i0,_,exp)) when Integer.lt il i0 -> + (* Added pred: \forall i \in [il .. i0] ; t[i]==exp *) let i2 = Integer.succ i0 in init_range ~sigma lv ty il i2 (Some exp) :: acc - | Some (off,exp,_) -> + | (_il,Some (_i0,off,exp)) -> + (* case [_il=_i0], so uses [off] corresponding to [_i0] + Added pred: t[i]==exp*) let lv = Cil.addOffsetLval off lv in init_value ~sigma lv ty (Some exp) :: acc in + let add_missing_indices acc i0 = function + (* adds eventual default value for missing indices. *) + | (i1, _) -> + if Integer.ge i0 i1 then (* no hole *) acc + else (* defaults values + Added pred: \forall i \in [i0 .. i1[ ; t[i]==default *) + init_range ~sigma lv ty i0 i1 None :: acc + in let acc, delayed = List.fold_left (fun (acc,delayed) (off,init) -> - match delayed, off, init with - | None, Index({enode=Const (CInt64 (i0,_,_))}, NoOffset), - SingleInit curr -> - (acc,Some(off,curr,i0)) - | Some (i0,prev,ip), Index({enode=Const (CInt64 (i,_,_))}, NoOffset), - SingleInit curr - when ExpStructEq.equal prev curr - && Integer.equal (Integer.pred ip) i -> - (acc,Some(i0,prev,i)) - | _, _,_ -> + let off = constfold_coffset off in + let idx,acc = match off with + | Index({enode=Const CInt64 (idx,_,_)}, _) -> + (match delayed with + | (iprev, _) when Integer.lt iprev idx -> + (* CIL invariant broken. + without that invariant, an algo with a 2sd pass + is required for introducing default values *) + WpLog.fatal "CIL invariant broken: unordered initializer"; + | _ -> ()) ; + idx, + (* adds default values for missing indices *) + add_missing_indices acc (Integer.succ idx) delayed + | _ -> (* CIL invariant broken. *) + WpLog.fatal "CIL invariant broken: unknown initialized index" + in + match off, init with (* only simple init can be delayed *) + | Index(_, NoOffset), SingleInit init -> begin + match delayed with + | (i_prev,(Some (_,_,init_delayed) as delayed_info)) + when Wp_parameters.InitWithForall.get () + && Integer.equal (Integer.pred i_prev) idx + && ExpStructEq.equal init_delayed init -> + acc, (idx,delayed_info) + | _ -> (* flush the delayed init, and store the new one *) + let acc = make_quant acc delayed in + acc, (idx, Some (idx,off,init)) + end + | Index(_, _),_ -> + (* flush the delayed init, and adds the current one *) let acc = make_quant acc delayed in - begin match off, init with - | Index({enode=Const (CInt64 (i0,_,_))}, NoOffset), - SingleInit curr -> - acc, Some (off,curr,i0) - | _ -> - let lv = Cil.addOffsetLval off lv in - init_variable ~sigma lv init acc, None - end) - (acc,None) - (List.rev initl) in - (make_quant acc delayed) + let lv = Cil.addOffsetLval off lv in + (init_variable ~sigma lv init acc), (idx, None) + | _ -> WpLog.fatal "CIL invariant broken: not an index" + ) + (acc,delayed) + (List.rev initl) + in + let acc = make_quant acc delayed in + add_missing_indices acc Integer.zero delayed | _ -> List.fold_left (fun acc (off,init) -> diff --git a/src/plugins/wp/tests/wp_acsl/init_value.i b/src/plugins/wp/tests/wp_acsl/init_value.i index 382ae866678afdd2183fd0ef54a7f9a2e88625e0..b9d9caeabadd4510e4a64607a265906f70f4274c 100644 --- a/src/plugins/wp/tests/wp_acsl/init_value.i +++ b/src/plugins/wp/tests/wp_acsl/init_value.i @@ -1,9 +1,9 @@ /* run.config - OPT: - OPT: -main main_ko + OPT: -wp-init-const -wp-no-let + OPT: -main main_ko -wp-no-let */ /* run.config_qualif - OPT: -wp -wp-par 1 -wp-prop="-qed_ko" + OPT: -wp-init-const -wp -wp-par 1 -wp-prop="-qed_ko" OPT: -main main_ko -wp-par 1 -wp-prop qed_ko -wp-steps 50 */ @@ -11,25 +11,33 @@ /* --- GOAL: partial and complete initialization of value --- */ /* -------------------------------------------------------------------------- */ -struct S { int a; int b;}; +struct S { int a; int b;}; struct S s = {2}; int t[2] = {1}; +int t1[9+1] = {[5 ... 6]=2, [0 ... 3 ]=1 }; -struct St {int tab[10];}; +struct St {int tab[9+1];}; struct St st = {{1,2,3,4}}; -struct Sc {int a; int b[3]; int c;}; +struct Sc {int a; int b[2+1]; int c;}; struct Sc sc0 = {1,{2,3,4},5}; struct Sc sc1 = {1,2,3,4,5}; -struct Sc sc2 = {1,{2,3},4}; +struct Sc sc2 = {1,{2,3},4}; struct Sc sc3 = {1,2,3,4}; +struct Sc sq0 = {2,{2,2},2}; +struct Sc sq1 = {.b={2,2}}; + unsigned char tab[32]; -int u []; +union U { + short t[4]; + short a; + long long b; +} u = {.a=-1 }; /*@ requires qed_ok: Struct_Simple_a: s.a == 2 ; requires qed_ok: Struct_Simple_b: s.b == 0 ; @@ -44,8 +52,15 @@ int u []; requires qed_ok: Sc_c_3 : sc3.c == 0; requires qed_ok: Tab_no_init : tab[5] == 0 ; requires qed_ok: Tab_todo : \forall int i; 0 <= i <= 31 ==> tab[i] <= 255; + requires qed_ok: sq0.b[1]==2; + requires qed_ok: sq0.b[2]==0; + requires qed_ok: \forall integer i; 0 <= i <= 3 ==> t1[i] == 1; + requires qed_ok: todo: t1[4] == 0; + requires qed_ok: \forall integer i; 5 < i <= 6 ==> t1[i] == 2; + requires qed_ok: \forall integer i; 6 < i <= 9 ==> t1[i] == 0; + requires qed_ok: direct_init_union: u.a == -1; */ -void main (void){return;} +void main (int a){return;}; /*@ requires qed_ko: Sc_eq_ko : sc2 == sc3; requires qed_ko: Sc_t : sc3.b[2] == 3 ; @@ -53,6 +68,33 @@ void main (void){return;} requires qed_ko: Tab_no_init : tab[5] == 1 ; requires qed_ko: With_Array_Struct_3 : st.tab[3] == 3 ; requires qed_ko: Simple_Array_1 : t[1] == 1 ; + requires qed_ko: T1_6: t1[6] == 0; + requires qed_ko: indirect_init_union_b: u.b == 0; + requires qed_ko: indirect_init_union_t: u.t[0] == 0; */ void main_ko (void){return;} +const int ta1[5] = { [2]=1,[4]=1 }; +/*@ ensures qed_ok: ta1[0]==ta1[1] && ta1[1]==ta1[3]; + @ ensures qed_ko: ta1[4]==0; + @ ensures qed_ko: ta1[3]==1; */ +void fa1(void) {return ;} + +const int ta2[5] = { [2 ... 3]=1 }; +/*@ ensures qed_ok: ta2[0]==ta2[1] && ta2[1]==ta2[4]; + @ ensures qed_ko: ta2[4]==1; + @ ensures qed_ko: ta2[1]==1; */ +void fa2(void) {return ;} + +const int ta3[5] = { [1]=1, [3]=1}; +/*@ ensures qed_ok: ta3[0]==ta3[2] && ta1[2]==ta1[4]; + @ ensures qed_ko: ta3[0]==1; + @ ensures qed_ko: ta3[2]==1; + @ ensures qed_ko: ta2[4]==1; */ +void fa3(void) {return ;} + +const struct { int a, b, c; } ts1[4] = { [2].a=1, [2].b=1 }; +/*@ ensures qed_ok: ts1[0]==ts1[1] && ts1[1]==ts1[3] && ts1[2].a ==ts1[2].b; + @ ensures qed_ko: ts1[2].c==1; + @ ensures qed_ko: ts1[0].a==1;*/ +void fs1(void) {return ;} diff --git a/src/plugins/wp/tests/wp_acsl/init_value.i.0.report.json b/src/plugins/wp/tests/wp_acsl/init_value.i.0.report.json index 24349b32c01b0a4eff5f6e5927b4825c7cf3f059..ed3d641728778606547731d1d152cd81ce12ddbd 100644 --- a/src/plugins/wp/tests/wp_acsl/init_value.i.0.report.json +++ b/src/plugins/wp/tests/wp_acsl/init_value.i.0.report.json @@ -1,7 +1,43 @@ -{ "wp:global": { "alt-ergo": { "total": 3, "valid": 3, "rank": 8 }, - "qed": { "total": 10, "valid": 10 }, - "wp:main": { "total": 13, "valid": 13, "rank": 8 } }, - "wp:functions": { "main": { "main_pre_qed_ok_Tab_todo": { "alt-ergo": +{ "wp:global": { "alt-ergo": { "total": 7, "valid": 7, "rank": 29 }, + "qed": { "total": 17, "valid": 17 }, + "wp:main": { "total": 24, "valid": 24, "rank": 29 } }, + "wp:functions": { "main": { "main_pre_qed_ok_direct_init_union": { "qed": + { "total": 1, + "valid": 1 }, + "wp:main": + { "total": 1, + "valid": 1 } }, + "main_pre_qed_ok_5": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 2 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 2 } }, + "main_pre_qed_ok_4": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 2 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 2 } }, + "main_pre_qed_ok_todo": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "main_pre_qed_ok_3": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 2 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 2 } }, + "main_pre_qed_ok_2": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "main_pre_qed_ok": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "main_pre_qed_ok_Tab_todo": { "alt-ergo": { "total": 1, "valid": 1, "rank": 2 }, @@ -73,11 +109,47 @@ "wp:main": { "total": 1, "valid": 1 } }, - "wp:section": { "alt-ergo": { "total": 3, - "valid": 3, + "wp:section": { "alt-ergo": { "total": 6, + "valid": 6, "rank": 8 }, - "qed": { "total": 10, - "valid": 10 }, - "wp:main": { "total": 13, - "valid": 13, - "rank": 8 } } } } } + "qed": { "total": 14, + "valid": 14 }, + "wp:main": { "total": 20, + "valid": 20, + "rank": 8 } } }, + "fa1": { "fa1_post_qed_ok": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "wp:section": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } } }, + "fa2": { "fa2_post_qed_ok": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "wp:section": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } } }, + "fa3": { "fa3_post_qed_ok": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } }, + "wp:section": { "qed": { "total": 1, + "valid": 1 }, + "wp:main": { "total": 1, + "valid": 1 } } }, + "fs1": { "fs1_post_qed_ok": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 29 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 29 } }, + "wp:section": { "alt-ergo": { "total": 1, + "valid": 1, + "rank": 29 }, + "wp:main": { "total": 1, + "valid": 1, + "rank": 29 } } } } } diff --git a/src/plugins/wp/tests/wp_acsl/init_value.i.1.report.json b/src/plugins/wp/tests/wp_acsl/init_value.i.1.report.json index 7c26ecf79edec8169bee2869e3b2fa07bb08e876..a90fa9753d457fe09ba9c0a8dc032f363b91a00e 100644 --- a/src/plugins/wp/tests/wp_acsl/init_value.i.1.report.json +++ b/src/plugins/wp/tests/wp_acsl/init_value.i.1.report.json @@ -1,6 +1,18 @@ -{ "wp:global": { "alt-ergo": { "total": 6, "unknown": 6 }, - "wp:main": { "total": 6, "unknown": 6 } }, - "wp:functions": { "main_ko": { "main_ko_pre_qed_ko_Simple_Array_1": +{ "wp:global": { "alt-ergo": { "total": 18, "unknown": 18 }, + "wp:main": { "total": 18, "unknown": 18 } }, + "wp:functions": { "main_ko": { "main_ko_pre_qed_ko_indirect_init_union_t": + { "alt-ergo": { "total": 1, "unknown": 1 }, + "wp:main": { "total": 1, "unknown": 1 } }, + "main_ko_pre_qed_ko_indirect_init_union_b": + { "alt-ergo": { "total": 1, "unknown": 1 }, + "wp:main": { "total": 1, "unknown": 1 } }, + "main_ko_pre_qed_ko_T1_6": { "alt-ergo": + { "total": 1, + "unknown": 1 }, + "wp:main": + { "total": 1, + "unknown": 1 } }, + "main_ko_pre_qed_ko_Simple_Array_1": { "alt-ergo": { "total": 1, "unknown": 1 }, "wp:main": { "total": 1, "unknown": 1 } }, "main_ko_pre_qed_ko_With_Array_Struct_3": @@ -30,7 +42,59 @@ "wp:main": { "total": 1, "unknown": 1 } }, - "wp:section": { "alt-ergo": { "total": 6, - "unknown": 6 }, - "wp:main": { "total": 6, - "unknown": 6 } } } } } + "wp:section": { "alt-ergo": { "total": 9, + "unknown": 9 }, + "wp:main": { "total": 9, + "unknown": 9 } } }, + "fa1": { "fa1_post_qed_ko_2": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "fa1_post_qed_ko": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "wp:section": { "alt-ergo": { "total": 2, + "unknown": 2 }, + "wp:main": { "total": 2, + "unknown": 2 } } }, + "fa2": { "fa2_post_qed_ko_2": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "fa2_post_qed_ko": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "wp:section": { "alt-ergo": { "total": 2, + "unknown": 2 }, + "wp:main": { "total": 2, + "unknown": 2 } } }, + "fa3": { "fa3_post_qed_ko_3": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "fa3_post_qed_ko_2": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "fa3_post_qed_ko": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "wp:section": { "alt-ergo": { "total": 3, + "unknown": 3 }, + "wp:main": { "total": 3, + "unknown": 3 } } }, + "fs1": { "fs1_post_qed_ko_2": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "fs1_post_qed_ko": { "alt-ergo": { "total": 1, + "unknown": 1 }, + "wp:main": { "total": 1, + "unknown": 1 } }, + "wp:section": { "alt-ergo": { "total": 2, + "unknown": 2 }, + "wp:main": { "total": 2, + "unknown": 2 } } } } } diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle index ad4d9f1ea971d2c837da496bee9cee9a1fa814ba..bcd9a305a139c01b26fa11ccc56af7dbdfd3c080 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle @@ -1,47 +1,386 @@ -# frama-c -wp [...] +# frama-c -wp -wp-no-let [...] [kernel] Parsing tests/wp_acsl/init_value.i (no preprocessing) [wp] Running WP plugin... [wp] Loading driver 'share/wp.driver' [wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function fa1 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fa1': +Let x = ta1_0[4]. +Let x_1 = ta1_0[0]. +Let x_2 = ta1_0[1]. +Let x_3 = ta1_0[3]. +Assume { + Type: is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_3) /\ is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + (* Initializer *) + Init: ta1_0[2] = 1. + (* Initializer *) + Init: x = 1. + (* Initializer *) + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). +} +Prove: (x_2 = x_1) /\ (x_3 = x_2). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa1': +Let x = ta1_0[4]. +Assume { + Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(ta1_0[3]) /\ + is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + (* Initializer *) + Init: ta1_0[2] = 1. + (* Initializer *) + Init: x = 1. + (* Initializer *) + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). +} +Prove: x = 0. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa1': +Let x = ta1_0[4]. +Let x_1 = ta1_0[3]. +Assume { + Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(x_1) /\ + is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + (* Initializer *) + Init: ta1_0[2] = 1. + (* Initializer *) + Init: x = 1. + (* Initializer *) + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). +} +Prove: x_1 = 1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fa2 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fa2': +Let x = ta2_0[0]. +Let x_1 = ta2_0[1]. +Let x_2 = ta2_0[4]. +Assume { + Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 3) -> (ta2_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). +} +Prove: (x_1 = x) /\ (x_2 = x_1). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa2': +Let x = ta2_0[4]. +Assume { + Type: is_sint32(ta2_0[0]) /\ is_sint32(ta2_0[1]) /\ is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 3) -> (ta2_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). +} +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa2': +Let x = ta2_0[1]. +Assume { + Type: is_sint32(ta2_0[0]) /\ is_sint32(x) /\ is_sint32(ta2_0[4]). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 3) -> (ta2_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). +} +Prove: x = 1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fa3 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fa3': +Let x = ta1_0[4]. +Let x_1 = ta1_0[2]. +Let x_2 = ta3_0[0]. +Let x_3 = ta3_0[2]. +Assume { + Type: is_sint32(x_1) /\ is_sint32(x) /\ is_sint32(x_2) /\ is_sint32(x_3). + (* Initializer *) + Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: ta3_0[1] = 1. + (* Initializer *) + Init: ta3_0[3] = 1. + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + (* Initializer *) + Init: x_1 = 1. + (* Initializer *) + Init: x = 1. + (* Initializer *) + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). +} +Prove: (x = x_1) /\ (x_3 = x_2). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa3': +Let x = ta3_0[0]. +Assume { + Type: is_sint32(x) /\ is_sint32(ta3_0[2]). + (* Initializer *) + Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: ta3_0[1] = 1. + (* Initializer *) + Init: ta3_0[3] = 1. + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). +} +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa3': +Let x = ta3_0[2]. +Assume { + Type: is_sint32(ta3_0[0]) /\ is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: ta3_0[1] = 1. + (* Initializer *) + Init: ta3_0[3] = 1. + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). +} +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa3': +Let x = ta2_0[4]. +Assume { + Type: is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 3) -> (ta2_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). +} +Prove: x = 1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fs1 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fs1': +Let a = ts1_0[2]. +Let x = a.F5_c. +Let x_1 = a.F5_b. +Let x_2 = a.F5_a. +Let a_1 = ts1_0[0]. +Let a_2 = ts1_0[1]. +Let a_3 = ts1_0[3]. +Assume { + Type: IsS5(a_1) /\ IsS5(a_2) /\ IsS5(a_3) /\ is_sint32(a_1.F5_a) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(x). + (* Initializer *) + Init: forall i : Z. let a_4 = ts1_0[i] in ((0 <= i) -> ((i <= 1) -> + (((a_4.F5_a) = 0) /\ ((a_4.F5_b) = 0) /\ ((a_4.F5_c) = 0)))). + (* Initializer *) + Init: x_2 = 1. + (* Initializer *) + Init: x_1 = 1. + (* Initializer *) + Init: x = 0. + (* Initializer *) + Init: forall i : Z. let a_4 = ts1_0[i] in ((3 <= i) -> ((i <= 3) -> + (((a_4.F5_a) = 0) /\ ((a_4.F5_b) = 0) /\ ((a_4.F5_c) = 0)))). +} +Prove: (x_1 = x_2) /\ EqS5(a_1, a_2) /\ EqS5(a_2, a_3). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fs1': +Let a = ts1_0[2]. +Let x = a.F5_c. +Let x_1 = a.F5_b. +Let x_2 = a.F5_a. +Let a_1 = ts1_0[0]. +Assume { + Type: IsS5(a_1) /\ IsS5(ts1_0[1]) /\ IsS5(ts1_0[3]) /\ + is_sint32(a_1.F5_a) /\ is_sint32(x_2) /\ is_sint32(x_1) /\ + is_sint32(x). + (* Initializer *) + Init: forall i : Z. let a_2 = ts1_0[i] in ((0 <= i) -> ((i <= 1) -> + (((a_2.F5_a) = 0) /\ ((a_2.F5_b) = 0) /\ ((a_2.F5_c) = 0)))). + (* Initializer *) + Init: x_2 = 1. + (* Initializer *) + Init: x_1 = 1. + (* Initializer *) + Init: x = 0. + (* Initializer *) + Init: forall i : Z. let a_2 = ts1_0[i] in ((3 <= i) -> ((i <= 3) -> + (((a_2.F5_a) = 0) /\ ((a_2.F5_b) = 0) /\ ((a_2.F5_c) = 0)))). +} +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fs1': +Let a = ts1_0[2]. +Let x = a.F5_c. +Let x_1 = a.F5_b. +Let x_2 = a.F5_a. +Let a_1 = ts1_0[0]. +Let x_3 = a_1.F5_a. +Assume { + Type: IsS5(a_1) /\ IsS5(ts1_0[1]) /\ IsS5(ts1_0[3]) /\ is_sint32(x_3) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(x). + (* Initializer *) + Init: forall i : Z. let a_2 = ts1_0[i] in ((0 <= i) -> ((i <= 1) -> + (((a_2.F5_a) = 0) /\ ((a_2.F5_b) = 0) /\ ((a_2.F5_c) = 0)))). + (* Initializer *) + Init: x_2 = 1. + (* Initializer *) + Init: x_1 = 1. + (* Initializer *) + Init: x = 0. + (* Initializer *) + Init: forall i : Z. let a_2 = ts1_0[i] in ((3 <= i) -> ((i <= 3) -> + (((a_2.F5_a) = 0) /\ ((a_2.F5_b) = 0) /\ ((a_2.F5_c) = 0)))). +} +Prove: x_3 = 1. + +------------------------------------------------------------ ------------------------------------------------------------ Function main ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Struct_Simple_a' in 'main': -Prove: true. +Let x = s.F1_S_b. +Let x_1 = s.F1_S_a. +Assume { + Type: is_sint32(x_1) /\ is_sint32(x). + (* Initializer *) + Init: x_1 = 2. + (* Initializer *) + Init: x = 0. +} +Prove: x_1 = 2. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Struct_Simple_b' in 'main': -Prove: true. +Let x = s.F1_S_b. +Let x_1 = s.F1_S_a. +Assume { + Type: is_sint32(x_1) /\ is_sint32(x). + (* Initializer *) + Init: x_1 = 2. + (* Initializer *) + Init: x = 0. +} +Prove: x = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Simple_Array_0' in 'main': -Prove: true. +Let x = t[0]. +Assume { + Type: is_sint32(x) /\ is_sint32(t[1]). + (* Initializer *) + Init: x = 1. + (* Initializer *) + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). +} +Prove: x = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Simple_Array_1' in 'main': -Let x = t[1]. +Let x = t[0]. +Let x_1 = t[1]. Assume { - Type: is_sint32(x). + Type: is_sint32(x) /\ is_sint32(x_1). (* Initializer *) - Init: t[0] = 1. + Init: x = 1. (* Initializer *) Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). } -Prove: x = 0. +Prove: x_1 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,With_Array_Struct_5' in 'main': -Prove: true. +Let a = st_0.F2_St_tab. +Let a_1 = a[3]. +Let a_2 = a[5]. +Assume { + Type: is_sint32(a_1) /\ is_sint32(a_2). + (* Initializer *) + Init: a[0] = 1. + (* Initializer *) + Init: a[1] = 2. + (* Initializer *) + Init: a[2] = 3. + (* Initializer *) + Init: a_1 = 4. + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). +} +Prove: a_2 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,With_Array_Struct_3' in 'main': -Prove: true. +Let a = st_0.F2_St_tab. +Let a_1 = a[3]. +Assume { + Type: is_sint32(a_1) /\ is_sint32(a[5]). + (* Initializer *) + Init: a[0] = 1. + (* Initializer *) + Init: a[1] = 2. + (* Initializer *) + Init: a[2] = 3. + (* Initializer *) + Init: a_1 = 4. + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). +} +Prove: a_1 = 4. ------------------------------------------------------------ @@ -76,27 +415,96 @@ Prove: EqS3_Sc(sc1_0, sc0_0). ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_t' in 'main': -Prove: true. +Let x = sc2_0.F3_Sc_c. +Let a = sc2_0.F3_Sc_b. +Let a_1 = a[2]. +Assume { + Type: is_sint32(x) /\ is_sint32(a_1). + (* Initializer *) + Init: (sc2_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a[0] = 2. + (* Initializer *) + Init: a[1] = 3. + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). + (* Initializer *) + Init: x = 4. +} +Prove: a_1 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_t' in 'main': -Prove: true. +Let x = sc3_0.F3_Sc_c. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. +Assume { + Type: is_sint32(x) /\ is_sint32(a_1). + (* Initializer *) + Init: (sc3_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a[0] = 2. + (* Initializer *) + Init: a[1] = 3. + (* Initializer *) + Init: a_1 = 4. + (* Initializer *) + Init: x = 0. +} +Prove: a_1 = 4. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_c_2' in 'main': -Prove: true. +Let x = sc2_0.F3_Sc_c. +Let a = sc2_0.F3_Sc_b. +Assume { + Type: is_sint32(x) /\ is_sint32(a[2]). + (* Initializer *) + Init: (sc2_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a[0] = 2. + (* Initializer *) + Init: a[1] = 3. + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). + (* Initializer *) + Init: x = 4. +} +Prove: x = 4. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_c_3' in 'main': -Prove: true. +Let x = sc3_0.F3_Sc_c. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. +Assume { + Type: is_sint32(x) /\ is_sint32(a_1). + (* Initializer *) + Init: (sc3_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a[0] = 2. + (* Initializer *) + Init: a[1] = 3. + (* Initializer *) + Init: a_1 = 4. + (* Initializer *) + Init: x = 0. +} +Prove: x = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Tab_no_init' in 'main': -Prove: true. +Let x = tab_0[5]. +Assume { + Type: is_uint8(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). +} +Prove: x = 0. ------------------------------------------------------------ @@ -111,3 +519,117 @@ Assume { Prove: tab_0[i] <= 255. ------------------------------------------------------------ + +Goal Pre-condition 'qed_ok' in 'main': +Let a = sq0_0.F3_Sc_b. +Let a_1 = a[1]. +Assume { + Type: is_sint32(a_1) /\ is_sint32(a[2]). + (* Initializer *) + Init: (sq0_0.F3_Sc_a) = 2. + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). + (* Initializer *) + Init: (sq0_0.F3_Sc_c) = 2. +} +Prove: a_1 = 2. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok' in 'main': +Let a = sq0_0.F3_Sc_b. +Let a_1 = a[2]. +Assume { + Type: is_sint32(a[1]) /\ is_sint32(a_1). + (* Initializer *) + Init: (sq0_0.F3_Sc_a) = 2. + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). + (* Initializer *) + Init: (sq0_0.F3_Sc_c) = 2. +} +Prove: a_1 = 0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok' in 'main': +Assume { + Type: is_sint32(t1_0[4]). + (* Goal *) + When: (0 <= i) /\ (i <= 3). + (* Initializer *) + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). + (* Initializer *) + Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). + (* Initializer *) + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). + (* Initializer *) + Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). +} +Prove: t1_0[i] = 1. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,todo' in 'main': +Let x = t1_0[4]. +Assume { + Type: is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). +} +Prove: x = 0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok' in 'main': +Assume { + Type: is_sint32(t1_0[4]). + (* Goal *) + When: (6 <= i) /\ (i <= 6). + (* Initializer *) + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). + (* Initializer *) + Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). + (* Initializer *) + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). + (* Initializer *) + Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). +} +Prove: t1_0[i] = 2. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok' in 'main': +Assume { + Type: is_sint32(t1_0[4]). + (* Goal *) + When: (7 <= i) /\ (i <= 9). + (* Initializer *) + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). + (* Initializer *) + Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). + (* Initializer *) + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). + (* Initializer *) + Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). +} +Prove: t1_0[i] = 0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ok,direct_init_union' in 'main': +Let x = u.F4_U_a. +Assume { Type: is_sint16(x). (* Initializer *) Init: x = (-1). } +Prove: x = (-1). + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle index a95fc1f3809f0317d6310d97e8de7e9b290253c0..125cf6eebc17d9a97091d3c08a58f882d44e2219 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle @@ -1,17 +1,155 @@ -# frama-c -wp [...] +# frama-c -wp -wp-no-let [...] [kernel] Parsing tests/wp_acsl/init_value.i (no preprocessing) [wp] Running WP plugin... [wp] Loading driver 'share/wp.driver' [wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function fa1 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fa1': +Let x = ta1_0[0]. +Let x_1 = ta1_0[1]. +Let x_2 = ta1_0[3]. +Assume { + Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2) /\ + is_sint32(ta1_0[4]). +} +Prove: (x_1 = x) /\ (x_2 = x_1). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa1': +Let x = ta1_0[4]. +Assume { + Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(ta1_0[3]) /\ + is_sint32(x). +} +Prove: x = 0. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa1': +Let x = ta1_0[3]. +Assume { + Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(x) /\ + is_sint32(ta1_0[4]). +} +Prove: x = 1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fa2 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fa2': +Let x = ta2_0[0]. +Let x_1 = ta2_0[1]. +Let x_2 = ta2_0[4]. +Assume { Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2). } +Prove: (x_1 = x) /\ (x_2 = x_1). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa2': +Let x = ta2_0[4]. +Assume { Type: is_sint32(ta2_0[0]) /\ is_sint32(ta2_0[1]) /\ is_sint32(x). } +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa2': +Let x = ta2_0[1]. +Assume { Type: is_sint32(ta2_0[0]) /\ is_sint32(x) /\ is_sint32(ta2_0[4]). } +Prove: x = 1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fa3 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fa3': +Let x = ta1_0[2]. +Let x_1 = ta1_0[4]. +Let x_2 = ta3_0[0]. +Let x_3 = ta3_0[2]. +Assume { + Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_3). +} +Prove: (x_1 = x) /\ (x_3 = x_2). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa3': +Let x = ta3_0[0]. Assume { Type: is_sint32(x) /\ is_sint32(ta3_0[2]). } +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa3': +Let x = ta3_0[2]. Assume { Type: is_sint32(ta3_0[0]) /\ is_sint32(x). } +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fa3': +Let x = ta2_0[4]. Assume { Type: is_sint32(x). } +Prove: x = 1. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fs1 +------------------------------------------------------------ + +Goal Post-condition 'qed_ok' in 'fs1': +Let a = ts1_0[0]. +Let a_1 = ts1_0[1]. +Let a_2 = ts1_0[3]. +Let a_3 = ts1_0[2]. +Let x = a_3.F5_a. +Let x_1 = a_3.F5_b. +Assume { + Type: IsS5(a) /\ IsS5(a_1) /\ IsS5(a_2) /\ is_sint32(a.F5_a) /\ + is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(a_3.F5_c). +} +Prove: (x_1 = x) /\ EqS5(a, a_1) /\ EqS5(a_1, a_2). + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fs1': +Let a = ts1_0[0]. +Let a_1 = ts1_0[2]. +Let x = a_1.F5_c. +Assume { + Type: IsS5(a) /\ IsS5(ts1_0[1]) /\ IsS5(ts1_0[3]) /\ is_sint32(a.F5_a) /\ + is_sint32(a_1.F5_a) /\ is_sint32(a_1.F5_b) /\ is_sint32(x). +} +Prove: x = 1. + +------------------------------------------------------------ + +Goal Post-condition 'qed_ko' in 'fs1': +Let a = ts1_0[0]. +Let x = a.F5_a. +Let a_1 = ts1_0[2]. +Assume { + Type: IsS5(a) /\ IsS5(ts1_0[1]) /\ IsS5(ts1_0[3]) /\ is_sint32(x) /\ + is_sint32(a_1.F5_a) /\ is_sint32(a_1.F5_b) /\ is_sint32(a_1.F5_c). +} +Prove: x = 1. + +------------------------------------------------------------ ------------------------------------------------------------ Function main_ko ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Sc_eq_ko' in 'main_ko': +Let x = sc2_0.F3_Sc_c. Let a = sc2_0.F3_Sc_b. Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. Assume { - Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0). + Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_sint32(x) /\ is_sint32(a_2). (* Initializer *) Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) @@ -19,7 +157,7 @@ Assume { (* Initializer *) Init: a_1[1] = 3. (* Initializer *) - Init: a_1[2] = 4. + Init: a_2 = 4. (* Initializer *) Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) @@ -31,29 +169,80 @@ Assume { (* Initializer *) Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: (sc2_0.F3_Sc_c) = 4. + Init: x = 4. } Prove: EqS3_Sc(sc2_0, sc3_0). ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Sc_t' in 'main_ko': -Prove: false. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. +Assume { + Type: IsS3_Sc(sc3_0) /\ is_sint32(a_1). + (* Initializer *) + Init: (sc3_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a[0] = 2. + (* Initializer *) + Init: a[1] = 3. + (* Initializer *) + Init: a_1 = 4. + (* Initializer *) + Init: (sc3_0.F3_Sc_c) = 0. +} +Prove: a_1 = 3. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Sc_c_2' in 'main_ko': -Prove: false. +Let x = sc2_0.F3_Sc_c. +Let a = sc2_0.F3_Sc_b. +Assume { + Type: IsS3_Sc(sc2_0) /\ is_sint32(x). + (* Initializer *) + Init: (sc2_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a[0] = 2. + (* Initializer *) + Init: a[1] = 3. + (* Initializer *) + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). + (* Initializer *) + Init: x = 4. +} +Prove: x = 2. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Tab_no_init' in 'main_ko': -Prove: false. +Let x = tab_0[5]. +Assume { + Type: is_uint8(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). +} +Prove: x = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,With_Array_Struct_3' in 'main_ko': -Prove: false. +Let a = st_0.F2_St_tab. +Let a_1 = a[3]. +Assume { + Type: is_sint32(a_1). + (* Initializer *) + Init: a[0] = 1. + (* Initializer *) + Init: a[1] = 2. + (* Initializer *) + Init: a[2] = 3. + (* Initializer *) + Init: a_1 = 4. + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). +} +Prove: a_1 = 3. ------------------------------------------------------------ @@ -69,3 +258,42 @@ Assume { Prove: x = 1. ------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,T1_6' in 'main_ko': +Let x = t1_0[6]. +Assume { + Type: is_sint32(x). + (* Initializer *) + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). +} +Prove: x = 0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,indirect_init_union_b' in 'main_ko': +Let x = u.F4_U_b. +Assume { + Type: is_sint64(x) /\ is_sint16((u.F4_U_t)[0]). + (* Initializer *) + Init: (u.F4_U_a) = (-1). +} +Prove: x = 0. + +------------------------------------------------------------ + +Goal Pre-condition 'qed_ko,indirect_init_union_t' in 'main_ko': +Let a = (u.F4_U_t)[0]. +Assume { + Type: is_sint64(u.F4_U_b) /\ is_sint16(a). + (* Initializer *) + Init: (u.F4_U_a) = (-1). +} +Prove: a = 0. + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle index 87c51d12edc17d9360bd1aef0ebd6ccc5fa192cd..83fb66921697c443a2b99b43cf8f9ba51d5a5b81 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle @@ -3,7 +3,11 @@ [wp] Running WP plugin... [wp] Loading driver 'share/wp.driver' [wp] Warning: Missing RTE guards -[wp] 13 goals scheduled +[wp] 24 goals scheduled +[wp] [Qed] Goal typed_fa1_post_qed_ok : Valid +[wp] [Qed] Goal typed_fa2_post_qed_ok : Valid +[wp] [Qed] Goal typed_fa3_post_qed_ok : Valid +[wp] [Alt-Ergo] Goal typed_fs1_post_qed_ok : Valid [wp] [Qed] Goal typed_main_pre_qed_ok_Struct_Simple_a : Valid [wp] [Qed] Goal typed_main_pre_qed_ok_Struct_Simple_b : Valid [wp] [Qed] Goal typed_main_pre_qed_ok_Simple_Array_0 : Valid @@ -17,11 +21,22 @@ [wp] [Qed] Goal typed_main_pre_qed_ok_Sc_c_3 : Valid [wp] [Qed] Goal typed_main_pre_qed_ok_Tab_no_init : Valid [wp] [Alt-Ergo] Goal typed_main_pre_qed_ok_Tab_todo : Valid -[wp] Proved goals: 13 / 13 - Qed: 10 - Alt-Ergo: 3 +[wp] [Qed] Goal typed_main_pre_qed_ok : Valid +[wp] [Qed] Goal typed_main_pre_qed_ok_2 : Valid +[wp] [Alt-Ergo] Goal typed_main_pre_qed_ok_3 : Valid +[wp] [Qed] Goal typed_main_pre_qed_ok_todo : Valid +[wp] [Alt-Ergo] Goal typed_main_pre_qed_ok_4 : Valid +[wp] [Alt-Ergo] Goal typed_main_pre_qed_ok_5 : Valid +[wp] [Qed] Goal typed_main_pre_qed_ok_direct_init_union : Valid +[wp] Proved goals: 24 / 24 + Qed: 17 + Alt-Ergo: 7 [wp] Report 'tests/wp_acsl/init_value.i.0.report.json' ------------------------------------------------------------- Functions WP Alt-Ergo Total Success -main 10 3 (28..40) 13 100% +main 14 6 (28..40) 20 100% +fa1 1 - 1 100% +fa2 1 - 1 100% +fa3 1 - 1 100% +fs1 - 1 (160..184) 1 100% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle index 9ca602f4ad9efda7c9c0c3e9cfc48d54109d812f..d779e53743fb22ccbdaf2a1c04e02b0489876e18 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.1.res.oracle @@ -3,17 +3,33 @@ [wp] Running WP plugin... [wp] Loading driver 'share/wp.driver' [wp] Warning: Missing RTE guards -[wp] 6 goals scheduled +[wp] 18 goals scheduled +[wp] [Alt-Ergo] Goal typed_fa1_post_qed_ko : Unknown +[wp] [Alt-Ergo] Goal typed_fa1_post_qed_ko_2 : Unknown +[wp] [Alt-Ergo] Goal typed_fa2_post_qed_ko : Unknown +[wp] [Alt-Ergo] Goal typed_fa2_post_qed_ko_2 : Unknown +[wp] [Alt-Ergo] Goal typed_fa3_post_qed_ko : Unknown +[wp] [Alt-Ergo] Goal typed_fa3_post_qed_ko_2 : Unknown +[wp] [Alt-Ergo] Goal typed_fa3_post_qed_ko_3 : Unknown +[wp] [Alt-Ergo] Goal typed_fs1_post_qed_ko : Unknown +[wp] [Alt-Ergo] Goal typed_fs1_post_qed_ko_2 : Unknown [wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_Sc_eq_ko : Unknown [wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_Sc_t : Unknown [wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_Sc_c_2 : Unknown [wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_Tab_no_init : Unknown [wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_With_Array_Struct_3 : Unknown [wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_Simple_Array_1 : Unknown -[wp] Proved goals: 0 / 6 - Alt-Ergo: 0 (unknown: 6) +[wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_T1_6 : Unknown +[wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_indirect_init_union_b : Unknown +[wp] [Alt-Ergo] Goal typed_main_ko_pre_qed_ko_indirect_init_union_t : Unknown +[wp] Proved goals: 0 / 18 + Alt-Ergo: 0 (unknown: 18) [wp] Report 'tests/wp_acsl/init_value.i.1.report.json' ------------------------------------------------------------- Functions WP Alt-Ergo Total Success -main_ko - - 6 0.0% +main_ko - - 9 0.0% +fa1 - - 2 0.0% +fa2 - - 2 0.0% +fa3 - - 3 0.0% +fs1 - - 2 0.0% -------------------------------------------------------------