Skip to content

Commit 6c38c1c

Browse files
committed
Name lval_type argument for base set
1 parent 5df7a36 commit 6c38c1c

File tree

1 file changed

+42
-42
lines changed

1 file changed

+42
-42
lines changed

src/analyses/base.ml

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,7 +1673,7 @@ struct
16731673

16741674
(* Updating a single varinfo*offset pair. NB! This function's type does
16751675
* not include the flag. *)
1676-
let set_mval ~(man: _ man) ?(invariant=false) ?(blob_destructive=false) ?lval_raw ?rval_raw ?t_override (st: store) ((x, offs): Addr.Mval.t) (lval_type: Cil.typ) (value: value): store =
1676+
let set_mval ~(man: _ man) ?(invariant=false) ?(blob_destructive=false) ?lval_raw ?rval_raw ?t_override (st: store) ((x, offs): Addr.Mval.t) ~(lval_type: Cil.typ) (value: value): store =
16771677
let ask = Analyses.ask_of_man man in
16781678
let cil_offset = Offs.to_cil_offset offs in
16791679
let t = match t_override with
@@ -1812,20 +1812,20 @@ struct
18121812
effect_on_arrays ask with_dep
18131813
end
18141814

1815-
let set_var ~(man: _ man) ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override (st: store) (x: Cil.varinfo) (lval_type: Cil.typ) (value: value): store =
1816-
set_mval ~man ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override st (x, `NoOffset) lval_type value
1815+
let set_var ~(man: _ man) ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override (st: store) (x: Cil.varinfo) ~(lval_type: Cil.typ) (value: value): store =
1816+
set_mval ~man ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override st (x, `NoOffset) ~lval_type value
18171817

1818-
let set_addr ~(man: _ man) ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override (st: store) (x: Addr.t) (lval_type: Cil.typ) (value: value): store =
1819-
Option.map_default (fun x -> set_mval ~man ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override st x lval_type value) st (Addr.to_mval x)
1818+
let set_addr ~(man: _ man) ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override (st: store) (x: Addr.t) ~(lval_type: Cil.typ) (value: value): store =
1819+
Option.map_default (fun x -> set_mval ~man ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override st x ~lval_type value) st (Addr.to_mval x)
18201820

18211821
(** [set st addr val] returns a state where [addr] is set to [val]
18221822
* it is always ok to put None for lval_raw and rval_raw, this amounts to not using/maintaining
18231823
* precise information about arrays. *)
1824-
let set ~(man: _ man) ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override (st: store) (lval: AD.t) (lval_type: Cil.typ) (value: value) : store =
1824+
let set ~(man: _ man) ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override (st: store) (lval: AD.t) ~(lval_type: Cil.typ) (value: value) : store =
18251825
let lval_raw = (Option.map (fun x -> Lval x) lval_raw) in
18261826
if M.tracing then M.tracel "set" "lval: %a\nvalue: %a\nstate: %a" AD.pretty lval VD.pretty value CPA.pretty st.cpa;
18271827
let update_one x store =
1828-
set_addr ~man ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override store x lval_type value
1828+
set_addr ~man ?invariant ?blob_destructive ?lval_raw ?rval_raw ?t_override store x ~lval_type value
18291829
in try
18301830
(* We start from the current state and an empty list of global deltas,
18311831
* and we assign to all the different possible places: *)
@@ -1845,7 +1845,7 @@ struct
18451845
let set_many ~man (st: store) lval_value_list: store =
18461846
(* Maybe this can be done with a simple fold *)
18471847
let f (acc: store) ((lval:AD.t),(typ:Cil.typ),(value:value)): store =
1848-
set ~man acc lval typ value
1848+
set ~man acc lval ~lval_type:typ value
18491849
in
18501850
(* And fold over the list starting from the store turned wstore: *)
18511851
List.fold_left f st lval_value_list
@@ -1899,7 +1899,7 @@ struct
18991899
let get_var = get_var
19001900
let get_mval ~man st mval exp = get_mval ~man st mval exp
19011901
let get ~man st addrs exp = get ~man st addrs exp
1902-
let set ~man st lval lval_type ?lval_raw value = set ~man ~invariant:true st lval lval_type ?lval_raw value
1902+
let set ~man st lval lval_type ?lval_raw value = set ~man ~invariant:true st lval ~lval_type ?lval_raw value (* TODO: name lval_type in BaseInvariant *)
19031903

19041904
let refine_entire_var = true
19051905
let map_oldval oldval _ = oldval
@@ -1919,8 +1919,8 @@ struct
19191919
let set_savetop ~man ?lval_raw ?rval_raw st adr lval_t v : store =
19201920
if M.tracing then M.tracel "set" "savetop %a %a %a" AD.pretty adr d_type lval_t VD.pretty v;
19211921
match v with
1922-
| Top -> set ~man st adr lval_t (VD.top_value (AD.type_of adr)) ?lval_raw ?rval_raw
1923-
| v -> set ~man st adr lval_t v ?lval_raw ?rval_raw
1922+
| Top -> set ~man st adr ~lval_type:lval_t (VD.top_value (AD.type_of adr)) ?lval_raw ?rval_raw
1923+
| v -> set ~man st adr ~lval_type:lval_t v ?lval_raw ?rval_raw
19241924

19251925

19261926
(**************************************************************************
@@ -2058,7 +2058,7 @@ struct
20582058

20592059
let body man f =
20602060
let init_var (acc: store) v: store =
2061-
set_var ~man acc v v.vtype (VD.init_value ~varAttr:v.vattr v.vtype)
2061+
set_var ~man acc v ~lval_type:v.vtype (VD.init_value ~varAttr:v.vattr v.vtype)
20622062
in
20632063
List.fold_left init_var man.local f.slocals
20642064

@@ -2082,7 +2082,7 @@ struct
20822082
let t_override = Cilfacade.fundec_return_type fundec in
20832083
assert (not (Cil.isVoidType t_override)); (* Returning a value from a void function, CIL removes the Return expression for us anyway. *)
20842084
let rv = eval_rv ~man man.local exp in
2085-
let st' = set_var ~man ~t_override nst (return_varinfo ()) t_override rv in
2085+
let st' = set_var ~man ~t_override nst (return_varinfo ()) ~lval_type:t_override rv in
20862086
match ThreadId.get_current ask with
20872087
| `Lifted tid when ThreadReturn.is_current ask ->
20882088
if not (ThreadIdDomain.Thread.is_main tid) then ( (* Only non-main return constitutes an implicit pthread_exit according to man page (https://github.com/goblint/analyzer/issues/1767#issuecomment-3642590227). *)
@@ -2101,7 +2101,7 @@ struct
21012101
else
21022102
let current_value = eval_rv ~man man.local (Lval (Var v, NoOffset)) in
21032103
let new_value = VD.update_array_lengths (eval_rv ~man man.local) current_value v.vtype in
2104-
set_var ~man man.local v v.vtype new_value
2104+
set_var ~man man.local v ~lval_type:v.vtype new_value
21052105

21062106
(**************************************************************************
21072107
* Function calls
@@ -2154,7 +2154,7 @@ struct
21542154
);
21552155
(* copied from set_many *)
21562156
let f (acc: store) ((lval:Addr.t),(typ:Cil.typ),(value:value)): store =
2157-
let acc' = set_addr ~man acc lval typ value in
2157+
let acc' = set_addr ~man acc lval ~lval_type:typ value in
21582158
if must then
21592159
acc'
21602160
else
@@ -2421,7 +2421,7 @@ struct
24212421
else
24222422
VD.top_value (unrollType dest_typ)
24232423
in
2424-
set ~man st dest_a dest_typ value in
2424+
set ~man st dest_a ~lval_type:dest_typ value in
24252425
(* for string functions *)
24262426
let eval_n = function
24272427
(* if only n characters of a given string are needed, evaluate expression n to an integer option *)
@@ -2467,27 +2467,27 @@ struct
24672467
let lv_a = eval_lv ~man st lv_val in
24682468
let lv_typ = Cilfacade.typeOfLval lv_val in
24692469
if all && typeSig s1_typ = typeSig s2_typ && typeSig s2_typ = typeSig lv_typ then (* all types need to coincide *)
2470-
set ~man st lv_a lv_typ (f s1_a s2_a)
2470+
set ~man st lv_a ~lval_type:lv_typ (f s1_a s2_a)
24712471
else if not all && typeSig s1_typ = typeSig s2_typ then (* only the types of s1 and s2 need to coincide *)
2472-
set ~man st lv_a lv_typ (f s1_a s2_a)
2472+
set ~man st lv_a ~lval_type:lv_typ (f s1_a s2_a)
24732473
else
2474-
set ~man st lv_a lv_typ (VD.top_value (unrollType lv_typ))
2474+
set ~man st lv_a ~lval_type:lv_typ (VD.top_value (unrollType lv_typ))
24752475
| _ ->
24762476
(* check if s1 is potentially a string literal as writing to it would be undefined behavior; then return top *)
24772477
let _ = AD.string_writing_defined s1_a in
2478-
set ~man st s1_a s1_typ (VD.top_value (unrollType s1_typ))
2478+
set ~man st s1_a ~lval_type:s1_typ (VD.top_value (unrollType s1_typ))
24792479
end
24802480
(* else compute value in array domain *)
24812481
else
24822482
let lv_a, lv_typ =
24832483
Option.map_default (fun lv -> eval_lv ~man st lv, Cilfacade.typeOfLval lv) (s1_a, s1_typ) lv
24842484
in
24852485
match (get ~man st s1_a None), get ~man st s2_a None with
2486-
| Array array_s1, Array array_s2 -> set ~man ~blob_destructive:true st lv_a lv_typ (op_array array_s1 array_s2)
2486+
| Array array_s1, Array array_s2 -> set ~man ~blob_destructive:true st lv_a ~lval_type:lv_typ (op_array array_s1 array_s2)
24872487
| Array array_s1, _ when CilType.Typ.equal s2_typ charPtrType ->
24882488
let s2_null_bytes = List.map CArrays.to_null_byte_domain (AD.to_string s2_a) in
24892489
let array_s2 = List.fold_left CArrays.join (CArrays.bot ()) s2_null_bytes in
2490-
set ~man ~blob_destructive:true st lv_a lv_typ (op_array array_s1 array_s2)
2490+
set ~man ~blob_destructive:true st lv_a ~lval_type:lv_typ (op_array array_s1 array_s2)
24912491
| Bot, Array array_s2 ->
24922492
(* If we have bot inside here, we assume the blob is used as a char array and create one inside *)
24932493
let ptrdiff_ik = Cilfacade.ptrdiff_ikind () in
@@ -2496,7 +2496,7 @@ struct
24962496
try ValueDomainQueries.ID.unlift (ID.cast_to ~kind:Internal ptrdiff_ik) size (* TODO: proper castkind *)
24972497
with Failure _ -> ID.top_of ptrdiff_ik in
24982498
let empty_array = CArrays.make s_id (Int (ID.top_of IChar)) in
2499-
set ~man st lv_a lv_typ (op_array empty_array array_s2)
2499+
set ~man st lv_a ~lval_type:lv_typ (op_array empty_array array_s2)
25002500
| Bot , _ when CilType.Typ.equal s2_typ charPtrType ->
25012501
(* If we have bot inside here, we assume the blob is used as a char array and create one inside *)
25022502
let ptrdiff_ik = Cilfacade.ptrdiff_ikind () in
@@ -2507,19 +2507,19 @@ struct
25072507
let empty_array = CArrays.make s_id (Int (ID.top_of IChar)) in
25082508
let s2_null_bytes = List.map CArrays.to_null_byte_domain (AD.to_string s2_a) in
25092509
let array_s2 = List.fold_left CArrays.join (CArrays.bot ()) s2_null_bytes in
2510-
set ~man st lv_a lv_typ (op_array empty_array array_s2)
2510+
set ~man st lv_a ~lval_type:lv_typ (op_array empty_array array_s2)
25112511
| _, Array array_s2 when CilType.Typ.equal s1_typ charPtrType ->
25122512
(* if s1 is string literal, str(n)cpy and str(n)cat are undefined *)
25132513
if op_addr = None then
25142514
(* triggers warning, function only evaluated for side-effects *)
25152515
let _ = AD.string_writing_defined s1_a in
2516-
set ~man st s1_a s1_typ (VD.top_value (unrollType s1_typ))
2516+
set ~man st s1_a ~lval_type:s1_typ (VD.top_value (unrollType s1_typ))
25172517
else
25182518
let s1_null_bytes = List.map CArrays.to_null_byte_domain (AD.to_string s1_a) in
25192519
let array_s1 = List.fold_left CArrays.join (CArrays.bot ()) s1_null_bytes in
2520-
set ~man st lv_a lv_typ (op_array array_s1 array_s2)
2520+
set ~man st lv_a ~lval_type:lv_typ (op_array array_s1 array_s2)
25212521
| _ ->
2522-
set ~man st lv_a lv_typ (VD.top_value (unrollType lv_typ))
2522+
set ~man st lv_a ~lval_type:lv_typ (VD.top_value (unrollType lv_typ))
25232523
in
25242524
(* Returns a tuple, the first is the address of the blob if one was allocated, the second is the returned address (may contain null pointer or be only null-pointer) *)
25252525
let alloc loc size =
@@ -2557,13 +2557,13 @@ struct
25572557
| _ ->
25582558
VD.top_value dest_typ
25592559
in
2560-
set ~man st dest_a dest_typ value
2560+
set ~man st dest_a ~lval_type:dest_typ value
25612561
| Bzero { dest; count; }, _ ->
25622562
(* TODO: share something with memset special case? *)
25632563
(* TODO: check count *)
25642564
let dest_a, dest_typ = addr_type_of_exp dest in
25652565
let value = VD.zero_init_value dest_typ in
2566-
set ~man st dest_a dest_typ value
2566+
set ~man st dest_a ~lval_type:dest_typ value
25672567
| Memcpy { dest = dst; src; n; }, _ -> (* TODO: use n *)
25682568
memory_copying dst src (Some n)
25692569
| Strcpy { dest = dst; src; n }, _ -> string_manipulation dst src None false None (fun ar1 ar2 -> Array (CArrays.string_copy ar1 ar2 (eval_n n)))
@@ -2585,7 +2585,7 @@ struct
25852585
| Array array_s -> Int (CArrays.to_string_length array_s)
25862586
| _ -> VD.top_value (unrollType dest_typ)
25872587
in
2588-
set ~man st dest_a dest_typ value
2588+
set ~man st dest_a ~lval_type:dest_typ value
25892589
) st lv
25902590
| Strstr { haystack; needle }, _ ->
25912591
Option.map_default (fun lv_val ->
@@ -2634,12 +2634,12 @@ struct
26342634
let dst_lval = mkMem ~addr:(Cil.stripCasts attr) ~off:NoOffset in
26352635
let dest_typ = get_type dst_lval in
26362636
let dest_a = eval_lv ~man st dst_lval in
2637-
let fallback () = set ~man st dest_a dest_typ (MutexAttr (ValueDomain.MutexAttr.top ())) in
2637+
let fallback () = set ~man st dest_a ~lval_type:dest_typ (MutexAttr (ValueDomain.MutexAttr.top ())) in
26382638
match eval_rv ~man st mtyp with
26392639
| Int x ->
26402640
Option.map_default_delayed (fun z ->
26412641
if M.tracing then M.tracel "attr" "setting";
2642-
set ~man st dest_a dest_typ (MutexAttr (ValueDomain.MutexAttr.of_int z))
2642+
set ~man st dest_a ~lval_type:dest_typ (MutexAttr (ValueDomain.MutexAttr.of_int z))
26432643
) fallback (ID.to_int x)
26442644
| _ -> fallback ()
26452645
end
@@ -2713,7 +2713,7 @@ struct
27132713
| Abs (ik, x) -> Int (ID.cast_to ~kind:Internal ik (apply_abs ik x)) (* TODO: proper castkind *)
27142714
end
27152715
in
2716-
Option.map_default (fun lv -> set ~man st (eval_lv ~man st lv) (Cilfacade.typeOfLval lv) result) st lv
2716+
Option.map_default (fun lv -> set ~man st (eval_lv ~man st lv) ~lval_type:(Cilfacade.typeOfLval lv) result) st lv
27172717
(* handling thread creations *)
27182718
| ThreadCreate _, _ ->
27192719
invalidate_ret_lv man.local (* actual results joined via threadspawn *)
@@ -2729,7 +2729,7 @@ struct
27292729
| Thread a ->
27302730
let v = List.fold VD.join (VD.bot ()) (List.map (fun x -> G.thread (man.global (V.thread x))) (ValueDomain.Threads.elements a)) in
27312731
(* TODO: is this type right? *)
2732-
set ~man st ret_a (Cilfacade.typeOf ret_var) v
2732+
set ~man st ret_a ~lval_type:(Cilfacade.typeOf ret_var) v
27332733
| _ -> invalidate ~must:true ~man st [ret_var]
27342734
end
27352735
| _ -> invalidate ~must:true ~man st [ret_var]
@@ -2742,7 +2742,7 @@ struct
27422742
| ThreadSelf, _ ->
27432743
begin match lv, ThreadId.get_current (Analyses.ask_of_man man) with
27442744
| Some lv, `Lifted tid ->
2745-
set ~man st (eval_lv ~man st lv) (Cilfacade.typeOfLval lv) (Thread (ValueDomain.Threads.singleton tid))
2745+
set ~man st (eval_lv ~man st lv) ~lval_type:(Cilfacade.typeOfLval lv) (Thread (ValueDomain.Threads.singleton tid))
27462746
| Some lv, _ ->
27472747
invalidate_ret_lv st
27482748
| None, _ ->
@@ -2816,13 +2816,13 @@ struct
28162816
let st' = match eval_rv ~man st env with
28172817
| Address jmp_buf ->
28182818
let value = VD.JmpBuf (ValueDomain.JmpBufs.Bufs.singleton (Target (man.prev_node, man.control_context ())), false) in
2819-
let r = set ~man st jmp_buf (Cilfacade.typeOf env) value in
2819+
let r = set ~man st jmp_buf ~lval_type:(Cilfacade.typeOf env) value in
28202820
if M.tracing then M.tracel "setjmp" "setting setjmp %a on %a -> %a" d_exp env D.pretty st D.pretty r;
28212821
r
28222822
| _ -> failwith "problem?!"
28232823
in
28242824
Option.map_default (fun lv ->
2825-
set ~man st' (eval_lv ~man st lv) (Cilfacade.typeOfLval lv) (Int (ID.of_int IInt Z.zero))
2825+
set ~man st' (eval_lv ~man st lv) ~lval_type:(Cilfacade.typeOfLval lv) (Int (ID.of_int IInt Z.zero))
28262826
) st' lv
28272827
| Longjmp {env; value}, _ ->
28282828
let ensure_not_zero (rv:value) = match rv with
@@ -2843,11 +2843,11 @@ struct
28432843
in
28442844
let rv = ensure_not_zero @@ eval_rv ~man man.local value in
28452845
let t = Cilfacade.typeOf value in
2846-
set_var ~man ~t_override:t man.local !longjmp_return t rv (* Not raising Deadcode here, deadcode is raised at a higher level! *)
2846+
set_var ~man ~t_override:t man.local !longjmp_return ~lval_type:t rv (* Not raising Deadcode here, deadcode is raised at a higher level! *)
28472847
| Rand, _ ->
28482848
Option.map_default (fun x ->
28492849
let result:value = (Int (ID.starting IInt Z.zero)) in
2850-
set ~man st (eval_lv ~man st x) (Cilfacade.typeOfLval x) result
2850+
set ~man st (eval_lv ~man st x) ~lval_type:(Cilfacade.typeOfLval x) result
28512851
) st lv
28522852
| _, _ ->
28532853
let st =
@@ -3076,7 +3076,7 @@ struct
30763076
let get_var = get_var
30773077
let get ~man st addrs exp = get ~man st addrs exp
30783078
let get_mval ~man st mval exp = get_mval ~man st mval exp
3079-
let set ~man st lval lval_type ?lval_raw value = set ~man ~invariant:false st lval lval_type ?lval_raw value (* TODO: should have invariant false? doesn't work with empty cpa then, because meets *)
3079+
let set ~man st lval lval_type ?lval_raw value = set ~man ~invariant:false st lval ~lval_type ?lval_raw value (* TODO: should have invariant false? doesn't work with empty cpa then, because meets *)
30803080

30813081
let refine_entire_var = false
30823082
let map_oldval oldval t_lval =
@@ -3119,7 +3119,7 @@ struct
31193119
let e_d' =
31203120
WideningTokenLifter.with_side_tokens (WideningTokenLifter.TS.of_list uuids) (fun () ->
31213121
CPA.fold (fun x v acc ->
3122-
set_var ~man ~invariant:false acc x x.vtype v
3122+
set_var ~man ~invariant:false acc x ~lval_type:x.vtype v
31233123
) e_d.cpa man.local
31243124
)
31253125
in
@@ -3146,7 +3146,7 @@ struct
31463146
Priv.enter_multithreaded ask (priv_getg man.global) (priv_sideg man.sideg) st
31473147
| Events.AssignSpawnedThread (lval, tid) ->
31483148
(* TODO: is this type right? *)
3149-
set ~man man.local (eval_lv ~man man.local lval) (Cilfacade.typeOfLval lval) (Thread (ValueDomain.Threads.singleton tid))
3149+
set ~man man.local (eval_lv ~man man.local lval) ~lval_type:(Cilfacade.typeOfLval lval) (Thread (ValueDomain.Threads.singleton tid))
31503150
| Events.Assert exp ->
31513151
assert_fn man exp true
31523152
| Events.Unassume {exp; tokens} ->

0 commit comments

Comments
 (0)