diff --git a/src/plugins/wp/share/why3/frama_c_wp/cbits.mlw b/src/plugins/wp/share/why3/frama_c_wp/cbits.mlw index 7207fa0d437dc4d4a9108a9fef93195c0f0350a9..2d609dc75fe99a131b3b4dde6ec364b406573f7e 100644 --- a/src/plugins/wp/share/why3/frama_c_wp/cbits.mlw +++ b/src/plugins/wp/share/why3/frama_c_wp/cbits.mlw @@ -57,6 +57,7 @@ theory Cbits (** ** land identities *) axiom land_idemp: forall x:int [land x x]. (land x x) = x + axiom land_idemp_bis: forall x y : int [land x (land x y)]. land x (land x y) = land x y axiom land_0: forall x:int [land 0 x]. (land 0 x) = 0 axiom land_0bis: forall x:int [land x 0]. (land x 0) = 0 axiom land_1: forall x:int [land (-1) x]. (land (-1) x) = x @@ -67,6 +68,7 @@ theory Cbits (** ** lor identities *) axiom lor_idemp: forall x:int [lor x x]. (lor x x) = x + axiom lor_idemp_bis: forall x y : int [lor x (lor x y)]. lor x (lor x y) = lor x y axiom lor_1: forall x:int [lor (-1) x]. (lor (-1) x) = -1 axiom lor_1bis: forall x:int [lor x (-1)]. (lor x (-1)) = -1 axiom lor_0: forall x:int [lor 0 x]. (lor 0 x) = x @@ -77,6 +79,7 @@ theory Cbits (** ** lxor identities *) axiom lxor_nilpotent: forall x:int [lxor x x]. (lxor x x) = 0 + axiom lxor_nilpotent_bis: forall x y : int [lxor x (lxor x y)]. lxor x (lxor x y) = y axiom lxor_1: forall x:int [lxor (-1) x]. (lxor (-1) x) = (lnot x) axiom lxor_1bis: forall x:int [lxor x (-1)]. (lxor x (-1)) = (lnot x) axiom lxor_0: forall x:int [lxor 0 x]. (lxor 0 x) = x @@ -481,7 +484,7 @@ theory Cbits lemma is_sint_land: forall n x y:int. is_sint n x -> is_sint n y -> to_sint n (land x y) = land x y lemma is_sint_lsr: forall n x y:int. - 0<=y -> is_sint n x -> to_sint n (lsr x y) = lsr x y + 0<=y -> is_sint n x -> to_sint n (lsr x y) = lsr x y lemma is_sint_lsl1_inf : forall n y:int. 0<=y<n -> to_sint n (lsl 1 y) = (lsl 1 y) lemma is_sint_lsl1_sup : forall n y:int. @@ -508,7 +511,7 @@ theory Cbits is_sint8 x -> is_sint8 y -> to_sint8 (land x y) = land x y axiom is_sint8_lsr: forall x y:int [to_sint8 (lsr x y)]. - 0<=y -> is_sint8 x -> to_sint8 (lsr x y) = lsr x y + 0<=y -> is_sint8 x -> to_sint8 (lsr x y) = lsr x y axiom is_sint8_lsl1 : lsl 1 7 = Cint.max_sint8 @@ -524,7 +527,7 @@ theory Cbits is_sint16 x -> to_sint16 (lnot x) = lnot x axiom is_sint16_lxor : forall x y:int [to_sint16 (lxor x y)]. - is_sint16 x -> is_sint16 y -> to_sint16 (lxor x y) = lxor x y + is_sint16 x -> is_sint16 y -> to_sint16 (lxor x y) = lxor x y axiom is_sint16_lor : forall x y:int [to_sint16 (lor x y)]. is_sint16 x -> is_sint16 y -> to_sint16 (lor x y) = lor x y @@ -549,7 +552,7 @@ theory Cbits is_sint32 x -> to_sint32 (lnot x) = lnot x axiom is_sint32_lxor : forall x y:int [to_sint32 (lxor x y)]. - is_sint32 x -> is_sint32 y -> to_sint32 (lxor x y) = lxor x y + is_sint32 x -> is_sint32 y -> to_sint32 (lxor x y) = lxor x y axiom is_sint32_lor : forall x y:int [to_sint32(lor x y)]. is_sint32 x -> is_sint32 y -> to_sint32 (lor x y) = lor x y diff --git a/src/plugins/wp/tests/wp_acsl/bitwise_idemp.i b/src/plugins/wp/tests/wp_acsl/bitwise_idemp.i new file mode 100644 index 0000000000000000000000000000000000000000..61f3abf7668e4da1077013226d6a65f4dcdb8947 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/bitwise_idemp.i @@ -0,0 +1,42 @@ +/* + X Y | X & Y | X & (X & Y) + | | + 0 0 | 0 | 0 + 0 1 | 0 | 0 + 1 0 | 0 | 0 + 1 1 | 1 | 1 +*/ + +void land(int x, int a, int b, int c, int d) { + //@ check A: (x ? c == a : c == b) ==> (a & (b & c)) == (a & b) ; + //@ check B: (x ? c == a : c == b) ==> ((a & b) & c) == (a & b) ; +} + +/* + X Y | X | Y | X | (X | Y) + | | + 0 0 | 0 | 0 + 0 1 | 1 | 1 + 1 0 | 1 | 1 + 1 1 | 1 | 1 + +*/ + +void lor(int x, int a, int b, int c, int d) { + //@ check A: (x ? c == a : c == b) ==> (a | (b | c)) == (a | b) ; + //@ check B: (x ? c == a : c == b) ==> ((a | b) | c) == (a | b) ; +} + +/* + X Y | X ^ Y | X ^ (X ^ Y) + | | + 0 0 | 0 | 0 + 0 1 | 1 | 1 + 1 0 | 1 | 0 + 1 1 | 0 | 1 +*/ + +void lxor(int x, int a, int b, int c, int d, int e) { + //@ check A: (x ? c == a && e == b : c == b && e == a) ==> (a ^ (b ^ c)) == e ; + //@ check B: (x ? c == a && e == b : c == b && e == a) ==> ((a ^ b) ^ c) == e ; +} diff --git a/src/plugins/wp/tests/wp_acsl/oracle/bitwise_idemp.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/bitwise_idemp.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..f80dac5a4192881eb6bf83ff9ebee27388f759b8 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle/bitwise_idemp.res.oracle @@ -0,0 +1,75 @@ +# frama-c -wp [...] +[kernel] Parsing tests/wp_acsl/bitwise_idemp.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function land +------------------------------------------------------------ + +Goal Check 'A' (file tests/wp_acsl/bitwise_idemp.i, line 11): +Assume { + Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(x). + (* Goal *) + When: if (x = 0) then (c = b) else (c = a). +} +Prove: land(a, land(b, c)) = land(a, b). + +------------------------------------------------------------ + +Goal Check 'B' (file tests/wp_acsl/bitwise_idemp.i, line 12): +Assume { + Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(x). + (* Goal *) + When: if (x = 0) then (c = b) else (c = a). +} +Prove: land(a, land(b, c)) = land(a, b). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lor +------------------------------------------------------------ + +Goal Check 'A' (file tests/wp_acsl/bitwise_idemp.i, line 26): +Assume { + Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(x). + (* Goal *) + When: if (x = 0) then (c = b) else (c = a). +} +Prove: lor(a, lor(b, c)) = lor(a, b). + +------------------------------------------------------------ + +Goal Check 'B' (file tests/wp_acsl/bitwise_idemp.i, line 27): +Assume { + Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(x). + (* Goal *) + When: if (x = 0) then (c = b) else (c = a). +} +Prove: lor(a, lor(b, c)) = lor(a, b). + +------------------------------------------------------------ +------------------------------------------------------------ + Function lxor +------------------------------------------------------------ + +Goal Check 'A' (file tests/wp_acsl/bitwise_idemp.i, line 40): +Assume { + Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(e) /\ + is_sint32(x). + (* Goal *) + When: if (x = 0) then ((c = b) /\ (e = a)) else ((c = a) /\ (e = b)). +} +Prove: lxor(a, lxor(b, c)) = e. + +------------------------------------------------------------ + +Goal Check 'B' (file tests/wp_acsl/bitwise_idemp.i, line 41): +Assume { + Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(e) /\ + is_sint32(x). + (* Goal *) + When: if (x = 0) then ((c = b) /\ (e = a)) else ((c = a) /\ (e = b)). +} +Prove: lxor(a, lxor(b, c)) = e. + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise_idemp.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise_idemp.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..f06b148b1571530b0853c53a0dd3c46f79ab88ab --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise_idemp.res.oracle @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing tests/wp_acsl/bitwise_idemp.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +[wp] 6 goals scheduled +[wp] [Alt-Ergo] Goal typed_land_check_A : Unsuccess +[wp] [Alt-Ergo] Goal typed_land_check_B : Unsuccess +[wp] [Alt-Ergo] Goal typed_lor_check_A : Unsuccess +[wp] [Alt-Ergo] Goal typed_lor_check_B : Unsuccess +[wp] [Alt-Ergo] Goal typed_lxor_check_A : Unsuccess +[wp] [Alt-Ergo] Goal typed_lxor_check_B : Unsuccess +[wp] Proved goals: 0 / 6 + Alt-Ergo: 0 (unsuccess: 6) +------------------------------------------------------------ + Functions WP Alt-Ergo Total Success + land - - 2 0.0% + lor - - 2 0.0% + lxor - - 2 0.0% +------------------------------------------------------------