]> granicus.if.org Git - clang/commitdiff
[analyzer] Look for allocation site in the parent frames as well as the current one.
authorAnna Zaks <ganna@apple.com>
Thu, 5 Feb 2015 01:02:53 +0000 (01:02 +0000)
committerAnna Zaks <ganna@apple.com>
Thu, 5 Feb 2015 01:02:53 +0000 (01:02 +0000)
Instead of handling edge cases (mostly involving blocks), where we have difficulty finding
an allocation statement, allow the allocation site to be in a parent node.

Previously we assumed that the allocation site can always be found in the same frame
as allocation, but there are scenarios in which an element is leaked in a child
frame but is allocated in the parent.

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

lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
lib/StaticAnalyzer/Checkers/MallocChecker.cpp
lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
test/Analysis/objc-radar17039661.m

index 13ea4d3ed090aa35610f8efc1aa0a9eebb4853d6..ee0195641129e92edcd032cb4a6e325034433b3f 100644 (file)
@@ -499,9 +499,11 @@ MacOSKeychainAPIChecker::getAllocationNode(const ExplodedNode *N,
   while (N) {
     if (!N->getState()->get<AllocatedData>(Sym))
       break;
-    // Allocation node, is the last node in the current context in which the
-    // symbol was tracked.
-    if (N->getLocationContext() == LeakContext)
+    // Allocation node, is the last node in the current or parent context in
+    // which the symbol was tracked.
+    const LocationContext *NContext = N->getLocationContext();
+    if (NContext == LeakContext ||
+        NContext->isParentOf(LeakContext))
       AllocNode = N;
     N = N->pred_empty() ? nullptr : *(N->pred_begin());
   }
index aee5a43048b95699bb2aa7985f0bb3c6182602a3..96a2962037413c8c8339f2e173939b7a5c618ee3 100644 (file)
@@ -1801,9 +1801,11 @@ MallocChecker::getAllocationSite(const ExplodedNode *N, SymbolRef Sym,
         }
       }
 
-    // Allocation node, is the last node in the current context in which the
-    // symbol was tracked.
-    if (N->getLocationContext() == LeakContext)
+    // Allocation node, is the last node in the current or parent context in
+    // which the symbol was tracked.
+    const LocationContext *NContext = N->getLocationContext();
+    if (NContext == LeakContext ||
+        NContext->isParentOf(LeakContext))
       AllocNode = N;
     N = N->pred_empty() ? nullptr : *(N->pred_begin());
   }
index c8578543de52468d740dc46f58de9e973eb882b9..ac74ecd0f493f373b62957f097a1f256930c2ced 100644 (file)
@@ -2190,7 +2190,7 @@ static AllocationInfo
 GetAllocationSite(ProgramStateManager& StateMgr, const ExplodedNode *N,
                   SymbolRef Sym) {
   const ExplodedNode *AllocationNode = N;
-  const ExplodedNode *AllocationNodeInCurrentContext = N;
+  const ExplodedNode *AllocationNodeInCurrentOrParentContext = N;
   const MemRegion *FirstBinding = nullptr;
   const LocationContext *LeakContext = N->getLocationContext();
 
@@ -2220,10 +2220,15 @@ GetAllocationSite(ProgramStateManager& StateMgr, const ExplodedNode *N,
     // AllocationNode is the last node in which the symbol was tracked.
     AllocationNode = N;
 
-    // AllocationNodeInCurrentContext, is the last node in the current context
-    // in which the symbol was tracked.
-    if (NContext == LeakContext)
-      AllocationNodeInCurrentContext = N;
+    // AllocationNodeInCurrentContext, is the last node in the current or
+    // parent context in which the symbol was tracked.
+    //
+    // Note that the allocation site might be in the parent conext. For example,
+    // the case where an allocation happens in a block that captures a reference
+    // to it and that reference is overwritten/dropped by another call to
+    // the block.
+    if (NContext == LeakContext || NContext->isParentOf(LeakContext))
+      AllocationNodeInCurrentOrParentContext = N;
 
     // Find the last init that was called on the given symbol and store the
     // init method's location context.
@@ -2261,7 +2266,7 @@ GetAllocationSite(ProgramStateManager& StateMgr, const ExplodedNode *N,
     FirstBinding = nullptr;
   }
 
-  return AllocationInfo(AllocationNodeInCurrentContext,
+  return AllocationInfo(AllocationNodeInCurrentOrParentContext,
                         FirstBinding,
                         InterestingMethodContext);
 }
@@ -2392,20 +2397,8 @@ CFRefLeakReport::CFRefLeakReport(CFRefBug &D, const LangOptions &LOpts,
   ProgramPoint P = AllocNode->getLocation();
   if (Optional<CallExitEnd> Exit = P.getAs<CallExitEnd>())
     AllocStmt = Exit->getCalleeContext()->getCallSite();
-  else {
-    // We are going to get a BlockEdge when the leak and allocation happen in
-    // different, non-nested frames (contexts). For example, the case where an
-    // allocation happens in a block that captures a reference to it and
-    // that reference is overwritten/dropped by another call to the block.
-    if (Optional<BlockEdge> Edge = P.getAs<BlockEdge>()) {
-      if (Optional<CFGStmt> St = Edge->getDst()->front().getAs<CFGStmt>()) {
-        AllocStmt = St->getStmt();
-      }
-    }
-    else {
-      AllocStmt = P.castAs<PostStmt>().getStmt();
-    }
-  }
+  else
+    AllocStmt = P.castAs<PostStmt>().getStmt();
   assert(AllocStmt && "Cannot find allocation statement");
 
   PathDiagnosticLocation AllocLocation =
index ec4f19d2da3ba2a6819d44642d61a188043645e7..fc55ab1daeb4577f282b5a9237beed1328d4989f 100644 (file)
@@ -1,5 +1,6 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -verify -fblocks %s
-
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -fblocks -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -fblocks -analyzer-output=plist-multi-file -analyzer-config path-diagnostics-alternate=false %s -o %t
+// RUN: FileCheck --input-file=%t %s
 @class NSString;
 typedef long NSInteger;
 typedef unsigned char BOOL;
@@ -13,14 +14,13 @@ typedef unsigned char BOOL;
 @interface NSNumber : NSObject
 + (NSNumber *)numberWithInteger:(NSInteger)value __attribute__((availability(ios,introduced=2.0)));
 @end
-
 NSInteger *inoutIntegerValueGlobal;
 NSInteger *inoutIntegerValueGlobal2;
 NSString *traitNameGlobal;
 static BOOL cond;
 
 static inline void reallyPerformAction(void (^integerHandler)(NSInteger *inoutIntegerValue, NSString *traitName)) {
-  integerHandler(inoutIntegerValueGlobal, traitNameGlobal);
+  integerHandler(inoutIntegerValueGlobal, traitNameGlobal); // expected-warning {{Potential leak of an object}}
   integerHandler(inoutIntegerValueGlobal2,traitNameGlobal);
 }
 
@@ -47,7 +47,7 @@ static inline BOOL performAction(NSNumber *(^action)(NSNumber *traitValue)) {
 void runTest() {
   __attribute__((__blocks__(byref))) NSNumber *builtinResult = ((NSNumber *)0);
   BOOL wasBuiltinTrait = performAction(^(NSNumber *traitValue) {
-    builtinResult = [traitValue retain]; // expected-warning {{Potential leak of an object}}
+    builtinResult = [traitValue retain];
 
     return traitValue;
   });
@@ -58,3 +58,1176 @@ void runTest() {
     return;
   }
 }
+
+// CHECK: <key>diagnostics</key>
+// CHECK: <array>
+// CHECK:  <dict>
+// CHECK:   <key>path</key>
+// CHECK:   <array>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>48</integer>
+// CHECK:           <key>col</key><integer>3</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>48</integer>
+// CHECK:           <key>col</key><integer>15</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>49</integer>
+// CHECK:           <key>col</key><integer>26</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>49</integer>
+// CHECK:           <key>col</key><integer>38</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>49</integer>
+// CHECK:      <key>col</key><integer>26</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>49</integer>
+// CHECK:         <key>col</key><integer>26</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>53</integer>
+// CHECK:         <key>col</key><integer>4</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>0</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Calling &apos;performAction&apos;</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Calling &apos;performAction&apos;</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>27</integer>
+// CHECK:      <key>col</key><integer>1</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>depth</key><integer>1</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Entered call from &apos;runTest&apos;</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Entered call from &apos;runTest&apos;</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>27</integer>
+// CHECK:           <key>col</key><integer>1</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>27</integer>
+// CHECK:           <key>col</key><integer>6</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>28</integer>
+// CHECK:           <key>col</key><integer>3</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>28</integer>
+// CHECK:           <key>col</key><integer>15</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>28</integer>
+// CHECK:           <key>col</key><integer>3</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>28</integer>
+// CHECK:           <key>col</key><integer>15</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>29</integer>
+// CHECK:           <key>col</key><integer>3</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>29</integer>
+// CHECK:           <key>col</key><integer>21</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>29</integer>
+// CHECK:      <key>col</key><integer>3</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>29</integer>
+// CHECK:         <key>col</key><integer>3</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>43</integer>
+// CHECK:         <key>col</key><integer>4</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>1</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Calling &apos;reallyPerformAction&apos;</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Calling &apos;reallyPerformAction&apos;</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>22</integer>
+// CHECK:      <key>col</key><integer>1</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>depth</key><integer>2</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Entered call from &apos;performAction&apos;</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Entered call from &apos;performAction&apos;</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>22</integer>
+// CHECK:           <key>col</key><integer>1</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>22</integer>
+// CHECK:           <key>col</key><integer>6</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>23</integer>
+// CHECK:           <key>col</key><integer>3</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>23</integer>
+// CHECK:           <key>col</key><integer>16</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>23</integer>
+// CHECK:      <key>col</key><integer>3</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>23</integer>
+// CHECK:         <key>col</key><integer>3</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>23</integer>
+// CHECK:         <key>col</key><integer>58</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>2</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>29</integer>
+// CHECK:      <key>col</key><integer>23</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Entered call from &apos;reallyPerformAction&apos;</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Entered call from &apos;reallyPerformAction&apos;</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>29</integer>
+// CHECK:           <key>col</key><integer>23</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>29</integer>
+// CHECK:           <key>col</key><integer>23</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>6</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>6</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>9</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>12</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>31</integer>
+// CHECK:      <key>col</key><integer>9</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>31</integer>
+// CHECK:         <key>col</key><integer>9</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>31</integer>
+// CHECK:         <key>col</key><integer>12</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Assuming &apos;cond&apos; is not equal to 0</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Assuming &apos;cond&apos; is not equal to 0</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>9</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>12</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>7</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>14</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>7</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>14</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>30</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>30</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>33</integer>
+// CHECK:      <key>col</key><integer>30</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>33</integer>
+// CHECK:         <key>col</key><integer>30</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>33</integer>
+// CHECK:         <key>col</key><integer>50</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>NSNumber boxed expression produces an object with a +0 retain count</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>NSNumber boxed expression produces an object with a +0 retain count</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>30</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>30</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>35</integer>
+// CHECK:           <key>col</key><integer>33</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>35</integer>
+// CHECK:           <key>col</key><integer>38</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>35</integer>
+// CHECK:      <key>col</key><integer>33</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>35</integer>
+// CHECK:         <key>col</key><integer>33</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>35</integer>
+// CHECK:         <key>col</key><integer>50</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>49</integer>
+// CHECK:      <key>col</key><integer>40</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>depth</key><integer>4</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Entered call</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Entered call</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>49</integer>
+// CHECK:           <key>col</key><integer>40</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>49</integer>
+// CHECK:           <key>col</key><integer>40</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>17</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>17</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>21</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>21</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>50</integer>
+// CHECK:      <key>col</key><integer>21</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>50</integer>
+// CHECK:         <key>col</key><integer>21</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>50</integer>
+// CHECK:         <key>col</key><integer>39</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>50</integer>
+// CHECK:         <key>col</key><integer>22</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>50</integer>
+// CHECK:         <key>col</key><integer>31</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>4</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Reference count incremented. The object now has a +1 retain count</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Reference count incremented. The object now has a +1 retain count</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>35</integer>
+// CHECK:      <key>col</key><integer>33</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>35</integer>
+// CHECK:         <key>col</key><integer>33</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>35</integer>
+// CHECK:         <key>col</key><integer>50</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Returning to caller</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Returning to caller</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>35</integer>
+// CHECK:           <key>col</key><integer>33</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>35</integer>
+// CHECK:           <key>col</key><integer>38</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>37</integer>
+// CHECK:           <key>col</key><integer>7</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>37</integer>
+// CHECK:           <key>col</key><integer>8</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>37</integer>
+// CHECK:           <key>col</key><integer>7</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>37</integer>
+// CHECK:           <key>col</key><integer>8</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>40</integer>
+// CHECK:           <key>col</key><integer>7</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>40</integer>
+// CHECK:           <key>col</key><integer>18</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>23</integer>
+// CHECK:      <key>col</key><integer>3</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>23</integer>
+// CHECK:         <key>col</key><integer>3</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>23</integer>
+// CHECK:         <key>col</key><integer>58</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>2</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Returning to caller</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Returning to caller</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>23</integer>
+// CHECK:           <key>col</key><integer>3</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>23</integer>
+// CHECK:           <key>col</key><integer>16</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>24</integer>
+// CHECK:           <key>col</key><integer>3</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>24</integer>
+// CHECK:           <key>col</key><integer>16</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>24</integer>
+// CHECK:      <key>col</key><integer>3</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>24</integer>
+// CHECK:         <key>col</key><integer>3</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>24</integer>
+// CHECK:         <key>col</key><integer>58</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>2</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>29</integer>
+// CHECK:      <key>col</key><integer>23</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Entered call from &apos;reallyPerformAction&apos;</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Entered call from &apos;reallyPerformAction&apos;</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>29</integer>
+// CHECK:           <key>col</key><integer>23</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>29</integer>
+// CHECK:           <key>col</key><integer>23</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>6</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>6</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>9</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>12</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>31</integer>
+// CHECK:      <key>col</key><integer>9</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>31</integer>
+// CHECK:         <key>col</key><integer>9</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>31</integer>
+// CHECK:         <key>col</key><integer>12</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Assuming &apos;cond&apos; is not equal to 0</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Assuming &apos;cond&apos; is not equal to 0</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>9</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>31</integer>
+// CHECK:           <key>col</key><integer>12</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>7</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>14</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>7</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>33</integer>
+// CHECK:           <key>col</key><integer>14</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>35</integer>
+// CHECK:           <key>col</key><integer>33</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>35</integer>
+// CHECK:           <key>col</key><integer>38</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>35</integer>
+// CHECK:      <key>col</key><integer>33</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>35</integer>
+// CHECK:         <key>col</key><integer>33</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>35</integer>
+// CHECK:         <key>col</key><integer>50</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>3</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Calling anonymous block</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>49</integer>
+// CHECK:      <key>col</key><integer>40</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>depth</key><integer>4</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Entered call</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Entered call</string>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>49</integer>
+// CHECK:           <key>col</key><integer>40</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>49</integer>
+// CHECK:           <key>col</key><integer>40</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>17</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>control</string>
+// CHECK:     <key>edges</key>
+// CHECK:      <array>
+// CHECK:       <dict>
+// CHECK:        <key>start</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>50</integer>
+// CHECK:           <key>col</key><integer>17</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:        <key>end</key>
+// CHECK:         <array>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>52</integer>
+// CHECK:           <key>col</key><integer>5</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:          <dict>
+// CHECK:           <key>line</key><integer>52</integer>
+// CHECK:           <key>col</key><integer>10</integer>
+// CHECK:           <key>file</key><integer>0</integer>
+// CHECK:          </dict>
+// CHECK:         </array>
+// CHECK:       </dict>
+// CHECK:      </array>
+// CHECK:    </dict>
+// CHECK:    <dict>
+// CHECK:     <key>kind</key><string>event</string>
+// CHECK:     <key>location</key>
+// CHECK:     <dict>
+// CHECK:      <key>line</key><integer>52</integer>
+// CHECK:      <key>col</key><integer>5</integer>
+// CHECK:      <key>file</key><integer>0</integer>
+// CHECK:     </dict>
+// CHECK:     <key>ranges</key>
+// CHECK:     <array>
+// CHECK:       <array>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>52</integer>
+// CHECK:         <key>col</key><integer>5</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:        <dict>
+// CHECK:         <key>line</key><integer>52</integer>
+// CHECK:         <key>col</key><integer>21</integer>
+// CHECK:         <key>file</key><integer>0</integer>
+// CHECK:        </dict>
+// CHECK:       </array>
+// CHECK:     </array>
+// CHECK:     <key>depth</key><integer>4</integer>
+// CHECK:     <key>extended_message</key>
+// CHECK:     <string>Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1</string>
+// CHECK:     <key>message</key>
+// CHECK:     <string>Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1</string>
+// CHECK:    </dict>
+// CHECK:   </array>
+// CHECK:   <key>description</key><string>Potential leak of an object</string>
+// CHECK:   <key>category</key><string>Memory (Core Foundation/Objective-C)</string>
+// CHECK:   <key>type</key><string>Leak</string>
+// CHECK:  <key>location</key>
+// CHECK:  <dict>
+// CHECK:   <key>line</key><integer>52</integer>
+// CHECK:   <key>col</key><integer>5</integer>
+// CHECK:   <key>file</key><integer>0</integer>
+// CHECK:  </dict>
+// CHECK:  </dict>
+// CHECK: </array>
+// CHECK:</dict>
+// CHECK:</plist>