From: Ted Kremenek Date: Fri, 31 Jul 2009 00:34:52 +0000 (+0000) Subject: Fix use-after-release bug introduced in r77585 where the PathDiagnosticClient X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=82ec2e99084996eecbdf3a304f3cbba8c16c2f6b;p=clang Fix use-after-release bug introduced in r77585 where the PathDiagnosticClient 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 --- diff --git a/include/clang/Analysis/PathSensitive/AnalysisManager.h b/include/clang/Analysis/PathSensitive/AnalysisManager.h index f1b413633e..e7371de656 100644 --- a/include/clang/Analysis/PathSensitive/AnalysisManager.h +++ b/include/clang/Analysis/PathSensitive/AnalysisManager.h @@ -29,7 +29,7 @@ class AnalysisManager : public BugReporterData { Diagnostic &Diags; const LangOptions &LangInfo; - llvm::OwningPtr 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; } diff --git a/lib/Frontend/AnalysisConsumer.cpp b/lib/Frontend/AnalysisConsumer.cpp index 6ed59b4ac2..ed7ea5e8e7 100644 --- a/lib/Frontend/AnalysisConsumer.cpp +++ b/lib/Frontend/AnalysisConsumer.cpp @@ -84,8 +84,7 @@ namespace { const std::string OutDir; AnalyzerOptions Opts; - // PD is owned by AnalysisManager. - PathDiagnosticClient *PD; + llvm::OwningPtr 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,