You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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)
2062
2062
in
2063
2063
List.fold_left init_var man.local f.slocals
2064
2064
@@ -2082,7 +2082,7 @@ struct
2082
2082
let t_override =Cilfacade.fundec_return_type fundec in
2083
2083
assert (not (Cil.isVoidType t_override)); (* Returning a value from a void function, CIL removes the Return expression for us anyway. *)
2084
2084
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
2086
2086
matchThreadId.get_current ask with
2087
2087
|`LiftedtidwhenThreadReturn.is_current ask ->
2088
2088
ifnot (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
2101
2101
else
2102
2102
let current_value = eval_rv ~man man.local (Lval (Var v, NoOffset)) in
2103
2103
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
(* if s1 is string literal, str(n)cpy and str(n)cat are undefined *)
2513
2513
if op_addr =Nonethen
2514
2514
(* triggers warning, function only evaluated for side-effects *)
2515
2515
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))
2517
2517
else
2518
2518
let s1_null_bytes =List.map CArrays.to_null_byte_domain (AD.to_string s1_a) in
2519
2519
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)
2521
2521
|_ ->
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))
2523
2523
in
2524
2524
(* 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) *)
2525
2525
letalloclocsize=
@@ -2557,13 +2557,13 @@ struct
2557
2557
|_ ->
2558
2558
VD.top_value dest_typ
2559
2559
in
2560
-
set ~man st dest_a dest_typ value
2560
+
set ~man st dest_a ~lval_type:dest_typ value
2561
2561
|Bzero{ dest; count; }, _ ->
2562
2562
(* TODO: share something with memset special case? *)
2563
2563
(* TODO: check count *)
2564
2564
let dest_a, dest_typ = addr_type_of_exp dest in
2565
2565
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
2567
2567
|Memcpy{ dest = dst; src; n; }, _ -> (* TODO: use n *)
|Arrayarray_s -> Int (CArrays.to_string_length array_s)
2586
2586
|_ -> VD.top_value (unrollType dest_typ)
2587
2587
in
2588
-
set ~man st dest_a dest_typ value
2588
+
set ~man st dest_a ~lval_type:dest_typ value
2589
2589
) st lv
2590
2590
|Strstr{ haystack; needle }, _ ->
2591
2591
Option.map_default (funlv_val ->
@@ -2634,12 +2634,12 @@ struct
2634
2634
let dst_lval = mkMem ~addr:(Cil.stripCasts attr) ~off:NoOffsetin
2635
2635
let dest_typ = get_type dst_lval in
2636
2636
let dest_a = eval_lv ~man st dst_lval in
2637
-
letfallback()= set ~man st dest_a dest_typ (MutexAttr (ValueDomain.MutexAttr.top ())) in
2637
+
letfallback()= set ~man st dest_a ~lval_type:dest_typ (MutexAttr (ValueDomain.MutexAttr.top ())) in
2638
2638
match eval_rv ~man st mtyp with
2639
2639
|Intx ->
2640
2640
Option.map_default_delayed (funz ->
2641
2641
ifM.tracing thenM.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))
2643
2643
) fallback (ID.to_int x)
2644
2644
|_ -> fallback ()
2645
2645
end
@@ -2713,7 +2713,7 @@ struct
2713
2713
|Abs (ik, x) -> Int (ID.cast_to ~kind:Internal ik (apply_abs ik x)) (* TODO: proper castkind *)
2714
2714
end
2715
2715
in
2716
-
Option.map_default (funlv -> set ~man st (eval_lv ~man st lv) (Cilfacade.typeOfLval lv) result) st lv
2716
+
Option.map_default (funlv -> set ~man st (eval_lv ~man st lv) ~lval_type:(Cilfacade.typeOfLval lv) result) st lv
2717
2717
(* handling thread creations *)
2718
2718
|ThreadCreate_, _ ->
2719
2719
invalidate_ret_lv man.local (* actual results joined via threadspawn *)
@@ -2729,7 +2729,7 @@ struct
2729
2729
|Threada ->
2730
2730
let v =List.fold VD.join (VD.bot ()) (List.map (funx -> G.thread (man.global (V.thread x))) (ValueDomain.Threads.elements a)) in
2731
2731
(* 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
2733
2733
|_ -> invalidate ~must:true~man st [ret_var]
2734
2734
end
2735
2735
|_ -> invalidate ~must:true~man st [ret_var]
@@ -2742,7 +2742,7 @@ struct
2742
2742
|ThreadSelf, _ ->
2743
2743
beginmatch lv, ThreadId.get_current (Analyses.ask_of_man man) with
2744
2744
|Somelv, `Liftedtid ->
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))
2746
2746
|Somelv, _ ->
2747
2747
invalidate_ret_lv st
2748
2748
|None, _ ->
@@ -2816,13 +2816,13 @@ struct
2816
2816
let st' =match eval_rv ~man st env with
2817
2817
|Addressjmp_buf ->
2818
2818
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
2820
2820
ifM.tracing thenM.tracel "setjmp""setting setjmp %a on %a -> %a" d_exp env D.pretty st D.pretty r;
2821
2821
r
2822
2822
|_ -> failwith "problem?!"
2823
2823
in
2824
2824
Option.map_default (funlv ->
2825
-
set ~man st' (eval_lv ~man st lv) (Cilfacade.typeOfLval lv) (Int (ID.of_int IIntZ.zero))
2825
+
set ~man st' (eval_lv ~man st lv) ~lval_type:(Cilfacade.typeOfLval lv) (Int (ID.of_int IIntZ.zero))
2826
2826
) st' lv
2827
2827
|Longjmp{env; value}, _ ->
2828
2828
letensure_not_zero (rv:value) =match rv with
@@ -2843,11 +2843,11 @@ struct
2843
2843
in
2844
2844
let rv = ensure_not_zero @@ eval_rv ~man man.local value in
2845
2845
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! *)
2847
2847
|Rand, _ ->
2848
2848
Option.map_default (funx ->
2849
2849
let result:value = (Int (ID.starting IIntZ.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
2851
2851
) st lv
2852
2852
|_, _ ->
2853
2853
let st =
@@ -3076,7 +3076,7 @@ struct
3076
3076
let get_var = get_var
3077
3077
letget~manstaddrsexp= get ~man st addrs exp
3078
3078
letget_mval~manstmvalexp= get_mval ~man st mval exp
3079
-
letset~manstlvallval_type?lval_rawvalue= 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
+
letset~manstlvallval_type?lval_rawvalue= 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 *)
0 commit comments