xref: /freebsd/contrib/llvm-project/clang/lib/StaticAnalyzer/Frontend/AnalyzerHelpFlags.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
15ffd83dbSDimitry Andric //===--- CheckerRegistration.cpp - Registration for the Analyzer Checkers -===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric //
95ffd83dbSDimitry Andric // Defines the registration function for the analyzer checkers.
105ffd83dbSDimitry Andric //
115ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
125ffd83dbSDimitry Andric 
135ffd83dbSDimitry Andric #include "clang/StaticAnalyzer/Frontend/AnalyzerHelpFlags.h"
145ffd83dbSDimitry Andric #include "clang/Basic/Diagnostic.h"
155ffd83dbSDimitry Andric #include "clang/Frontend/CompilerInstance.h"
165ffd83dbSDimitry Andric #include "clang/Frontend/FrontendDiagnostic.h"
175ffd83dbSDimitry Andric #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
185ffd83dbSDimitry Andric #include "clang/StaticAnalyzer/Core/CheckerManager.h"
195ffd83dbSDimitry Andric #include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
205ffd83dbSDimitry Andric #include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
215ffd83dbSDimitry Andric #include "llvm/ADT/SmallVector.h"
225ffd83dbSDimitry Andric #include "llvm/Support/raw_ostream.h"
235ffd83dbSDimitry Andric #include <memory>
245ffd83dbSDimitry Andric 
255ffd83dbSDimitry Andric using namespace clang;
265ffd83dbSDimitry Andric using namespace ento;
275ffd83dbSDimitry Andric 
285ffd83dbSDimitry Andric void ento::printCheckerHelp(raw_ostream &out, CompilerInstance &CI) {
295ffd83dbSDimitry Andric   out << "OVERVIEW: Clang Static Analyzer Checkers List\n\n";
305ffd83dbSDimitry Andric   out << "USAGE: -analyzer-checker <CHECKER or PACKAGE,...>\n\n";
315ffd83dbSDimitry Andric 
325ffd83dbSDimitry Andric   auto CheckerMgr = std::make_unique<CheckerManager>(
33*5f757f3fSDimitry Andric       CI.getAnalyzerOpts(), CI.getLangOpts(), CI.getDiagnostics(),
345ffd83dbSDimitry Andric       CI.getFrontendOpts().Plugins);
355ffd83dbSDimitry Andric 
365ffd83dbSDimitry Andric   CheckerMgr->getCheckerRegistryData().printCheckerWithDescList(
37*5f757f3fSDimitry Andric       CI.getAnalyzerOpts(), out);
385ffd83dbSDimitry Andric }
395ffd83dbSDimitry Andric 
405ffd83dbSDimitry Andric void ento::printEnabledCheckerList(raw_ostream &out, CompilerInstance &CI) {
415ffd83dbSDimitry Andric   out << "OVERVIEW: Clang Static Analyzer Enabled Checkers List\n\n";
425ffd83dbSDimitry Andric 
435ffd83dbSDimitry Andric   auto CheckerMgr = std::make_unique<CheckerManager>(
44*5f757f3fSDimitry Andric       CI.getAnalyzerOpts(), CI.getLangOpts(), CI.getDiagnostics(),
455ffd83dbSDimitry Andric       CI.getFrontendOpts().Plugins);
465ffd83dbSDimitry Andric 
475ffd83dbSDimitry Andric   CheckerMgr->getCheckerRegistryData().printEnabledCheckerList(out);
485ffd83dbSDimitry Andric }
495ffd83dbSDimitry Andric 
505ffd83dbSDimitry Andric void ento::printCheckerConfigList(raw_ostream &out, CompilerInstance &CI) {
515ffd83dbSDimitry Andric 
525ffd83dbSDimitry Andric   auto CheckerMgr = std::make_unique<CheckerManager>(
53*5f757f3fSDimitry Andric       CI.getAnalyzerOpts(), CI.getLangOpts(), CI.getDiagnostics(),
545ffd83dbSDimitry Andric       CI.getFrontendOpts().Plugins);
555ffd83dbSDimitry Andric 
565ffd83dbSDimitry Andric   CheckerMgr->getCheckerRegistryData().printCheckerOptionList(
57*5f757f3fSDimitry Andric       CI.getAnalyzerOpts(), out);
585ffd83dbSDimitry Andric }
595ffd83dbSDimitry Andric 
605ffd83dbSDimitry Andric void ento::printAnalyzerConfigList(raw_ostream &out) {
615ffd83dbSDimitry Andric   // FIXME: This message sounds scary, should be scary, but incorrectly states
625ffd83dbSDimitry Andric   // that all configs are super dangerous. In reality, many of them should be
635ffd83dbSDimitry Andric   // accessible to the user. We should create a user-facing subset of config
645ffd83dbSDimitry Andric   // options under a different frontend flag.
655ffd83dbSDimitry Andric   out << R"(
665ffd83dbSDimitry Andric OVERVIEW: Clang Static Analyzer -analyzer-config Option List
675ffd83dbSDimitry Andric 
685ffd83dbSDimitry Andric The following list of configurations are meant for development purposes only, as
695ffd83dbSDimitry Andric some of the variables they define are set to result in the most optimal
705ffd83dbSDimitry Andric analysis. Setting them to other values may drastically change how the analyzer
715ffd83dbSDimitry Andric behaves, and may even result in instabilities, crashes!
725ffd83dbSDimitry Andric 
735ffd83dbSDimitry Andric USAGE: -analyzer-config <OPTION1=VALUE,OPTION2=VALUE,...>
745ffd83dbSDimitry Andric        -analyzer-config OPTION1=VALUE, -analyzer-config OPTION2=VALUE, ...
755ffd83dbSDimitry Andric OPTIONS:
765ffd83dbSDimitry Andric )";
775ffd83dbSDimitry Andric 
785ffd83dbSDimitry Andric   using OptionAndDescriptionTy = std::pair<StringRef, std::string>;
795ffd83dbSDimitry Andric   OptionAndDescriptionTy PrintableOptions[] = {
805ffd83dbSDimitry Andric #define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL)                \
815ffd83dbSDimitry Andric     {                                                                          \
825ffd83dbSDimitry Andric       CMDFLAG,                                                                 \
835ffd83dbSDimitry Andric       llvm::Twine(llvm::Twine() + "(" +                                        \
845ffd83dbSDimitry Andric                   (StringRef(#TYPE) == "StringRef" ? "string" : #TYPE ) +      \
855ffd83dbSDimitry Andric                   ") " DESC                                                    \
865ffd83dbSDimitry Andric                   " (default: " #DEFAULT_VAL ")").str()                        \
875ffd83dbSDimitry Andric     },
885ffd83dbSDimitry Andric 
895ffd83dbSDimitry Andric #define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC,        \
905ffd83dbSDimitry Andric                                              SHALLOW_VAL, DEEP_VAL)            \
915ffd83dbSDimitry Andric     {                                                                          \
925ffd83dbSDimitry Andric       CMDFLAG,                                                                 \
935ffd83dbSDimitry Andric       llvm::Twine(llvm::Twine() + "(" +                                        \
945ffd83dbSDimitry Andric                   (StringRef(#TYPE) == "StringRef" ? "string" : #TYPE ) +      \
955ffd83dbSDimitry Andric                   ") " DESC                                                    \
965ffd83dbSDimitry Andric                   " (default: " #SHALLOW_VAL " in shallow mode, " #DEEP_VAL    \
975ffd83dbSDimitry Andric                   " in deep mode)").str()                                      \
985ffd83dbSDimitry Andric     },
995ffd83dbSDimitry Andric #include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
1005ffd83dbSDimitry Andric #undef ANALYZER_OPTION
1015ffd83dbSDimitry Andric #undef ANALYZER_OPTION_DEPENDS_ON_USER_MODE
1025ffd83dbSDimitry Andric   };
1035ffd83dbSDimitry Andric 
10481ad6265SDimitry Andric   llvm::sort(PrintableOptions, llvm::less_first());
1055ffd83dbSDimitry Andric 
1065ffd83dbSDimitry Andric   for (const auto &Pair : PrintableOptions) {
1075ffd83dbSDimitry Andric     AnalyzerOptions::printFormattedEntry(out, Pair, /*InitialPad*/ 2,
1085ffd83dbSDimitry Andric                                          /*EntryWidth*/ 30,
1095ffd83dbSDimitry Andric                                          /*MinLineWidth*/ 70);
1105ffd83dbSDimitry Andric     out << "\n\n";
1115ffd83dbSDimitry Andric   }
1125ffd83dbSDimitry Andric }
113