Skip to content

Commit d447838

Browse files
committed
Partition W by m not S in Miné's analysis
1 parent ba7ff17 commit d447838

File tree

1 file changed

+31
-37
lines changed

1 file changed

+31
-37
lines changed

src/analyses/basePriv.ml

+31-37
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,12 @@ struct
956956
(* weak: G -> (2^M -> D) *)
957957
(* sync: M -> (2^M -> (G -> D)) *)
958958
include AbstractLockCenteredBase (VD) (CPA)
959+
960+
module W =
961+
struct
962+
include MapDomain.MapBot (LockDomain.MustLock) (MayVars)
963+
let name () = "W"
964+
end
959965
end
960966

961967
module MinePrivBase =
@@ -1130,14 +1136,9 @@ struct
11301136
include LockCenteredBase
11311137
open Locksets
11321138

1133-
module W =
1134-
struct
1135-
include SetDomain.ToppedSet (Basetype.Variables) (struct let topname = "All variables" end)
1136-
let name () = "W"
1137-
end
1138-
module D = MapDomain.MapBot (MustLockset) (W)
1139+
module D = W
11391140

1140-
let startstate () = D.empty ()
1141+
let startstate () = W.empty ()
11411142

11421143
let read_global ask getg (st: BaseComponents (D).t) x =
11431144
let s = current_lockset ask in
@@ -1153,8 +1154,11 @@ struct
11531154
let cpa' = CPA.add x v st.cpa in
11541155
if not invariant && not (!earlyglobs && is_excluded_from_earlyglobs x) then
11551156
sideg (V.global x) (G.create_weak (GWeak.singleton s v));
1156-
let w' = if not invariant then
1157-
D.join st.priv (D.singleton s (W.singleton x))
1157+
let w' = if not invariant then (
1158+
MustLockset.fold (fun m acc ->
1159+
W.join acc (W.singleton m (MayVars.singleton x))
1160+
) s st.priv
1161+
)
11581162
else
11591163
st.priv (* No need to add invariant to W because it doesn't matter for reads after invariant, only unlocks. *)
11601164
in
@@ -1169,18 +1173,13 @@ struct
11691173
acc
11701174
) (G.sync (getg (V.mutex m))) st.cpa
11711175
in
1176+
(* Could set W m to empty here (like Lock-Centered) but Miné doesn't and mentions this over-approximation. *)
11721177
{st with cpa = cpa'}
11731178

11741179
let unlock ask getg sideg (st: BaseComponents (D).t) m =
11751180
let s = MustLockset.remove m (current_lockset ask) in
1176-
let w = D.fold (fun s' w acc ->
1177-
if MustLockset.mem m s' then
1178-
W.join w acc
1179-
else
1180-
acc
1181-
) st.priv (W.empty ())
1182-
in
1183-
let is_in_W x _ = W.mem x w in
1181+
let w = W.find m st.priv in
1182+
let is_in_W x _ = MayVars.mem x w in
11841183
let side_cpa = CPA.filter is_in_W st.cpa in
11851184
sideg (V.mutex m) (G.create_sync (GSync.singleton s side_cpa));
11861185
st
@@ -1201,7 +1200,7 @@ struct
12011200
CPA.fold (fun x v (st: BaseComponents (D).t) ->
12021201
if is_global ask x then (
12031202
sideg (V.global x) (G.create_weak (GWeak.singleton (MustLockset.empty ()) v));
1204-
{st with priv = D.join st.priv (D.singleton (MustLockset.empty ()) (W.singleton x))} (* TODO: is this add necessary? *)
1203+
st
12051204
)
12061205
else
12071206
st
@@ -1227,12 +1226,6 @@ struct
12271226
let name () = "V"
12281227
end
12291228

1230-
module DV2 =
1231-
struct
1232-
include MapDomain.MapBot_LiftTop (LockDomain.MustLock) (MayVars)
1233-
let name () = "V2"
1234-
end
1235-
12361229
module L =
12371230
struct
12381231
include MapDomain.MapBot_LiftTop (LockDomain.MustLock) (MinLocksets)
@@ -1248,7 +1241,7 @@ struct
12481241
open Locksets
12491242

12501243
open LockCenteredD
1251-
module D = Lattice.Prod3 (DV) (DV2) (L)
1244+
module D = Lattice.Prod3 (DV) (W) (L)
12521245

12531246
module Wrapper = Wrapper (G)
12541247
module UnwrappedG = G
@@ -1257,7 +1250,7 @@ struct
12571250
let invariant_global ask getg = invariant_global ask (Wrapper.getg ask getg)
12581251
let invariant_vars ask getg = invariant_vars ask (Wrapper.getg ask getg)
12591252

1260-
let startstate () = (DV.bot (), DV2.bot (), L.bot ())
1253+
let startstate () = (DV.bot (), W.bot (), L.bot ())
12611254

12621255
let lockset_init = MustLockset.all ()
12631256

@@ -1271,7 +1264,7 @@ struct
12711264
let read_global ask getg (st: BaseComponents (D).t) x =
12721265
let getg = Wrapper.getg ask getg in
12731266
let s = current_lockset ask in
1274-
let (vv, vv2, l) = st.priv in
1267+
let (vv, _, l) = st.priv in
12751268
let d_cpa = CPA.find x st.cpa in
12761269
let d_sync = L.fold (fun m bs acc ->
12771270
if not (MustVars.mem x (DV.find m vv)) then
@@ -1315,34 +1308,35 @@ struct
13151308
let sideg = Wrapper.sideg ask sideg in
13161309
let getg = Wrapper.getg ask getg in
13171310
let s = current_lockset ask in
1318-
let (vv, vv2, l) = st.priv in
1319-
let (v', v2') = L.fold (fun m _ (acc1, acc2) ->
1311+
let (vv, w, l) = st.priv in
1312+
let (v', w') = L.fold (fun m _ (acc1, acc2) ->
13201313
DV.add m (MustVars.add x (DV.find m acc1)) acc1,
1321-
DV2.add m (MayVars.add x (DV2.find m acc2)) acc2
1322-
) l (vv, vv2)
1314+
W.add m (MayVars.add x (W.find m acc2)) acc2
1315+
) l (vv, w)
13231316
in
13241317
let cpa' = CPA.add x v st.cpa in
13251318
if not invariant && not (!earlyglobs && is_excluded_from_earlyglobs x) then (
13261319
let v = distr_init getg x v in
13271320
sideg (V.global x) (UnwrappedG.create_weak (GWeak.singleton s v))
13281321
(* Unlock after invariant will still side effect refined value from CPA, because cannot distinguish from non-invariant write. *)
13291322
);
1330-
{st with cpa = cpa'; priv = (v', v2', l)}
1323+
{st with cpa = cpa'; priv = (v', w', l)}
13311324

13321325
let lock ask getg (st: BaseComponents (D).t) m =
13331326
let s = current_lockset ask in
1334-
let (v, v2, l) = st.priv in
1327+
let (v, w, l) = st.priv in
13351328
let v' = DV.add m (MustVars.empty ()) v in
1336-
let v2' = DV2.add m (MayVars.empty ()) v2 in
1329+
let w' = W.add m (MayVars.empty ()) w in
13371330
let l' = L.add m (MinLocksets.singleton s) l in
1338-
{st with priv = (v', v2', l')}
1331+
{st with priv = (v', w', l')}
13391332

13401333
let unlock ask getg sideg (st: BaseComponents (D).t) m =
13411334
let sideg = Wrapper.sideg ask sideg in
13421335
let getg = Wrapper.getg ask getg in
13431336
let s = MustLockset.remove m (current_lockset ask) in
1344-
let (_, v2, _) = st.priv in
1345-
let is_in_G x _ = is_global ask x && MayVars.mem x (DV2.find m v2) in
1337+
let (_, w, _) = st.priv in
1338+
let w = W.find m w in
1339+
let is_in_G x _ = is_global ask x && MayVars.mem x w in (* TODO: is_global check unnecessary? *)
13461340
let side_cpa = CPA.filter is_in_G st.cpa in
13471341
let side_cpa = CPA.mapi (fun x v ->
13481342
let v = distr_init getg x v in

0 commit comments

Comments
 (0)