]> granicus.if.org Git - clang/commitdiff
[analyzer] Fix crash in RunLoopAutoreleaseChecker on empty children
authorGeorge Karpenkov <ekarpenkov@apple.com>
Mon, 30 Jul 2018 21:44:15 +0000 (21:44 +0000)
committerGeorge Karpenkov <ekarpenkov@apple.com>
Mon, 30 Jul 2018 21:44:15 +0000 (21:44 +0000)
Differential Revision: https://reviews.llvm.org/D50012

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@338312 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/RunLoopAutoreleaseLeakChecker.cpp
test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m

index 64b61a0213d28961b146fc63e56ab27f66cd33a2..5c5785441911fdf3f32835dbb9eb046d4a5fd7c4 100644 (file)
@@ -46,8 +46,7 @@ const char * RunLoopRunBind = "RunLoopRunM";
 const char * OtherMsgBind = "OtherMessageSentM";
 const char * AutoreleasePoolBind = "AutoreleasePoolM";
 
-class RunLoopAutoreleaseLeakChecker : public Checker<
-                                      check::ASTCodeBody> {
+class RunLoopAutoreleaseLeakChecker : public Checker<check::ASTCodeBody> {
 
 public:
   void checkASTCodeBody(const Decl *D,
@@ -66,6 +65,8 @@ static TriBoolTy
 seenBeforeRec(const Stmt *Parent, const Stmt *A, const Stmt *B,
               MemoizationMapTy &Memoization) {
   for (const Stmt *C : Parent->children()) {
+    if (!C) continue;
+
     if (C == A)
       return true;
 
index 4dde40e210a07a415f1b3d62d4b15b6cf9de9461..32fc2206a31cd8c39516cb1e1da53415dcf88bf7 100644 (file)
@@ -43,7 +43,7 @@ void runloop_init_before_two_objects() { // Warning: object created before the l
     NSObject *object2 = [[NSObject alloc] init]; // no-warning, warning on the first one is enough.
     (void) object;
     (void) object2;
-    [[NSRunLoop mainRunLoop] run]; 
+    [[NSRunLoop mainRunLoop] run];
   }
 }
 
@@ -61,6 +61,15 @@ void runloop_init_after() { // No warning: objects created after the loop
   }
 }
 
+void no_crash_on_empty_children() {
+  @autoreleasepool {
+    for (;;) {}
+    NSObject *object = [[NSObject alloc] init]; // expected-warning{{Temporary objects allocated in the autorelease pool followed by the launch of main run loop may never get released; consider moving them to a separate autorelease pool}}
+    [[NSRunLoop mainRunLoop] run];
+    (void) object;
+  }
+}
+
 #endif
 
 #ifdef AP1