Skip to content

Commit 3456d30

Browse files
authored
Merge pull request #861 from goblint/base-invariant-lvals
Fix base Invariant query lval and offset handling
2 parents 4e91db8 + 8773053 commit 3456d30

File tree

5 files changed

+24
-32
lines changed

5 files changed

+24
-32
lines changed

src/analyses/base.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,8 +1186,8 @@ struct
11861186
CilLval.Set.fold (fun k a ->
11871187
let i =
11881188
match k with
1189-
| (Var k, offset) ->
1190-
(try var_invariant ~offset k with Not_found -> Invariant.none)
1189+
| (Var v, offset) when not (InvariantCil.var_is_heap v) ->
1190+
(try I.key_invariant_lval v ~offset ~lval:k (Arg.find v) with Not_found -> Invariant.none)
11911191
| _ -> Invariant.none
11921192
in
11931193
Invariant.(a && i)

src/cdomains/structDomain.ml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ sig
2828
val widen_with_fct: (value -> value -> value) -> t -> t -> t
2929
val join_with_fct: (value -> value -> value) -> t -> t -> t
3030
val leq_with_fct: (value -> value -> bool) -> t -> t -> bool
31-
val invariant: value_invariant:(offset:Cil.offset -> lval:Cil.lval option -> value -> Invariant.t) -> offset:Cil.offset -> lval:Cil.lval option -> t -> Invariant.t
31+
val invariant: value_invariant:(offset:Cil.offset -> lval:Cil.lval -> value -> Invariant.t) -> offset:Cil.offset -> lval:Cil.lval -> t -> Invariant.t
3232
end
3333

3434
module Simple (Val: Arg) =
@@ -81,18 +81,15 @@ struct
8181
match offset with
8282
(* invariants for all fields *)
8383
| NoOffset ->
84-
let c_lval = Option.get lval in
8584
fold (fun f v acc ->
86-
let f_lval = Cil.addOffsetLval (Field (f, NoOffset)) c_lval in
87-
let i = value_invariant ~offset ~lval:(Some f_lval) v in
85+
let f_lval = Cil.addOffsetLval (Field (f, NoOffset)) lval in
86+
let i = value_invariant ~offset ~lval:f_lval v in
8887
Invariant.(acc && i)
8988
) x (Invariant.top ())
9089
(* invariant for one field *)
9190
| Field (f, offset) ->
9291
let v = get x f in
93-
let c_lval = Option.get lval in
94-
let f_lval = Cil.addOffsetLval (Field (f, NoOffset)) c_lval in
95-
value_invariant ~offset ~lval:(Some f_lval) v
92+
value_invariant ~offset ~lval v
9693
(* invariant for one index *)
9794
| Index (i, offset) ->
9895
Invariant.none

src/cdomains/structDomain.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ sig
2727
val widen_with_fct: (value -> value -> value) -> t -> t -> t
2828
val join_with_fct: (value -> value -> value) -> t -> t -> t
2929
val leq_with_fct: (value -> value -> bool) -> t -> t -> bool
30-
val invariant: value_invariant:(offset:Cil.offset -> lval:Cil.lval option -> value -> Invariant.t) -> offset:Cil.offset -> lval:Cil.lval option -> t -> Invariant.t
30+
val invariant: value_invariant:(offset:Cil.offset -> lval:Cil.lval -> value -> Invariant.t) -> offset:Cil.offset -> lval:Cil.lval -> t -> Invariant.t
3131
end
3232

3333
module Simple (Val: Arg): S with type value = Val.t and type field = fieldinfo

src/cdomains/unionDomain.ml

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module type S =
1010
sig
1111
include Lattice.S
1212
type value
13-
val invariant: value_invariant:(offset:Cil.offset -> lval:Cil.lval option -> value -> Invariant.t) -> offset:Cil.offset -> lval:Cil.lval option -> t -> Invariant.t
13+
val invariant: value_invariant:(offset:Cil.offset -> lval:Cil.lval -> value -> Invariant.t) -> offset:Cil.offset -> lval:Cil.lval -> t -> Invariant.t
1414
end
1515

1616
module Field = Lattice.Flat (CilType.Fieldinfo) (struct
@@ -27,23 +27,20 @@ struct
2727
match offset with
2828
(* invariants for all fields *)
2929
| Cil.NoOffset ->
30-
let c_lval = Option.get lval in
3130
begin match lift_f with
32-
| `Lifted f ->
33-
let f_lval = Cil.addOffsetLval (Field (f, NoOffset)) c_lval in
34-
value_invariant ~offset ~lval:(Some f_lval) v
35-
| `Top
36-
| `Bot ->
37-
Invariant.none
31+
| `Lifted f ->
32+
let f_lval = Cil.addOffsetLval (Field (f, NoOffset)) lval in
33+
value_invariant ~offset ~lval:f_lval v
34+
| `Top
35+
| `Bot ->
36+
Invariant.none
3837
end
3938
(* invariant for one field *)
4039
| Field (f, offset) ->
41-
let c_lval = Option.get lval in
4240
begin match lift_f with
4341
| `Lifted f' ->
4442
let v = Values.cast ~torg:f'.ftype f.ftype v in
45-
let f_lval = Cil.addOffsetLval (Field (f, NoOffset)) c_lval in
46-
value_invariant ~offset ~lval:(Some f_lval) v
43+
value_invariant ~offset ~lval v
4744
| `Top
4845
| `Bot ->
4946
Invariant.none

src/cdomains/valueDomain.ml

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,7 +1221,7 @@ struct
12211221
module VS = Set.Make (Basetype.Variables)
12221222

12231223
let rec ad_invariant ~vs ~offset ~lval x =
1224-
let c_exp = Cil.(Lval (Option.get lval)) in
1224+
let c_exp = Lval lval in
12251225
let i_opt = AD.fold (fun addr acc_opt ->
12261226
BatOption.bind acc_opt (fun acc ->
12271227
match addr with
@@ -1246,7 +1246,7 @@ struct
12461246
else
12471247
Invariant.none
12481248
in
1249-
let i_deref = deref_invariant ~vs ~lval vi offset (Mem c_exp, NoOffset) in
1249+
let i_deref = deref_invariant ~vs vi ~offset ~lval:(Mem c_exp, NoOffset) in
12501250

12511251
Some (Invariant.(acc || (i && i_deref)))
12521252
| Addr.NullPtr ->
@@ -1273,13 +1273,13 @@ struct
12731273

12741274
and vd_invariant ~vs ~offset ~lval = function
12751275
| `Int n ->
1276-
let e = Lval (Option.get lval) in
1276+
let e = Lval lval in
12771277
if InvariantCil.(not (exp_contains_tmp e) && exp_is_in_scope scope e) then
12781278
ID.invariant e n
12791279
else
12801280
Invariant.none
12811281
| `Float n ->
1282-
let e = Lval (Option.get lval) in
1282+
let e = Lval lval in
12831283
if InvariantCil.(not (exp_contains_tmp e) && exp_is_in_scope scope e) then
12841284
FD.invariant e n
12851285
else
@@ -1290,20 +1290,18 @@ struct
12901290
| `Union n -> Unions.invariant ~value_invariant:(vd_invariant ~vs) ~offset ~lval n
12911291
| _ -> Invariant.none (* TODO *)
12921292

1293-
(* TODO: remove duplicate lval arguments? *)
1294-
and deref_invariant ~vs ~lval vi offset lval' =
1293+
and deref_invariant ~vs vi ~offset ~lval =
12951294
let v = find vi in
1296-
key_invariant_lval ~vs ~lval vi offset lval' v
1295+
key_invariant_lval ~vs vi ~offset ~lval v
12971296

1298-
and key_invariant_lval ~vs ~lval k offset lval' v =
1297+
and key_invariant_lval ?(vs=VS.empty) k ~offset ~lval v =
12991298
if not (VS.mem k vs) then
13001299
let vs' = VS.add k vs in
1301-
vd_invariant ~vs:vs' ~offset ~lval:(Some lval') v
1300+
vd_invariant ~vs:vs' ~offset ~lval v
13021301
else
13031302
Invariant.none
13041303

1305-
1306-
let key_invariant k ?(offset=NoOffset) v = key_invariant_lval ~vs:VS.empty ~lval:None k offset (var k) v
1304+
let key_invariant k ?(offset=NoOffset) v = key_invariant_lval k ~offset ~lval:(var k) v
13071305
end
13081306

13091307
let invariant_global find g =

0 commit comments

Comments
 (0)