[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

Jordan Rose jordan_rose at apple.com
Tue Jan 8 09:26:43 PST 2013


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];
}

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/60e8ddb0/attachment.html>


More information about the cfe-commits mailing list