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