blob: 3aada6f37f37d7ca8ee8bad9ed3478d0daa4ca63 [file] [log] [blame]
//===--- 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 {
namespace 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");
// 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 tidy
} // namespace clang