forked from OSchip/llvm-project
[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 llvm-svn: 332609
This commit is contained in:
parent
cf21074603
commit
85a92c3f0b
|
@ -309,11 +309,12 @@ static void setStaticAnalyzerCheckerOpts(const ClangTidyOptions &Opts,
|
|||
|
||||
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::CreateASTConsumer(
|
|||
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> ClangTidyASTConsumerFactory::getCheckNames() {
|
|||
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::OptionMap &Options,
|
|||
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();
|
||||
}
|
||||
|
|
|
@ -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(const ClangTidyOptions &Options);
|
|||
/// 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.
|
||||
///
|
||||
|
|
|
@ -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("");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 char **argv) {
|
|||
<< 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 char **argv) {
|
|||
}
|
||||
|
||||
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 char **argv) {
|
|||
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();
|
||||
|
|
|
@ -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'
|
Loading…
Reference in New Issue