@@ -697,7 +697,7 @@ struct
697697 let a1 = eval_rv a gs st e1 in
698698 let a2 = eval_rv a gs st e2 in
699699 let both_arith_type = isArithmeticType (typeOf e1) && isArithmeticType (typeOf e2) in
700- let is_safe = VD. equal a1 a2 || VD. is_safe_cast t1 (typeOf e1) && VD. is_safe_cast t2 (typeOf e2) && not both_arith_type in
700+ let is_safe = ( VD. equal a1 a2 || VD. is_safe_cast t1 (typeOf e1) && VD. is_safe_cast t2 (typeOf e2) ) && not both_arith_type in
701701 M. tracel " cast" " remove cast on both sides for %a? -> %b\n " d_exp exp is_safe;
702702 if is_safe then ( (* we can ignore the casts if the values are equal anyway, or if the casts can't change the value *)
703703 let e1 = if isArithmeticType (typeOf e1) then c1 else e1 in
@@ -1870,7 +1870,7 @@ struct
18701870 let start_addr = eval_tv ctx.ask ctx.global ctx.local start in
18711871 List. filter_map (create_thread (Some (Mem id, NoOffset )) (Some ptc_arg)) (AD. to_var_may start_addr)
18721872 end
1873- | `Unknown _ -> begin
1873+ | `Unknown _ when get_bool " exp.unknown_funs_spawn " -> begin
18741874 let args =
18751875 match LF. get_invalidate_action f.vname with
18761876 | Some fnc -> fnc `Write args (* why do we only spawn arguments that are written?? *)
@@ -1934,7 +1934,7 @@ struct
19341934 let special ctx (lv :lval option ) (f : varinfo ) (args : exp list ) =
19351935 (* let heap_var = heap_var !Tracing.current_loc in*)
19361936 let forks = forkfun ctx lv f args in
1937- if M. tracing then M. tracel " spawn" " Base.special %s: spawning functions %a\n " f.vname (d_list " ," d_varinfo) (List. map BatTuple.Tuple3. second forks);
1937+ if M. tracing then if not ( List. is_empty forks) then M. tracel " spawn" " Base.special %s: spawning functions %a\n " f.vname (d_list " ," d_varinfo) (List. map BatTuple.Tuple3. second forks);
19381938 List. iter (BatTuple.Tuple3. uncurry ctx.spawn) forks;
19391939 let cpa,dep as st = ctx.local in
19401940 let gs = ctx.global in
0 commit comments