blob: 26befe0de59ae4f11f5e80ff97b60e1337598b08 [file] [log] [blame] [edit]
//===--- 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