//===--- CheckerRegistration.cpp - Registration for the Analyzer Checkers -===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Defines the registration function for the analyzer checkers. // //===----------------------------------------------------------------------===// #include "clang/StaticAnalyzer/Frontend/CheckerRegistration.h" #include "clang/Basic/Diagnostic.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" #include "clang/StaticAnalyzer/Core/CheckerManager.h" #include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h" #include "clang/StaticAnalyzer/Frontend/FrontendActions.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/raw_ostream.h" #include using namespace clang; using namespace ento; std::unique_ptr ento::createCheckerManager( ASTContext &context, AnalyzerOptions &opts, ArrayRef plugins, ArrayRef> checkerRegistrationFns, DiagnosticsEngine &diags) { auto checkerMgr = llvm::make_unique(context, opts); CheckerRegistry allCheckers(plugins, diags, opts, context.getLangOpts(), checkerRegistrationFns); allCheckers.initializeManager(*checkerMgr); allCheckers.validateCheckerOptions(); checkerMgr->finishedCheckerRegistration(); return checkerMgr; } void ento::printCheckerHelp(raw_ostream &out, ArrayRef plugins, AnalyzerOptions &anopts, DiagnosticsEngine &diags, const LangOptions &langOpts) { out << "OVERVIEW: Clang Static Analyzer Checkers List\n\n"; out << "USAGE: -analyzer-checker \n\n"; CheckerRegistry(plugins, diags, anopts, langOpts) .printCheckerWithDescList(out); } void ento::printEnabledCheckerList(raw_ostream &out, ArrayRef plugins, AnalyzerOptions &anopts, DiagnosticsEngine &diags, const LangOptions &langOpts) { out << "OVERVIEW: Clang Static Analyzer Enabled Checkers List\n\n"; CheckerRegistry(plugins, diags, anopts, langOpts) .printEnabledCheckerList(out); } void ento::printCheckerConfigList(raw_ostream &OS, ArrayRef plugins, AnalyzerOptions &opts, DiagnosticsEngine &diags, const LangOptions &LangOpts) { CheckerRegistry(plugins, diags, opts, LangOpts) .printCheckerOptionList(OS); } void ento::printAnalyzerConfigList(raw_ostream &out) { out << "OVERVIEW: Clang Static Analyzer -analyzer-config Option List\n\n"; out << "USAGE: -analyzer-config \n\n"; out << " -analyzer-config OPTION1=VALUE, -analyzer-config " "OPTION2=VALUE, ...\n\n"; out << "OPTIONS:\n\n"; using OptionAndDescriptionTy = std::pair; OptionAndDescriptionTy PrintableOptions[] = { #define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \ { \ CMDFLAG, \ llvm::Twine(llvm::Twine() + "(" + \ (StringRef(#TYPE) == "StringRef" ? "string" : #TYPE ) + \ ") " DESC \ " (default: " #DEFAULT_VAL ")").str() \ }, #define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \ SHALLOW_VAL, DEEP_VAL) \ { \ CMDFLAG, \ llvm::Twine(llvm::Twine() + "(" + \ (StringRef(#TYPE) == "StringRef" ? "string" : #TYPE ) + \ ") " DESC \ " (default: " #SHALLOW_VAL " in shallow mode, " #DEEP_VAL \ " in deep mode)").str() \ }, #include "clang/StaticAnalyzer/Core/AnalyzerOptions.def" #undef ANALYZER_OPTION #undef ANALYZER_OPTION_DEPENDS_ON_USER_MODE }; llvm::sort(PrintableOptions, [](const OptionAndDescriptionTy &LHS, const OptionAndDescriptionTy &RHS) { return LHS.first < RHS.first; }); for (const auto &Pair : PrintableOptions) { AnalyzerOptions::printFormattedEntry(out, Pair, /*InitialPad*/ 2, /*EntryWidth*/ 30, /*MinLineWidth*/ 70); out << "\n\n"; } }