[infer][IR] factor the test for pointer type

Summary: There was several implementations of the same function accross the codebase

Reviewed By: sblackshear

Differential Revision: D6658266

fbshipit-source-id: e12507b
master
Jeremy Dubreil 7 years ago committed by Facebook Github Bot
parent f50c7b469e
commit c6a6087ed1

@ -467,6 +467,8 @@ let rec is_array_of_cpp_class typ =
match typ.desc with Tarray (typ, _, _) -> is_array_of_cpp_class typ | _ -> is_cpp_class typ match typ.desc with Tarray (typ, _, _) -> is_array_of_cpp_class typ | _ -> is_cpp_class typ
let is_pointer typ = match typ.desc with Tptr _ -> true | _ -> false
let is_pointer_to_cpp_class typ = match typ.desc with Tptr (t, _) -> is_cpp_class t | _ -> false let is_pointer_to_cpp_class typ = match typ.desc with Tptr (t, _) -> is_cpp_class t | _ -> false
let has_block_prefix s = let has_block_prefix s =

@ -250,6 +250,8 @@ val is_array_of_cpp_class : t -> bool
val is_pointer_to_cpp_class : t -> bool val is_pointer_to_cpp_class : t -> bool
val is_pointer : t -> bool
val has_block_prefix : string -> bool val has_block_prefix : string -> bool
val is_block_type : t -> bool val is_block_type : t -> bool

@ -1160,12 +1160,11 @@ let pp_cfgnodename pname fmt (n: Procdesc.Node.t) =
let pp_etlist byvals fmt etl = let pp_etlist byvals fmt etl =
List.iteri List.iteri
~f:(fun index (id, ({Typ.desc} as ty)) -> ~f:(fun index (id, typ) ->
let is_ptr = match desc with Tptr _ -> true | _ -> false in
let byval_mark = let byval_mark =
if is_ptr && List.mem byvals index ~equal:Int.equal then "(byval)" else "" if Typ.is_pointer typ && List.mem byvals index ~equal:Int.equal then "(byval)" else ""
in in
Format.fprintf fmt " %a:%a%s" Mangled.pp id (Typ.pp_full Pp.text) ty byval_mark ) Format.fprintf fmt " %a:%a%s" Mangled.pp id (Typ.pp_full Pp.text) typ byval_mark )
etl etl

@ -31,8 +31,6 @@ end)
let blacklisted_functions = [BuiltinDecl.__set_array_length] let blacklisted_functions = [BuiltinDecl.__set_array_length]
let is_type_pointer t = match t.Typ.desc with Typ.Tptr _ -> true | _ -> false
let rec is_basic_type t = let rec is_basic_type t =
match t.Typ.desc with match t.Typ.desc with
| Tint _ | Tfloat _ | Tvoid -> | Tint _ | Tfloat _ | Tvoid ->
@ -87,11 +85,7 @@ module TransferFunctions (CFG : ProcCfg.S) = struct
let function_expects_a_pointer_as_nth_param callee_pname idx = let function_expects_a_pointer_as_nth_param callee_pname idx =
match nth_formal_param callee_pname idx with match nth_formal_param callee_pname idx with Some (_, typ) -> Typ.is_pointer typ | _ -> false
| Some (_, typ) ->
is_type_pointer typ
| _ ->
false
let is_struct_field_passed_by_ref call t al idx = let is_struct_field_passed_by_ref call t al idx =
@ -103,7 +97,7 @@ module TransferFunctions (CFG : ProcCfg.S) = struct
~f:(fun idx e -> ~f:(fun idx e ->
match e with match e with
| HilExp.AccessPath ((var, t), al) | HilExp.AccessPath ((var, t), al)
when should_report_var pdesc tenv uninit_vars ((var, t), al) && not (is_type_pointer t) when should_report_var pdesc tenv uninit_vars ((var, t), al) && not (Typ.is_pointer t)
&& not (is_struct_field_passed_by_ref call t al idx) -> && not (is_struct_field_passed_by_ref call t al idx) ->
report_intra ((var, t), al) loc (snd extras) report_intra ((var, t), al) loc (snd extras)
| _ -> | _ ->
@ -171,7 +165,7 @@ module TransferFunctions (CFG : ProcCfg.S) = struct
HilExp.is_null_literal rhs HilExp.is_null_literal rhs
(* the rhs has type int when assigning the lhs to null *) (* the rhs has type int when assigning the lhs to null *)
|| Option.equal Typ.equal (AccessPath.get_typ lhs tenv) (HilExp.get_typ tenv rhs) || Option.equal Typ.equal (AccessPath.get_typ lhs tenv) (HilExp.get_typ tenv rhs)
&& is_type_pointer (snd (fst lhs)) && Typ.is_pointer (snd (fst lhs))
(* checks that the set of initialized formal parameters defined in the precondition of (* checks that the set of initialized formal parameters defined in the precondition of
@ -206,7 +200,7 @@ module TransferFunctions (CFG : ProcCfg.S) = struct
let exec_instr (astate: Domain.astate) {ProcData.pdesc; ProcData.extras; ProcData.tenv} _ let exec_instr (astate: Domain.astate) {ProcData.pdesc; ProcData.extras; ProcData.tenv} _
(instr: HilInstr.t) = (instr: HilInstr.t) =
let update_prepost (((_, lhs_typ), apl) as lhs_ap) rhs = let update_prepost (((_, lhs_typ), apl) as lhs_ap) rhs =
if FormalMap.is_formal (fst lhs_ap) (fst extras) && is_type_pointer lhs_typ if FormalMap.is_formal (fst lhs_ap) (fst extras) && Typ.is_pointer lhs_typ
&& (not (is_pointer_assignment tenv lhs_ap rhs) || List.length apl > 0) && (not (is_pointer_assignment tenv lhs_ap rhs) || List.length apl > 0)
then then
let pre' = D.add lhs_ap (fst astate.prepost) in let pre' = D.add lhs_ap (fst astate.prepost) in
@ -225,7 +219,7 @@ module TransferFunctions (CFG : ProcCfg.S) = struct
in in
let prepost = update_prepost lhs_ap rhs in let prepost = update_prepost lhs_ap rhs in
(* check on lhs_typ to avoid false positive when assigning a pointer to another *) (* check on lhs_typ to avoid false positive when assigning a pointer to another *)
if should_report_var pdesc tenv uninit_vars (rhs_base, al) && not (is_type_pointer lhs_typ) if should_report_var pdesc tenv uninit_vars (rhs_base, al) && not (Typ.is_pointer lhs_typ)
then report_intra (rhs_base, al) loc (snd extras) ; then report_intra (rhs_base, al) loc (snd extras) ;
{astate with uninit_vars; prepost} {astate with uninit_vars; prepost}
| Assign (((lhs_ap, apl) as lhs), rhs, _) -> | Assign (((lhs_ap, apl) as lhs), rhs, _) ->

@ -500,7 +500,7 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
extract_exp_from_list pre_trans_result.exps extract_exp_from_list pre_trans_result.exps
"WARNING: in Field dereference we expect to know the object@\n" "WARNING: in Field dereference we expect to know the object@\n"
in in
let is_pointer_typ = match class_typ.desc with Typ.Tptr _ -> true | _ -> false in let is_pointer_typ = Typ.is_pointer class_typ in
let class_typ = match class_typ.desc with Typ.Tptr (t, _) -> t | _ -> class_typ in let class_typ = match class_typ.desc with Typ.Tptr (t, _) -> t | _ -> class_typ in
L.(debug Capture Verbose) "Type is '%s' @." (Typ.to_string class_typ) ; L.(debug Capture Verbose) "Type is '%s' @." (Typ.to_string class_typ) ;
let class_tname = let class_tname =

Loading…
Cancel
Save