From 144e062684235157c4b48e9fb854ff3544f5e48b Mon Sep 17 00:00:00 2001 From: Dulma Churchill Date: Fri, 7 Jul 2017 05:53:41 -0700 Subject: [PATCH] [linters] Take instancesRespondToSelector into account to avoid FPs Reviewed By: akotulski Differential Revision: D5380878 fbshipit-source-id: cf6f803 --- infer/src/clang/cFrontend_checkers_main.ml | 3 ++- infer/tests/codetoanalyze/objc/ioslints/issues.exp | 7 ++++--- .../objc/ioslints/unavailable_api_allowed_cases.m | 13 +++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/infer/src/clang/cFrontend_checkers_main.ml b/infer/src/clang/cFrontend_checkers_main.ml index 241aab0f8..f102a3b97 100644 --- a/infer/src/clang/cFrontend_checkers_main.ml +++ b/infer/src/clang/cFrontend_checkers_main.ml @@ -100,10 +100,11 @@ let parse_ctl_files linters_def_files : CFrontend_errors.linter list = let rec get_responds_to_selector stmt = let open Clang_ast_t in + let responToSelectorMethods = ["respondsToSelector:"; "instancesRespondToSelector:"] in match stmt with | ObjCMessageExpr (_, [_; ObjCSelectorExpr (_, _, _, method_name)], _, mdi) | ObjCMessageExpr (_, [ObjCSelectorExpr (_, _, _, method_name)], _, mdi) - when String.equal mdi.Clang_ast_t.omei_selector "respondsToSelector:" -> + when List.mem ~equal:String.equal responToSelectorMethods mdi.Clang_ast_t.omei_selector -> [method_name] | BinaryOperator (_, [stmt1;stmt2], _, bo_info) when PVariant.(=) bo_info.Clang_ast_t.boi_kind `LAnd -> diff --git a/infer/tests/codetoanalyze/objc/ioslints/issues.exp b/infer/tests/codetoanalyze/objc/ioslints/issues.exp index 215a9652f..fa980e1f5 100644 --- a/infer/tests/codetoanalyze/objc/ioslints/issues.exp +++ b/infer/tests/codetoanalyze/objc/ioslints/issues.exp @@ -1,7 +1,8 @@ -codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_m2, 123, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] -codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_m3:, 131, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] -codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_uifont_without_respondstoselector:, 105, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] +codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_m2, 136, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] +codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_m3:, 144, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] +codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_uifont_without_respondstoselector:, 118, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_with_responds_to_selector_in_else:, 71, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] +codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_without_instances_responds_to_selector, 95, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m, Unavailable_api_allowed_cases_without_responds_to_selector:, 64, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] codetoanalyze/objc/ioslints/unavailable_api_in_supported_ios_sdk.m, OpenURLOptionsFromSourceApplication, 26, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] codetoanalyze/objc/ioslints/unavailable_api_in_supported_ios_sdk.m, Unavailable_api_in_supported_ios_sdk_test:and:, 19, UNAVAILABLE_API_IN_SUPPORTED_IOS_SDK, [] diff --git a/infer/tests/codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m b/infer/tests/codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m index cbaaf859d..734049f65 100644 --- a/infer/tests/codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m +++ b/infer/tests/codetoanalyze/objc/ioslints/unavailable_api_allowed_cases.m @@ -82,6 +82,19 @@ } } +// no bug +- (void)with_instances_responds_to_selector { + if ([[UICollectionView class] + instancesRespondToSelector:@selector(setPrefetchingEnabled:)]) { + [[UICollectionView appearance] setPrefetchingEnabled:NO]; + } +} + +// bug +- (void)without_instances_responds_to_selector { + [[UICollectionView appearance] setPrefetchingEnabled:NO]; +} + // no bug - (void)with_responds_to_selector_two_selectors: (Unavailable_api_allowed_cases*)a {