Author: george.karpenkov Date: Mon Mar 5 16:18:21 2018 New Revision: 326755
URL: http://llvm.org/viewvc/llvm-project?rev=326755&view=rev Log: [analyzer] [quickfix] Prevent a crash in NamedDecl::getName() Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp cfe/trunk/test/gcdasyncsemaphorechecker_test.m Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp?rev=326755&r1=326754&r2=326755&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp Mon Mar 5 16:18:21 2018 @@ -88,9 +88,11 @@ void GCDAsyncSemaphoreChecker::checkASTC 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")); Modified: cfe/trunk/test/gcdasyncsemaphorechecker_test.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/gcdasyncsemaphorechecker_test.m?rev=326755&r1=326754&r2=326755&view=diff ============================================================================== --- cfe/trunk/test/gcdasyncsemaphorechecker_test.m (original) +++ cfe/trunk/test/gcdasyncsemaphorechecker_test.m Mon Mar 5 16:18:21 2018 @@ -1,5 +1,14 @@ // 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)(); @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits