<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>This is not correct. We <i>only</i> want to include the uniquing location, if it has one, because these two leaks should be considered the same:</div><div><br></div><div>void test() {</div><div>  id x = [[Foo alloc] init];</div><div>}</div><div><br></div><div>void test() {</div><div>  id x = [[Foo alloc] init];</div><div>  [x bar];</div><div>}</div><div><br></div><div>This is how the diagnostic machinery currently treats leaks along different paths—it only warns on a single path for each allocation, even if the leak occurs along multiple paths.</div><div><br></div><div>Jordan</div><div><br></div><br><div><div>On Jan 7, 2013, at 16:25 , Anna Zaks <<a href="mailto:ganna@apple.com">ganna@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Author: zaks<br>Date: Mon Jan  7 18:25:29 2013<br>New Revision: 171825<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=171825&view=rev">http://llvm.org/viewvc/llvm-project?rev=171825&view=rev</a><br>Log:<br>[analyzer] Include the bug uniqueing location in the issue_hash.<br><br>The issue here is that if we have 2 leaks reported at the same line for<br>which we cannot print the corresponding region info, they will get<br>treated as the same by issue_hash+description. We need to AUGMENT the<br>issue_hash with the allocation info to differentiate the two issues.<br><br>Add the "hash" (offset from the beginning of a function) representing<br>allocation site to solve the issue.<br><br>We might want to generalize solution in the future when we decide to<br>track more than just the 2 locations from the diagnostics.<br><br>Modified:<br>    cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h<br>    cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h<br>    cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp<br>    cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp<br>    cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp<br>    cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp<br>    cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp<br>    cfe/trunk/test/Analysis/malloc-plist.c<br><br>Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h (original)<br>+++ cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h Mon Jan  7 18:25:29 2013<br>@@ -75,6 +75,8 @@<br>   std::string Description;<br>   PathDiagnosticLocation Location;<br>   PathDiagnosticLocation UniqueingLocation;<br>+  const Decl *UniqueingDecl;<br>+  <br>   const ExplodedNode *ErrorNode;<br>   SmallVector<SourceRange, 4> Ranges;<br>   ExtraTextList ExtraText;<br>@@ -162,9 +164,10 @@<br>   /// for uniquing reports. For example, memory leaks checker, could set this to<br>   /// the allocation site, rather then the location where the bug is reported.<br>   BugReport(BugType& bt, StringRef desc, const ExplodedNode *errornode,<br>-            PathDiagnosticLocation LocationToUnique)<br>+            PathDiagnosticLocation LocationToUnique, const Decl *DeclToUnique)<br>     : BT(bt), DeclWithIssue(0), Description(desc),<br>       UniqueingLocation(LocationToUnique),<br>+      UniqueingDecl(DeclToUnique),<br>       ErrorNode(errornode), ConfigurationChangeToken(0),<br>       DoNotPrunePath(false) {}<br><br>@@ -260,6 +263,16 @@<br>   ///  This location is used by clients rendering diagnostics.<br>   virtual PathDiagnosticLocation getLocation(const SourceManager &SM) const;<br><br>+  /// \brief Get the location on which the report should be uniqued.<br>+  PathDiagnosticLocation getUniqueingLocation() const {<br>+    return UniqueingLocation;<br>+  }<br>+  <br>+  /// \brief Get the declaration containing the uniqueing location.<br>+  const Decl *getUniqueingDecl() const {<br>+    return UniqueingDecl;<br>+  }<br>+<br>   const Stmt *getStmt() const;<br><br>   /// \brief Add a range to a bug report.<br><br>Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h (original)<br>+++ cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h Mon Jan  7 18:25:29 2013<br>@@ -672,11 +672,17 @@<br>   PathPieces pathImpl;<br>   llvm::SmallVector<PathPieces *, 3> pathStack;<br><br>+  /// \brief Important bug uniqueing location.<br>+  /// The location info is useful to differentiate between bugs.<br>+  PathDiagnosticLocation UniqueingLoc;<br>+  const Decl *UniqueingDecl;<br>+<br>   PathDiagnostic(); // Do not implement.<br> public:<br>   PathDiagnostic(const Decl *DeclWithIssue, StringRef bugtype,<br>                  StringRef verboseDesc, StringRef shortDesc,<br>-                 StringRef category);<br>+                 StringRef category, PathDiagnosticLocation LocationToUnique,<br>+                 const Decl *DeclToUnique);<br><br>   ~PathDiagnostic();<br><br>@@ -738,6 +744,16 @@<br>     return Loc;<br>   }<br><br>+  /// \brief Get the location on which the report should be uniqued.<br>+  PathDiagnosticLocation getUniqueingLoc() const {<br>+    return UniqueingLoc;<br>+  }<br>+<br>+  /// \brief Get the declaration containing the uniqueing location.<br>+  const Decl *getUniqueingDecl() const {<br>+    return UniqueingDecl;<br>+  }<br>+<br>   void flattenLocations() {<br>     Loc.flatten();<br>     for (PathPieces::iterator I = pathImpl.begin(), E = pathImpl.end(); <br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp Mon Jan  7 18:25:29 2013<br>@@ -99,8 +99,8 @@<br>                                          CheckerContext &C) const;<br><br>   /// Find the allocation site for Sym on the path leading to the node N.<br>-  const Stmt *getAllocationSite(const ExplodedNode *N, SymbolRef Sym,<br>-                                CheckerContext &C) const;<br>+  const ExplodedNode *getAllocationNode(const ExplodedNode *N, SymbolRef Sym,<br>+                                        CheckerContext &C) const;<br><br>   BugReport *generateAllocatedDataNotReleasedReport(const AllocationPair &AP,<br>                                                     ExplodedNode *N,<br>@@ -486,8 +486,8 @@<br> }<br><br> // TODO: This logic is the same as in Malloc checker.<br>-const Stmt *<br>-MacOSKeychainAPIChecker::getAllocationSite(const ExplodedNode *N,<br>+const ExplodedNode *<br>+MacOSKeychainAPIChecker::getAllocationNode(const ExplodedNode *N,<br>                                            SymbolRef Sym,<br>                                            CheckerContext &C) const {<br>   const LocationContext *LeakContext = N->getLocationContext();<br>@@ -505,12 +505,7 @@<br>     N = N->pred_empty() ? NULL : *(N->pred_begin());<br>   }<br><br>-  ProgramPoint P = AllocNode->getLocation();<br>-  if (CallExitEnd *Exit = dyn_cast<CallExitEnd>(&P))<br>-    return Exit->getCalleeContext()->getCallSite();<br>-  if (clang::PostStmt *PS = dyn_cast<clang::PostStmt>(&P))<br>-    return PS->getStmt();<br>-  return 0;<br>+  return AllocNode;<br> }<br><br> BugReport *MacOSKeychainAPIChecker::<br>@@ -528,11 +523,22 @@<br>   // With leaks, we want to unique them by the location where they were<br>   // allocated, and only report a single path.<br>   PathDiagnosticLocation LocUsedForUniqueing;<br>-  if (const Stmt *AllocStmt = getAllocationSite(N, AP.first, C))<br>+  const ExplodedNode *AllocNode = getAllocationNode(N, AP.first, C);<br>+  const Stmt *AllocStmt = 0;<br>+  ProgramPoint P = AllocNode->getLocation();<br>+  if (CallExitEnd *Exit = dyn_cast<CallExitEnd>(&P))<br>+    AllocStmt = Exit->getCalleeContext()->getCallSite();<br>+  else if (clang::PostStmt *PS = dyn_cast<clang::PostStmt>(&P))<br>+    AllocStmt = PS->getStmt();<br>+<br>+  if (AllocStmt)<br>     LocUsedForUniqueing = PathDiagnosticLocation::createBegin(AllocStmt,<br>-                            C.getSourceManager(), N->getLocationContext());<br>+                                              C.getSourceManager(),<br>+                                              AllocNode->getLocationContext());<br>+<br>+  BugReport *Report = new BugReport(*BT, os.str(), N, LocUsedForUniqueing,<br>+                                   AllocNode->getLocationContext()->getDecl());<br><br>-  BugReport *Report = new BugReport(*BT, os.str(), N, LocUsedForUniqueing);<br>   Report->addVisitor(new SecKeychainBugVisitor(AP.first));<br>   markInteresting(Report, AP);<br>   return Report;<br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp Mon Jan  7 18:25:29 2013<br>@@ -113,7 +113,7 @@<br>   }<br> };<br><br>-typedef std::pair<const Stmt*, const MemRegion*> LeakInfo;<br>+typedef std::pair<const ExplodedNode*, const MemRegion*> LeakInfo;<br><br> class MallocChecker : public Checker<check::DeadSymbols,<br>                                      check::PointerEscape,<br>@@ -1039,14 +1039,7 @@<br>     N = N->pred_empty() ? NULL : *(N->pred_begin());<br>   }<br><br>-  ProgramPoint P = AllocNode->getLocation();<br>-  const Stmt *AllocationStmt = 0;<br>-  if (CallExitEnd *Exit = dyn_cast<CallExitEnd>(&P))<br>-    AllocationStmt = Exit->getCalleeContext()->getCallSite();<br>-  else if (StmtPoint *SP = dyn_cast<StmtPoint>(&P))<br>-    AllocationStmt = SP->getStmt();<br>-<br>-  return LeakInfo(AllocationStmt, ReferenceRegion);<br>+  return LeakInfo(AllocNode, ReferenceRegion);<br> }<br><br> void MallocChecker::reportLeak(SymbolRef Sym, ExplodedNode *N,<br>@@ -1066,12 +1059,20 @@<br>   // With leaks, we want to unique them by the location where they were<br>   // allocated, and only report a single path.<br>   PathDiagnosticLocation LocUsedForUniqueing;<br>-  const Stmt *AllocStmt = 0;<br>+  const ExplodedNode *AllocNode = 0;<br>   const MemRegion *Region = 0;<br>-  llvm::tie(AllocStmt, Region) = getAllocationSite(N, Sym, C);<br>-  if (AllocStmt)<br>-    LocUsedForUniqueing = PathDiagnosticLocation::createBegin(AllocStmt,<br>-                            C.getSourceManager(), N->getLocationContext());<br>+  llvm::tie(AllocNode, Region) = getAllocationSite(N, Sym, C);<br>+  <br>+  ProgramPoint P = AllocNode->getLocation();<br>+  const Stmt *AllocationStmt = 0;<br>+  if (CallExitEnd *Exit = dyn_cast<CallExitEnd>(&P))<br>+    AllocationStmt = Exit->getCalleeContext()->getCallSite();<br>+  else if (StmtPoint *SP = dyn_cast<StmtPoint>(&P))<br>+    AllocationStmt = SP->getStmt();<br>+  if (AllocationStmt)<br>+    LocUsedForUniqueing = PathDiagnosticLocation::createBegin(AllocationStmt,<br>+                                              C.getSourceManager(),<br>+                                              AllocNode->getLocationContext());<br><br>   SmallString<200> buf;<br>   llvm::raw_svector_ostream os(buf);<br>@@ -1082,7 +1083,9 @@<br>     os << '\'';<br>   }<br><br>-  BugReport *R = new BugReport(*BT_Leak, os.str(), N, LocUsedForUniqueing);<br>+  BugReport *R = new BugReport(*BT_Leak, os.str(), N, <br>+                               LocUsedForUniqueing, <br>+                               AllocNode->getLocationContext()->getDecl());<br>   R->markInteresting(Sym);<br>   R->addVisitor(new MallocBugVisitor(Sym, true));<br>   C.emitReport(R);<br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp Mon Jan  7 18:25:29 2013<br>@@ -1527,8 +1527,9 @@<br> void BugReport::Profile(llvm::FoldingSetNodeID& hash) const {<br>   hash.AddPointer(&BT);<br>   hash.AddString(Description);<br>-  if (UniqueingLocation.isValid()) {<br>-    UniqueingLocation.Profile(hash);<br>+  PathDiagnosticLocation UL = getUniqueingLocation();<br>+  if (UL.isValid()) {<br>+    UL.Profile(hash);<br>   } else if (Location.isValid()) {<br>     Location.Profile(hash);<br>   } else {<br>@@ -2295,7 +2296,9 @@<br>                          exampleReport->getBugType().getName(),<br>                          exampleReport->getDescription(),<br>                          exampleReport->getShortDescription(/*Fallback=*/false),<br>-                         BT.getCategory()));<br>+                         BT.getCategory(),<br>+                         exampleReport->getUniqueingLocation(),<br>+                         exampleReport->getUniqueingDecl()));<br><br>   // Generate the full path diagnostic, using the generation scheme<br>   // specified by the PathDiagnosticConsumer. Note that we have to generate<br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Mon Jan  7 18:25:29 2013<br>@@ -107,12 +107,16 @@<br><br> PathDiagnostic::PathDiagnostic(const Decl *declWithIssue,<br>                                StringRef bugtype, StringRef verboseDesc,<br>-                               StringRef shortDesc, StringRef category)<br>+                               StringRef shortDesc, StringRef category,<br>+                               PathDiagnosticLocation LocationToUnique,<br>+                               const Decl *DeclToUnique)<br>   : DeclWithIssue(declWithIssue),<br>     BugType(StripTrailingDots(bugtype)),<br>     VerboseDesc(StripTrailingDots(verboseDesc)),<br>     ShortDesc(StripTrailingDots(shortDesc)),<br>     Category(StripTrailingDots(category)),<br>+    UniqueingLoc(LocationToUnique),<br>+    UniqueingDecl(DeclToUnique),<br>     path(pathImpl) {}<br><br> void PathDiagnosticConsumer::anchor() { }<br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp Mon Jan  7 18:25:29 2013<br>@@ -499,8 +499,21 @@<br>                             *SM);<br>           FullSourceLoc FunLoc(SM->getExpansionLoc(Body->getLocStart()), *SM);<br>           o << "  <key>issue_hash</key><string>"<br>-              << Loc.getExpansionLineNumber() - FunLoc.getExpansionLineNumber()<br>-              << "</string>\n";<br>+            << Loc.getExpansionLineNumber() - FunLoc.getExpansionLineNumber();<br>+          <br>+          // Augment the hash with the bug uniqueing location. For example, <br>+          // this ensures that two leaks reported on the same line will have <br>+          // different issue_hashes.<br>+          PathDiagnosticLocation UPDLoc = D->getUniqueingLoc();<br>+          if (UPDLoc.isValid()) {<br>+            FullSourceLoc UL(SM->getExpansionLoc(UPDLoc.asLocation()),<br>+                             *SM);<br>+            FullSourceLoc UFunL(SM->getExpansionLoc(<br>+              D->getUniqueingDecl()->getBody()->getLocStart()), *SM);<br>+            o << "_" <br>+              << UL.getExpansionLineNumber() - UFunL.getExpansionLineNumber();<br>+          }<br>+          o << "</string>\n";<br>         }<br>       }<br>     }<br><br>Modified: cfe/trunk/test/Analysis/malloc-plist.c<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc-plist.c?rev=171825&r1=171824&r2=171825&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc-plist.c?rev=171825&r1=171824&r2=171825&view=diff</a><br>==============================================================================<br>--- cfe/trunk/test/Analysis/malloc-plist.c (original)<br>+++ cfe/trunk/test/Analysis/malloc-plist.c Mon Jan  7 18:25:29 2013<br>@@ -388,7 +388,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>diagnosticTest</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>5</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>5_2</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>15</integer><br>@@ -550,7 +550,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>myArrayAllocation</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>4</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>4_2</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>22</integer><br>@@ -935,7 +935,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>reallocDiagnostics</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>5</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>5_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>29</integer><br>@@ -1334,7 +1334,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>test_wrapper</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>3</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>3_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>46</integer><br>@@ -2413,7 +2413,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>reallocIntra</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>3</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>3_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>77</integer><br>@@ -2681,7 +2681,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>use_ret</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>3</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>3_2</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>87</integer><br>@@ -2843,7 +2843,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>LeakedSymbol</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>8</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>8_3</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>98</integer><br>@@ -3048,7 +3048,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>function_with_leak1</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>2</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>2_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>104</integer><br>@@ -3253,7 +3253,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>function_with_leak2</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>2</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>2_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>112</integer><br>@@ -3555,7 +3555,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>function_with_leak3</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>3</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>3_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>121</integer><br>@@ -3857,7 +3857,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>function_with_leak4</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>5</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>5_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>132</integer><br>@@ -4062,7 +4062,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>function_with_leak5</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>2</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>2_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>143</integer><br>@@ -4267,7 +4267,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>function_with_leak6</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>2</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>2_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>154</integer><br>@@ -4501,7 +4501,7 @@<br> // CHECK-NEXT:    <key>type</key><string>Memory leak</string><br> // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string><br> // CHECK-NEXT:   <key>issue_context</key><string>use_function_with_leak7</string><br>-// CHECK-NEXT:   <key>issue_hash</key><string>2</string><br>+// CHECK-NEXT:   <key>issue_hash</key><string>2_1</string><br> // CHECK-NEXT:   <key>location</key><br> // CHECK-NEXT:   <dict><br> // CHECK-NEXT:    <key>line</key><integer>170</integer><br>@@ -4510,3 +4510,5 @@<br> // CHECK-NEXT:   </dict><br> // CHECK-NEXT:   </dict><br> // CHECK-NEXT:  </array><br>+// CHECK-NEXT: </dict><br>+// CHECK-NEXT: </plist><br><br><br>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits<br></blockquote></div><br></body></html>