<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; "><br><div><div>On Jan 8, 2013, at 9:26 AM, Jordan Rose <<a href="mailto:jordan_rose@apple.com">jordan_rose@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><meta http-equiv="Content-Type" content="text/html charset=windows-1252"><div 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></blockquote><br>You are right this way we will allow more code modifications and still will be able to identify the same bugs. Thanks for reviewing. I'll commit the change.</div><div><br></div><div>Anna.</div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><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><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br></blockquote></div><br></div></blockquote></div><br></body></html>