| //===--- 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/PointerArithmeticOnPolymorphicObjectCheck.h" |
| #include "../bugprone/ReservedIdentifierCheck.h" |
| #include "../bugprone/SignalHandlerCheck.h" |
| #include "../bugprone/SignedCharMisuseCheck.h" |
| #include "../bugprone/SizeofExpressionCheck.h" |
| #include "../bugprone/SpuriouslyWakeUpFunctionsCheck.h" |
| #include "../bugprone/SuspiciousMemoryComparisonCheck.h" |
| #include "../bugprone/UnhandledSelfAssignmentCheck.h" |
| #include "../bugprone/UnsafeFunctionsCheck.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/EnumInitialValueCheck.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 "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"); |
| // CTR |
| CheckFactories |
| .registerCheck<bugprone::PointerArithmeticOnPolymorphicObjectCheck>( |
| "cert-ctr56-cpp"); |
| // DCL |
| 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 |
| // ARR |
| CheckFactories.registerCheck<bugprone::SizeofExpressionCheck>( |
| "cert-arr39-c"); |
| // 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"); |
| // INT |
| CheckFactories.registerCheck<readability::EnumInitialValueCheck>( |
| "cert-int09-c"); |
| // MSC |
| CheckFactories.registerCheck<bugprone::UnsafeFunctionsCheck>( |
| "cert-msc24-c"); |
| CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc30-c"); |
| CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>( |
| "cert-msc32-c"); |
| CheckFactories.registerCheck<bugprone::UnsafeFunctionsCheck>( |
| "cert-msc33-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-arr39-c.WarnOnSizeOfConstant"] = "false"; |
| Opts["cert-arr39-c.WarnOnSizeOfIntegerExpression"] = "false"; |
| Opts["cert-arr39-c.WarnOnSizeOfThis"] = "false"; |
| Opts["cert-arr39-c.WarnOnSizeOfCompareToConstant"] = "false"; |
| Opts["cert-arr39-c.WarnOnSizeOfPointer"] = "false"; |
| Opts["cert-arr39-c.WarnOnSizeOfPointerToAggregate"] = "false"; |
| Opts["cert-dcl16-c.NewSuffixes"] = "L;LL;LU;LLU"; |
| Opts["cert-err33-c.CheckedFunctions"] = CertErr33CCheckedFunctions; |
| Opts["cert-err33-c.AllowCastToVoid"] = "true"; |
| 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 |