Author: alexfh Date: Thu May 17 07:04:27 2018 New Revision: 332609 URL: http://llvm.org/viewvc/llvm-project?rev=332609&view=rev Log: [clang-tidy] Add a flag to enable alpha checkers
Summary: The alpha checkers can already be enabled using the clang driver, this allows them to be enabled using the clang-tidy as well. This can make it easier to test the alpha checkers with projects which already support the compile_commands.json. It will also allow more people to give feedback and patches about the alpha checkers since they can run it as part of clang tidy checks. Reviewers: aaron.ballman, hokein, ilya-biryukov, alexfh, lebedev.ri, xbolva00 Reviewed By: aaron.ballman, alexfh, lebedev.ri, xbolva00 Subscribers: xbolva00, NoQ, dcoughlin, lebedev.ri, xazax.hun, cfe-commits Patch by Paul Fultz II! Differential Revision: https://reviews.llvm.org/D46159 Added: clang-tools-extra/trunk/test/clang-tidy/enable-alpha-checks.cpp Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp clang-tools-extra/trunk/clang-tidy/ClangTidy.h clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp?rev=332609&r1=332608&r2=332609&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp Thu May 17 07:04:27 2018 @@ -309,11 +309,12 @@ static void setStaticAnalyzerCheckerOpts typedef std::vector<std::pair<std::string, bool>> CheckersList; -static CheckersList getCheckersControlList(ClangTidyContext &Context) { +static CheckersList getCheckersControlList(ClangTidyContext &Context, + bool IncludeExperimental) { CheckersList List; const auto &RegisteredCheckers = - AnalyzerOptions::getRegisteredCheckers(/*IncludeExperimental=*/false); + AnalyzerOptions::getRegisteredCheckers(IncludeExperimental); bool AnalyzerChecksEnabled = false; for (StringRef CheckName : RegisteredCheckers) { std::string ClangTidyCheckName((AnalyzerCheckNamePrefix + CheckName).str()); @@ -379,7 +380,8 @@ ClangTidyASTConsumerFactory::CreateASTCo Consumers.push_back(Finder->newASTConsumer()); AnalyzerOptionsRef AnalyzerOptions = Compiler.getAnalyzerOpts(); - AnalyzerOptions->CheckersControlList = getCheckersControlList(Context); + AnalyzerOptions->CheckersControlList = + getCheckersControlList(Context, Context.canEnableAnalyzerAlphaCheckers()); if (!AnalyzerOptions->CheckersControlList.empty()) { setStaticAnalyzerCheckerOpts(Context.getOptions(), AnalyzerOptions); AnalyzerOptions->AnalysisStoreOpt = RegionStoreModel; @@ -404,7 +406,8 @@ std::vector<std::string> ClangTidyASTCon CheckNames.push_back(CheckFactory.first); } - for (const auto &AnalyzerCheck : getCheckersControlList(Context)) + for (const auto &AnalyzerCheck : getCheckersControlList( + Context, Context.canEnableAnalyzerAlphaCheckers())) CheckNames.push_back(AnalyzerCheckNamePrefix + AnalyzerCheck.first); std::sort(CheckNames.begin(), CheckNames.end()); @@ -463,18 +466,24 @@ void OptionsView::store(ClangTidyOptions store(Options, LocalName, llvm::itostr(Value)); } -std::vector<std::string> getCheckNames(const ClangTidyOptions &Options) { +std::vector<std::string> +getCheckNames(const ClangTidyOptions &Options, + bool AllowEnablingAnalyzerAlphaCheckers) { clang::tidy::ClangTidyContext Context( llvm::make_unique<DefaultOptionsProvider>(ClangTidyGlobalOptions(), - Options)); + Options), + AllowEnablingAnalyzerAlphaCheckers); ClangTidyASTConsumerFactory Factory(Context); return Factory.getCheckNames(); } -ClangTidyOptions::OptionMap getCheckOptions(const ClangTidyOptions &Options) { +ClangTidyOptions::OptionMap +getCheckOptions(const ClangTidyOptions &Options, + bool AllowEnablingAnalyzerAlphaCheckers) { clang::tidy::ClangTidyContext Context( llvm::make_unique<DefaultOptionsProvider>(ClangTidyGlobalOptions(), - Options)); + Options), + AllowEnablingAnalyzerAlphaCheckers); ClangTidyASTConsumerFactory Factory(Context); return Factory.getCheckOptions(); } Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.h?rev=332609&r1=332608&r2=332609&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidy.h (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.h Thu May 17 07:04:27 2018 @@ -210,7 +210,8 @@ private: /// \brief Fills the list of check names that are enabled when the provided /// filters are applied. -std::vector<std::string> getCheckNames(const ClangTidyOptions &Options); +std::vector<std::string> getCheckNames(const ClangTidyOptions &Options, + bool AllowEnablingAnalyzerAlphaCheckers); /// \brief Returns the effective check-specific options. /// @@ -218,7 +219,9 @@ std::vector<std::string> getCheckNames(c /// effective options from all created checks. The returned set of options /// includes default check-specific options for all keys not overridden by \p /// Options. -ClangTidyOptions::OptionMap getCheckOptions(const ClangTidyOptions &Options); +ClangTidyOptions::OptionMap +getCheckOptions(const ClangTidyOptions &Options, + bool AllowEnablingAnalyzerAlphaCheckers); /// \brief Run a set of clang-tidy checks on a set of files. /// Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp?rev=332609&r1=332608&r2=332609&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp Thu May 17 07:04:27 2018 @@ -177,9 +177,11 @@ private: }; ClangTidyContext::ClangTidyContext( - std::unique_ptr<ClangTidyOptionsProvider> OptionsProvider) + std::unique_ptr<ClangTidyOptionsProvider> OptionsProvider, + bool AllowEnablingAnalyzerAlphaCheckers) : DiagEngine(nullptr), OptionsProvider(std::move(OptionsProvider)), - Profile(false) { + Profile(false), + AllowEnablingAnalyzerAlphaCheckers(AllowEnablingAnalyzerAlphaCheckers) { // Before the first translation unit we can get errors related to command-line // parsing, use empty string for the file name in this case. setCurrentFile(""); Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h?rev=332609&r1=332608&r2=332609&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h Thu May 17 07:04:27 2018 @@ -99,7 +99,8 @@ struct ClangTidyStats { class ClangTidyContext { public: /// \brief Initializes \c ClangTidyContext instance. - ClangTidyContext(std::unique_ptr<ClangTidyOptionsProvider> OptionsProvider); + ClangTidyContext(std::unique_ptr<ClangTidyOptionsProvider> OptionsProvider, + bool AllowEnablingAnalyzerAlphaCheckers = false); ~ClangTidyContext(); @@ -178,6 +179,12 @@ public: return CurrentBuildDirectory; } + /// \brief If the experimental alpha checkers from the static analyzer can be + /// enabled. + bool canEnableAnalyzerAlphaCheckers() const { + return AllowEnablingAnalyzerAlphaCheckers; + } + private: // Calls setDiagnosticsEngine() and storeError(). friend class ClangTidyDiagnosticConsumer; @@ -209,6 +216,8 @@ private: llvm::DenseMap<unsigned, std::string> CheckNamesByDiagnosticID; bool Profile; + + bool AllowEnablingAnalyzerAlphaCheckers; }; /// \brief A diagnostic consumer that turns each \c Diagnostic into a Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=332609&r1=332608&r2=332609&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Thu May 17 07:04:27 2018 @@ -181,6 +181,14 @@ report to stderr. cl::init(false), cl::cat(ClangTidyCategory)); +/// This option allows enabling the experimental alpha checkers from the static +/// analyzer. This option is set to false and not visible in help, because it is +/// highly not recommended for users. +static cl::opt<bool> + AllowEnablingAnalyzerAlphaCheckers("allow-enabling-analyzer-alpha-checkers", + cl::init(false), cl::Hidden, + cl::cat(ClangTidyCategory)); + static cl::opt<std::string> ExportFixes("export-fixes", cl::desc(R"( YAML file to store suggested fixes in. The stored fixes can be applied to the input source @@ -335,7 +343,8 @@ static int clangTidyMain(int argc, const << EC.message() << "\n"; } ClangTidyOptions EffectiveOptions = OptionsProvider->getOptions(FilePath); - std::vector<std::string> EnabledChecks = getCheckNames(EffectiveOptions); + std::vector<std::string> EnabledChecks = + getCheckNames(EffectiveOptions, AllowEnablingAnalyzerAlphaCheckers); if (ExplainConfig) { // FIXME: Show other ClangTidyOptions' fields, like ExtraArg. @@ -366,7 +375,8 @@ static int clangTidyMain(int argc, const } if (DumpConfig) { - EffectiveOptions.CheckOptions = getCheckOptions(EffectiveOptions); + EffectiveOptions.CheckOptions = + getCheckOptions(EffectiveOptions, AllowEnablingAnalyzerAlphaCheckers); llvm::outs() << configurationAsText( ClangTidyOptions::getDefaults().mergeWith( EffectiveOptions)) @@ -390,7 +400,8 @@ static int clangTidyMain(int argc, const llvm::InitializeAllTargetMCs(); llvm::InitializeAllAsmParsers(); - ClangTidyContext Context(std::move(OwningOptionsProvider)); + ClangTidyContext Context(std::move(OwningOptionsProvider), + AllowEnablingAnalyzerAlphaCheckers); runClangTidy(Context, OptionsParser.getCompilations(), PathList, BaseFS, EnableCheckProfile); ArrayRef<ClangTidyError> Errors = Context.getErrors(); Added: clang-tools-extra/trunk/test/clang-tidy/enable-alpha-checks.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/enable-alpha-checks.cpp?rev=332609&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/enable-alpha-checks.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/enable-alpha-checks.cpp Thu May 17 07:04:27 2018 @@ -0,0 +1,6 @@ +// Check if '-allow-enabling-analyzer-alpha-checkers' is visible for users. +// RUN: clang-tidy -help | not grep 'allow-enabling-analyzer-alpha-checkers' + +// Check if '-allow-enabling-analyzer-alpha-checkers' enables alpha checks. +// RUN: clang-tidy -checks=* -list-checks | not grep 'clang-analyzer-alpha' +// RUN: clang-tidy -checks=* -list-checks -allow-enabling-analyzer-alpha-checkers | grep 'clang-analyzer-alpha' _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits