r217205 - unique_ptrify BugReporter::visitors

David Blaikie dblaikie at gmail.com
Thu Sep 4 17:17:25 PDT 2014


On Thu, Sep 4, 2014 at 5:13 PM, Justin Bogner <mail at justinbogner.com> wrote:

> David Blaikie <dblaikie at gmail.com> writes:
> > Author: dblaikie
> > Date: Thu Sep  4 18:54:33 2014
> > New Revision: 217205
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=217205&view=rev
> > Log:
> > unique_ptrify BugReporter::visitors
> >
> > Modified:
> >     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
> >
>  cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> >     cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
> >     cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
> >     cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
> >     cfe/trunk/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp
> >
>  cfe/trunk/lib/StaticAnalyzer/Checkers/UndefCapturedBlockVarChecker.cpp
> >     cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
> >     cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> >
> > 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=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > ---
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
> (original)
> > +++
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h Thu
> Sep  4 18:54:33 2014
> > @@ -63,7 +63,7 @@ public:
> >    };
> >
> >    typedef const SourceRange *ranges_iterator;
> > -  typedef SmallVector<BugReporterVisitor *, 8> VisitorList;
> > +  typedef SmallVector<std::unique_ptr<BugReporterVisitor>, 8>
> VisitorList;
> >    typedef VisitorList::iterator visitor_iterator;
> >    typedef SmallVector<StringRef, 2> ExtraTextList;
> >
> > @@ -299,9 +299,9 @@ public:
> >    /// \sa registerConditionVisitor(), registerTrackNullOrUndefValue(),
> >    /// registerFindLastStore(), registerNilReceiverVisitor(), and
> >    /// registerVarDeclsLastStore().
> > -  void addVisitor(BugReporterVisitor *visitor);
> > +  void addVisitor(std::unique_ptr<BugReporterVisitor> visitor);
> >
> > -     /// Iterators through the custom diagnostic visitors.
> > +        /// Iterators through the custom diagnostic visitors.
> >    visitor_iterator visitor_begin() { return Callbacks.begin(); }
> >    visitor_iterator visitor_end() { return Callbacks.end(); }
>
> Spacing looks pretty strange here.
>

Yeah, I thought I'd at least managed to avoid clang-format modifying that
line, though it was weird before (& weird after, but just differently
weird... ) but I guess not.

Fixed it properly in r217209.


>
> >
> >
> > Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h?rev=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > ---
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> (original)
> > +++
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> Thu Sep  4 18:54:33 2014
> > @@ -48,7 +48,7 @@ public:
> >    /// (Warning: if you have a deep subclass of BugReporterVisitorImpl,
> the
> >    /// default implementation of clone() will NOT do the right thing,
> and you
> >    /// will have to provide your own implementation.)
> > -  virtual BugReporterVisitor *clone() const = 0;
> > +  virtual std::unique_ptr<BugReporterVisitor> clone() const = 0;
> >
> >    /// \brief Return a diagnostic piece which should be associated with
> the
> >    /// given node.
> > @@ -87,8 +87,8 @@ public:
> >  /// will have to provide your own implementation.)
> >  template <class DERIVED>
> >  class BugReporterVisitorImpl : public BugReporterVisitor {
> > -  BugReporterVisitor *clone() const override {
> > -    return new DERIVED(*static_cast<const DERIVED *>(this));
> > +  std::unique_ptr<BugReporterVisitor> clone() const override {
> > +  4:30pm  return llvm::make_unique<DERIVED>(*static_cast<const DERIVED
> *>(this));
> >    }
> >  };
> >
> >
> > Modified:
> cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp?rev=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
> (original)
> > +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
> Thu Sep  4 18:54:33 2014
> > @@ -270,7 +270,7 @@ void MacOSKeychainAPIChecker::
> >    os << "Deallocator doesn't match the allocator: '"
> >       << FunctionsToTrack[PDeallocIdx].Name << "' should be used.";
> >    BugReport *Report = new BugReport(*BT, os.str(), N);
> > -  Report->addVisitor(new SecKeychainBugVisitor(AP.first));
> > +
> Report->addVisitor(llvm::make_unique<SecKeychainBugVisitor>(AP.first));
> >    Report->addRange(ArgExpr->getSourceRange());
> >    markInteresting(Report, AP);
> >    C.emitReport(Report);
> > @@ -311,7 +311,7 @@ void MacOSKeychainAPIChecker::checkPreSt
> >                << FunctionsToTrack[DIdx].Name
> >                << "'.";
> >            BugReport *Report = new BugReport(*BT, os.str(), N);
> > -          Report->addVisitor(new SecKeychainBugVisitor(V));
> > +
> Report->addVisitor(llvm::make_unique<SecKeychainBugVisitor>(V));
> >            Report->addRange(ArgExpr->getSourceRange());
> >            Report->markInteresting(AS->Region);
> >            C.emitReport(Report);
> > @@ -430,7 +430,7 @@ void MacOSKeychainAPIChecker::checkPreSt
> >      initBugType();
> >      BugReport *Report = new BugReport(*BT,
> >          "Only call free if a valid (non-NULL) buffer was returned.", N);
> > -    Report->addVisitor(new SecKeychainBugVisitor(ArgSM));
> > +    Report->addVisitor(llvm::make_unique<SecKeychainBugVisitor>(ArgSM));
> >      Report->addRange(ArgExpr->getSourceRange());
> >      Report->markInteresting(AS->Region);
> >      C.emitReport(Report);
> > @@ -540,7 +540,7 @@ BugReport *MacOSKeychainAPIChecker::
> >    BugReport *Report = new BugReport(*BT, os.str(), N,
> LocUsedForUniqueing,
> >
>  AllocNode->getLocationContext()->getDecl());
> >
> > -  Report->addVisitor(new SecKeychainBugVisitor(AP.first));
> > +
> Report->addVisitor(llvm::make_unique<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=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (original)
> > +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp Thu Sep  4
> 18:54:33 2014
> > @@ -1467,7 +1467,7 @@ void MallocChecker::ReportMismatchedDeal
> >      BugReport *R = new BugReport(*BT_MismatchedDealloc, os.str(), N);
> >      R->markInteresting(Sym);
> >      R->addRange(Range);
> > -    R->addVisitor(new MallocBugVisitor(Sym));
> > +    R->addVisitor(llvm::make_unique<MallocBugVisitor>(Sym));
> >      C.emitReport(R);
> >    }
> >  }
> > @@ -1551,7 +1551,7 @@ void MallocChecker::ReportUseAfterFree(C
> >
> >      R->markInteresting(Sym);
> >      R->addRange(Range);
> > -    R->addVisitor(new MallocBugVisitor(Sym));
> > +    R->addVisitor(llvm::make_unique<MallocBugVisitor>(Sym));
> >      C.emitReport(R);
> >    }
> >  }
> > @@ -1583,7 +1583,7 @@ void MallocChecker::ReportDoubleFree(Che
> >      R->markInteresting(Sym);
> >      if (PrevSym)
> >        R->markInteresting(PrevSym);
> > -    R->addVisitor(new MallocBugVisitor(Sym));
> > +    R->addVisitor(llvm::make_unique<MallocBugVisitor>(Sym));
> >      C.emitReport(R);
> >    }
> >  }
> > @@ -1607,7 +1607,7 @@ void MallocChecker::ReportDoubleDelete(C
> >                                   "Attempt to delete released memory",
> N);
> >
> >      R->markInteresting(Sym);
> > -    R->addVisitor(new MallocBugVisitor(Sym));
> > +    R->addVisitor(llvm::make_unique<MallocBugVisitor>(Sym));
> >      C.emitReport(R);
> >    }
> >  }
> > @@ -1835,7 +1835,7 @@ void MallocChecker::reportLeak(SymbolRef
> >        new BugReport(*BT_Leak[*CheckKind], os.str(), N,
> LocUsedForUniqueing,
> >                      AllocNode->getLocationContext()->getDecl());
> >    R->markInteresting(Sym);
> > -  R->addVisitor(new MallocBugVisitor(Sym, true));
> > +  R->addVisitor(llvm::make_unique<MallocBugVisitor>(Sym, true));
> >    C.emitReport(R);
> >  }
> >
> >
> > Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp?rev=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
> (original)
> > +++ cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp Thu
> Sep  4 18:54:33 2014
> > @@ -1732,13 +1732,13 @@ namespace {
> >                                                      const ExplodedNode
> *N,
> >                                                      BugReport &BR)
> override;
> >
> > -    BugReporterVisitor *clone() const override {
> > +    std::unique_ptr<BugReporterVisitor> clone() const override {
> >        // The curiously-recurring template pattern only works for one
> level of
> >        // subclassing. Rather than make a new template base for
> >        // CFRefReportVisitor, we simply override clone() to do the right
> thing.
> >        // This could be trouble someday if BugReporterVisitorImpl is ever
> >        // used for something else besides a convenient implementation of
> clone().
> > -      return new CFRefLeakReportVisitor(*this);
> > +      return llvm::make_unique<CFRefLeakReportVisitor>(*this);
> >      }
> >    };
> >
> > @@ -1751,7 +1751,7 @@ namespace {
> >                  bool registerVisitor = true)
> >        : BugReport(D, D.getDescription(), n) {
> >        if (registerVisitor)
> > -        addVisitor(new CFRefReportVisitor(sym, GCEnabled, Log));
> > +        addVisitor(llvm::make_unique<CFRefReportVisitor>(sym,
> GCEnabled, Log));
> >        addGCModeDescription(LOpts, GCEnabled);
> >      }
> >
> > @@ -1759,7 +1759,7 @@ namespace {
> >                  const SummaryLogTy &Log, ExplodedNode *n, SymbolRef sym,
> >                  StringRef endText)
> >        : BugReport(D, D.getDescription(), endText, n) {
> > -      addVisitor(new CFRefReportVisitor(sym, GCEnabled, Log));
> > +      addVisitor(llvm::make_unique<CFRefReportVisitor>(sym, GCEnabled,
> Log));
> >        addGCModeDescription(LOpts, GCEnabled);
> >      }
> >
> > @@ -2387,7 +2387,7 @@ CFRefLeakReport::CFRefLeakReport(CFRefBu
> >      }
> >    }
> >
> > -  addVisitor(new CFRefLeakReportVisitor(sym, GCEnabled, Log));
> > +  addVisitor(llvm::make_unique<CFRefLeakReportVisitor>(sym, GCEnabled,
> Log));
> >  }
> >
> >
> //===----------------------------------------------------------------------===//
> >
> > Modified:
> cfe/trunk/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp?rev=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp
> (original)
> > +++ cfe/trunk/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp
> Thu Sep  4 18:54:33 2014
> > @@ -176,7 +176,8 @@ void TestAfterDivZeroChecker::reportBug(
> >                                     "already been used for division",
> >                        N);
> >
> > -    R->addVisitor(new DivisionBRVisitor(Val.getAsSymbol(),
> C.getStackFrame()));
> > +
> R->addVisitor(llvm::make_unique<DivisionBRVisitor>(Val.getAsSymbol(),
> > +
>  C.getStackFrame()));
> >      C.emitReport(R);
> >    }
> >  }
> >
> > Modified:
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefCapturedBlockVarChecker.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UndefCapturedBlockVarChecker.cpp?rev=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > ---
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefCapturedBlockVarChecker.cpp
> (original)
> > +++
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefCapturedBlockVarChecker.cpp Thu
> Sep  4 18:54:33 2014
> > @@ -92,8 +92,8 @@ UndefCapturedBlockVarChecker::checkPostS
> >          BugReport *R = new BugReport(*BT, os.str(), N);
> >          if (const Expr *Ex = FindBlockDeclRefExpr(BE->getBody(), VD))
> >            R->addRange(Ex->getSourceRange());
> > -        R->addVisitor(new FindLastStoreBRVisitor(*V, VR,
> > -
>  /*EnableNullFPSuppression*/false));
> > +        R->addVisitor(llvm::make_unique<FindLastStoreBRVisitor>(
> > +            *V, VR, /*EnableNullFPSuppression*/ false));
> >          R->disablePathPruning();
> >          // need location of block
> >          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=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp (original)
> > +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp Thu Sep  4
> 18:54:33 2014
> > @@ -499,10 +499,9 @@ PathDiagnosticBuilder::getEnclosingStmtL
> >
> //===----------------------------------------------------------------------===//
> >  // "Visitors only" path diagnostic generation algorithm.
> >
> //===----------------------------------------------------------------------===//
> > -static bool GenerateVisitorsOnlyPathDiagnostic(PathDiagnostic &PD,
> > -                                               PathDiagnosticBuilder
> &PDB,
> > -                                               const ExplodedNode *N,
> > -                                      ArrayRef<BugReporterVisitor *>
> visitors) {
> > +static bool GenerateVisitorsOnlyPathDiagnostic(
> > +    PathDiagnostic &PD, PathDiagnosticBuilder &PDB, const ExplodedNode
> *N,
> > +    ArrayRef<std::unique_ptr<BugReporterVisitor>> visitors) {
> >    // All path generation skips the very first node (the error node).
> >    // This is because there is special handling for the end-of-path note.
> >    N = N->getFirstPred();
> > @@ -511,11 +510,9 @@ static bool GenerateVisitorsOnlyPathDiag
> >
> >    BugReport *R = PDB.getBugReport();
> >    while (const ExplodedNode *Pred = N->getFirstPred()) {
> > -    for (ArrayRef<BugReporterVisitor *>::iterator I = visitors.begin(),
> > -                                                  E = visitors.end();
> > -         I != E; ++I) {
> > +    for (auto &V : visitors) {
> >        // Visit all the node pairs, but throw the path pieces away.
> > -      PathDiagnosticPiece *Piece = (*I)->VisitNode(N, Pred, PDB, *R);
> > +      PathDiagnosticPiece *Piece = V->VisitNode(N, Pred, PDB, *R);
> >        delete Piece;
> >      }
> >
> > @@ -556,11 +553,10 @@ static void updateStackPiecesWithMessage
> >
> >  static void CompactPathDiagnostic(PathPieces &path, const
> SourceManager& SM);
> >
> > -static bool GenerateMinimalPathDiagnostic(PathDiagnostic& PD,
> > -                                          PathDiagnosticBuilder &PDB,
> > -                                          const ExplodedNode *N,
> > -                                          LocationContextMap &LCM,
> > -                                      ArrayRef<BugReporterVisitor *>
> visitors) {
> > +static bool GenerateMinimalPathDiagnostic(
> > +    PathDiagnostic &PD, PathDiagnosticBuilder &PDB, const ExplodedNode
> *N,
> > +    LocationContextMap &LCM,
> > +    ArrayRef<std::unique_ptr<BugReporterVisitor>> visitors) {
> >
> >    SourceManager& SMgr = PDB.getSourceManager();
> >    const LocationContext *LC = PDB.LC;
> > @@ -870,10 +866,8 @@ static bool GenerateMinimalPathDiagnosti
> >      if (NextNode) {
> >        // Add diagnostic pieces from custom visitors.
> >        BugReport *R = PDB.getBugReport();
> > -      for (ArrayRef<BugReporterVisitor *>::iterator I =
> visitors.begin(),
> > -                                                    E = visitors.end();
> > -           I != E; ++I) {
> > -        if (PathDiagnosticPiece *p = (*I)->VisitNode(N, NextNode, PDB,
> *R)) {
> > +      for (auto &V : visitors) {
> > +        if (PathDiagnosticPiece *p = V->VisitNode(N, NextNode, PDB,
> *R)) {
> >            PD.getActivePath().push_front(p);
> >            updateStackPiecesWithMessage(p, CallStack);
> >          }
> > @@ -1392,11 +1386,10 @@ static bool isInLoopBody(ParentMap &PM,
> >  // Top-level logic for generating extensive path diagnostics.
> >
> //===----------------------------------------------------------------------===//
> >
> > -static bool GenerateExtensivePathDiagnostic(PathDiagnostic& PD,
> > -                                            PathDiagnosticBuilder &PDB,
> > -                                            const ExplodedNode *N,
> > -                                            LocationContextMap &LCM,
> > -                                      ArrayRef<BugReporterVisitor *>
> visitors) {
> > +static bool GenerateExtensivePathDiagnostic(
> > +    PathDiagnostic &PD, PathDiagnosticBuilder &PDB, const ExplodedNode
> *N,
> > +    LocationContextMap &LCM,
> > +    ArrayRef<std::unique_ptr<BugReporterVisitor>> visitors) {
> >    EdgeBuilder EB(PD, PDB);
> >    const SourceManager& SM = PDB.getSourceManager();
> >    StackDiagVector CallStack;
> > @@ -1573,10 +1566,8 @@ static bool GenerateExtensivePathDiagnos
> >
> >      // Add pieces from custom visitors.
> >      BugReport *R = PDB.getBugReport();
> > -    for (ArrayRef<BugReporterVisitor *>::iterator I = visitors.begin(),
> > -                                                  E = visitors.end();
> > -         I != E; ++I) {
> > -      if (PathDiagnosticPiece *p = (*I)->VisitNode(N, NextNode, PDB,
> *R)) {
> > +    for (auto &V : visitors) {
> > +      if (PathDiagnosticPiece *p = V->VisitNode(N, NextNode, PDB, *R)) {
> >          const PathDiagnosticLocation &Loc = p->getLocation();
> >          EB.addEdge(Loc, true);
> >          PD.getActivePath().push_front(p);
> > @@ -1635,12 +1626,10 @@ static const char StrLoopRangeEmpty[] =
> >  static const char StrLoopCollectionEmpty[] =
> >    "Loop body skipped when collection is empty";
> >
> > -static bool
> > -GenerateAlternateExtensivePathDiagnostic(PathDiagnostic& PD,
> > -                                         PathDiagnosticBuilder &PDB,
> > -                                         const ExplodedNode *N,
> > -                                         LocationContextMap &LCM,
> > -                                      ArrayRef<BugReporterVisitor *>
> visitors) {
> > +static bool GenerateAlternateExtensivePathDiagnostic(
> > +    PathDiagnostic &PD, PathDiagnosticBuilder &PDB, const ExplodedNode
> *N,
> > +    LocationContextMap &LCM,
> > +    ArrayRef<std::unique_ptr<BugReporterVisitor>> visitors) {
> >
> >    BugReport *report = PDB.getBugReport();
> >    const SourceManager& SM = PDB.getSourceManager();
> > @@ -1867,10 +1856,8 @@ GenerateAlternateExtensivePathDiagnostic
> >        continue;
> >
> >      // Add pieces from custom visitors.
> > -    for (ArrayRef<BugReporterVisitor *>::iterator I = visitors.begin(),
> > -         E = visitors.end();
> > -         I != E; ++I) {
> > -      if (PathDiagnosticPiece *p = (*I)->VisitNode(N, NextNode, PDB,
> *report)) {
> > +    for (auto &V : visitors) {
> > +      if (PathDiagnosticPiece *p = V->VisitNode(N, NextNode, PDB,
> *report)) {
> >          addEdgeToPath(PD.getActivePath(), PrevLoc, p->getLocation(),
> PDB.LC);
> >          PD.getActivePath().push_front(p);
> >          updateStackPiecesWithMessage(p, CallStack);
> > @@ -2547,7 +2534,7 @@ void BuiltinBug::anchor() {}
> >
> >  void BugReport::NodeResolver::anchor() {}
> >
> > -void BugReport::addVisitor(BugReporterVisitor* visitor) {
> > +void BugReport::addVisitor(std::unique_ptr<BugReporterVisitor> visitor)
> {
> >    if (!visitor)
> >      return;
> >
> > @@ -2555,20 +2542,15 @@ void BugReport::addVisitor(BugReporterVi
> >    visitor->Profile(ID);
> >    void *InsertPos;
> >
> > -  if (CallbacksSet.FindNodeOrInsertPos(ID, InsertPos)) {
> > -    delete visitor;
> > +  if (CallbacksSet.FindNodeOrInsertPos(ID, InsertPos))
> >      return;
> > -  }
> >
> > -  CallbacksSet.InsertNode(visitor, InsertPos);
> > -  Callbacks.push_back(visitor);
> > +  CallbacksSet.InsertNode(visitor.get(), InsertPos);
> > +  Callbacks.push_back(std::move(visitor));
> >    ++ConfigurationChangeToken;
> >  }
> >
> >  BugReport::~BugReport() {
> > -  for (visitor_iterator I = visitor_begin(), E = visitor_end(); I != E;
> ++I) {
> > -    delete *I;
> > -  }
> >    while (!interestingSymbols.empty()) {
> >      popInterestingSymbolsAndRegions();
> >    }
> > @@ -3126,9 +3108,9 @@ bool GRBugReporter::generatePathDiagnost
> >      const ExplodedNode *N = ErrorGraph.ErrorNode;
> >
> >      // Register additional node visitors.
> > -    R->addVisitor(new NilReceiverBRVisitor());
> > -    R->addVisitor(new ConditionBRVisitor());
> > -    R->addVisitor(new LikelyFalsePositiveSuppressionBRVisitor());
> > +    R->addVisitor(llvm::make_unique<NilReceiverBRVisitor>());
> > +    R->addVisitor(llvm::make_unique<ConditionBRVisitor>());
> > +
> R->addVisitor(llvm::make_unique<LikelyFalsePositiveSuppressionBRVisitor>());
> >
> >      BugReport::VisitorList visitors;
> >      unsigned origReportConfigToken, finalReportConfigToken;
> > @@ -3188,7 +3170,7 @@ bool GRBugReporter::generatePathDiagnost
> >        }
> >
> >        // Clean up the visitors we used.
> > -      llvm::DeleteContainerPointers(visitors);
> > +      visitors.clear();
> >
> >        // Did anything change while generating this path?
> >        finalReportConfigToken = R->getConfigurationChangeToken();
> >
> > Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=217205&r1=217204&r2=217205&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original)
> > +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Thu Sep  4
> 18:54:33 2014
> > @@ -218,7 +218,8 @@ public:
> >          EnableNullFPSuppression =
> State->isNull(*RetLoc).isConstrainedTrue();
> >
> >      BR.markInteresting(CalleeContext);
> > -    BR.addVisitor(new ReturnVisitor(CalleeContext,
> EnableNullFPSuppression));
> > +    BR.addVisitor(llvm::make_unique<ReturnVisitor>(CalleeContext,
> > +
>  EnableNullFPSuppression));
> >    }
> >
> >    /// Returns true if any counter-suppression heuristics are enabled for
> > @@ -565,8 +566,8 @@ PathDiagnosticPiece *FindLastStoreBRVisi
> >            if (const VarRegion *OriginalR = BDR->getOriginalRegion(VR)) {
> >              if (Optional<KnownSVal> KV =
> >                  State->getSVal(OriginalR).getAs<KnownSVal>())
> > -              BR.addVisitor(new FindLastStoreBRVisitor(*KV, OriginalR,
> > -
> EnableNullFPSuppression));
> > +              BR.addVisitor(llvm::make_unique<FindLastStoreBRVisitor>(
> > +                  *KV, OriginalR, EnableNullFPSuppression));
> >            }
> >          }
> >        }
> > @@ -975,8 +976,8 @@ bool bugreporter::trackNullOrUndefValue(
> >        // got initialized.
> >        if (const MemRegion *RR = getLocationRegionIfReference(Inner, N))
> {
> >          if (Optional<KnownSVal> KV = LVal.getAs<KnownSVal>())
> > -          report.addVisitor(new FindLastStoreBRVisitor(*KV, RR,
> > -
> EnableNullFPSuppression));
> > +          report.addVisitor(llvm::make_unique<FindLastStoreBRVisitor>(
> > +              *KV, RR, EnableNullFPSuppression));
> >        }
> >      }
> >
> > @@ -986,30 +987,26 @@ bool bugreporter::trackNullOrUndefValue(
> >
> >        report.markInteresting(R);
> >        report.markInteresting(V);
> > -      report.addVisitor(new UndefOrNullArgVisitor(R));
> > +      report.addVisitor(llvm::make_unique<UndefOrNullArgVisitor>(R));
> >
> >        // If the contents are symbolic, find out when they became null.
> > -      if (V.getAsLocSymbol(/*IncludeBaseRegions*/ true)) {
> > -        BugReporterVisitor *ConstraintTracker =
> > -          new TrackConstraintBRVisitor(V.castAs<DefinedSVal>(), false);
> > -        report.addVisitor(ConstraintTracker);
> > -      }
> > +      if (V.getAsLocSymbol(/*IncludeBaseRegions*/ true))
> > +        report.addVisitor(llvm::make_unique<TrackConstraintBRVisitor>(
> > +            V.castAs<DefinedSVal>(), false));
> >
> >        // Add visitor, which will suppress inline defensive checks.
> >        if (Optional<DefinedSVal> DV = V.getAs<DefinedSVal>()) {
> > -        if (!DV->isZeroConstant() &&
> > -          LVState->isNull(*DV).isConstrainedTrue() &&
> > -          EnableNullFPSuppression) {
> > -          BugReporterVisitor *IDCSuppressor =
> > -            new SuppressInlineDefensiveChecksVisitor(*DV,
> > -                                                     LVNode);
> > -          report.addVisitor(IDCSuppressor);
> > +        if (!DV->isZeroConstant() &&
> LVState->isNull(*DV).isConstrainedTrue() &&
> > +            EnableNullFPSuppression) {
> > +          report.addVisitor(
> > +
> llvm::make_unique<SuppressInlineDefensiveChecksVisitor>(*DV,
> > +
> LVNode));
> >          }
> >        }
> >
> >        if (Optional<KnownSVal> KV = V.getAs<KnownSVal>())
> > -        report.addVisitor(new FindLastStoreBRVisitor(*KV, R,
> > -
>  EnableNullFPSuppression));
> > +        report.addVisitor(llvm::make_unique<FindLastStoreBRVisitor>(
> > +            *KV, R, EnableNullFPSuppression));
> >        return true;
> >      }
> >    }
> > @@ -1040,12 +1037,12 @@ bool bugreporter::trackNullOrUndefValue(
> >        RVal = state->getSVal(L->getRegion());
> >
> >      const MemRegion *RegionRVal = RVal.getAsRegion();
> > -    report.addVisitor(new UndefOrNullArgVisitor(L->getRegion()));
> > +
> report.addVisitor(llvm::make_unique<UndefOrNullArgVisitor>(L->getRegion()));
> >
> >      if (RegionRVal && isa<SymbolicRegion>(RegionRVal)) {
> >        report.markInteresting(RegionRVal);
> > -      report.addVisitor(new TrackConstraintBRVisitor(
> > -        loc::MemRegionVal(RegionRVal), false));
> > +      report.addVisitor(llvm::make_unique<TrackConstraintBRVisitor>(
> > +          loc::MemRegionVal(RegionRVal), false));
> >      }
> >    }
> >
> > @@ -1128,8 +1125,8 @@ void FindLastStoreBRVisitor::registerSta
> >
> >          if (V.getAs<loc::ConcreteInt>() ||
> V.getAs<nonloc::ConcreteInt>()) {
> >            // Register a new visitor with the BugReport.
> > -          BR.addVisitor(new
> FindLastStoreBRVisitor(V.castAs<KnownSVal>(), R,
> > -
>  EnableNullFPSuppression));
> > +          BR.addVisitor(llvm::make_unique<FindLastStoreBRVisitor>(
> > +              V.castAs<KnownSVal>(), R, EnableNullFPSuppression));
> >          }
> >        }
> >      }
> >
> >
> > _______________________________________________
> > 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/20140904/62b1208e/attachment.html>


More information about the cfe-commits mailing list