diff options
4 files changed, 850 insertions, 28 deletions
diff --git a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h index b4592c0fc9e..a3784739d16 100644 --- a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h +++ b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h @@ -258,7 +258,18 @@ public:  namespace bugreporter { -void trackNullOrUndefValue(const ExplodedNode *N, const Stmt *S, BugReport &R); +/// Attempts to add visitors to trace a null or undefined value back to its +/// point of origin, whether it is a symbol constrained to null or an explicit +/// assignment. +/// +/// \param N A node "downstream" from the evaluation of the statement. +/// \param S The statement whose value is null or undefined. +/// \param R The bug report to which visitors should be attached. +/// \param IsArg Whether the statement is an argument to an inlined function. +///              If this is the case, \p N \em must be the CallEnter node for +///              the function. +void trackNullOrUndefValue(const ExplodedNode *N, const Stmt *S, BugReport &R, +                           bool IsArg = false);  const Stmt *GetDerefExpr(const ExplodedNode *N);  const Stmt *GetDenomExpr(const ExplodedNode *N); diff --git a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 213a52a9b91..dace7f3c8b6 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -283,6 +283,7 @@ PathDiagnosticPiece *FindLastStoreBRVisitor::VisitNode(const ExplodedNode *Succ,    const ExplodedNode *StoreSite = 0;    const Expr *InitE = 0; +  bool IsParam = false;    // First see if we reached the declaration of the region.    if (const VarRegion *VR = dyn_cast<VarRegion>(R)) { @@ -327,6 +328,7 @@ PathDiagnosticPiece *FindLastStoreBRVisitor::VisitNode(const ExplodedNode *Succ,        CallEventRef<> Call = CallMgr.getCaller(CE->getCalleeContext(),                                                Succ->getState());        InitE = Call->getArgExpr(Param->getFunctionScopeIndex()); +      IsParam = true;      }    } @@ -337,12 +339,14 @@ PathDiagnosticPiece *FindLastStoreBRVisitor::VisitNode(const ExplodedNode *Succ,    // If we have an expression that provided the value, try to track where it    // came from.    if (InitE) { -    InitE = InitE->IgnoreParenCasts(); - -    if (V.isUndef() || isa<loc::ConcreteInt>(V)) -      bugreporter::trackNullOrUndefValue(StoreSite, InitE, BR); -    else -      ReturnVisitor::addVisitorIfNecessary(StoreSite, InitE, BR); +    if (V.isUndef() || isa<loc::ConcreteInt>(V)) { +      if (!IsParam) +        InitE = InitE->IgnoreParenCasts(); +      bugreporter::trackNullOrUndefValue(StoreSite, InitE, BR, IsParam); +    } else { +      ReturnVisitor::addVisitorIfNecessary(StoreSite, InitE->IgnoreParenCasts(), +                                           BR); +    }    }    if (!R->canPrintPretty()) @@ -522,30 +526,32 @@ TrackConstraintBRVisitor::VisitNode(const ExplodedNode *N,  }  void bugreporter::trackNullOrUndefValue(const ExplodedNode *N, const Stmt *S, -                                        BugReport &report) { +                                        BugReport &report, bool IsArg) {    if (!S || !N)      return;    if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(S))      S = OVE->getSourceExpr(); -  ProgramStateManager &StateMgr = N->getState()->getStateManager(); - -  // Walk through nodes until we get one that matches the statement exactly. -  while (N) { -    const ProgramPoint &pp = N->getLocation(); -    if (const PostStmt *ps = dyn_cast<PostStmt>(&pp)) { -      if (ps->getStmt() == S) -        break; -    } else if (const CallExitEnd *CEE = dyn_cast<CallExitEnd>(&pp)) { -      if (CEE->getCalleeContext()->getCallSite() == S) -        break; -    } -    N = N->getFirstPred(); -  } +  if (IsArg) { +    assert(isa<CallEnter>(N->getLocation()) && "Tracking arg but not at call"); +  } else { +    // Walk through nodes until we get one that matches the statement exactly. +    do { +      const ProgramPoint &pp = N->getLocation(); +      if (const PostStmt *ps = dyn_cast<PostStmt>(&pp)) { +        if (ps->getStmt() == S) +          break; +      } else if (const CallExitEnd *CEE = dyn_cast<CallExitEnd>(&pp)) { +        if (CEE->getCalleeContext()->getCallSite() == S) +          break; +      } +      N = N->getFirstPred(); +    } while (N); -  if (!N) -    return; +    if (!N) +      return; +  }    ProgramStateRef state = N->getState(); @@ -560,11 +566,28 @@ void bugreporter::trackNullOrUndefValue(const ExplodedNode *N, const Stmt *S,        // FIXME: Right now we only track VarDecls because it's non-trivial to        // get a MemRegion for any other DeclRefExprs. <rdar://problem/12114812>        if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) { -        const VarRegion *R = -          StateMgr.getRegionManager().getVarRegion(VD, N->getLocationContext()); +        ProgramStateManager &StateMgr = state->getStateManager(); +        MemRegionManager &MRMgr = StateMgr.getRegionManager(); +        const VarRegion *R = MRMgr.getVarRegion(VD, N->getLocationContext());          // Mark both the variable region and its contents as interesting.          SVal V = state->getRawSVal(loc::MemRegionVal(R)); + +        // If the value matches the default for the variable region, that +        // might mean that it's been cleared out of the state. Fall back to +        // the full argument expression (with casts and such intact). +        if (IsArg) { +          bool UseArgValue = V.isUnknownOrUndef() || V.isZeroConstant(); +          if (!UseArgValue) { +            const SymbolRegionValue *SRV = +              dyn_cast_or_null<SymbolRegionValue>(V.getAsLocSymbol()); +            if (SRV) +              UseArgValue = (SRV->getRegion() == R); +          } +          if (UseArgValue) +            V = state->getSValAsScalarOrLoc(S, N->getLocationContext()); +        } +          report.markInteresting(R);          report.markInteresting(V);          report.addVisitor(new UndefOrNullArgVisitor(R)); diff --git a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp b/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp index 9b70d6861cc..c284bd7dfad 100644 --- a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp @@ -61,7 +61,7 @@ bool ExplodedGraph::shouldCollect(const ExplodedNode *node) {    //    // (1) 1 predecessor (that has one successor)    // (2) 1 successor (that has one predecessor) -  // (3) The ProgramPoint is for a PostStmt. +  // (3) The ProgramPoint is for a PostStmt, but not a PostStore.    // (4) There is no 'tag' for the ProgramPoint.    // (5) The 'store' is the same as the predecessor.    // (6) The 'GDM' is the same as the predecessor. @@ -85,7 +85,7 @@ bool ExplodedGraph::shouldCollect(const ExplodedNode *node) {    // Condition 3.    ProgramPoint progPoint = node->getLocation(); -  if (!isa<PostStmt>(progPoint)) +  if (!isa<PostStmt>(progPoint) || isa<PostStore>(progPoint))      return false;    // Condition 4. diff --git a/clang/test/Analysis/inlining/eager-reclamation-path-notes.c b/clang/test/Analysis/inlining/eager-reclamation-path-notes.c new file mode 100644 index 00000000000..6c7c05aa401 --- /dev/null +++ b/clang/test/Analysis/inlining/eager-reclamation-path-notes.c @@ -0,0 +1,788 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=text -analyzer-config graph-trim-interval=5 -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=plist-multi-file -analyzer-config graph-trim-interval=5 %s -o %t.plist +// RUN: FileCheck --input-file=%t.plist %s + +void use(int *ptr, int val) { +  *ptr = val; // expected-warning {{Dereference of null pointer (loaded from variable 'ptr')}} +  // expected-note@-1 {{Dereference of null pointer (loaded from variable 'ptr')}} +} + +int compute() { +  // Do something that will take enough processing to trigger trimming. +  // FIXME: This is actually really sensitive. If the interval timing is just +  // wrong, the node for the actual dereference may also be collected, and all +  // the path notes will disappear. <rdar://problem/12511814> +  return 2 + 3 + 4 + 5 + 6; +} + +void testSimple() { +  int *p = 0; +  // expected-note@-1 {{Variable 'p' initialized to a null pointer value}} +  use(p, compute()); +  // expected-note@-1 {{Passing null pointer value via 1st parameter 'ptr'}} +  // expected-note@-2 {{Calling 'use'}} +} + + +void use2(int *ptr, int val) { +  *ptr = val; // expected-warning {{Dereference of null pointer (loaded from variable 'ptr')}} +  // expected-note@-1 {{Dereference of null pointer (loaded from variable 'ptr')}} +} + +void passThrough(int *p) { +  use2(p, compute()); +  // expected-note@-1 {{Passing null pointer value via 1st parameter 'ptr'}} +  // expected-note@-2 {{Calling 'use2'}} +} + +void testChainedCalls() { +  int *ptr = 0; +  // expected-note@-1 {{Variable 'ptr' initialized to a null pointer value}} +  passThrough(ptr); +  // expected-note@-1 {{Passing null pointer value via 1st parameter 'p'}} +  // expected-note@-2 {{Calling 'passThrough'}} +} + +// CHECK:  <key>diagnostics</key> +// CHECK-NEXT:  <array> +// CHECK-NEXT:   <dict> +// CHECK-NEXT:    <key>path</key> +// CHECK-NEXT:    <array> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>19</integer> +// CHECK-NEXT:       <key>col</key><integer>3</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>19</integer> +// CHECK-NEXT:          <key>col</key><integer>3</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>19</integer> +// CHECK-NEXT:          <key>col</key><integer>8</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>0</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Variable 'p' initialized to a null pointer value</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Variable 'p' initialized to a null pointer value</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>19</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>19</integer> +// CHECK-NEXT:            <key>col</key><integer>5</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>10</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>16</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>5</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>10</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>16</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>10</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>16</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>7</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>21</integer> +// CHECK-NEXT:            <key>col</key><integer>7</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>21</integer> +// CHECK-NEXT:       <key>col</key><integer>7</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>21</integer> +// CHECK-NEXT:          <key>col</key><integer>7</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>21</integer> +// CHECK-NEXT:          <key>col</key><integer>7</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>0</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Passing null pointer value via 1st parameter 'ptr'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Passing null pointer value via 1st parameter 'ptr'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>21</integer> +// CHECK-NEXT:       <key>col</key><integer>3</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>21</integer> +// CHECK-NEXT:          <key>col</key><integer>3</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>21</integer> +// CHECK-NEXT:          <key>col</key><integer>19</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>0</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Calling 'use'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Calling 'use'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>5</integer> +// CHECK-NEXT:       <key>col</key><integer>1</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>depth</key><integer>1</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Entered call from 'testSimple'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Entered call from 'testSimple'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>5</integer> +// CHECK-NEXT:            <key>col</key><integer>1</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>5</integer> +// CHECK-NEXT:            <key>col</key><integer>4</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>6</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>6</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>6</integer> +// CHECK-NEXT:       <key>col</key><integer>3</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>6</integer> +// CHECK-NEXT:          <key>col</key><integer>4</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>6</integer> +// CHECK-NEXT:          <key>col</key><integer>6</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>1</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Dereference of null pointer (loaded from variable 'ptr')</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Dereference of null pointer (loaded from variable 'ptr')</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:    </array> +// CHECK-NEXT:    <key>description</key><string>Dereference of null pointer (loaded from variable 'ptr')</string> +// CHECK-NEXT:    <key>category</key><string>Logic error</string> +// CHECK-NEXT:    <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT:   <key>issue_context_kind</key><string>function</string> +// CHECK-NEXT:   <key>issue_context</key><string>use</string> +// CHECK-NEXT:   <key>issue_hash</key><integer>1</integer> +// CHECK-NEXT:   <key>location</key> +// CHECK-NEXT:   <dict> +// CHECK-NEXT:    <key>line</key><integer>6</integer> +// CHECK-NEXT:    <key>col</key><integer>3</integer> +// CHECK-NEXT:    <key>file</key><integer>0</integer> +// CHECK-NEXT:   </dict> +// CHECK-NEXT:   </dict> +// CHECK-NEXT:   <dict> +// CHECK-NEXT:    <key>path</key> +// CHECK-NEXT:    <array> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>39</integer> +// CHECK-NEXT:       <key>col</key><integer>3</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>39</integer> +// CHECK-NEXT:          <key>col</key><integer>3</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>39</integer> +// CHECK-NEXT:          <key>col</key><integer>10</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>0</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Variable 'ptr' initialized to a null pointer value</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Variable 'ptr' initialized to a null pointer value</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>39</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>39</integer> +// CHECK-NEXT:            <key>col</key><integer>5</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>41</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>41</integer> +// CHECK-NEXT:            <key>col</key><integer>13</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>41</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>41</integer> +// CHECK-NEXT:            <key>col</key><integer>13</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>41</integer> +// CHECK-NEXT:            <key>col</key><integer>15</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>41</integer> +// CHECK-NEXT:            <key>col</key><integer>17</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>41</integer> +// CHECK-NEXT:       <key>col</key><integer>15</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>41</integer> +// CHECK-NEXT:          <key>col</key><integer>15</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>41</integer> +// CHECK-NEXT:          <key>col</key><integer>17</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>0</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Passing null pointer value via 1st parameter 'p'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Passing null pointer value via 1st parameter 'p'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>41</integer> +// CHECK-NEXT:       <key>col</key><integer>3</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>41</integer> +// CHECK-NEXT:          <key>col</key><integer>3</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>41</integer> +// CHECK-NEXT:          <key>col</key><integer>18</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>0</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Calling 'passThrough'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Calling 'passThrough'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>32</integer> +// CHECK-NEXT:       <key>col</key><integer>1</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>depth</key><integer>1</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Entered call from 'testChainedCalls'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Entered call from 'testChainedCalls'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>32</integer> +// CHECK-NEXT:            <key>col</key><integer>1</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>32</integer> +// CHECK-NEXT:            <key>col</key><integer>4</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>6</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>6</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>11</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>17</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>6</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>11</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>17</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>11</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>17</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>8</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>33</integer> +// CHECK-NEXT:            <key>col</key><integer>8</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>33</integer> +// CHECK-NEXT:       <key>col</key><integer>8</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>33</integer> +// CHECK-NEXT:          <key>col</key><integer>8</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>33</integer> +// CHECK-NEXT:          <key>col</key><integer>8</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>1</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Passing null pointer value via 1st parameter 'ptr'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Passing null pointer value via 1st parameter 'ptr'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>33</integer> +// CHECK-NEXT:       <key>col</key><integer>3</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>33</integer> +// CHECK-NEXT:          <key>col</key><integer>3</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>33</integer> +// CHECK-NEXT:          <key>col</key><integer>20</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>1</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Calling 'use2'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Calling 'use2'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>27</integer> +// CHECK-NEXT:       <key>col</key><integer>1</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>depth</key><integer>2</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Entered call from 'passThrough'</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Entered call from 'passThrough'</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>control</string> +// CHECK-NEXT:      <key>edges</key> +// CHECK-NEXT:       <array> +// CHECK-NEXT:        <dict> +// CHECK-NEXT:         <key>start</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>27</integer> +// CHECK-NEXT:            <key>col</key><integer>1</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>27</integer> +// CHECK-NEXT:            <key>col</key><integer>4</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:         <key>end</key> +// CHECK-NEXT:          <array> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>28</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:           <dict> +// CHECK-NEXT:            <key>line</key><integer>28</integer> +// CHECK-NEXT:            <key>col</key><integer>3</integer> +// CHECK-NEXT:            <key>file</key><integer>0</integer> +// CHECK-NEXT:           </dict> +// CHECK-NEXT:          </array> +// CHECK-NEXT:        </dict> +// CHECK-NEXT:       </array> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:     <dict> +// CHECK-NEXT:      <key>kind</key><string>event</string> +// CHECK-NEXT:      <key>location</key> +// CHECK-NEXT:      <dict> +// CHECK-NEXT:       <key>line</key><integer>28</integer> +// CHECK-NEXT:       <key>col</key><integer>3</integer> +// CHECK-NEXT:       <key>file</key><integer>0</integer> +// CHECK-NEXT:      </dict> +// CHECK-NEXT:      <key>ranges</key> +// CHECK-NEXT:      <array> +// CHECK-NEXT:        <array> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>28</integer> +// CHECK-NEXT:          <key>col</key><integer>4</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:         <dict> +// CHECK-NEXT:          <key>line</key><integer>28</integer> +// CHECK-NEXT:          <key>col</key><integer>6</integer> +// CHECK-NEXT:          <key>file</key><integer>0</integer> +// CHECK-NEXT:         </dict> +// CHECK-NEXT:        </array> +// CHECK-NEXT:      </array> +// CHECK-NEXT:      <key>depth</key><integer>2</integer> +// CHECK-NEXT:      <key>extended_message</key> +// CHECK-NEXT:      <string>Dereference of null pointer (loaded from variable 'ptr')</string> +// CHECK-NEXT:      <key>message</key> +// CHECK-NEXT:      <string>Dereference of null pointer (loaded from variable 'ptr')</string> +// CHECK-NEXT:     </dict> +// CHECK-NEXT:    </array> +// CHECK-NEXT:    <key>description</key><string>Dereference of null pointer (loaded from variable 'ptr')</string> +// CHECK-NEXT:    <key>category</key><string>Logic error</string> +// CHECK-NEXT:    <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT:   <key>issue_context_kind</key><string>function</string> +// CHECK-NEXT:   <key>issue_context</key><string>use2</string> +// CHECK-NEXT:   <key>issue_hash</key><integer>1</integer> +// CHECK-NEXT:   <key>location</key> +// CHECK-NEXT:   <dict> +// CHECK-NEXT:    <key>line</key><integer>28</integer> +// CHECK-NEXT:    <key>col</key><integer>3</integer> +// CHECK-NEXT:    <key>file</key><integer>0</integer> +// CHECK-NEXT:   </dict> +// CHECK-NEXT:   </dict> +// CHECK-NEXT:  </array>  | 

