From a4668796d03f901337e310ec690fc2195e8bd1cc Mon Sep 17 00:00:00 2001 From: George Karpenkov Date: Wed, 7 Mar 2018 02:54:01 +0000 Subject: [PATCH] [analyzer] Fix the checker for the performance anti-pattern to accept messages send to ObjC objects. Differential Revision: https://reviews.llvm.org/D44170 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326868 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Checkers/GCDAsyncSemaphoreChecker.cpp | 25 ++++++++------- test/Analysis/gcdasyncsemaphorechecker_test.m | 31 +++++++++++++++++++ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp b/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp index 23ef032bb0..eda7a5fcd1 100644 --- a/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp @@ -111,23 +111,26 @@ void GCDAsyncSemaphoreChecker::checkASTCodeBody(const Decl *D, ) ).bind(WarningBinding)); - auto AcceptsBlockM = - forEachDescendant(callExpr(hasAnyArgument(hasType( + auto HasBlockArgumentM = hasAnyArgument(hasType( hasCanonicalType(blockPointerType()) - )))); + )); - auto BlockSignallingM = - forEachDescendant(callExpr(hasAnyArgument(hasDescendant(callExpr( + auto ArgCallsSignalM = hasArgument(0, hasDescendant(callExpr( allOf( callsName("dispatch_semaphore_signal"), equalsBoundArgDecl(0, SemaphoreBinding) - )))))); + )))); + + auto HasBlockAndCallsSignalM = allOf(HasBlockArgumentM, ArgCallsSignalM); + + auto AcceptsBlockM = + forEachDescendant( + stmt(anyOf( + callExpr(HasBlockAndCallsSignalM), + objcMessageExpr(HasBlockAndCallsSignalM) + ))); - auto FinalM = compoundStmt( - SemaphoreBindingM, - SemaphoreWaitM, - AcceptsBlockM, - BlockSignallingM); + auto FinalM = compoundStmt(SemaphoreBindingM, SemaphoreWaitM, AcceptsBlockM); MatchFinder F; Callback CB(BR, AM.getAnalysisDeclContext(D), this); diff --git a/test/Analysis/gcdasyncsemaphorechecker_test.m b/test/Analysis/gcdasyncsemaphorechecker_test.m index a82545a3b6..ff434d3652 100644 --- a/test/Analysis/gcdasyncsemaphorechecker_test.m +++ b/test/Analysis/gcdasyncsemaphorechecker_test.m @@ -177,7 +177,9 @@ void warn_with_cast() { @interface Test1 : NSObject -(void)use_method_warn; +-(void)use_objc_callback_warn; -(void)testNoWarn; +-(void)acceptBlock:(block_t)callback; @end @implementation Test1 @@ -200,4 +202,33 @@ void warn_with_cast() { dispatch_semaphore_wait(sema, 100); } +-(void)acceptBlock:(block_t) callback { + callback(); +} + +-(void)use_objc_callback_warn { + dispatch_semaphore_t sema = dispatch_semaphore_create(0); + + [self acceptBlock:^{ + dispatch_semaphore_signal(sema); + }]; + dispatch_semaphore_wait(sema, 100); // expected-warning{{Possible semaphore performance anti-pattern}} +} + +void use_objc_and_c_callback(Test1 *t) { + dispatch_semaphore_t sema = dispatch_semaphore_create(0); + + func(^{ + dispatch_semaphore_signal(sema); + }); + dispatch_semaphore_wait(sema, 100); // expected-warning{{Possible semaphore performance anti-pattern}} + + dispatch_semaphore_t sema1 = dispatch_semaphore_create(0); + + [t acceptBlock:^{ + dispatch_semaphore_signal(sema1); + }]; + dispatch_semaphore_wait(sema1, 100); // expected-warning{{Possible semaphore performance anti-pattern}} +} + @end -- 2.40.0