1 //===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "../ClangTidy.h" 10 #include "../ClangTidyModule.h" 11 #include "../ClangTidyModuleRegistry.h" 12 #include "../bugprone/BadSignalToKillThreadCheck.h" 13 #include "../bugprone/ReservedIdentifierCheck.h" 14 #include "../bugprone/SignalHandlerCheck.h" 15 #include "../bugprone/SignedCharMisuseCheck.h" 16 #include "../bugprone/SpuriouslyWakeUpFunctionsCheck.h" 17 #include "../bugprone/SuspiciousMemoryComparisonCheck.h" 18 #include "../bugprone/UnhandledSelfAssignmentCheck.h" 19 #include "../bugprone/UnusedReturnValueCheck.h" 20 #include "../concurrency/ThreadCanceltypeAsynchronousCheck.h" 21 #include "../google/UnnamedNamespaceInHeaderCheck.h" 22 #include "../misc/NewDeleteOverloadsCheck.h" 23 #include "../misc/NonCopyableObjects.h" 24 #include "../misc/StaticAssertCheck.h" 25 #include "../misc/ThrowByValueCatchByReferenceCheck.h" 26 #include "../performance/MoveConstructorInitCheck.h" 27 #include "../readability/UppercaseLiteralSuffixCheck.h" 28 #include "CommandProcessorCheck.h" 29 #include "DefaultOperatorNewAlignmentCheck.h" 30 #include "DontModifyStdNamespaceCheck.h" 31 #include "FloatLoopCounter.h" 32 #include "LimitedRandomnessCheck.h" 33 #include "MutatingCopyCheck.h" 34 #include "NonTrivialTypesLibcMemoryCallsCheck.h" 35 #include "PostfixOperatorCheck.h" 36 #include "ProperlySeededRandomGeneratorCheck.h" 37 #include "SetLongJmpCheck.h" 38 #include "StaticObjectExceptionCheck.h" 39 #include "StrToNumCheck.h" 40 #include "ThrownExceptionTypeCheck.h" 41 #include "VariadicFunctionDefCheck.h" 42 43 namespace { 44 45 // Checked functions for cert-err33-c. 46 // The following functions are deliberately excluded because they can be called 47 // with NULL argument and in this case the check is not applicable: 48 // `mblen, mbrlen, mbrtowc, mbtowc, wctomb, wctomb_s`. 49 // FIXME: The check can be improved to handle such cases. 50 const llvm::StringRef CertErr33CCheckedFunctions = "::aligned_alloc;" 51 "::asctime_s;" 52 "::at_quick_exit;" 53 "::atexit;" 54 "::bsearch;" 55 "::bsearch_s;" 56 "::btowc;" 57 "::c16rtomb;" 58 "::c32rtomb;" 59 "::calloc;" 60 "::clock;" 61 "::cnd_broadcast;" 62 "::cnd_init;" 63 "::cnd_signal;" 64 "::cnd_timedwait;" 65 "::cnd_wait;" 66 "::ctime_s;" 67 "::fclose;" 68 "::fflush;" 69 "::fgetc;" 70 "::fgetpos;" 71 "::fgets;" 72 "::fgetwc;" 73 "::fopen;" 74 "::fopen_s;" 75 "::fprintf;" 76 "::fprintf_s;" 77 "::fputc;" 78 "::fputs;" 79 "::fputwc;" 80 "::fputws;" 81 "::fread;" 82 "::freopen;" 83 "::freopen_s;" 84 "::fscanf;" 85 "::fscanf_s;" 86 "::fseek;" 87 "::fsetpos;" 88 "::ftell;" 89 "::fwprintf;" 90 "::fwprintf_s;" 91 "::fwrite;" 92 "::fwscanf;" 93 "::fwscanf_s;" 94 "::getc;" 95 "::getchar;" 96 "::getenv;" 97 "::getenv_s;" 98 "::gets_s;" 99 "::getwc;" 100 "::getwchar;" 101 "::gmtime;" 102 "::gmtime_s;" 103 "::localtime;" 104 "::localtime_s;" 105 "::malloc;" 106 "::mbrtoc16;" 107 "::mbrtoc32;" 108 "::mbsrtowcs;" 109 "::mbsrtowcs_s;" 110 "::mbstowcs;" 111 "::mbstowcs_s;" 112 "::memchr;" 113 "::mktime;" 114 "::mtx_init;" 115 "::mtx_lock;" 116 "::mtx_timedlock;" 117 "::mtx_trylock;" 118 "::mtx_unlock;" 119 "::printf_s;" 120 "::putc;" 121 "::putwc;" 122 "::raise;" 123 "::realloc;" 124 "::remove;" 125 "::rename;" 126 "::scanf;" 127 "::scanf_s;" 128 "::setlocale;" 129 "::setvbuf;" 130 "::signal;" 131 "::snprintf;" 132 "::snprintf_s;" 133 "::sprintf;" 134 "::sprintf_s;" 135 "::sscanf;" 136 "::sscanf_s;" 137 "::strchr;" 138 "::strerror_s;" 139 "::strftime;" 140 "::strpbrk;" 141 "::strrchr;" 142 "::strstr;" 143 "::strtod;" 144 "::strtof;" 145 "::strtoimax;" 146 "::strtok;" 147 "::strtok_s;" 148 "::strtol;" 149 "::strtold;" 150 "::strtoll;" 151 "::strtoul;" 152 "::strtoull;" 153 "::strtoumax;" 154 "::strxfrm;" 155 "::swprintf;" 156 "::swprintf_s;" 157 "::swscanf;" 158 "::swscanf_s;" 159 "::thrd_create;" 160 "::thrd_detach;" 161 "::thrd_join;" 162 "::thrd_sleep;" 163 "::time;" 164 "::timespec_get;" 165 "::tmpfile;" 166 "::tmpfile_s;" 167 "::tmpnam;" 168 "::tmpnam_s;" 169 "::tss_create;" 170 "::tss_get;" 171 "::tss_set;" 172 "::ungetc;" 173 "::ungetwc;" 174 "::vfprintf;" 175 "::vfprintf_s;" 176 "::vfscanf;" 177 "::vfscanf_s;" 178 "::vfwprintf;" 179 "::vfwprintf_s;" 180 "::vfwscanf;" 181 "::vfwscanf_s;" 182 "::vprintf_s;" 183 "::vscanf;" 184 "::vscanf_s;" 185 "::vsnprintf;" 186 "::vsnprintf_s;" 187 "::vsprintf;" 188 "::vsprintf_s;" 189 "::vsscanf;" 190 "::vsscanf_s;" 191 "::vswprintf;" 192 "::vswprintf_s;" 193 "::vswscanf;" 194 "::vswscanf_s;" 195 "::vwprintf_s;" 196 "::vwscanf;" 197 "::vwscanf_s;" 198 "::wcrtomb;" 199 "::wcschr;" 200 "::wcsftime;" 201 "::wcspbrk;" 202 "::wcsrchr;" 203 "::wcsrtombs;" 204 "::wcsrtombs_s;" 205 "::wcsstr;" 206 "::wcstod;" 207 "::wcstof;" 208 "::wcstoimax;" 209 "::wcstok;" 210 "::wcstok_s;" 211 "::wcstol;" 212 "::wcstold;" 213 "::wcstoll;" 214 "::wcstombs;" 215 "::wcstombs_s;" 216 "::wcstoul;" 217 "::wcstoull;" 218 "::wcstoumax;" 219 "::wcsxfrm;" 220 "::wctob;" 221 "::wctrans;" 222 "::wctype;" 223 "::wmemchr;" 224 "::wprintf_s;" 225 "::wscanf;" 226 "::wscanf_s;"; 227 228 } // namespace 229 230 namespace clang { 231 namespace tidy { 232 namespace cert { 233 234 class CERTModule : public ClangTidyModule { 235 public: addCheckFactories(ClangTidyCheckFactories & CheckFactories)236 void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { 237 // C++ checkers 238 // CON 239 CheckFactories.registerCheck<bugprone::SpuriouslyWakeUpFunctionsCheck>( 240 "cert-con54-cpp"); 241 // DCL 242 CheckFactories.registerCheck<PostfixOperatorCheck>( 243 "cert-dcl21-cpp"); 244 CheckFactories.registerCheck<VariadicFunctionDefCheck>("cert-dcl50-cpp"); 245 CheckFactories.registerCheck<bugprone::ReservedIdentifierCheck>( 246 "cert-dcl51-cpp"); 247 CheckFactories.registerCheck<misc::NewDeleteOverloadsCheck>( 248 "cert-dcl54-cpp"); 249 CheckFactories.registerCheck<DontModifyStdNamespaceCheck>( 250 "cert-dcl58-cpp"); 251 CheckFactories.registerCheck<google::build::UnnamedNamespaceInHeaderCheck>( 252 "cert-dcl59-cpp"); 253 // ERR 254 CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>( 255 "cert-err09-cpp"); 256 CheckFactories.registerCheck<SetLongJmpCheck>("cert-err52-cpp"); 257 CheckFactories.registerCheck<StaticObjectExceptionCheck>("cert-err58-cpp"); 258 CheckFactories.registerCheck<ThrownExceptionTypeCheck>("cert-err60-cpp"); 259 CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>( 260 "cert-err61-cpp"); 261 // MEM 262 CheckFactories.registerCheck<DefaultOperatorNewAlignmentCheck>( 263 "cert-mem57-cpp"); 264 // MSC 265 CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc50-cpp"); 266 CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>( 267 "cert-msc51-cpp"); 268 // OOP 269 CheckFactories.registerCheck<performance::MoveConstructorInitCheck>( 270 "cert-oop11-cpp"); 271 CheckFactories.registerCheck<bugprone::UnhandledSelfAssignmentCheck>( 272 "cert-oop54-cpp"); 273 CheckFactories.registerCheck<NonTrivialTypesLibcMemoryCallsCheck>( 274 "cert-oop57-cpp"); 275 CheckFactories.registerCheck<MutatingCopyCheck>( 276 "cert-oop58-cpp"); 277 278 // C checkers 279 // CON 280 CheckFactories.registerCheck<bugprone::SpuriouslyWakeUpFunctionsCheck>( 281 "cert-con36-c"); 282 // DCL 283 CheckFactories.registerCheck<misc::StaticAssertCheck>("cert-dcl03-c"); 284 CheckFactories.registerCheck<readability::UppercaseLiteralSuffixCheck>( 285 "cert-dcl16-c"); 286 CheckFactories.registerCheck<bugprone::ReservedIdentifierCheck>( 287 "cert-dcl37-c"); 288 // ENV 289 CheckFactories.registerCheck<CommandProcessorCheck>("cert-env33-c"); 290 // ERR 291 CheckFactories.registerCheck<bugprone::UnusedReturnValueCheck>( 292 "cert-err33-c"); 293 CheckFactories.registerCheck<StrToNumCheck>("cert-err34-c"); 294 // EXP 295 CheckFactories.registerCheck<bugprone::SuspiciousMemoryComparisonCheck>( 296 "cert-exp42-c"); 297 // FLP 298 CheckFactories.registerCheck<FloatLoopCounter>("cert-flp30-c"); 299 CheckFactories.registerCheck<bugprone::SuspiciousMemoryComparisonCheck>( 300 "cert-flp37-c"); 301 // FIO 302 CheckFactories.registerCheck<misc::NonCopyableObjectsCheck>("cert-fio38-c"); 303 // MSC 304 CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc30-c"); 305 CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>( 306 "cert-msc32-c"); 307 // POS 308 CheckFactories.registerCheck<bugprone::BadSignalToKillThreadCheck>( 309 "cert-pos44-c"); 310 CheckFactories 311 .registerCheck<concurrency::ThreadCanceltypeAsynchronousCheck>( 312 "cert-pos47-c"); 313 // SIG 314 CheckFactories.registerCheck<bugprone::SignalHandlerCheck>("cert-sig30-c"); 315 // STR 316 CheckFactories.registerCheck<bugprone::SignedCharMisuseCheck>( 317 "cert-str34-c"); 318 } 319 getModuleOptions()320 ClangTidyOptions getModuleOptions() override { 321 ClangTidyOptions Options; 322 ClangTidyOptions::OptionMap &Opts = Options.CheckOptions; 323 Opts["cert-dcl16-c.NewSuffixes"] = "L;LL;LU;LLU"; 324 Opts["cert-err33-c.CheckedFunctions"] = CertErr33CCheckedFunctions; 325 Opts["cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField"] = "false"; 326 Opts["cert-str34-c.DiagnoseSignedUnsignedCharComparisons"] = "false"; 327 return Options; 328 } 329 }; 330 331 } // namespace cert 332 333 // Register the MiscTidyModule using this statically initialized variable. 334 static ClangTidyModuleRegistry::Add<cert::CERTModule> 335 X("cert-module", 336 "Adds lint checks corresponding to CERT secure coding guidelines."); 337 338 // This anchor is used to force the linker to link in the generated object file 339 // and thus register the CERTModule. 340 volatile int CERTModuleAnchorSource = 0; 341 342 } // namespace tidy 343 } // namespace clang 344