r327426 - [analyzer] Fix the matcher for GCDAntipattern to look for "signal" call in all parameters

George Karpenkov via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 13 10:27:01 PDT 2018


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);
 




More information about the cfe-commits mailing list