Author: george.karpenkov Date: Tue Mar 13 10:27:01 2018 New Revision: 327426
URL: http://llvm.org/viewvc/llvm-project?rev=327426&view=rev Log: [analyzer] Fix the matcher for GCDAntipattern to look for "signal" call in all parameters rdar://38405904 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp cfe/trunk/test/Analysis/gcdantipatternchecker_test.m Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp?rev=327426&r1=327425&r2=327426&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp Tue Mar 13 10:27:01 2018 @@ -121,11 +121,11 @@ void GCDAntipatternChecker::checkASTCode hasCanonicalType(blockPointerType()) )); - auto ArgCallsSignalM = hasArgument(0, hasDescendant(callExpr( + auto ArgCallsSignalM = hasAnyArgument(stmt(hasDescendant(callExpr( allOf( callsName("dispatch_semaphore_signal"), equalsBoundArgDecl(0, SemaphoreBinding) - )))); + ))))); auto HasBlockAndCallsSignalM = allOf(HasBlockArgumentM, ArgCallsSignalM); Modified: cfe/trunk/test/Analysis/gcdantipatternchecker_test.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/gcdantipatternchecker_test.m?rev=327426&r1=327425&r2=327426&view=diff ============================================================================== --- cfe/trunk/test/Analysis/gcdantipatternchecker_test.m (original) +++ cfe/trunk/test/Analysis/gcdantipatternchecker_test.m Tue Mar 13 10:27:01 2018 @@ -177,9 +177,11 @@ void warn_with_cast() { @interface MyInterface1 : NSObject -(void)use_method_warn; +-(void) pass_block_as_second_param_warn; -(void)use_objc_callback_warn; -(void)testNoWarn; -(void)acceptBlock:(block_t)callback; +-(void)flag:(int)flag acceptBlock:(block_t)callback; @end @implementation MyInterface1 @@ -193,6 +195,15 @@ void warn_with_cast() { dispatch_semaphore_wait(sema, 100); // expected-warning{{Waiting on a semaphore with Grand Central Dispatch creates useless threads and is subject to priority inversion}} } +-(void) pass_block_as_second_param_warn { + dispatch_semaphore_t sema = dispatch_semaphore_create(0); + + [self flag:1 acceptBlock:^{ + dispatch_semaphore_signal(sema); + }]; + dispatch_semaphore_wait(sema, 100); // expected-warning{{Waiting on a semaphore with Grand Central Dispatch creates useless threads and is subject to priority inversion}} +} + -(void)testNoWarn { dispatch_semaphore_t sema = dispatch_semaphore_create(0); @@ -206,6 +217,10 @@ void warn_with_cast() { callback(); } +-(void)flag:(int)flag acceptBlock:(block_t)callback { + callback(); +} + -(void)use_objc_callback_warn { dispatch_semaphore_t sema = dispatch_semaphore_create(0); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits