Index: clang-tidy/ClangTidy.cpp =================================================================== --- clang-tidy/ClangTidy.cpp +++ clang-tidy/ClangTidy.cpp @@ -303,11 +303,12 @@ typedef std::vector> 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()); @@ -374,7 +375,8 @@ AnalyzerOptions->Config["cfg-temporary-dtors"] = Context.getOptions().AnalyzeTemporaryDtors ? "true" : "false"; - AnalyzerOptions->CheckersControlList = getCheckersControlList(Context); + AnalyzerOptions->CheckersControlList = getCheckersControlList( + Context, *Context.getOptions().AllowEnablingAnalyzerAlphaCheckers); if (!AnalyzerOptions->CheckersControlList.empty()) { setStaticAnalyzerCheckerOpts(Context.getOptions(), AnalyzerOptions); AnalyzerOptions->AnalysisStoreOpt = RegionStoreModel; @@ -398,7 +400,8 @@ CheckNames.push_back(CheckFactory.first); } - for (const auto &AnalyzerCheck : getCheckersControlList(Context)) + for (const auto &AnalyzerCheck : getCheckersControlList( + Context, *Context.getOptions().AllowEnablingAnalyzerAlphaCheckers)) CheckNames.push_back(AnalyzerCheckNamePrefix + AnalyzerCheck.first); std::sort(CheckNames.begin(), CheckNames.end()); Index: clang-tidy/ClangTidyOptions.h =================================================================== --- clang-tidy/ClangTidyOptions.h +++ clang-tidy/ClangTidyOptions.h @@ -77,6 +77,9 @@ /// \brief Turns on temporary destructor-based analysis. llvm::Optional AnalyzeTemporaryDtors; + /// \brief Turns on experimental alpha checkers from the static analyzer. + llvm::Optional AllowEnablingAnalyzerAlphaCheckers; + /// \brief Format code around applied fixes with clang-format using this /// style. /// Index: clang-tidy/ClangTidyOptions.cpp =================================================================== --- clang-tidy/ClangTidyOptions.cpp +++ clang-tidy/ClangTidyOptions.cpp @@ -108,6 +108,7 @@ Options.HeaderFilterRegex = ""; Options.SystemHeaders = false; Options.AnalyzeTemporaryDtors = false; + Options.AllowEnablingAnalyzerAlphaCheckers = false; Options.FormatStyle = "none"; Options.User = llvm::None; for (ClangTidyModuleRegistry::iterator I = ClangTidyModuleRegistry::begin(), @@ -148,6 +149,8 @@ overrideValue(Result.HeaderFilterRegex, Other.HeaderFilterRegex); overrideValue(Result.SystemHeaders, Other.SystemHeaders); overrideValue(Result.AnalyzeTemporaryDtors, Other.AnalyzeTemporaryDtors); + overrideValue(Result.AllowEnablingAnalyzerAlphaCheckers, + Other.AllowEnablingAnalyzerAlphaCheckers); overrideValue(Result.FormatStyle, Other.FormatStyle); overrideValue(Result.User, Other.User); mergeVectors(Result.ExtraArgs, Other.ExtraArgs); Index: clang-tidy/tool/ClangTidyMain.cpp =================================================================== --- clang-tidy/tool/ClangTidyMain.cpp +++ clang-tidy/tool/ClangTidyMain.cpp @@ -192,6 +192,14 @@ cl::init(false), cl::cat(ClangTidyCategory)); +/// This option allows enabling alpha checkers from the static analyzer, that +/// are experimental. This option is set to false and not visible in help, +/// because it is highly not recommended for users. +static cl::opt + AllowEnablingAnalyzerAlphaCheckers("allow-enabling-analyzer-alpha-checkers", + cl::init(false), cl::Hidden, + cl::cat(ClangTidyCategory)); + static cl::opt ExportFixes("export-fixes", cl::desc(R"( YAML file to store suggested fixes in. The stored fixes can be applied to the input source @@ -301,6 +309,8 @@ DefaultOptions.HeaderFilterRegex = HeaderFilter; DefaultOptions.SystemHeaders = SystemHeaders; DefaultOptions.AnalyzeTemporaryDtors = AnalyzeTemporaryDtors; + DefaultOptions.AllowEnablingAnalyzerAlphaCheckers = + AllowEnablingAnalyzerAlphaCheckers; DefaultOptions.FormatStyle = FormatStyle; DefaultOptions.User = llvm::sys::Process::GetEnv("USER"); // USERNAME is used on Windows. Index: test/clang-tidy/enable-alpha-checks.cpp =================================================================== --- /dev/null +++ test/clang-tidy/enable-alpha-checks.cpp @@ -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'