diff --git a/infer/src/pulse/PulseModelsDSL.ml b/infer/src/pulse/PulseModelsDSL.ml index 387d36bd9d..bf4e6fa2fb 100644 --- a/infer/src/pulse/PulseModelsDSL.ml +++ b/infer/src/pulse/PulseModelsDSL.ml @@ -274,13 +274,13 @@ module Syntax = struct (fun {decompiler} -> PulseDecompiler.find addr decompiler) |> exec_pure_operation - let is_block_list pvar = + let is_dict_missing_key_var_block_list s = Option.exists Config.dict_missing_key_var_block_list ~f:(fun regexp -> - Str.string_match regexp (Pvar.to_string pvar) 0 ) + Str.string_match regexp s 0 ) let get_pvar_deref_typ formals pvar : Typ.name option model_monad = - if is_block_list pvar then ret None + if is_dict_missing_key_var_block_list (Pvar.to_string pvar) then ret None else match List.Assoc.find formals ~equal:Pvar.equal pvar with | Some typ -> @@ -291,8 +291,10 @@ module Syntax = struct let resolve_field_info typ fld : Struct.field_info option model_monad = - let* {analysis_data= {tenv}} = get_data in - Tenv.resolve_field_info tenv typ fld |> ret + if is_dict_missing_key_var_block_list (Fieldname.get_field_name fld) then ret None + else + let* {analysis_data= {tenv}} = get_data in + Tenv.resolve_field_info tenv typ fld |> ret let is_dict_non_alias formals addr : bool model_monad = diff --git a/infer/tests/codetoanalyze/hack/pulse/Makefile b/infer/tests/codetoanalyze/hack/pulse/Makefile index 255377a3dc..114f7262a8 100644 --- a/infer/tests/codetoanalyze/hack/pulse/Makefile +++ b/infer/tests/codetoanalyze/hack/pulse/Makefile @@ -10,7 +10,9 @@ INFER_OPTIONS = --pulse-only --debug-exceptions --pulse-specialization-partial \ --pulse-max-disjuncts 8 --log-pulse-unreachable-nodes \ --pulse-transitive-access-config transitive-access-config.json \ --pulse-transitive-access-config transitive-access-config-extra.json \ - --dict-missing-key-var-block-list '\$$args' + --dict-missing-key-var-block-list '\$$args' \ + --dict-missing-key-var-block-list 'block_listed_field' \ + INFERPRINT_OPTIONS = --issues-tests HH_SOURCES = $(sort $(wildcard hh/*.hack)) diff --git a/infer/tests/codetoanalyze/hack/pulse/dict_missing_key.hack b/infer/tests/codetoanalyze/hack/pulse/dict_missing_key.hack index 714679c017..408bd850e2 100644 --- a/infer/tests/codetoanalyze/hack/pulse/dict_missing_key.hack +++ b/infer/tests/codetoanalyze/hack/pulse/dict_missing_key.hack @@ -190,3 +190,16 @@ function suppress_args_param(dict $args): int { function call_suppress_args_param_ok(): int { return suppress_args_param(dict['hi' => 42]); } + +class BlockListedField { + public dict $block_listed_field = dict[]; + + public function read_dict_hi(): int { + return $this->block_listed_field['hi']; + } + + public function call_read_dict_hi_ok(): int { + $this->block_listed_field = dict['bye' => 42]; + return $this->read_dict_hi(); + } +}