123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- //===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- #include "../ClangTidy.h"
- #include "../ClangTidyModule.h"
- #include "../ClangTidyModuleRegistry.h"
- #include "../bugprone/BadSignalToKillThreadCheck.h"
- #include "../bugprone/ReservedIdentifierCheck.h"
- #include "../bugprone/SignalHandlerCheck.h"
- #include "../bugprone/SignedCharMisuseCheck.h"
- #include "../bugprone/SpuriouslyWakeUpFunctionsCheck.h"
- #include "../bugprone/SuspiciousMemoryComparisonCheck.h"
- #include "../bugprone/UnhandledSelfAssignmentCheck.h"
- #include "../bugprone/UnusedReturnValueCheck.h"
- #include "../concurrency/ThreadCanceltypeAsynchronousCheck.h"
- #include "../google/UnnamedNamespaceInHeaderCheck.h"
- #include "../misc/NewDeleteOverloadsCheck.h"
- #include "../misc/NonCopyableObjects.h"
- #include "../misc/StaticAssertCheck.h"
- #include "../misc/ThrowByValueCatchByReferenceCheck.h"
- #include "../performance/MoveConstructorInitCheck.h"
- #include "../readability/UppercaseLiteralSuffixCheck.h"
- #include "CommandProcessorCheck.h"
- #include "DefaultOperatorNewAlignmentCheck.h"
- #include "DontModifyStdNamespaceCheck.h"
- #include "FloatLoopCounter.h"
- #include "LimitedRandomnessCheck.h"
- #include "MutatingCopyCheck.h"
- #include "NonTrivialTypesLibcMemoryCallsCheck.h"
- #include "PostfixOperatorCheck.h"
- #include "ProperlySeededRandomGeneratorCheck.h"
- #include "SetLongJmpCheck.h"
- #include "StaticObjectExceptionCheck.h"
- #include "StrToNumCheck.h"
- #include "ThrownExceptionTypeCheck.h"
- #include "VariadicFunctionDefCheck.h"
- namespace {
- // Checked functions for cert-err33-c.
- // The following functions are deliberately excluded because they can be called
- // with NULL argument and in this case the check is not applicable:
- // `mblen, mbrlen, mbrtowc, mbtowc, wctomb, wctomb_s`.
- // FIXME: The check can be improved to handle such cases.
- const llvm::StringRef CertErr33CCheckedFunctions = "::aligned_alloc;"
- "::asctime_s;"
- "::at_quick_exit;"
- "::atexit;"
- "::bsearch;"
- "::bsearch_s;"
- "::btowc;"
- "::c16rtomb;"
- "::c32rtomb;"
- "::calloc;"
- "::clock;"
- "::cnd_broadcast;"
- "::cnd_init;"
- "::cnd_signal;"
- "::cnd_timedwait;"
- "::cnd_wait;"
- "::ctime_s;"
- "::fclose;"
- "::fflush;"
- "::fgetc;"
- "::fgetpos;"
- "::fgets;"
- "::fgetwc;"
- "::fopen;"
- "::fopen_s;"
- "::fprintf;"
- "::fprintf_s;"
- "::fputc;"
- "::fputs;"
- "::fputwc;"
- "::fputws;"
- "::fread;"
- "::freopen;"
- "::freopen_s;"
- "::fscanf;"
- "::fscanf_s;"
- "::fseek;"
- "::fsetpos;"
- "::ftell;"
- "::fwprintf;"
- "::fwprintf_s;"
- "::fwrite;"
- "::fwscanf;"
- "::fwscanf_s;"
- "::getc;"
- "::getchar;"
- "::getenv;"
- "::getenv_s;"
- "::gets_s;"
- "::getwc;"
- "::getwchar;"
- "::gmtime;"
- "::gmtime_s;"
- "::localtime;"
- "::localtime_s;"
- "::malloc;"
- "::mbrtoc16;"
- "::mbrtoc32;"
- "::mbsrtowcs;"
- "::mbsrtowcs_s;"
- "::mbstowcs;"
- "::mbstowcs_s;"
- "::memchr;"
- "::mktime;"
- "::mtx_init;"
- "::mtx_lock;"
- "::mtx_timedlock;"
- "::mtx_trylock;"
- "::mtx_unlock;"
- "::printf_s;"
- "::putc;"
- "::putwc;"
- "::raise;"
- "::realloc;"
- "::remove;"
- "::rename;"
- "::scanf;"
- "::scanf_s;"
- "::setlocale;"
- "::setvbuf;"
- "::signal;"
- "::snprintf;"
- "::snprintf_s;"
- "::sprintf;"
- "::sprintf_s;"
- "::sscanf;"
- "::sscanf_s;"
- "::strchr;"
- "::strerror_s;"
- "::strftime;"
- "::strpbrk;"
- "::strrchr;"
- "::strstr;"
- "::strtod;"
- "::strtof;"
- "::strtoimax;"
- "::strtok;"
- "::strtok_s;"
- "::strtol;"
- "::strtold;"
- "::strtoll;"
- "::strtoul;"
- "::strtoull;"
- "::strtoumax;"
- "::strxfrm;"
- "::swprintf;"
- "::swprintf_s;"
- "::swscanf;"
- "::swscanf_s;"
- "::thrd_create;"
- "::thrd_detach;"
- "::thrd_join;"
- "::thrd_sleep;"
- "::time;"
- "::timespec_get;"
- "::tmpfile;"
- "::tmpfile_s;"
- "::tmpnam;"
- "::tmpnam_s;"
- "::tss_create;"
- "::tss_get;"
- "::tss_set;"
- "::ungetc;"
- "::ungetwc;"
- "::vfprintf;"
- "::vfprintf_s;"
- "::vfscanf;"
- "::vfscanf_s;"
- "::vfwprintf;"
- "::vfwprintf_s;"
- "::vfwscanf;"
- "::vfwscanf_s;"
- "::vprintf_s;"
- "::vscanf;"
- "::vscanf_s;"
- "::vsnprintf;"
- "::vsnprintf_s;"
- "::vsprintf;"
- "::vsprintf_s;"
- "::vsscanf;"
- "::vsscanf_s;"
- "::vswprintf;"
- "::vswprintf_s;"
- "::vswscanf;"
- "::vswscanf_s;"
- "::vwprintf_s;"
- "::vwscanf;"
- "::vwscanf_s;"
- "::wcrtomb;"
- "::wcschr;"
- "::wcsftime;"
- "::wcspbrk;"
- "::wcsrchr;"
- "::wcsrtombs;"
- "::wcsrtombs_s;"
- "::wcsstr;"
- "::wcstod;"
- "::wcstof;"
- "::wcstoimax;"
- "::wcstok;"
- "::wcstok_s;"
- "::wcstol;"
- "::wcstold;"
- "::wcstoll;"
- "::wcstombs;"
- "::wcstombs_s;"
- "::wcstoul;"
- "::wcstoull;"
- "::wcstoumax;"
- "::wcsxfrm;"
- "::wctob;"
- "::wctrans;"
- "::wctype;"
- "::wmemchr;"
- "::wprintf_s;"
- "::wscanf;"
- "::wscanf_s;";
- } // namespace
- namespace clang::tidy {
- namespace cert {
- class CERTModule : public ClangTidyModule {
- public:
- void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
- // C++ checkers
- // CON
- CheckFactories.registerCheck<bugprone::SpuriouslyWakeUpFunctionsCheck>(
- "cert-con54-cpp");
- // DCL
- CheckFactories.registerCheck<PostfixOperatorCheck>(
- "cert-dcl21-cpp");
- CheckFactories.registerCheck<VariadicFunctionDefCheck>("cert-dcl50-cpp");
- CheckFactories.registerCheck<bugprone::ReservedIdentifierCheck>(
- "cert-dcl51-cpp");
- CheckFactories.registerCheck<misc::NewDeleteOverloadsCheck>(
- "cert-dcl54-cpp");
- CheckFactories.registerCheck<DontModifyStdNamespaceCheck>(
- "cert-dcl58-cpp");
- CheckFactories.registerCheck<google::build::UnnamedNamespaceInHeaderCheck>(
- "cert-dcl59-cpp");
- // ERR
- CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>(
- "cert-err09-cpp");
- CheckFactories.registerCheck<SetLongJmpCheck>("cert-err52-cpp");
- CheckFactories.registerCheck<StaticObjectExceptionCheck>("cert-err58-cpp");
- CheckFactories.registerCheck<ThrownExceptionTypeCheck>("cert-err60-cpp");
- CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>(
- "cert-err61-cpp");
- // MEM
- CheckFactories.registerCheck<DefaultOperatorNewAlignmentCheck>(
- "cert-mem57-cpp");
- // MSC
- CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc50-cpp");
- CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>(
- "cert-msc51-cpp");
- CheckFactories.registerCheck<bugprone::SignalHandlerCheck>(
- "cert-msc54-cpp");
- // OOP
- CheckFactories.registerCheck<performance::MoveConstructorInitCheck>(
- "cert-oop11-cpp");
- CheckFactories.registerCheck<bugprone::UnhandledSelfAssignmentCheck>(
- "cert-oop54-cpp");
- CheckFactories.registerCheck<NonTrivialTypesLibcMemoryCallsCheck>(
- "cert-oop57-cpp");
- CheckFactories.registerCheck<MutatingCopyCheck>(
- "cert-oop58-cpp");
- // C checkers
- // CON
- CheckFactories.registerCheck<bugprone::SpuriouslyWakeUpFunctionsCheck>(
- "cert-con36-c");
- // DCL
- CheckFactories.registerCheck<misc::StaticAssertCheck>("cert-dcl03-c");
- CheckFactories.registerCheck<readability::UppercaseLiteralSuffixCheck>(
- "cert-dcl16-c");
- CheckFactories.registerCheck<bugprone::ReservedIdentifierCheck>(
- "cert-dcl37-c");
- // ENV
- CheckFactories.registerCheck<CommandProcessorCheck>("cert-env33-c");
- // ERR
- CheckFactories.registerCheck<bugprone::UnusedReturnValueCheck>(
- "cert-err33-c");
- CheckFactories.registerCheck<StrToNumCheck>("cert-err34-c");
- // EXP
- CheckFactories.registerCheck<bugprone::SuspiciousMemoryComparisonCheck>(
- "cert-exp42-c");
- // FLP
- CheckFactories.registerCheck<FloatLoopCounter>("cert-flp30-c");
- CheckFactories.registerCheck<bugprone::SuspiciousMemoryComparisonCheck>(
- "cert-flp37-c");
- // FIO
- CheckFactories.registerCheck<misc::NonCopyableObjectsCheck>("cert-fio38-c");
- // MSC
- CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc30-c");
- CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>(
- "cert-msc32-c");
- // POS
- CheckFactories.registerCheck<bugprone::BadSignalToKillThreadCheck>(
- "cert-pos44-c");
- CheckFactories
- .registerCheck<concurrency::ThreadCanceltypeAsynchronousCheck>(
- "cert-pos47-c");
- // SIG
- CheckFactories.registerCheck<bugprone::SignalHandlerCheck>("cert-sig30-c");
- // STR
- CheckFactories.registerCheck<bugprone::SignedCharMisuseCheck>(
- "cert-str34-c");
- }
- ClangTidyOptions getModuleOptions() override {
- ClangTidyOptions Options;
- ClangTidyOptions::OptionMap &Opts = Options.CheckOptions;
- Opts["cert-dcl16-c.NewSuffixes"] = "L;LL;LU;LLU";
- Opts["cert-err33-c.CheckedFunctions"] = CertErr33CCheckedFunctions;
- Opts["cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField"] = "false";
- Opts["cert-str34-c.DiagnoseSignedUnsignedCharComparisons"] = "false";
- return Options;
- }
- };
- } // namespace cert
- // Register the MiscTidyModule using this statically initialized variable.
- static ClangTidyModuleRegistry::Add<cert::CERTModule>
- X("cert-module",
- "Adds lint checks corresponding to CERT secure coding guidelines.");
- // This anchor is used to force the linker to link in the generated object file
- // and thus register the CERTModule.
- volatile int CERTModuleAnchorSource = 0;
- } // namespace clang::tidy
|