From: Anna Zaks Date: Fri, 19 Aug 2011 23:21:56 +0000 (+0000) Subject: Static Analyzer Diagnostics: Switch CFRefCount to using the new visitor API. BugRepor... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc757b049796949e4b11646445a6598f0bdabd7a;p=clang 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 --- diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h index a8923be63f..07cc467521 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h @@ -51,7 +51,7 @@ class BugType; /// This class provides an interface through which checkers can create /// individual bug reports. -class BugReport : public BugReporterVisitor { +class BugReport { public: class NodeResolver { public: @@ -90,27 +90,19 @@ protected: public: BugReport(BugType& bt, StringRef desc, const ExplodedNode *errornode) : BT(bt), Description(desc), ErrorNode(errornode), - Callbacks(F.getEmptyList()) { - addVisitor(this); - } + Callbacks(F.getEmptyList()) {} BugReport(BugType& bt, StringRef shortDesc, StringRef desc, const ExplodedNode *errornode) : BT(bt), ShortDescription(shortDesc), Description(desc), - ErrorNode(errornode), Callbacks(F.getEmptyList()) { - addVisitor(this); - } + ErrorNode(errornode), Callbacks(F.getEmptyList()) {} BugReport(BugType& bt, StringRef desc, FullSourceLoc l) : BT(bt), Description(desc), Location(l), ErrorNode(0), - Callbacks(F.getEmptyList()) { - addVisitor(this); - } + Callbacks(F.getEmptyList()) {} virtual ~BugReport(); - virtual bool isOwnedByReporterContext() { return false; } - const BugType& getBugType() const { return BT; } BugType& getBugType() { return BT; } @@ -164,11 +156,6 @@ public: /// Iterators through the custom diagnostic visitors. visitor_iterator visitor_begin() { return Callbacks.begin(); } visitor_iterator visitor_end() { return Callbacks.end(); } - - virtual PathDiagnosticPiece *VisitNode(const ExplodedNode *N, - const ExplodedNode *PrevN, - BugReporterContext &BRC, - BugReport &BR); }; //===----------------------------------------------------------------------===// diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h index 4533616d99..98943d6c41 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h @@ -42,7 +42,6 @@ public: BugReporterContext &BRC, BugReport &BR) = 0; - virtual bool isOwnedByReporterContext() { return true; } virtual void Profile(llvm::FoldingSetNodeID &ID) const = 0; }; diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index fb0331c274..df3ebb860d 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1224,9 +1224,7 @@ void BugReport::addVisitor(BugReporterVisitor* visitor) { BugReport::~BugReport() { for (visitor_iterator I = visitor_begin(), E = visitor_end(); I != E; ++I) { - if ((*I)->isOwnedByReporterContext()) { - delete *I; - } + delete *I; } } @@ -1340,13 +1338,6 @@ SourceLocation BugReport::getLocation() const { return FullSourceLoc(); } -PathDiagnosticPiece *BugReport::VisitNode(const ExplodedNode *N, - const ExplodedNode *PrevN, - BugReporterContext &BRC, - BugReport &BR) { - return NULL; -} - //===----------------------------------------------------------------------===// // Methods for BugReporter and subclasses. //===----------------------------------------------------------------------===// 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 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& 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(N->getLocation())) return NULL; @@ -2113,7 +2132,7 @@ PathDiagnosticPiece *CFRefReport::VisitNode(const ExplodedNode *N, if (CurrV.isOwned()) { os << "+1 retain count"; - if (static_cast(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)); } //===----------------------------------------------------------------------===//