Loading clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -88,9 +88,11 @@ void GCDAsyncSemaphoreChecker::checkASTCodeBody(const Decl *D, BugReporter &BR) const { // The pattern is very common in tests, and it is OK to use it there. if (const auto* ND = dyn_cast<NamedDecl>(D)) if (ND->getName().startswith("test")) if (const auto* ND = dyn_cast<NamedDecl>(D)) { std::string DeclName = ND->getNameAsString(); if (StringRef(DeclName).startswith("test")) return; } const char *SemaphoreBinding = "semaphore_name"; auto SemaphoreCreateM = callExpr(callsName("dispatch_semaphore_create")); Loading clang/test/gcdasyncsemaphorechecker_test.m +35 −1 Original line number Diff line number Diff line // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.osx.GCDAsyncSemaphore %s -fblocks -verify // typedef signed char BOOL; @protocol NSObject - (BOOL)isEqual:(id)object; @end @interface NSObject <NSObject> {} +(id)alloc; -(id)init; -(id)autorelease; -(id)copy; -(id)retain; @end typedef int dispatch_semaphore_t; typedef void (^block_t)(); Loading Loading @@ -166,4 +175,29 @@ void warn_with_cast() { dispatch_semaphore_wait((int)sema, 100); // expected-warning{{Possible semaphore performance anti-pattern}} } @interface Test1 : NSObject -(void)use_method_warn; -(void)testNoWarn; @end @implementation Test1 -(void)use_method_warn { 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}} } -(void)testNoWarn { dispatch_semaphore_t sema = dispatch_semaphore_create(0); func(^{ dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, 100); } @end Loading
clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -88,9 +88,11 @@ void GCDAsyncSemaphoreChecker::checkASTCodeBody(const Decl *D, BugReporter &BR) const { // The pattern is very common in tests, and it is OK to use it there. if (const auto* ND = dyn_cast<NamedDecl>(D)) if (ND->getName().startswith("test")) if (const auto* ND = dyn_cast<NamedDecl>(D)) { std::string DeclName = ND->getNameAsString(); if (StringRef(DeclName).startswith("test")) return; } const char *SemaphoreBinding = "semaphore_name"; auto SemaphoreCreateM = callExpr(callsName("dispatch_semaphore_create")); Loading
clang/test/gcdasyncsemaphorechecker_test.m +35 −1 Original line number Diff line number Diff line // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.osx.GCDAsyncSemaphore %s -fblocks -verify // typedef signed char BOOL; @protocol NSObject - (BOOL)isEqual:(id)object; @end @interface NSObject <NSObject> {} +(id)alloc; -(id)init; -(id)autorelease; -(id)copy; -(id)retain; @end typedef int dispatch_semaphore_t; typedef void (^block_t)(); Loading Loading @@ -166,4 +175,29 @@ void warn_with_cast() { dispatch_semaphore_wait((int)sema, 100); // expected-warning{{Possible semaphore performance anti-pattern}} } @interface Test1 : NSObject -(void)use_method_warn; -(void)testNoWarn; @end @implementation Test1 -(void)use_method_warn { 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}} } -(void)testNoWarn { dispatch_semaphore_t sema = dispatch_semaphore_create(0); func(^{ dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, 100); } @end