Skip to content

Commit

Permalink
[dict missing key] Apply dict_missing_key_var_block_list to field
Browse files Browse the repository at this point in the history
Summary:
This diff applies the pre-existing dict_missing_key_var_block_list
option to block-list dict fields.

Reviewed By: geralt-encore

Differential Revision: D57728774

fbshipit-source-id: 06851d929c4dcda31c900089974145491fcf8bc8
  • Loading branch information
skcho authored and facebook-github-bot committed May 24, 2024
1 parent 512d1a2 commit a95dafb
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 6 deletions.
12 changes: 7 additions & 5 deletions infer/src/pulse/PulseModelsDSL.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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 ->
Expand All @@ -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 =
Expand Down
4 changes: 3 additions & 1 deletion infer/tests/codetoanalyze/hack/pulse/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
13 changes: 13 additions & 0 deletions infer/tests/codetoanalyze/hack/pulse/dict_missing_key.hack
Original file line number Diff line number Diff line change
Expand Up @@ -190,3 +190,16 @@ function suppress_args_param(dict<string, int> $args): int {
function call_suppress_args_param_ok(): int {
return suppress_args_param(dict['hi' => 42]);
}

class BlockListedField {
public dict<string, int> $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();
}
}

0 comments on commit a95dafb

Please sign in to comment.