Cppcheck
settings.cpp
Go to the documentation of this file.
1 /*
2  * Cppcheck - A tool for static C/C++ code analysis
3  * Copyright (C) 2007-2024 Cppcheck team.
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "config.h"
20 #include "settings.h"
21 #include "path.h"
22 #include "summaries.h"
23 #include "vfvalue.h"
24 
25 #include <cctype>
26 #include <fstream>
27 #include <sstream>
28 #include <utility>
29 
30 #include "json.h"
31 
32 #ifndef _WIN32
33 #include <unistd.h> // for getpid()
34 #else
35 #include <process.h> // for getpid()
36 #endif
37 
38 
39 std::atomic<bool> Settings::mTerminated;
40 
41 const char Settings::SafeChecks::XmlRootName[] = "safe-checks";
42 const char Settings::SafeChecks::XmlClasses[] = "class-public";
43 const char Settings::SafeChecks::XmlExternalFunctions[] = "external-functions";
44 const char Settings::SafeChecks::XmlInternalFunctions[] = "internal-functions";
45 const char Settings::SafeChecks::XmlExternalVariables[] = "external-variables";
46 
47 static int getPid()
48 {
49 #ifndef _WIN32
50  return getpid();
51 #else
52  return _getpid();
53 #endif
54 }
55 
57 {
62  pid = getPid();
63 }
64 
65 std::string Settings::loadCppcheckCfg(Settings& settings, Suppressions& suppressions)
66 {
67  // TODO: this always needs to be run *after* the Settings has been filled
68  static const std::string cfgFilename = "cppcheck.cfg";
69  std::string fileName;
70 #ifdef FILESDIR
71  if (Path::isFile(Path::join(FILESDIR, cfgFilename)))
72  fileName = Path::join(FILESDIR, cfgFilename);
73 #endif
74  // cppcheck-suppress knownConditionTrueFalse
75  if (fileName.empty()) {
76  // TODO: make sure that exename is set
77  fileName = Path::getPathFromFilename(settings.exename) + cfgFilename;
78  if (!Path::isFile(fileName))
79  return "";
80  }
81 
82  std::ifstream fin(fileName);
83  if (!fin.is_open())
84  return "could not open file";
85  picojson::value json;
86  fin >> json;
87  {
88  const std::string& lastErr = picojson::get_last_error();
89  if (!lastErr.empty())
90  return "not a valid JSON - " + lastErr;
91  }
92  const picojson::object& obj = json.get<picojson::object>();
93  {
94  const picojson::object::const_iterator it = obj.find("productName");
95  if (it != obj.cend()) {
96  const auto& v = it->second;
97  if (!v.is<std::string>())
98  return "'productName' is not a string";
99  settings.cppcheckCfgProductName = v.get<std::string>();
100  }
101  }
102  {
103  const picojson::object::const_iterator it = obj.find("about");
104  if (it != obj.cend()) {
105  const auto& v = it->second;
106  if (!v.is<std::string>())
107  return "'about' is not a string";
108  settings.cppcheckCfgAbout = v.get<std::string>();
109  }
110  }
111  {
112  const picojson::object::const_iterator it = obj.find("addons");
113  if (it != obj.cend()) {
114  const auto& entry = it->second;
115  if (!entry.is<picojson::array>())
116  return "'addons' is not an array";
117  for (const picojson::value &v : entry.get<picojson::array>())
118  {
119  if (!v.is<std::string>())
120  return "'addons' array entry is not a string";
121  const std::string &s = v.get<std::string>();
122  if (!Path::isAbsolute(s))
123  settings.addons.emplace(Path::join(Path::getPathFromFilename(fileName), s));
124  else
125  settings.addons.emplace(s);
126  }
127  }
128  }
129  {
130  const picojson::object::const_iterator it = obj.find("suppressions");
131  if (it != obj.cend()) {
132  const auto& entry = it->second;
133  if (!entry.is<picojson::array>())
134  return "'suppressions' is not an array";
135  for (const picojson::value &v : entry.get<picojson::array>())
136  {
137  if (!v.is<std::string>())
138  return "'suppressions' array entry is not a string";
139  const std::string &s = v.get<std::string>();
140  const std::string err = suppressions.nomsg.addSuppressionLine(s);
141  if (!err.empty())
142  return "could not parse suppression '" + s + "' - " + err;
143  }
144  }
145  }
146  {
147  const picojson::object::const_iterator it = obj.find("safety");
148  if (it != obj.cend()) {
149  const auto& v = it->second;
150  if (!v.is<bool>())
151  return "'safety' is not a bool";
152  settings.safety = settings.safety || v.get<bool>();
153  }
154  }
155 
156  return "";
157 }
158 
159 std::pair<std::string, std::string> Settings::getNameAndVersion(const std::string& productName) {
160  if (productName.empty())
161  return {};
162  const std::string::size_type pos1 = productName.rfind(' ');
163  if (pos1 == std::string::npos)
164  return {};
165  if (pos1 + 2 >= productName.length())
166  return {};
167  for (auto pos2 = pos1 + 1; pos2 < productName.length(); ++pos2) {
168  const char c = productName[pos2];
169  const char prev = productName[pos2-1];
170  if (std::isdigit(c))
171  continue;
172  if (c == '.' && std::isdigit(prev))
173  continue;
174  if (c == 's' && pos2 + 1 == productName.length() && std::isdigit(prev))
175  continue;
176  return {};
177  }
178  return {productName.substr(0, pos1), productName.substr(pos1+1)};
179 }
180 
181 std::string Settings::parseEnabled(const std::string &str, std::tuple<SimpleEnableGroup<Severity>, SimpleEnableGroup<Checks>> &groups)
182 {
183  // Enable parameters may be comma separated...
184  if (str.find(',') != std::string::npos) {
185  std::string::size_type prevPos = 0;
186  std::string::size_type pos = 0;
187  while ((pos = str.find(',', pos)) != std::string::npos) {
188  if (pos == prevPos)
189  return std::string("--enable parameter is empty");
190  std::string errmsg(parseEnabled(str.substr(prevPos, pos - prevPos), groups));
191  if (!errmsg.empty())
192  return errmsg;
193  ++pos;
194  prevPos = pos;
195  }
196  if (prevPos >= str.length())
197  return std::string("--enable parameter is empty");
198  return parseEnabled(str.substr(prevPos), groups);
199  }
200 
201  auto& severity = std::get<0>(groups);
202  auto& checks = std::get<1>(groups);
203 
204  if (str == "all") {
205  // "error" is always enabled and cannot be controlled - so exclude it from "all"
206  SimpleEnableGroup<Severity> newSeverity;
207  newSeverity.fill();
208  newSeverity.disable(Severity::error);
209  severity.enable(newSeverity);
212  } else if (str == "warning") {
214  } else if (str == "style") {
216  } else if (str == "performance") {
218  } else if (str == "portability") {
220  } else if (str == "information") {
222  } else if (str == "unusedFunction") {
224  } else if (str == "missingInclude") {
226  }
227 #ifdef CHECK_INTERNAL
228  else if (str == "internal") {
230  }
231 #endif
232  else {
233  // the actual option is prepending in the applyEnabled() call
234  if (str.empty())
235  return " parameter is empty";
236  return " parameter with the unknown name '" + str + "'";
237  }
238 
239  return "";
240 }
241 
242 std::string Settings::addEnabled(const std::string &str)
243 {
244  return applyEnabled(str, true);
245 }
246 
247 std::string Settings::removeEnabled(const std::string &str)
248 {
249  return applyEnabled(str, false);
250 }
251 
252 std::string Settings::applyEnabled(const std::string &str, bool enable)
253 {
254  std::tuple<SimpleEnableGroup<Severity>, SimpleEnableGroup<Checks>> groups;
255  std::string errmsg = parseEnabled(str, groups);
256  if (!errmsg.empty())
257  return (enable ? "--enable" : "--disable") + errmsg;
258 
259  const auto s = std::get<0>(groups);
260  const auto c = std::get<1>(groups);
261  if (enable) {
262  severity.enable(s);
263  checks.enable(c);
264  }
265  else {
266  severity.disable(s);
267  checks.disable(c);
268  }
269  // FIXME: hack to make sure "error" is always enabled
271  return errmsg;
272 }
273 
274 bool Settings::isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck) const
275 {
276  if (!severity.isEnabled(Severity::warning) && (value->condition || value->defaultArg))
277  return false;
278  if (!certainty.isEnabled(Certainty::inconclusive) && (inconclusiveCheck || value->isInconclusive()))
279  return false;
280  return true;
281 }
282 
284 {
286 }
287 
289 {
290  if (level == CheckLevel::normal) {
291  // Checking should finish in reasonable time.
292  checkLevel = level;
295  }
296  else if (level == CheckLevel::exhaustive) {
297  // Checking can take a little while. ~ 10 times slower than normal analysis is OK.
301  }
302 }
303 
304 // TODO: auto generate these tables
305 
306 static const std::set<std::string> autosarCheckers{
307  "accessMoved",
308  "argumentSize",
309  "arrayIndexOutOfBounds",
310  "arrayIndexOutOfBoundsCond",
311  "arrayIndexThenCheck",
312  "bufferAccessOutOfBounds",
313  "comparePointers",
314  "constParameter",
315  "cstyleCast",
316  "ctuOneDefinitionViolation",
317  "doubleFree",
318  "duplInheritedMember",
319  "duplicateBreak",
320  "funcArgNamesDifferent",
321  "functionConst",
322  "functionStatic",
323  "invalidContainer",
324  "memleak",
325  "mismatchAllocDealloc",
326  "missingReturn",
327  "negativeIndex",
328  "noExplicitConstructor",
329  "nullPointer",
330  "nullPointerArithmetic",
331  "nullPointerArithmeticRedundantCheck",
332  "nullPointerDefaultArg",
333  "nullPointerRedundantCheck",
334  "objectIndex",
335  "overlappingWriteFunction",
336  "overlappingWriteUnion",
337  "pointerOutOfBounds",
338  "pointerOutOfBoundsCond",
339  "preprocessorErrorDirective",
340  "redundantAssignment",
341  "redundantInitialization",
342  "returnDanglingLifetime",
343  "shiftTooManyBits",
344  "sizeofSideEffects",
345  "throwInDestructor",
346  "throwInNoexceptFunction",
347  "uninitData",
348  "uninitMember",
349  "unreachableCode",
350  "unreadVariable",
351  "unsignedLessThanZero",
352  "unusedFunction",
353  "unusedStructMember",
354  "unusedValue",
355  "unusedVariable",
356  "useInitializerList",
357  "variableScope",
358  "virtualCallInConstructor",
359  "zerodiv",
360  "zerodivcond"
361 };
362 
363 static const std::set<std::string> certCCheckers{
364  "IOWithoutPositioning",
365  "autoVariables",
366  "autovarInvalidDeallocation",
367  "bitwiseOnBoolean",
368  "comparePointers",
369  "danglingLifetime",
370  "deallocret",
371  "deallocuse",
372  "doubleFree",
373  "floatConversionOverflow",
374  "invalidFunctionArg",
375  "invalidLengthModifierError",
376  "invalidLifetime",
377  "invalidScanfFormatWidth",
378  "invalidscanf",
379  "leakReturnValNotUsed",
380  "leakUnsafeArgAlloc",
381  "memleak",
382  "memleakOnRealloc",
383  "mismatchAllocDealloc",
384  "missingReturn",
385  "nullPointer",
386  "nullPointerArithmetic",
387  "nullPointerArithmeticRedundantCheck",
388  "nullPointerDefaultArg",
389  "nullPointerRedundantCheck",
390  "preprocessorErrorDirective",
391  "resourceLeak",
392  "sizeofCalculation",
393  "stringLiteralWrite",
394  "uninitStructMember",
395  "uninitdata",
396  "uninitvar",
397  "unknownEvaluationOrder",
398  "useClosedFile",
399  "wrongPrintfScanfArgNum",
400  "wrongPrintfScanfParameterPositionError"
401 };
402 
403 static const std::set<std::string> certCppCheckers{
404  "IOWithoutPositioning",
405  "accessMoved",
406  "comparePointers",
407  "containerOutOfBounds",
408  "ctuOneDefinitionViolation",
409  "deallocMismatch",
410  "deallocThrow",
411  "deallocuse",
412  "doubleFree",
413  "eraseDereference",
414  "exceptThrowInDestructor",
415  "initializerList",
416  "invalidContainer",
417  "lifetime",
418  "memleak",
419  "missingReturn",
420  "nullPointer",
421  "operatorEqToSelf",
422  "sizeofCalculation",
423  "uninitvar",
424  "virtualCallInConstructor",
425  "virtualDestructor"
426 };
427 
428 static const std::set<std::string> misrac2012Checkers{
429  "alwaysFalse",
430  "alwaysTrue",
431  "argumentSize",
432  "autovarInvalidDeallocation",
433  "bufferAccessOutOfBounds",
434  "comparePointers",
435  "compareValueOutOfTypeRangeError",
436  "constPointer",
437  "danglingLifetime",
438  "duplicateBreak",
439  "error",
440  "funcArgNamesDifferent",
441  "incompatibleFileOpen",
442  "invalidFunctionArg",
443  "knownConditionTrueFalse",
444  "leakNoVarFunctionCall",
445  "leakReturnValNotUsed",
446  "memleak",
447  "memleakOnRealloc",
448  "missingReturn",
449  "overlappingWriteFunction",
450  "overlappingWriteUnion",
451  "pointerOutOfBounds",
452  "preprocessorErrorDirective",
453  "redundantAssignInSwitch",
454  "redundantAssignment",
455  "redundantCondition",
456  "resourceLeak",
457  "shadowVariable",
458  "sizeofCalculation",
459  "syntaxError",
460  "uninitvar",
461  "unknownEvaluationOrder",
462  "unreadVariable",
463  "unusedLabel",
464  "unusedVariable",
465  "useClosedFile",
466  "writeReadOnlyFile"
467 };
468 
469 static const std::set<std::string> misrac2023Checkers{
470  "alwaysFalse",
471  "alwaysTrue",
472  "argumentSize",
473  "autovarInvalidDeallocation",
474  "bufferAccessOutOfBounds",
475  "comparePointers",
476  "compareValueOutOfTypeRangeError",
477  "constPointer",
478  "danglingLifetime",
479  "duplicateBreak",
480  "error",
481  "funcArgNamesDifferent",
482  "incompatibleFileOpen",
483  "invalidFunctionArg",
484  "knownConditionTrueFalse",
485  "leakNoVarFunctionCall",
486  "leakReturnValNotUsed",
487  "memleak",
488  "memleakOnRealloc",
489  "missingReturn",
490  "overlappingWriteFunction",
491  "overlappingWriteUnion",
492  "pointerOutOfBounds",
493  "preprocessorErrorDirective",
494  "redundantAssignInSwitch",
495  "redundantAssignment",
496  "redundantCondition",
497  "resourceLeak",
498  "shadowVariable",
499  "sizeofCalculation",
500  "syntaxError",
501  "uninitvar",
502  "unknownEvaluationOrder",
503  "unreadVariable",
504  "unusedLabel",
505  "unusedVariable",
506  "useClosedFile",
507  "writeReadOnlyFile"
508 };
509 
510 static const std::set<std::string> misracpp2008Checkers{
511  "autoVariables",
512  "comparePointers",
513  "constParameter",
514  "constVariable",
515  "cstyleCast",
516  "ctuOneDefinitionViolation",
517  "danglingLifetime",
518  "duplInheritedMember",
519  "duplicateBreak",
520  "exceptThrowInDestructor",
521  "funcArgNamesDifferent",
522  "functionConst",
523  "functionStatic",
524  "missingReturn",
525  "noExplicit",
526  "overlappingWriteFunction",
527  "overlappingWriteUnion",
528  "pointerOutOfBounds",
529  "preprocessorErrorDirective",
530  "redundantAssignment",
531  "redundantInitialization",
532  "returnReference",
533  "returnTempReference",
534  "shadowVariable",
535  "shiftTooManyBits",
536  "sizeofSideEffects",
537  "throwInDestructor",
538  "uninitDerivedMemberVar",
539  "uninitDerivedMemberVarPrivate",
540  "uninitMemberVar",
541  "uninitMemberVarPrivate",
542  "uninitStructMember",
543  "uninitdata",
544  "uninitvar",
545  "unknownEvaluationOrder",
546  "unreachableCode",
547  "unreadVariable",
548  "unsignedLessThanZero",
549  "unusedFunction",
550  "unusedStructMember",
551  "unusedVariable",
552  "varScope",
553  "variableScope",
554  "virtualCallInConstructor"
555 };
556 
557 bool Settings::isPremiumEnabled(const char id[]) const
558 {
559  if (premiumArgs.find("autosar") != std::string::npos && autosarCheckers.count(id))
560  return true;
561  if (premiumArgs.find("cert-c-") != std::string::npos && certCCheckers.count(id))
562  return true;
563  if (premiumArgs.find("cert-c++") != std::string::npos && certCppCheckers.count(id))
564  return true;
565  if (premiumArgs.find("misra-c-") != std::string::npos && (misrac2012Checkers.count(id) || misrac2023Checkers.count(id)))
566  return true;
567  if (premiumArgs.find("misra-c++") != std::string::npos && misracpp2008Checkers.count(id))
568  return true;
569  return false;
570 }
571 
572 void Settings::setMisraRuleTexts(const ExecuteCmdFn& executeCommand)
573 {
574  if (premiumArgs.find("--misra-c-20") != std::string::npos) {
575  const auto it = std::find_if(addonInfos.cbegin(), addonInfos.cend(), [](const AddonInfo& a) {
576  return a.name == "premiumaddon.json";
577  });
578  if (it != addonInfos.cend()) {
579  std::string arg;
580  if (premiumArgs.find("--misra-c-2023") != std::string::npos)
581  arg = "--misra-c-2023-rule-texts";
582  else
583  arg = "--misra-c-2012-rule-texts";
584  std::string output;
585  executeCommand(it->executable, {std::move(arg)}, "2>&1", output);
586  setMisraRuleTexts(output);
587  }
588  }
589 }
590 
591 void Settings::setMisraRuleTexts(const std::string& data)
592 {
593  mMisraRuleTexts.clear();
594  std::istringstream istr(data);
595  std::string line;
596  while (std::getline(istr, line)) {
597  std::string::size_type pos = line.find(' ');
598  if (pos == std::string::npos)
599  continue;
600  std::string id = line.substr(0, pos);
601  std::string text = line.substr(pos + 1);
602  if (id.empty() || text.empty())
603  continue;
604  mMisraRuleTexts[id] = std::move(text);
605  }
606 }
607 
608 std::string Settings::getMisraRuleText(const std::string& id, const std::string& text) const {
609  if (id.compare(0, 9, "misra-c20") != 0)
610  return text;
611  const auto it = mMisraRuleTexts.find(id.substr(id.rfind('-') + 1));
612  return it != mMisraRuleTexts.end() ? it->second : text;
613 }
614 
616 {
617  static constexpr ExecutorType defaultExecutor =
618 #if defined(HAS_THREADING_MODEL_FORK)
619  ExecutorType::Process;
620 #elif defined(HAS_THREADING_MODEL_THREAD)
621  ExecutorType::Thread;
622 #endif
623  return defaultExecutor;
624 }
static std::string join(const std::string &path1, const std::string &path2)
join 2 paths with '/' separators
Definition: path.cpp:339
static bool isFile(const std::string &path)
Checks if given path is a file.
Definition: path.cpp:329
static std::string getPathFromFilename(const std::string &filename)
Lookup the path part from a filename (e.g., '/tmp/a.h' -> '/tmp/', 'a.h' -> '')
Definition: path.cpp:88
static bool isAbsolute(const std::string &path)
Check if given path is absolute.
Definition: path.cpp:166
This is just a container for general settings so that we don't need to pass individual values to func...
Definition: settings.h:95
void loadSummaries()
Definition: settings.cpp:283
static std::atomic< bool > mTerminated
terminate checking
Definition: settings.h:99
static std::string loadCppcheckCfg(Settings &settings, Suppressions &suppressions)
Definition: settings.cpp:65
CheckLevel checkLevel
Definition: settings.h:465
int performanceValueFlowMaxSubFunctionArgs
max number of sets of arguments to pass to subfuncions in valueflow
Definition: settings.h:264
int pid
pid of cppcheck.
Definition: settings.h:267
std::string addEnabled(const std::string &str)
Enable extra checks by id.
Definition: settings.cpp:242
std::map< std::string, std::string > mMisraRuleTexts
Definition: settings.h:479
std::string getMisraRuleText(const std::string &id, const std::string &text) const
Definition: settings.cpp:608
ExecutorType
Definition: settings.h:198
std::string exename
Definition: settings.h:210
bool isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck=false) const
Returns true if given value can be shown.
Definition: settings.cpp:274
SimpleEnableGroup< Checks > checks
Definition: settings.h:360
std::function< int(std::string, std::vector< std::string >, std::string, std::string &)> ExecuteCmdFn
Definition: settings.h:469
std::unordered_set< std::string > addons
addons, either filename of python/json file or json data
Definition: settings.h:109
void setMisraRuleTexts(const ExecuteCmdFn &executeCommand)
Definition: settings.cpp:572
bool safety
Safety certified behavior Show checkers report when Cppcheck finishes Make cppcheck checking more str...
Definition: settings.h:313
std::string removeEnabled(const std::string &str)
Disable extra checks by id.
Definition: settings.cpp:247
std::string buildDir
–cppcheck-build-dir.
Definition: settings.h:121
static std::pair< std::string, std::string > getNameAndVersion(const std::string &productName)
Definition: settings.cpp:159
std::string cppcheckCfgProductName
cppcheck.cfg: Custom product name
Definition: settings.h:165
std::vector< AddonInfo > addonInfos
the loaded addons infos
Definition: settings.h:112
std::string premiumArgs
Extra arguments for Cppcheck Premium addon.
Definition: settings.h:273
std::set< std::string > summaryReturn
Definition: settings.h:453
void setCheckLevel(CheckLevel level)
Definition: settings.cpp:288
std::string cppcheckCfgAbout
cppcheck.cfg: About text
Definition: settings.h:168
int performanceValueFlowMaxIfCount
–performance-valueflow-max-if-count=C
Definition: settings.h:261
Settings()
Definition: settings.cpp:56
static ExecutorType defaultExecutor()
Definition: settings.cpp:615
bool isPremiumEnabled(const char id[]) const
Is checker id enabled by premiumArgs.
Definition: settings.cpp:557
ExecutorType executor
Definition: settings.h:207
SimpleEnableGroup< Certainty > certainty
Definition: settings.h:359
std::string applyEnabled(const std::string &str, bool enable)
Definition: settings.cpp:252
SimpleEnableGroup< Severity > severity
Definition: settings.h:358
static std::string parseEnabled(const std::string &str, std::tuple< SimpleEnableGroup< Severity >, SimpleEnableGroup< Checks >> &groups)
Definition: settings.cpp:181
bool isEnabled(T flag) const
Definition: settings.h:66
void setEnabled(T flag, bool enabled)
Definition: settings.h:81
void disable(T flag)
Definition: settings.h:75
void enable(T flag)
Definition: settings.h:69
std::string addSuppressionLine(const std::string &line)
Don't show the given error.
bool defaultArg
Is this value passed as default parameter to the function?
Definition: vfvalue.h:299
const Token * condition
Condition that this value depends on.
Definition: vfvalue.h:280
bool isInconclusive() const
Definition: vfvalue.h:378
@ warning
Warning.
@ portability
Portability warning.
@ style
Style warning.
@ information
Checking information.
@ performance
Performance warning.
@ error
Programming error.
@ missingInclude
@ internalCheck
@ unusedFunction
CPPCHECKLIB void loadReturn(const std::string &buildDir, std::set< std::string > &summaryReturn)
Definition: summaries.cpp:156
static const std::set< std::string > autosarCheckers
Definition: settings.cpp:306
static const std::set< std::string > misrac2012Checkers
Definition: settings.cpp:428
static const std::set< std::string > misrac2023Checkers
Definition: settings.cpp:469
static const std::set< std::string > misracpp2008Checkers
Definition: settings.cpp:510
static const std::set< std::string > certCppCheckers
Definition: settings.cpp:403
static int getPid()
Definition: settings.cpp:47
static const std::set< std::string > certCCheckers
Definition: settings.cpp:363
static const char XmlExternalFunctions[]
Definition: settings.h:320
static const char XmlInternalFunctions[]
Definition: settings.h:321
static const char XmlClasses[]
Definition: settings.h:319
static const char XmlRootName[]
Definition: settings.h:318
static const char XmlExternalVariables[]
Definition: settings.h:322
SuppressionList nomsg
suppress message (–suppressions)
Definition: suppressions.h:264