aboutsummaryrefslogtreecommitdiff
path: root/lib/StaticAnalyzer/Core/CFRefCount.cpp
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2011-08-19 23:21:56 +0000
committerAnna Zaks <ganna@apple.com>2011-08-19 23:21:56 +0000
commitdc757b049796949e4b11646445a6598f0bdabd7a (patch)
tree812c0cb400af196a55c96b5a7b555a1c0c426b9e /lib/StaticAnalyzer/Core/CFRefCount.cpp
parent2ba4fde1915029f97c44e562e354320a5c10ac65 (diff)
Static Analyzer Diagnostics: Switch CFRefCount to using the new visitor API. BugReport no longer needs to inherit from BugReporterVisitor.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138142 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/CFRefCount.cpp')
-rw-r--r--lib/StaticAnalyzer/Core/CFRefCount.cpp45
1 files changed, 33 insertions, 12 deletions
diff --git a/lib/StaticAnalyzer/Core/CFRefCount.cpp b/lib/StaticAnalyzer/Core/CFRefCount.cpp
index 78325f366c..9e6d829a25 100644
--- a/lib/StaticAnalyzer/Core/CFRefCount.cpp
+++ b/lib/StaticAnalyzer/Core/CFRefCount.cpp
@@ -1959,6 +1959,26 @@ namespace {
// Bug Reports. //
//===---------===//
+ class CFRefReportVisitor : public BugReporterVisitor {
+ SymbolRef Sym;
+ const CFRefCount &TF;
+ public:
+
+ CFRefReportVisitor(SymbolRef sym, const CFRefCount &tf)
+ : Sym(sym), TF(tf) {}
+
+ void Profile(llvm::FoldingSetNodeID &ID) const {
+ static int x = 0;
+ ID.AddPointer(&x);
+ ID.AddPointer(Sym);
+ }
+
+ PathDiagnosticPiece *VisitNode(const ExplodedNode *N,
+ const ExplodedNode *PrevN,
+ BugReporterContext &BRC,
+ BugReport &BR);
+ };
+
class CFRefReport : public BugReport {
protected:
SymbolRef Sym;
@@ -1966,11 +1986,15 @@ namespace {
public:
CFRefReport(CFRefBug& D, const CFRefCount &tf,
ExplodedNode *n, SymbolRef sym)
- : BugReport(D, D.getDescription(), n), Sym(sym), TF(tf) {}
+ : BugReport(D, D.getDescription(), n), Sym(sym), TF(tf) {
+ addVisitor(new CFRefReportVisitor(sym, tf));
+ }
CFRefReport(CFRefBug& D, const CFRefCount &tf,
ExplodedNode *n, SymbolRef sym, StringRef endText)
- : BugReport(D, D.getDescription(), endText, n), Sym(sym), TF(tf) {}
+ : BugReport(D, D.getDescription(), endText, n), Sym(sym), TF(tf) {
+ addVisitor(new CFRefReportVisitor(sym, tf));
+ }
virtual ~CFRefReport() {}
@@ -1991,11 +2015,6 @@ namespace {
const ExplodedNode *N);
std::pair<const char**,const char**> getExtraDescriptiveText();
-
- PathDiagnosticPiece *VisitNode(const ExplodedNode *N,
- const ExplodedNode *PrevN,
- BugReporterContext &BRC,
- BugReport &BR);
};
class CFRefLeakReport : public CFRefReport {
@@ -2060,10 +2079,10 @@ static inline bool contains(const SmallVectorImpl<ArgEffect>& V,
return false;
}
-PathDiagnosticPiece *CFRefReport::VisitNode(const ExplodedNode *N,
- const ExplodedNode *PrevN,
- BugReporterContext &BRC,
- BugReport &BR) {
+PathDiagnosticPiece *CFRefReportVisitor::VisitNode(const ExplodedNode *N,
+ const ExplodedNode *PrevN,
+ BugReporterContext &BRC,
+ BugReport &BR) {
if (!isa<PostStmt>(N->getLocation()))
return NULL;
@@ -2113,7 +2132,7 @@ PathDiagnosticPiece *CFRefReport::VisitNode(const ExplodedNode *N,
if (CurrV.isOwned()) {
os << "+1 retain count";
- if (static_cast<CFRefBug&>(getBugType()).getTF().isGCEnabled()) {
+ if (TF.isGCEnabled()) {
assert(CurrV.getObjKind() == RetEffect::CF);
os << ". "
"Core Foundation objects are not automatically garbage collected.";
@@ -2507,6 +2526,8 @@ CFRefLeakReport::CFRefLeakReport(CFRefBug& D, const CFRefCount &tf,
// FIXME: AllocBinding doesn't get populated for RegionStore yet.
if (AllocBinding)
os << " and stored into '" << AllocBinding->getString() << '\'';
+
+ addVisitor(new CFRefReportVisitor(sym, tf));
}
//===----------------------------------------------------------------------===//