Skip to content
Snippets Groups Projects
Commit 253076fe authored by Loïc Correnson's avatar Loïc Correnson
Browse files

Merge branch 'feature/wp/const-deps' into 'master'

[wp] Keep global const dependencies

Closes #695

See merge request frama-c/frama-c!3518
parents 038d45c0 caa4ab80
No related branches found
No related tags found
No related merge requests found
Showing
with 1608 additions and 1579 deletions
...@@ -26,22 +26,22 @@ module Make(W : Mcfg.S) = ...@@ -26,22 +26,22 @@ module Make(W : Mcfg.S) =
struct struct
let compute_global_init wenv filter obj = let compute_global_init wenv filter obj =
Globals.Vars.fold_in_file_order Globals.Vars.fold_in_file_rev_order
(fun var initinfo obj -> (fun var initinfo obj ->
if var.vstorage = Extern then obj else if var.vstorage = Extern then obj else
let do_init = match filter with let do_init = match filter with
| `All -> true | `All -> true
| `InitConst -> Cil.isGlobalInitConst var | `InitConst -> Cil.isGlobalInitConst var
in if not do_init then obj in if not do_init then obj
else else let old_loc = Cil.CurrentLoc.get () in
let old_loc = Cil.CurrentLoc.get () in
Cil.CurrentLoc.set var.vdecl ; Cil.CurrentLoc.set var.vdecl ;
let obj = W.init wenv var initinfo.init obj in let obj = W.init wenv var initinfo.init obj in
Cil.CurrentLoc.set old_loc ; obj Cil.CurrentLoc.set old_loc ; obj
) obj ) obj
let process_global_const wenv obj = let process_global_const wenv obj =
Globals.Vars.fold_in_file_order Globals.Vars.fold_in_file_rev_order
(fun var _initinfo obj -> (fun var _initinfo obj ->
if Cil.isGlobalInitConst var if Cil.isGlobalInitConst var
then W.const wenv var obj then W.const wenv var obj
......
static int const A = 1 ;
static int const B = A+1 ;
int main(void) {
//@ assert B == 2 ;
return 0;
}
# frama-c -wp [...]
[kernel] Parsing global_const_dependencies.i (no preprocessing)
[wp] Running WP plugin...
[wp] Warning: Missing RTE guards
------------------------------------------------------------
Function main
------------------------------------------------------------
Goal Assertion (file global_const_dependencies.i, line 5):
Prove: true.
------------------------------------------------------------
This diff is collapsed.
This diff is collapsed.
...@@ -14,13 +14,13 @@ Assume { ...@@ -14,13 +14,13 @@ Assume {
(* Heap *) (* Heap *)
Type: region(G_v_20) <= 0. Type: region(G_v_20) <= 0.
(* Initializer *) (* Initializer *)
Init: (w.F1_St_a) = 1.
(* Initializer *)
Init: (w.F1_St_b) = 2.
(* Initializer *)
Init: Mint_0[shiftfield_F1_St_a(a)] = 1. Init: Mint_0[shiftfield_F1_St_a(a)] = 1.
(* Initializer *) (* Initializer *)
Init: Mint_0[shiftfield_F1_St_b(a)] = 2. Init: Mint_0[shiftfield_F1_St_b(a)] = 2.
(* Initializer *)
Init: (w.F1_St_a) = 1.
(* Initializer *)
Init: (w.F1_St_b) = 2.
} }
Prove: EqS1_St(a_1, w). Prove: EqS1_St(a_1, w).
...@@ -34,13 +34,13 @@ Assume { ...@@ -34,13 +34,13 @@ Assume {
(* Heap *) (* Heap *)
Type: region(G_v_20) <= 0. Type: region(G_v_20) <= 0.
(* Initializer *) (* Initializer *)
Init: (w.F1_St_a) = 1.
(* Initializer *)
Init: (w.F1_St_b) = 2.
(* Initializer *)
Init: Mint_0[shiftfield_F1_St_a(a)] = 1. Init: Mint_0[shiftfield_F1_St_a(a)] = 1.
(* Initializer *) (* Initializer *)
Init: Mint_0[shiftfield_F1_St_b(a)] = 2. Init: Mint_0[shiftfield_F1_St_b(a)] = 2.
(* Initializer *)
Init: (w.F1_St_a) = 1.
(* Initializer *)
Init: (w.F1_St_b) = 2.
} }
Prove: EqS1_St(a_1, w). Prove: EqS1_St(a_1, w).
......
...@@ -11,13 +11,13 @@ Goal Post-condition 'P' in 'main': ...@@ -11,13 +11,13 @@ Goal Post-condition 'P' in 'main':
Assume { Assume {
Type: IsS1_St(v) /\ IsS1_St(w). Type: IsS1_St(v) /\ IsS1_St(w).
(* Initializer *) (* Initializer *)
Init: (w.F1_St_a) = 1.
(* Initializer *)
Init: (w.F1_St_b) = 2.
(* Initializer *)
Init: (v.F1_St_a) = 1. Init: (v.F1_St_a) = 1.
(* Initializer *) (* Initializer *)
Init: (v.F1_St_b) = 2. Init: (v.F1_St_b) = 2.
(* Initializer *)
Init: (w.F1_St_a) = 1.
(* Initializer *)
Init: (w.F1_St_b) = 2.
} }
Prove: EqS1_St(v, w). Prove: EqS1_St(v, w).
......
# frama-c -wp [...]
[kernel] Parsing global_const_dependencies.i (no preprocessing)
[wp] Running WP plugin...
[wp] Warning: Missing RTE guards
[wp] 1 goal scheduled
[wp] [Qed] Goal typed_main_assert : Valid
[wp] Proved goals: 1 / 1
Qed: 1
------------------------------------------------------------
Functions WP Alt-Ergo Total Success
main 1 - 1 100%
------------------------------------------------------------
...@@ -49,13 +49,13 @@ Assume { ...@@ -49,13 +49,13 @@ Assume {
(* Heap *) (* Heap *)
Type: region(G_v_30) <= 0. Type: region(G_v_30) <= 0.
(* Initializer *) (* Initializer *)
Init: (w.F2_St_a) = 1.
(* Initializer *)
Init: (w.F2_St_b) = 2.
(* Initializer *)
Init: Mint_0[shiftfield_F2_St_a(a)] = 1. Init: Mint_0[shiftfield_F2_St_a(a)] = 1.
(* Initializer *) (* Initializer *)
Init: Mint_0[shiftfield_F2_St_b(a)] = 2. Init: Mint_0[shiftfield_F2_St_b(a)] = 2.
(* Initializer *)
Init: (w.F2_St_a) = 1.
(* Initializer *)
Init: (w.F2_St_b) = 2.
} }
Prove: EqS2_St(a_1, w). Prove: EqS2_St(a_1, w).
...@@ -69,13 +69,13 @@ Assume { ...@@ -69,13 +69,13 @@ Assume {
(* Heap *) (* Heap *)
Type: region(G_v_30) <= 0. Type: region(G_v_30) <= 0.
(* Initializer *) (* Initializer *)
Init: (w.F2_St_a) = 1.
(* Initializer *)
Init: (w.F2_St_b) = 2.
(* Initializer *)
Init: Mint_0[shiftfield_F2_St_a(a)] = 1. Init: Mint_0[shiftfield_F2_St_a(a)] = 1.
(* Initializer *) (* Initializer *)
Init: Mint_0[shiftfield_F2_St_b(a)] = 2. Init: Mint_0[shiftfield_F2_St_b(a)] = 2.
(* Initializer *)
Init: (w.F2_St_a) = 1.
(* Initializer *)
Init: (w.F2_St_b) = 2.
} }
Prove: EqS2_St(a_1, w). Prove: EqS2_St(a_1, w).
......
...@@ -30,108 +30,6 @@ Assume { ...@@ -30,108 +30,6 @@ Assume {
(* Goal *) (* Goal *)
When: (0 <= i) /\ (i <= 499). When: (0 <= i) /\ (i <= 499).
(* Initializer *) (* Initializer *)
Init: h2_0[0] = 0.
(* Initializer *)
Init: h2_0[1] = 1.
(* Initializer *)
Init: h2_0[2] = 2.
(* Initializer *)
Init: h2_0[3] = 3.
(* Initializer *)
Init: h2_0[4] = 4.
(* Initializer *)
Init: h2_0[5] = 5.
(* Initializer *)
Init: h2_0[6] = 6.
(* Initializer *)
Init: h2_0[7] = 7.
(* Initializer *)
Init: h2_0[8] = 8.
(* Initializer *)
Init: h2_0[9] = 9.
(* Initializer *)
Init: h2_0[10] = 10.
(* Initializer *)
Init: h2_0[11] = 11.
(* Initializer *)
Init: h2_0[12] = 12.
(* Initializer *)
Init: h2_0[13] = 13.
(* Initializer *)
Init: h2_0[14] = 14.
(* Initializer *)
Init: h2_0[15] = 15.
(* Initializer *)
Init: h2_0[16] = 16.
(* Initializer *)
Init: h2_0[17] = 17.
(* Initializer *)
Init: h2_0[18] = 18.
(* Initializer *)
Init: h2_0[19] = 19.
(* Initializer *)
Init: h2_0[20] = 20.
(* Initializer *)
Init: h2_0[21] = 21.
(* Initializer *)
Init: h2_0[22] = 22.
(* Initializer *)
Init: h2_0[23] = 23.
(* Initializer *)
Init: h2_0[24] = 24.
(* Initializer *)
Init: h2_0[25] = 25.
(* Initializer *)
Init: h2_0[26] = 26.
(* Initializer *)
Init: h2_0[27] = 27.
(* Initializer *)
Init: h2_0[28] = 28.
(* Initializer *)
Init: h2_0[29] = 29.
(* Initializer *)
Init: h2_0[30] = 30.
(* Initializer *)
Init: h2_0[31] = 31.
(* Initializer *)
Init: h2_0[32] = 32.
(* Initializer *)
Init: h2_0[33] = 33.
(* Initializer *)
Init: h2_0[34] = 34.
(* Initializer *)
Init: h2_0[35] = 35.
(* Initializer *)
Init: h2_0[36] = 36.
(* Initializer *)
Init: h2_0[37] = 37.
(* Initializer *)
Init: h2_0[38] = 38.
(* Initializer *)
Init: h2_0[39] = 39.
(* Initializer *)
Init: h2_0[40] = 40.
(* Initializer *)
Init: h2_0[41] = 41.
(* Initializer *)
Init: h2_0[42] = 42.
(* Initializer *)
Init: h2_0[43] = 43.
(* Initializer *)
Init: h2_0[44] = 44.
(* Initializer *)
Init: h2_0[45] = 45.
(* Initializer *)
Init: h2_0[46] = 46.
(* Initializer *)
Init: h2_0[47] = 47.
(* Initializer *)
Init: h2_0[48] = 48.
(* Initializer *)
Init: h2_0[49] = 49.
(* Initializer *)
Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (h2_0[i_1] = 0))).
(* Initializer *)
Init: h1_0[0] = 0. Init: h1_0[0] = 0.
(* Initializer *) (* Initializer *)
Init: h1_0[1] = 1. Init: h1_0[1] = 1.
...@@ -233,6 +131,108 @@ Assume { ...@@ -233,6 +131,108 @@ Assume {
Init: h1_0[49] = 49. Init: h1_0[49] = 49.
(* Initializer *) (* Initializer *)
Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (h1_0[i_1] = 0))). Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (h1_0[i_1] = 0))).
(* Initializer *)
Init: h2_0[0] = 0.
(* Initializer *)
Init: h2_0[1] = 1.
(* Initializer *)
Init: h2_0[2] = 2.
(* Initializer *)
Init: h2_0[3] = 3.
(* Initializer *)
Init: h2_0[4] = 4.
(* Initializer *)
Init: h2_0[5] = 5.
(* Initializer *)
Init: h2_0[6] = 6.
(* Initializer *)
Init: h2_0[7] = 7.
(* Initializer *)
Init: h2_0[8] = 8.
(* Initializer *)
Init: h2_0[9] = 9.
(* Initializer *)
Init: h2_0[10] = 10.
(* Initializer *)
Init: h2_0[11] = 11.
(* Initializer *)
Init: h2_0[12] = 12.
(* Initializer *)
Init: h2_0[13] = 13.
(* Initializer *)
Init: h2_0[14] = 14.
(* Initializer *)
Init: h2_0[15] = 15.
(* Initializer *)
Init: h2_0[16] = 16.
(* Initializer *)
Init: h2_0[17] = 17.
(* Initializer *)
Init: h2_0[18] = 18.
(* Initializer *)
Init: h2_0[19] = 19.
(* Initializer *)
Init: h2_0[20] = 20.
(* Initializer *)
Init: h2_0[21] = 21.
(* Initializer *)
Init: h2_0[22] = 22.
(* Initializer *)
Init: h2_0[23] = 23.
(* Initializer *)
Init: h2_0[24] = 24.
(* Initializer *)
Init: h2_0[25] = 25.
(* Initializer *)
Init: h2_0[26] = 26.
(* Initializer *)
Init: h2_0[27] = 27.
(* Initializer *)
Init: h2_0[28] = 28.
(* Initializer *)
Init: h2_0[29] = 29.
(* Initializer *)
Init: h2_0[30] = 30.
(* Initializer *)
Init: h2_0[31] = 31.
(* Initializer *)
Init: h2_0[32] = 32.
(* Initializer *)
Init: h2_0[33] = 33.
(* Initializer *)
Init: h2_0[34] = 34.
(* Initializer *)
Init: h2_0[35] = 35.
(* Initializer *)
Init: h2_0[36] = 36.
(* Initializer *)
Init: h2_0[37] = 37.
(* Initializer *)
Init: h2_0[38] = 38.
(* Initializer *)
Init: h2_0[39] = 39.
(* Initializer *)
Init: h2_0[40] = 40.
(* Initializer *)
Init: h2_0[41] = 41.
(* Initializer *)
Init: h2_0[42] = 42.
(* Initializer *)
Init: h2_0[43] = 43.
(* Initializer *)
Init: h2_0[44] = 44.
(* Initializer *)
Init: h2_0[45] = 45.
(* Initializer *)
Init: h2_0[46] = 46.
(* Initializer *)
Init: h2_0[47] = 47.
(* Initializer *)
Init: h2_0[48] = 48.
(* Initializer *)
Init: h2_0[49] = 49.
(* Initializer *)
Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (h2_0[i_1] = 0))).
} }
Prove: h2_0[i] = h1_0[i]. Prove: h2_0[i] = h1_0[i].
......
...@@ -24,8 +24,8 @@ Prove: Mint_0[shift_sint32(a, i)] = 0. ...@@ -24,8 +24,8 @@ Prove: Mint_0[shift_sint32(a, i)] = 0.
------------------------------------------------------------ ------------------------------------------------------------
Goal Assertion (file array_initialized.c, line 185): Goal Assertion (file array_initialized.c, line 185):
Let a = global(K_h1_26). Let a = global(K_h2_27).
Let a_1 = global(K_h2_27). Let a_1 = global(K_h1_26).
Assume { Assume {
(* Goal *) (* Goal *)
When: (0 <= i) /\ (i <= 499). When: (0 <= i) /\ (i <= 499).
...@@ -236,7 +236,7 @@ Assume { ...@@ -236,7 +236,7 @@ Assume {
Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) ->
(Mint_0[shift_sint32(a, i_1)] = 0))). (Mint_0[shift_sint32(a, i_1)] = 0))).
} }
Prove: Mint_0[shift_sint32(a_1, i)] = Mint_0[shift_sint32(a, i)]. Prove: Mint_0[shift_sint32(a, i)] = Mint_0[shift_sint32(a_1, i)].
------------------------------------------------------------ ------------------------------------------------------------
------------------------------------------------------------ ------------------------------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment