Commit 1c86fe88 authored by George Karpenkov's avatar George Karpenkov
Browse files

[analyzer] [quickfix] Prevent a crash in NamedDecl::getName()

parent 7de87381
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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"));
+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)();

@@ -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