forked from OSchip/llvm-project
[analyzer] Command line option to show enabled checker list.
This patch adds a command line option to list the checkers that were enabled by analyzer-checker and not disabled by -analyzer-disable-checker. It can be very useful to debug long command lines when it is not immediately apparent which checkers are turned on and which checkers are turned off. Differential Revision: https://reviews.llvm.org/D23060 llvm-svn: 278006
This commit is contained in:
parent
142f4f76be
commit
c430990d0b
|
@ -114,6 +114,9 @@ def analyzer_disable_all_checks : Flag<["-"], "analyzer-disable-all-checks">,
|
|||
def analyzer_checker_help : Flag<["-"], "analyzer-checker-help">,
|
||||
HelpText<"Display the list of analyzer checkers that are available">;
|
||||
|
||||
def analyzer_list_enabled_checkers : Flag<["-"], "analyzer-list-enabled-checkers">,
|
||||
HelpText<"Display the list of enabled analyzer checkers">;
|
||||
|
||||
def analyzer_config : Separate<["-"], "analyzer-config">,
|
||||
HelpText<"Choose analyzer options to enable">;
|
||||
|
||||
|
|
|
@ -149,6 +149,7 @@ public:
|
|||
unsigned DisableAllChecks : 1;
|
||||
|
||||
unsigned ShowCheckerHelp : 1;
|
||||
unsigned ShowEnabledCheckerList : 1;
|
||||
unsigned AnalyzeAll : 1;
|
||||
unsigned AnalyzerDisplayProgress : 1;
|
||||
unsigned AnalyzeNestedBlocks : 1;
|
||||
|
@ -541,6 +542,7 @@ public:
|
|||
AnalysisPurgeOpt(PurgeStmt),
|
||||
DisableAllChecks(0),
|
||||
ShowCheckerHelp(0),
|
||||
ShowEnabledCheckerList(0),
|
||||
AnalyzeAll(0),
|
||||
AnalyzerDisplayProgress(0),
|
||||
AnalyzeNestedBlocks(0),
|
||||
|
|
|
@ -127,7 +127,9 @@ public:
|
|||
|
||||
/// Prints the name and description of all checkers in this registry.
|
||||
/// This output is not intended to be machine-parseable.
|
||||
void printHelp(raw_ostream &out, size_t maxNameChars = 30) const ;
|
||||
void printHelp(raw_ostream &out, size_t maxNameChars = 30) const;
|
||||
void printList(raw_ostream &out,
|
||||
SmallVectorImpl<CheckerOptInfo> &opts) const;
|
||||
|
||||
private:
|
||||
mutable CheckerInfoList Checkers;
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
namespace clang {
|
||||
|
||||
class Stmt;
|
||||
class AnalyzerOptions;
|
||||
|
||||
namespace ento {
|
||||
|
||||
|
@ -52,6 +53,8 @@ private:
|
|||
};
|
||||
|
||||
void printCheckerHelp(raw_ostream &OS, ArrayRef<std::string> plugins);
|
||||
void printEnabledCheckerList(raw_ostream &OS, ArrayRef<std::string> plugins,
|
||||
const AnalyzerOptions &opts);
|
||||
|
||||
} // end GR namespace
|
||||
|
||||
|
|
|
@ -238,6 +238,7 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
}
|
||||
|
||||
Opts.ShowCheckerHelp = Args.hasArg(OPT_analyzer_checker_help);
|
||||
Opts.ShowEnabledCheckerList = Args.hasArg(OPT_analyzer_list_enabled_checkers);
|
||||
Opts.DisableAllChecks = Args.hasArg(OPT_analyzer_disable_all_checks);
|
||||
|
||||
Opts.visualizeExplodedGraphWithGraphViz =
|
||||
|
|
|
@ -229,6 +229,11 @@ bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
|
|||
ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins);
|
||||
return true;
|
||||
}
|
||||
if (Clang->getAnalyzerOpts()->ShowEnabledCheckerList) {
|
||||
ento::printEnabledCheckerList(llvm::outs(),
|
||||
Clang->getFrontendOpts().Plugins,
|
||||
*Clang->getAnalyzerOpts());
|
||||
}
|
||||
#endif
|
||||
|
||||
// If there were errors in processing arguments, don't do anything else.
|
||||
|
|
|
@ -175,3 +175,22 @@ void CheckerRegistry::printHelp(raw_ostream &out,
|
|||
out << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
void CheckerRegistry::printList(
|
||||
raw_ostream &out, SmallVectorImpl<CheckerOptInfo> &opts) const {
|
||||
std::sort(Checkers.begin(), Checkers.end(), checkerNameLT);
|
||||
|
||||
// Collect checkers enabled by the options.
|
||||
CheckerInfoSet enabledCheckers;
|
||||
for (SmallVectorImpl<CheckerOptInfo>::iterator i = opts.begin(),
|
||||
e = opts.end();
|
||||
i != e; ++i) {
|
||||
collectCheckers(Checkers, Packages, *i, enabledCheckers);
|
||||
}
|
||||
|
||||
for (CheckerInfoSet::const_iterator i = enabledCheckers.begin(),
|
||||
e = enabledCheckers.end();
|
||||
i != e; ++i) {
|
||||
out << (*i)->FullName << '\n';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -101,6 +101,16 @@ void ClangCheckerRegistry::warnIncompatible(DiagnosticsEngine *diags,
|
|||
<< pluginAPIVersion;
|
||||
}
|
||||
|
||||
static SmallVector<CheckerOptInfo, 8>
|
||||
getCheckerOptList(const AnalyzerOptions &opts) {
|
||||
SmallVector<CheckerOptInfo, 8> checkerOpts;
|
||||
for (unsigned i = 0, e = opts.CheckersControlList.size(); i != e; ++i) {
|
||||
const std::pair<std::string, bool> &opt = opts.CheckersControlList[i];
|
||||
checkerOpts.push_back(CheckerOptInfo(opt.first.c_str(), opt.second));
|
||||
}
|
||||
return checkerOpts;
|
||||
}
|
||||
|
||||
std::unique_ptr<CheckerManager>
|
||||
ento::createCheckerManager(AnalyzerOptions &opts, const LangOptions &langOpts,
|
||||
ArrayRef<std::string> plugins,
|
||||
|
@ -108,11 +118,7 @@ ento::createCheckerManager(AnalyzerOptions &opts, const LangOptions &langOpts,
|
|||
std::unique_ptr<CheckerManager> checkerMgr(
|
||||
new CheckerManager(langOpts, &opts));
|
||||
|
||||
SmallVector<CheckerOptInfo, 8> checkerOpts;
|
||||
for (unsigned i = 0, e = opts.CheckersControlList.size(); i != e; ++i) {
|
||||
const std::pair<std::string, bool> &opt = opts.CheckersControlList[i];
|
||||
checkerOpts.push_back(CheckerOptInfo(opt.first.c_str(), opt.second));
|
||||
}
|
||||
SmallVector<CheckerOptInfo, 8> checkerOpts = getCheckerOptList(opts);
|
||||
|
||||
ClangCheckerRegistry allCheckers(plugins, &diags);
|
||||
allCheckers.initializeManager(*checkerMgr, checkerOpts);
|
||||
|
@ -137,3 +143,12 @@ void ento::printCheckerHelp(raw_ostream &out, ArrayRef<std::string> plugins) {
|
|||
|
||||
ClangCheckerRegistry(plugins).printHelp(out);
|
||||
}
|
||||
|
||||
void ento::printEnabledCheckerList(raw_ostream &out,
|
||||
ArrayRef<std::string> plugins,
|
||||
const AnalyzerOptions &opts) {
|
||||
out << "OVERVIEW: Clang Static Analyzer Enabled Checkers List\n\n";
|
||||
|
||||
SmallVector<CheckerOptInfo, 8> checkerOpts = getCheckerOptList(opts);
|
||||
ClangCheckerRegistry(plugins).printList(out, checkerOpts);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
// RUN: %clang -target x86_64-apple-darwin10 --analyze %s -o /dev/null -Xclang -analyzer-checker=core -Xclang -analyzer-list-enabled-checkers > %t 2>&1
|
||||
// RUN: FileCheck --input-file=%t %s
|
||||
|
||||
// CHECK: OVERVIEW: Clang Static Analyzer Enabled Checkers List
|
||||
// CHECK: core.CallAndMessage
|
||||
// CHECK: core.DivideZero
|
||||
// CHECK: core.DynamicTypePropagation
|
||||
// CHECK: core.NonNullParamChecker
|
||||
// CHECK: core.NullDereference
|
||||
// CHECK: core.StackAddressEscape
|
||||
// CHECK: core.UndefinedBinaryOperatorResult
|
||||
// CHECK: core.VLASize
|
||||
// CHECK: core.builtin.BuiltinFunctions
|
||||
// CHECK: core.builtin.NoReturnFunctions
|
||||
// CHECK: core.uninitialized.ArraySubscript
|
||||
// CHECK: core.uninitialized.Assign
|
||||
// CHECK: core.uninitialized.Branch
|
||||
// CHECK: core.uninitialized.CapturedBlockVariable
|
||||
// CHECK: core.uninitialized.UndefReturn
|
||||
|
Loading…
Reference in New Issue