diff options
author | Anna Zaks <ganna@apple.com> | 2011-08-19 23:21:56 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-08-19 23:21:56 +0000 |
commit | dc757b049796949e4b11646445a6598f0bdabd7a (patch) | |
tree | 812c0cb400af196a55c96b5a7b555a1c0c426b9e /lib/StaticAnalyzer/Core/CFRefCount.cpp | |
parent | 2ba4fde1915029f97c44e562e354320a5c10ac65 (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.cpp | 45 |
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)); } //===----------------------------------------------------------------------===// |