From 4dc8472942ce60f29de9587b9451cc3d49df7abf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kirst=C3=B3f=20Umann?= Date: Thu, 26 Mar 2020 17:27:13 +0100 Subject: [PATCH] [analyzer] Add the Preprocessor to CheckerManager --- .../include/clang/StaticAnalyzer/Core/CheckerManager.h | 18 ++++++++++++------ .../Checkers/RetainCountChecker/RetainCountChecker.cpp | 2 +- .../UninitializedObject/UninitializedObjectChecker.cpp | 2 +- clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp | 2 +- .../StaticAnalyzer/Frontend/CreateCheckerManager.cpp | 7 ++----- clang/unittests/StaticAnalyzer/Reusables.h | 5 +++-- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h index 4635ca3..f34f5c2 100644 --- a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h @@ -122,9 +122,10 @@ enum class ObjCMessageVisitKind { }; class CheckerManager { - ASTContext *Context; + ASTContext *Context = nullptr; const LangOptions LangOpts; - AnalyzerOptions &AOptions; + const AnalyzerOptions &AOptions; + const Preprocessor *PP = nullptr; CheckerNameRef CurrentCheckerName; DiagnosticsEngine &Diags; std::unique_ptr Registry; @@ -137,15 +138,16 @@ public: // dependencies look like this: Core -> Checkers -> Frontend. CheckerManager( - ASTContext &Context, AnalyzerOptions &AOptions, + ASTContext &Context, AnalyzerOptions &AOptions, const Preprocessor &PP, ArrayRef plugins, ArrayRef> checkerRegistrationFns); /// Constructs a CheckerManager that ignores all non TblGen-generated /// checkers. Useful for unit testing, unless the checker infrastructure /// itself is tested. - CheckerManager(ASTContext &Context, AnalyzerOptions &AOptions) - : CheckerManager(Context, AOptions, {}, {}) {} + CheckerManager(ASTContext &Context, AnalyzerOptions &AOptions, + const Preprocessor &PP) + : CheckerManager(Context, AOptions, PP, {}, {}) {} /// Constructs a CheckerManager without requiring an AST. No checker /// registration will take place. Only useful for retrieving the @@ -163,7 +165,11 @@ public: void finishedCheckerRegistration(); const LangOptions &getLangOpts() const { return LangOpts; } - AnalyzerOptions &getAnalyzerOptions() const { return AOptions; } + const AnalyzerOptions &getAnalyzerOptions() const { return AOptions; } + const Preprocessor &getPreprocessor() const { + assert(PP); + return *PP; + } const CheckerRegistry &getCheckerRegistry() const { return *Registry; } DiagnosticsEngine &getDiagnostics() const { return Diags; } ASTContext &getASTContext() const { diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp index 6f8cb14..1af93cc 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp @@ -1485,7 +1485,7 @@ bool ento::shouldRegisterRetainCountBase(const LangOptions &LO) { // it should be possible to enable the NS/CF retain count checker as // osx.cocoa.RetainCount, and it should be possible to disable // osx.OSObjectRetainCount using osx.cocoa.RetainCount:CheckOSObject=false. -static bool getOption(AnalyzerOptions &Options, +static bool getOption(const AnalyzerOptions &Options, StringRef Postfix, StringRef Value) { auto I = Options.Config.find( diff --git a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp index 14f5514..562d553 100644 --- a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp @@ -608,7 +608,7 @@ std::string clang::ento::getVariableName(const FieldDecl *Field) { void ento::registerUninitializedObjectChecker(CheckerManager &Mgr) { auto Chk = Mgr.registerChecker(); - AnalyzerOptions &AnOpts = Mgr.getAnalyzerOptions(); + const AnalyzerOptions &AnOpts = Mgr.getAnalyzerOptions(); UninitObjCheckerOptions &ChOpts = Chk->Opts; ChOpts.IsPedantic = AnOpts.getCheckerBooleanOption(Chk, "Pedantic"); diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp index 6c12352..74c6897 100644 --- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -208,7 +208,7 @@ public: void Initialize(ASTContext &Context) override { Ctx = &Context; - checkerMgr = std::make_unique(*Ctx, *Opts, Plugins, + checkerMgr = std::make_unique(*Ctx, *Opts, PP, Plugins, CheckerRegistrationFns); Mgr = std::make_unique(*Ctx, PP, PathConsumers, diff --git a/clang/lib/StaticAnalyzer/Frontend/CreateCheckerManager.cpp b/clang/lib/StaticAnalyzer/Frontend/CreateCheckerManager.cpp index f93e328..140f807 100644 --- a/clang/lib/StaticAnalyzer/Frontend/CreateCheckerManager.cpp +++ b/clang/lib/StaticAnalyzer/Frontend/CreateCheckerManager.cpp @@ -18,11 +18,11 @@ namespace clang { namespace ento { CheckerManager::CheckerManager( - ASTContext &Context, AnalyzerOptions &AOptions, + ASTContext &Context, AnalyzerOptions &AOptions, const Preprocessor &PP, ArrayRef plugins, ArrayRef> checkerRegistrationFns) : Context(&Context), LangOpts(Context.getLangOpts()), AOptions(AOptions), - Diags(Context.getDiagnostics()), + PP(&PP), Diags(Context.getDiagnostics()), Registry( std::make_unique(plugins, Context.getDiagnostics(), AOptions, checkerRegistrationFns)) { @@ -31,9 +31,6 @@ CheckerManager::CheckerManager( finishedCheckerRegistration(); } -/// Constructs a CheckerManager without requiring an AST. No checker -/// registration will take place. Only useful for retrieving the -/// CheckerRegistry and print for help flags where the AST is unavalaible. CheckerManager::CheckerManager(AnalyzerOptions &AOptions, const LangOptions &LangOpts, DiagnosticsEngine &Diags, diff --git a/clang/unittests/StaticAnalyzer/Reusables.h b/clang/unittests/StaticAnalyzer/Reusables.h index 1346adb..3f2fd61 100644 --- a/clang/unittests/StaticAnalyzer/Reusables.h +++ b/clang/unittests/StaticAnalyzer/Reusables.h @@ -56,8 +56,9 @@ protected: public: ExprEngineConsumer(CompilerInstance &C) - : C(C), ChkMgr(C.getASTContext(), *C.getAnalyzerOpts()), CTU(C), - Consumers(), + : C(C), + ChkMgr(C.getASTContext(), *C.getAnalyzerOpts(), C.getPreprocessor()), + CTU(C), Consumers(), AMgr(C.getASTContext(), C.getPreprocessor(), Consumers, CreateRegionStoreManager, CreateRangeConstraintManager, &ChkMgr, *C.getAnalyzerOpts()), -- 2.7.4