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