]> granicus.if.org Git - clang/commitdiff
Fix use-after-release bug introduced in r77585 where the PathDiagnosticClient
authorTed Kremenek <kremenek@apple.com>
Fri, 31 Jul 2009 00:34:52 +0000 (00:34 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 31 Jul 2009 00:34:52 +0000 (00:34 +0000)
created by AnalysisConsumer would be released by an instance of AnalysisManager
and then reused by later instances of AnalysisManager. Ownership of the
PathDiagnosticClient now belongs (for now) in AnalysisConsumer.

We also need this layering (for now) because the HTMLDiagnostiClient requires
that the entire translation unit be processed before emitting diagnostics. This
is done in its destructor (which should also be fixed, but that is another
issue).

This fixes PR 4653.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77648 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/AnalysisManager.h
lib/Frontend/AnalysisConsumer.cpp

index f1b413633eb0c4616d34dc5193f2d8b5e4a59e71..e7371de65621c10b3fc33e23b692ef15a0119b9c 100644 (file)
@@ -29,7 +29,7 @@ class AnalysisManager : public BugReporterData {
   Diagnostic &Diags;
   const LangOptions &LangInfo;
 
-  llvm::OwningPtr<PathDiagnosticClient> PD;
+  PathDiagnosticClient *PD;
   
   // Configurable components creators.
   StoreManagerCreator CreateStoreMgr;
@@ -51,7 +51,6 @@ public:
                   ConstraintManagerCreator constraintmgr,
                   bool displayProgress, bool vizdot, bool vizubi, 
                   bool purge, bool eager, bool trim)
-
     : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd), 
       CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),
       AScope(ScopeDecl), DisplayedFunction(!displayProgress),
@@ -124,7 +123,7 @@ public:
   }
     
   virtual PathDiagnosticClient *getPathDiagnosticClient() {
-    return PD.get();      
+    return PD;      
   }
     
   bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
index 6ed59b4ac2bce177427a1929e45c2446567fc609..ed7ea5e8e7c696eb65f85ec98307fdaaa4020417 100644 (file)
@@ -84,8 +84,7 @@ namespace {
     const std::string OutDir;
     AnalyzerOptions Opts;
 
-    // PD is owned by AnalysisManager.
-    PathDiagnosticClient *PD;
+    llvm::OwningPtr<PathDiagnosticClient> PD;
     StoreManagerCreator CreateStoreMgr;
     ConstraintManagerCreator CreateConstraintMgr;
 
@@ -106,7 +105,7 @@ namespace {
         switch (Opts.AnalysisDiagOpt) {
         default:
 #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN, AUTOCREATE) \
-          case PD_##NAME: PD = CREATEFN(OutDir, PP, PPF); break;
+          case PD_##NAME: PD.reset(CREATEFN(OutDir, PP, PPF)); break;
 #include "clang/Frontend/Analyses.def"
         }
       }
@@ -216,7 +215,7 @@ void AnalysisConsumer::HandleTopLevelSingleDecl(Decl *D) {
 void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
 
   if(!TranslationUnitActions.empty()) {
-    AnalysisManager mgr(*Ctx, Diags, LOpts, PD, 
+    AnalysisManager mgr(*Ctx, Diags, LOpts, PD.get()
                         CreateStoreMgr, CreateConstraintMgr,
                         Opts.AnalyzerDisplayProgress, Opts.VisualizeEGDot,
                         Opts.VisualizeEGUbi, Opts.PurgeDead, Opts.EagerlyAssume,
@@ -251,7 +250,7 @@ void AnalysisConsumer::HandleCode(Decl* D, Stmt* Body, Actions& actions) {
 
   // Create an AnalysisManager that will manage the state for analyzing
   // this method/function.
-  AnalysisManager mgr(D, *Ctx, Diags, LOpts, PD, 
+  AnalysisManager mgr(D, *Ctx, Diags, LOpts, PD.get()
                       CreateStoreMgr, CreateConstraintMgr,
                       Opts.AnalyzerDisplayProgress, Opts.VisualizeEGDot,
                       Opts.VisualizeEGUbi, Opts.PurgeDead, Opts.EagerlyAssume,