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