forked from OSchip/llvm-project
Add an option to silence all analyzer warnings.
People have been incorrectly using "-analyzer-disable-checker" to silence analyzer warnings on a file, when analyzing a project. Add the "-analyzer-disable-all-checks" option, which would allow the suppression and suggest it as part of the error message for "-analyzer-disable-checker". The idea here is to compose this with "--analyze" so that users can selectively opt out specific files from static analysis. llvm-svn: 216763
This commit is contained in:
parent
43e3717bdb
commit
d5478fdd8f
|
@ -135,6 +135,9 @@ def warn_unknown_warning_specifier : Warning<
|
|||
|
||||
def err_unknown_analyzer_checker : Error<
|
||||
"no analyzer checkers are associated with '%0'">;
|
||||
def note_suggest_disabling_all_checkers : Note<
|
||||
"use -analyzer-disable-all-checks to disable all static analyzer checkers">;
|
||||
|
||||
def warn_incompatible_analyzer_plugin_api : Warning<
|
||||
"checker plugin '%0' is not compatible with this version of the analyzer">,
|
||||
InGroup<DiagGroup<"analyzer-incompatible-plugin"> >;
|
||||
|
|
|
@ -108,6 +108,9 @@ def analyzer_disable_checker : Separate<["-"], "analyzer-disable-checker">,
|
|||
def analyzer_disable_checker_EQ : Joined<["-"], "analyzer-disable-checker=">,
|
||||
Alias<analyzer_disable_checker>;
|
||||
|
||||
def analyzer_disable_all_checks : Flag<["-"], "analyzer-disable-all-checks">,
|
||||
HelpText<"Disable all static analyzer checks">;
|
||||
|
||||
def analyzer_checker_help : Flag<["-"], "analyzer-checker-help">,
|
||||
HelpText<"Display the list of analyzer checkers that are available">;
|
||||
|
||||
|
|
|
@ -137,6 +137,13 @@ public:
|
|||
unsigned maxBlockVisitOnPath;
|
||||
|
||||
|
||||
/// \brief Disable all analyzer checks.
|
||||
///
|
||||
/// This flag allows one to disable analyzer checks on the code processed by
|
||||
/// the given analysis consumer. Note, the code will get parsed and the
|
||||
/// command-line options will get checked.
|
||||
unsigned DisableAllChecks : 1;
|
||||
|
||||
unsigned ShowCheckerHelp : 1;
|
||||
unsigned AnalyzeAll : 1;
|
||||
unsigned AnalyzerDisplayProgress : 1;
|
||||
|
@ -420,6 +427,7 @@ public:
|
|||
AnalysisConstraintsOpt(RangeConstraintsModel),
|
||||
AnalysisDiagOpt(PD_HTML),
|
||||
AnalysisPurgeOpt(PurgeStmt),
|
||||
DisableAllChecks(0),
|
||||
ShowCheckerHelp(0),
|
||||
AnalyzeAll(0),
|
||||
AnalyzerDisplayProgress(0),
|
||||
|
|
|
@ -215,6 +215,8 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
}
|
||||
|
||||
Opts.ShowCheckerHelp = Args.hasArg(OPT_analyzer_checker_help);
|
||||
Opts.DisableAllChecks = Args.hasArg(OPT_analyzer_disable_all_checks);
|
||||
|
||||
Opts.visualizeExplodedGraphWithGraphViz =
|
||||
Args.hasArg(OPT_analyzer_viz_egraph_graphviz);
|
||||
Opts.visualizeExplodedGraphWithUbiGraph =
|
||||
|
|
|
@ -314,7 +314,7 @@ public:
|
|||
/// analyzed. This allows to redefine the default inlining policies when
|
||||
/// analyzing a given function.
|
||||
ExprEngine::InliningModes
|
||||
getInliningModeForFunction(const Decl *D, const SetOfConstDecls &Visited);
|
||||
getInliningModeForFunction(const Decl *D, const SetOfConstDecls &Visited);
|
||||
|
||||
/// \brief Build the call graph for all the top level decls of this TU and
|
||||
/// use it to define the order in which the functions should be visited.
|
||||
|
@ -513,6 +513,11 @@ void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
|
|||
if (Diags.hasErrorOccurred() || Diags.hasFatalErrorOccurred())
|
||||
return;
|
||||
|
||||
// Don't analyze if the user explicitly asked for no checks to be performed
|
||||
// on this file.
|
||||
if (Opts->DisableAllChecks)
|
||||
return;
|
||||
|
||||
{
|
||||
if (TUTotalTimer) TUTotalTimer->startTimer();
|
||||
|
||||
|
|
|
@ -118,9 +118,12 @@ CheckerManager *ento::createCheckerManager(AnalyzerOptions &opts,
|
|||
checkerMgr->finishedCheckerRegistration();
|
||||
|
||||
for (unsigned i = 0, e = checkerOpts.size(); i != e; ++i) {
|
||||
if (checkerOpts[i].isUnclaimed())
|
||||
if (checkerOpts[i].isUnclaimed()) {
|
||||
diags.Report(diag::err_unknown_analyzer_checker)
|
||||
<< checkerOpts[i].getName();
|
||||
diags.Report(diag::note_suggest_disabling_all_checkers);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return checkerMgr.release();
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-store=region -analyzer-disable-all-checks -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-disable-all-checks -analyzer-checker=core -analyzer-store=region -verify %s
|
||||
// RUN: not %clang_cc1 -analyze -analyzer-checker=core -analyzer-store=region -analyzer-disable-checker -verify %s 2>&1 | FileCheck %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
// CHECK: use -analyzer-disable-all-checks to disable all static analyzer checkers
|
||||
int buggy() {
|
||||
int x = 0;
|
||||
return 5/x; // no warning
|
||||
}
|
Loading…
Reference in New Issue