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