From a03cf24ee0295037ce4d19f98e548f3e4814ac34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 15 May 2026 16:39:46 +0200 Subject: [PATCH 001/171] small `Check::instances()` usage cleanup (#8559) - consistently use range loops - fixed `shadowFunction` selfcheck warnings - return a const reference --- cli/cmdlineparser.cpp | 6 +++--- lib/check.cpp | 11 ++++++++--- lib/check.h | 7 +++++-- lib/cppcheck.cpp | 28 ++++++++++++---------------- test/testcheck.cpp | 9 +++++---- test/testgarbage.cpp | 4 ++-- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 43361c6e5bc..2ebef4ba3c9 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -359,9 +359,9 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a if (std::strcmp(argv[i], "--doc") == 0) { std::ostringstream doc; // Get documentation.. - for (const Check * it : Check::instances()) { - const std::string& name(it->name()); - const std::string info(it->classInfo()); + for (const Check * const c : Check::instances()) { + const std::string& name(c->name()); + const std::string info(c->classInfo()); if (!name.empty() && !info.empty()) doc << "## " << name << " ##\n" << info << "\n"; diff --git a/lib/check.cpp b/lib/check.cpp index 812c8b02fcd..f639ba226bd 100644 --- a/lib/check.cpp +++ b/lib/check.cpp @@ -50,9 +50,9 @@ Check::Check(const std::string &aname) return i->name() > aname; }); if (it == instances().end()) - instances().push_back(this); + instances_internal().push_back(this); else - instances().insert(it, this); + instances_internal().insert(it, this); } void Check::writeToErrorList(const ErrorMessage &errmsg) @@ -88,7 +88,7 @@ bool Check::wrongData(const Token *tok, const char *str) return true; } -std::list &Check::instances() +std::list &Check::instances_internal() { #ifdef __SVR4 // Under Solaris, destructors are called in wrong order which causes a segmentation fault. @@ -101,6 +101,11 @@ std::list &Check::instances() #endif } +const std::list &Check::instances() +{ + return instances_internal(); +} + std::string Check::getMessageId(const ValueFlow::Value &value, const char id[]) { if (value.condition != nullptr) diff --git a/lib/check.h b/lib/check.h index 4e3c5b9a4e3..8c3e42a69de 100644 --- a/lib/check.h +++ b/lib/check.h @@ -66,17 +66,20 @@ class CPPCHECKLIB Check { Check(std::string aname, const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) : mTokenizer(tokenizer), mSettings(settings), mErrorLogger(errorLogger), mName(std::move(aname)) {} +private: + static std::list &instances_internal(); + public: virtual ~Check() { if (!mTokenizer) - instances().remove(this); + instances_internal().remove(this); } Check(const Check &) = delete; Check& operator=(const Check &) = delete; /** List of registered check classes. This is used by Cppcheck to run checks and generate documentation */ - static std::list &instances(); + static const std::list &instances(); /** run checks, the token list is not simplified */ virtual void runChecks(const Tokenizer &, ErrorLogger *) = 0; diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 3ef1e7c83e3..652bd4f5bef 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1338,8 +1338,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation const std::time_t maxTime = mSettings.checksMaxTime > 0 ? std::time(nullptr) + mSettings.checksMaxTime : 0; // call all "runChecks" in all registered Check classes - // cppcheck-suppress shadowFunction - TODO: fix this - for (Check *check : Check::instances()) { + for (Check * const c : Check::instances()) { if (Settings::terminated()) return; @@ -1357,8 +1356,8 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation return; } - Timer::run(check->name() + "::runChecks", mTimerResults, [&]() { - check->runChecks(tokenizer, &mErrorLogger); + Timer::run(c->name() + "::runChecks", mTimerResults, [&]() { + c->runChecks(tokenizer, &mErrorLogger); }); } } @@ -1388,11 +1387,10 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation } if (!doUnusedFunctionOnly) { - // cppcheck-suppress shadowFunction - TODO: fix this - for (const Check *check : Check::instances()) { - if (Check::FileInfo * const fi = check->getFileInfo(tokenizer, mSettings, currentConfig)) { + for (const Check * const c : Check::instances()) { + if (Check::FileInfo * const fi = c->getFileInfo(tokenizer, mSettings, currentConfig)) { if (analyzerInformation) - analyzerInformation->setFileInfo(check->name(), fi->toString()); + analyzerInformation->setFileInfo(c->name(), fi->toString()); if (mSettings.useSingleJob()) mFileInfo.push_back(fi); else @@ -1714,8 +1712,8 @@ void CppCheck::getErrorMessages(ErrorLogger &errorlogger) s.addEnabled("all"); // call all "getErrorMessages" in all registered Check classes - for (auto it = Check::instances().cbegin(); it != Check::instances().cend(); ++it) - (*it)->getErrorMessages(&errorlogger, &s); + for (const Check * const c : Check::instances()) + c->getErrorMessages(&errorlogger, &s); CheckUnusedFunctions::getErrorMessages(errorlogger); Preprocessor::getErrorMessages(errorlogger, s); @@ -1832,9 +1830,8 @@ bool CppCheck::analyseWholeProgram() } } - // cppcheck-suppress shadowFunction - TODO: fix this - for (Check *check : Check::instances()) - errors |= check->analyseWholeProgram(ctu, mFileInfo, mSettings, mErrorLogger); // TODO: ctu + for (Check * const c : Check::instances()) + errors |= c->analyseWholeProgram(ctu, mFileInfo, mSettings, mErrorLogger); // TODO: ctu } if (mUnusedFunctionsCheck) @@ -1881,9 +1878,8 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st } else { // Analyse the tokens - // cppcheck-suppress shadowFunction - TODO: fix this - for (Check *check : Check::instances()) - check->analyseWholeProgram(ctuFileInfo, fileInfoList, mSettings, mErrorLogger); + for (Check * const c : Check::instances()) + c->analyseWholeProgram(ctuFileInfo, fileInfoList, mSettings, mErrorLogger); } for (Check::FileInfo *fi : fileInfoList) diff --git a/test/testcheck.cpp b/test/testcheck.cpp index 8ea4cef38d8..b07c7e0db0c 100644 --- a/test/testcheck.cpp +++ b/test/testcheck.cpp @@ -33,18 +33,19 @@ class TestCheck : public TestFixture { } void instancesSorted() const { - for (auto i = Check::instances().cbegin(); i != Check::instances().cend(); ++i) { + const auto& checks = Check::instances(); + for (auto i = checks.cbegin(); i != checks.cend(); ++i) { auto j = i; ++j; - if (j != Check::instances().cend()) { + if (j != checks.cend()) { ASSERT_EQUALS(true, (*i)->name() < (*j)->name()); } } } void classInfoFormat() const { - for (auto i = Check::instances().cbegin(); i != Check::instances().cend(); ++i) { - const std::string info = (*i)->classInfo(); + for (const Check * const c : Check::instances()) { + const std::string info = c->classInfo(); if (!info.empty()) { ASSERT('\n' != info[0]); // No \n in the beginning ASSERT('\n' == info.back()); // \n at end diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 44f163a53c1..38baa798fed 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -285,8 +285,8 @@ class TestGarbage : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // call all "runChecks" in all registered Check classes - for (auto it = Check::instances().cbegin(); it != Check::instances().cend(); ++it) { - (*it)->runChecks(tokenizer, this); + for (Check * const c : Check::instances()) { + c->runChecks(tokenizer, this); } return tokenizer.tokens()->stringifyList(false, false, false, true, false, nullptr, nullptr); From 40f6f6ad90c987ca6ffcd72881128acab9ed8997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= Date: Fri, 15 May 2026 16:15:20 +0000 Subject: [PATCH 002/171] gtk.cfg: Add some defines (#8558) --- cfg/gtk.cfg | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/cfg/gtk.cfg b/cfg/gtk.cfg index c4ab8972155..b561aad91b2 100644 --- a/cfg/gtk.cfg +++ b/cfg/gtk.cfg @@ -10,10 +10,24 @@ + + + + + + + + + + + + + + @@ -234,6 +248,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + g_thread_new g_thread_try_new @@ -22972,6 +23066,10 @@ + + + + From 5d69c9fc2e0e7dd8c58a23aa5357d42275778c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 15 May 2026 18:18:17 +0200 Subject: [PATCH 003/171] AUTHORS: Add Tamaranch [skip ci] (#8560) --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 40391c83d7d..04cff0891a9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -141,6 +141,7 @@ Frank Winklmeier Frank Zingsheim Frederik Schwarzer fu7mu4 +Gaƫl Bonithon Galimov Albert Garrett Bodily Gary Leutheuser From dc0a43793e6364c032ca8490ee36442d187ab20c Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 15 May 2026 19:16:22 +0200 Subject: [PATCH 004/171] Fix #14707 Clarify: uninitMemberVarNoCtor variable (#8556) Co-authored-by: chrchr-github --- lib/checkclass.cpp | 2 +- test/testconstructors.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 9fc9bdc7863..dd96b4dc43c 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -372,7 +372,7 @@ void CheckClass::constructors() const Variable& var = *usage.var; if (diagVars.count(&var) == 0) - uninitVarError(scope->bodyStart, false, FunctionType::eConstructor, var.scope()->className, var.name(), false, false, true); + uninitVarError(var.nameToken(), false, FunctionType::eConstructor, var.scope()->className, var.name(), false, false, true); } } } diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 61916e1d0bb..7fb5889c88a 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -763,7 +763,7 @@ class TestConstructors : public TestFixture { check("struct S {\n" // #14546 " int a = 0, b;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:1:10]: (warning) Member variable 'S::b' has no initializer. [uninitMemberVarNoCtor]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:2:16]: (warning) Member variable 'S::b' has no initializer. [uninitMemberVarNoCtor]\n", errout_str()); check("struct S {\n" " int a, b;\n" From e277aba41ca11ba815df7403c81537612ac40e71 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 15 May 2026 19:17:47 +0200 Subject: [PATCH 005/171] Fix #14453 FP constParameterPointer with strchr() (#8554) --- cfg/std.cfg | 10 +++++----- test/cfg/std.c | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cfg/std.cfg b/cfg/std.cfg index e282dd99995..ec5fbb72548 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -4411,7 +4411,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + @@ -4444,7 +4444,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + @@ -4861,7 +4861,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun false - + @@ -5044,7 +5044,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun false - + @@ -5433,7 +5433,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun false - + diff --git a/test/cfg/std.c b/test/cfg/std.c index 928d52bf116..997f8204f73 100644 --- a/test/cfg/std.c +++ b/test/cfg/std.c @@ -3519,6 +3519,13 @@ void invalidFunctionArg_strchr(const char *cs, int c) (void)strchr(cs, 256); } +void constParameterPointer_strchr(char *str) // #14453 +{ + char *sep = strchr(str, ':'); + if (sep) + *sep = '\0'; +} + void invalidFunctionArg_log10(float f, double d, const long double ld) { // cppcheck-suppress invalidFunctionArg From 7a9174637689297090c056150adab06f90a85ea7 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 15 May 2026 22:45:04 +0200 Subject: [PATCH 006/171] Fix #14714, #14748 FN constParameterPointer (array member, dereference in ternary) (#8553) Co-authored-by: chrchr-github --- lib/checkother.cpp | 4 +++- test/testother.cpp | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index fb75d80fca7..0c4ce7d63cf 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1941,7 +1941,9 @@ void CheckOther::checkConstPointer() continue; if (deref != NONE) { const Token* gparent = parent->astParent(); - while (Token::simpleMatch(gparent, "[") && parent != gparent->astOperand2() && parent->str() == gparent->str()) + while (Token::simpleMatch(gparent, "[") && parent != gparent->astOperand2()) + gparent = gparent->astParent(); + while (Token::Match(gparent, "[?:]")) gparent = gparent->astParent(); if (deref == MEMBER) { if (!gparent) diff --git a/test/testother.cpp b/test/testother.cpp index c5a94a673fe..cfdcffe05d3 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -4844,6 +4844,26 @@ class TestOther : public TestFixture { " return s->x ? 1 : 0;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2:10]: (style) Parameter 's' can be declared as pointer to const [constParameterPointer]\n", errout_str()); + + check("struct S { int a[1][1]; };\n" // #14714 + "int f(S* s) {\n" + " return s->a[0][0] ? 1 : 0;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:10]: (style) Parameter 's' can be declared as pointer to const [constParameterPointer]\n", errout_str()); + + check("int f(int *p, int *q) {\n" // #14748 + " return p ? *p : *q;\n" + "}\n" + "void g(int *p, int *q) {\n" + " int& r = p ? *p : *q;\n" + " r = 0;\n" + "}\n" + "void h(int *p, int *q) {\n" + " i(p ? *p : *q);\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:1:12]: (style) Parameter 'p' can be declared as pointer to const [constParameterPointer]\n" + "[test.cpp:1:20]: (style) Parameter 'q' can be declared as pointer to const [constParameterPointer]\n", + errout_str()); } void constArray() { From f7f054932c7245d1f9c2a18c68396311ae97a836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Sat, 16 May 2026 16:01:44 +0200 Subject: [PATCH 007/171] refs #14498 - do not create global static instances of the checks (#8555) --- Makefile | 160 ++++++++++++++++++----------------- cli/cmdlineparser.cpp | 3 +- lib/check.cpp | 43 +--------- lib/check.h | 10 +-- lib/check64bit.cpp | 5 -- lib/checkassert.cpp | 5 -- lib/checkautovariables.cpp | 6 -- lib/checkbool.cpp | 5 -- lib/checkbufferoverrun.cpp | 7 -- lib/checkclass.cpp | 5 -- lib/checkcondition.cpp | 5 -- lib/checkexceptionsafety.cpp | 5 -- lib/checkfunctions.cpp | 6 -- lib/checkinternal.cpp | 6 -- lib/checkinternal.h | 5 ++ lib/checkio.cpp | 5 -- lib/checkleakautovar.cpp | 5 -- lib/checkmemoryleak.cpp | 8 -- lib/checknullpointer.cpp | 5 -- lib/checkother.cpp | 5 -- lib/checkpostfixoperator.cpp | 6 -- lib/checks.cpp | 123 +++++++++++++++++++++++++++ lib/checks.h | 34 ++++++++ lib/checksizeof.cpp | 5 -- lib/checkstl.cpp | 5 -- lib/checkstring.cpp | 5 -- lib/checktype.cpp | 5 -- lib/checkuninitvar.cpp | 5 -- lib/checkunusedvar.cpp | 5 -- lib/checkvaarg.cpp | 8 -- lib/cppcheck.cpp | 13 +-- lib/cppcheck.vcxproj | 2 + oss-fuzz/Makefile | 6 +- test/fixture.h | 3 +- test/testcheck.cpp | 15 +--- test/testgarbage.cpp | 3 +- 36 files changed, 271 insertions(+), 276 deletions(-) create mode 100644 lib/checks.cpp create mode 100644 lib/checks.h diff --git a/Makefile b/Makefile index bb006c36fea..932a1ad302b 100644 --- a/Makefile +++ b/Makefile @@ -228,6 +228,7 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/checknullpointer.o \ $(libcppdir)/checkother.o \ $(libcppdir)/checkpostfixoperator.o \ + $(libcppdir)/checks.o \ $(libcppdir)/checksizeof.o \ $(libcppdir)/checkstl.o \ $(libcppdir)/checkstring.o \ @@ -560,6 +561,9 @@ $(libcppdir)/checkother.o: lib/checkother.cpp lib/addoninfo.h lib/astutils.h lib $(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp +$(libcppdir)/checks.o: lib/checks.cpp lib/check.h lib/check64bit.h lib/checkassert.h lib/checkautovariables.h lib/checkbool.h lib/checkbufferoverrun.h lib/checkclass.h lib/checkcondition.h lib/checkexceptionsafety.h lib/checkfunctions.h lib/checkinternal.h lib/checkio.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/checkother.h lib/checkpostfixoperator.h lib/checks.h lib/checksizeof.h lib/checkstl.h lib/checkstring.h lib/checktype.h lib/checkuninitvar.h lib/checkunusedvar.h lib/checkvaarg.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/standards.h lib/vfvalue.h + $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp + $(libcppdir)/checksizeof.o: lib/checksizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checksizeof.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp @@ -590,7 +594,7 @@ $(libcppdir)/clangimport.o: lib/clangimport.cpp lib/clangimport.h lib/config.h l $(libcppdir)/color.o: lib/color.cpp lib/color.h lib/config.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/color.cpp -$(libcppdir)/cppcheck.o: lib/cppcheck.cpp externals/picojson/picojson.h externals/simplecpp/simplecpp.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/clangimport.h lib/color.h lib/config.h lib/cppcheck.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/version.h lib/vfvalue.h +$(libcppdir)/cppcheck.o: lib/cppcheck.cpp externals/picojson/picojson.h externals/simplecpp/simplecpp.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkunusedfunctions.h lib/clangimport.h lib/color.h lib/config.h lib/cppcheck.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/version.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/cppcheck.cpp $(libcppdir)/ctu.o: lib/ctu.cpp externals/tinyxml2/tinyxml2.h lib/astutils.h lib/check.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h @@ -695,7 +699,7 @@ $(libcppdir)/vfvalue.o: lib/vfvalue.cpp lib/config.h lib/errortypes.h lib/mathli frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_FE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ frontend/frontend.cpp -cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h +cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h @@ -728,238 +732,238 @@ cli/stacktrace.o: cli/stacktrace.cpp cli/stacktrace.h lib/config.h lib/utils.h cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/threadexecutor.cpp -test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h +test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/fixture.cpp test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/helpers.cpp -test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/main.cpp test/options.o: test/options.cpp lib/config.h lib/timer.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/options.cpp -test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/test64bit.cpp -test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testanalyzerinformation.cpp -test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testassert.cpp -test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testastutils.cpp -test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testautovariables.cpp -test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbool.cpp -test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbufferoverrun.cpp -test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcharvar.cpp -test/testcheck.o: test/testcheck.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcheck.o: test/testcheck.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheck.cpp -test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheckersreport.cpp -test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclangimport.cpp -test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclass.cpp -test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcmdlineparser.cpp -test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcolor.cpp -test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcondition.cpp -test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testconstructors.cpp -test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcppcheck.cpp -test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h +test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testerrorlogger.cpp -test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexceptionsafety.cpp -test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexecutor.cpp -test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilelister.cpp -test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilesettings.cpp -test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfrontend.cpp -test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfunctions.cpp -test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testgarbage.cpp -test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h +test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testimportproject.cpp -test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testincompletestatement.cpp -test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkinternal.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testinternal.cpp -test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkio.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testio.cpp -test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkleakautovar.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testleakautovar.cpp -test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testlibrary.cpp -test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmathlib.cpp -test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkmemoryleak.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmemleak.cpp -test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/checks.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testnullpointer.cpp -test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testoptions.cpp -test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testother.cpp -test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpath.cpp -test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpathmatch.cpp -test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testplatform.cpp -test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkpostfixoperator.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpostfixoperator.cpp -test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpreprocessor.cpp -test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprocessexecutor.cpp -test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprogrammemory.cpp -test/testregex.o: test/testregex.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testregex.o: test/testregex.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testregex.cpp -test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsarifreport.cpp -test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsettings.cpp -test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytemplate.cpp -test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytokens.cpp -test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytypedef.cpp -test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifyusing.cpp -test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsingleexecutor.cpp -test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsizeof.cpp -test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststandards.cpp -test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststl.cpp -test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststring.cpp -test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsummaries.cpp -test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsuppressions.cpp -test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsymboldatabase.cpp -test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testthreadexecutor.cpp -test/testtimer.o: test/testtimer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h +test/testtimer.o: test/testtimer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtimer.cpp -test/testtoken.o: test/testtoken.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtoken.o: test/testtoken.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtoken.cpp -test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenize.cpp -test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenlist.cpp -test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenrange.cpp -test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtype.cpp -test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testuninitvar.cpp -test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedfunctions.cpp -test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedprivfunc.cpp -test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedvar.cpp -test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testutils.cpp -test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvaarg.cpp -test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvalueflow.cpp -test/testvarid.o: test/testvarid.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvarid.o: test/testvarid.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvarid.cpp -test/testvfvalue.o: test/testvfvalue.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testvfvalue.o: test/testvfvalue.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvfvalue.cpp externals/simplecpp/simplecpp.o: externals/simplecpp/simplecpp.cpp externals/simplecpp/simplecpp.h diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 2ebef4ba3c9..27cfe08d871 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -20,6 +20,7 @@ #include "addoninfo.h" #include "check.h" +#include "checks.h" #include "checkers.h" #include "color.h" #include "config.h" @@ -359,7 +360,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a if (std::strcmp(argv[i], "--doc") == 0) { std::ostringstream doc; // Get documentation.. - for (const Check * const c : Check::instances()) { + for (const Check * const c : CheckInstances::get()) { const std::string& name(c->name()); const std::string info(c->classInfo()); if (!name.empty() && !info.empty()) diff --git a/lib/check.cpp b/lib/check.cpp index f639ba226bd..4033378e927 100644 --- a/lib/check.cpp +++ b/lib/check.cpp @@ -26,34 +26,15 @@ #include "tokenize.h" #include "vfvalue.h" -#include #include #include -#include #include //--------------------------------------------------------------------------- -Check::Check(const std::string &aname) - : mName(aname) -{ - { - const auto it = std::find_if(instances().begin(), instances().end(), [&](const Check *i) { - return i->name() == aname; - }); - if (it != instances().end()) - throw std::runtime_error("'" + aname + "' instance already exists"); - } - - // make sure the instances are sorted - const auto it = std::find_if(instances().begin(), instances().end(), [&](const Check* i) { - return i->name() > aname; - }); - if (it == instances().end()) - instances_internal().push_back(this); - else - instances_internal().insert(it, this); -} +Check::Check(std::string aname) + : mName(std::move(aname)) +{} void Check::writeToErrorList(const ErrorMessage &errmsg) { @@ -88,24 +69,6 @@ bool Check::wrongData(const Token *tok, const char *str) return true; } -std::list &Check::instances_internal() -{ -#ifdef __SVR4 - // Under Solaris, destructors are called in wrong order which causes a segmentation fault. - // This fix ensures pointer remains valid and reachable until program terminates. - static std::list *_instances= new std::list; - return *_instances; -#else - static std::list _instances; - return _instances; -#endif -} - -const std::list &Check::instances() -{ - return instances_internal(); -} - std::string Check::getMessageId(const ValueFlow::Value &value, const char id[]) { if (value.condition != nullptr) diff --git a/lib/check.h b/lib/check.h index 8c3e42a69de..9a50e64baa1 100644 --- a/lib/check.h +++ b/lib/check.h @@ -59,7 +59,7 @@ class Tokenizer; class CPPCHECKLIB Check { public: /** This constructor is used when registering the CheckClass */ - explicit Check(const std::string &aname); + explicit Check(std::string aname); protected: /** This constructor is used when running checks. */ @@ -70,17 +70,11 @@ class CPPCHECKLIB Check { static std::list &instances_internal(); public: - virtual ~Check() { - if (!mTokenizer) - instances_internal().remove(this); - } + virtual ~Check() = default; Check(const Check &) = delete; Check& operator=(const Check &) = delete; - /** List of registered check classes. This is used by Cppcheck to run checks and generate documentation */ - static const std::list &instances(); - /** run checks, the token list is not simplified */ virtual void runChecks(const Tokenizer &, ErrorLogger *) = 0; diff --git a/lib/check64bit.cpp b/lib/check64bit.cpp index d203eb5f279..b33ab5bdbcb 100644 --- a/lib/check64bit.cpp +++ b/lib/check64bit.cpp @@ -36,11 +36,6 @@ // CWE ids used static const CWE CWE758(758U); // Reliance on Undefined, Unspecified, or Implementation-Defined Behavior -// Register this check class (by creating a static instance of it) -namespace { - Check64BitPortability instance; -} - static bool is32BitIntegerReturn(const Function* func, const Settings* settings) { if (settings->platform.sizeof_pointer != 8) diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 3ab55967ede..ce2d7c62169 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -39,11 +39,6 @@ // CWE ids used static const CWE CWE398(398U); // Indicator of Poor Code Quality -// Register this check class (by creating a static instance of it) -namespace { - CheckAssert instance; -} - void CheckAssert::assertWithSideEffects() { if (!mSettings->severity.isEnabled(Severity::warning)) diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index e778f3d5959..fdc5deceefa 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -39,12 +39,6 @@ //--------------------------------------------------------------------------- - -// Register this check class into cppcheck by creating a static instance of it.. -namespace { - CheckAutoVariables instance; -} - static const CWE CWE398(398U); // Indicator of Poor Code Quality static const CWE CWE562(562U); // Return of Stack Variable Address static const CWE CWE590(590U); // Free of Memory not on the Heap diff --git a/lib/checkbool.cpp b/lib/checkbool.cpp index 93e501416aa..c9a66876317 100644 --- a/lib/checkbool.cpp +++ b/lib/checkbool.cpp @@ -32,11 +32,6 @@ #include //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckBool instance; -} - static const CWE CWE398(398U); // Indicator of Poor Code Quality static const CWE CWE571(571U); // Expression is Always True static const CWE CWE587(587U); // Assignment of a Fixed Address to a Pointer diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 642e40bce76..3ba41882316 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -50,13 +50,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckBufferOverrun instance; -} - -//--------------------------------------------------------------------------- - // CWE ids used: static const CWE CWE131(131U); // Incorrect Calculation of Buffer Size static const CWE CWE170(170U); // Improper Null Termination diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index dd96b4dc43c..9c0ad424112 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -43,11 +43,6 @@ //--------------------------------------------------------------------------- -// Register CheckClass.. -namespace { - CheckClass instance; -} - static const CWE CWE398(398U); // Indicator of Poor Code Quality static const CWE CWE404(404U); // Improper Resource Shutdown or Release static const CWE CWE665(665U); // Improper Initialization diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index d0913963cca..cec3293ad27 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -52,11 +52,6 @@ static const CWE CWE571(571U); // Expression is Always True //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckCondition instance; -} - bool CheckCondition::diag(const Token* tok, bool insert) { if (!tok) diff --git a/lib/checkexceptionsafety.cpp b/lib/checkexceptionsafety.cpp index 34303cc0f4a..6da5281e80a 100644 --- a/lib/checkexceptionsafety.cpp +++ b/lib/checkexceptionsafety.cpp @@ -34,11 +34,6 @@ //--------------------------------------------------------------------------- -// Register CheckExceptionSafety.. -namespace { - CheckExceptionSafety instance; -} - static const CWE CWE398(398U); // Indicator of Poor Code Quality static const CWE CWE703(703U); // Improper Check or Handling of Exceptional Conditions static const CWE CWE480(480U); // Use of Incorrect Operator diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index 7611ea7eee4..733b868814e 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -44,12 +44,6 @@ //--------------------------------------------------------------------------- - -// Register this check class (by creating a static instance of it) -namespace { - CheckFunctions instance; -} - static const CWE CWE252(252U); // Unchecked Return Value static const CWE CWE477(477U); // Use of Obsolete Functions static const CWE CWE758(758U); // Reliance on Undefined, Unspecified, or Implementation-Defined Behavior diff --git a/lib/checkinternal.cpp b/lib/checkinternal.cpp index f289044b102..ed39b4db96a 100644 --- a/lib/checkinternal.cpp +++ b/lib/checkinternal.cpp @@ -31,12 +31,6 @@ #include #include -// Register this check class (by creating a static instance of it). -// Disabled in release builds -namespace { - CheckInternal instance; -} - void CheckInternal::checkTokenMatchPatterns() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); diff --git a/lib/checkinternal.h b/lib/checkinternal.h index 1fc97bcb247..d62d9698b8d 100644 --- a/lib/checkinternal.h +++ b/lib/checkinternal.h @@ -22,6 +22,8 @@ #define checkinternalH //--------------------------------------------------------------------------- +#ifdef CHECK_INTERNAL + #include "check.h" #include "config.h" @@ -93,4 +95,7 @@ class CPPCHECKLIB CheckInternal : public Check { }; /// @} //--------------------------------------------------------------------------- + +#endif // CHECK_INTERNAL + #endif // checkinternalH diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 8b3c835caf3..32bedf8024f 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -45,11 +45,6 @@ //--------------------------------------------------------------------------- -// Register CheckIO.. -namespace { - CheckIO instance; -} - // CVE ID used: static const CWE CWE119(119U); // Improper Restriction of Operations within the Bounds of a Memory Buffer static const CWE CWE398(398U); // Indicator of Poor Code Quality diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 803ea9967a3..1c9a7283161 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -45,11 +45,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckLeakAutoVar instance; -} - static const CWE CWE672(672U); static const CWE CWE415(415U); diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 1a6ef787eb6..b2f97693cd6 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -37,14 +37,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckMemoryLeakInFunction instance1; - CheckMemoryLeakInClass instance2; - CheckMemoryLeakStructMember instance3; - CheckMemoryLeakNoVar instance4; -} - // CWE ID used: static const CWE CWE398(398U); // Indicator of Poor Code Quality static const CWE CWE401(401U); // Improper Release of Memory Before Removing Last Reference ('Memory Leak') diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index beb9d5d77a3..5bd602488b4 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -47,11 +47,6 @@ static const CWE CWE_NULL_POINTER_DEREFERENCE(476U); static const CWE CWE_INCORRECT_CALCULATION(682U); -// Register this check class (by creating a static instance of it) -namespace { - CheckNullPointer instance; -} - //--------------------------------------------------------------------------- static bool checkNullpointerFunctionCallPlausibility(const Function* func, unsigned int arg) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 0c4ce7d63cf..b454c4410cf 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -49,11 +49,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckOther instance; -} - static const CWE CWE128(128U); // Wrap-around Error static const CWE CWE131(131U); // Incorrect Calculation of Buffer Size static const CWE CWE197(197U); // Numeric Truncation Error diff --git a/lib/checkpostfixoperator.cpp b/lib/checkpostfixoperator.cpp index c6c9ccba77b..d771177b2d2 100644 --- a/lib/checkpostfixoperator.cpp +++ b/lib/checkpostfixoperator.cpp @@ -34,12 +34,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckPostfixOperator instance; -} - - // CWE ids used static const CWE CWE398(398U); // Indicator of Poor Code Quality diff --git a/lib/checks.cpp b/lib/checks.cpp new file mode 100644 index 00000000000..169832c2745 --- /dev/null +++ b/lib/checks.cpp @@ -0,0 +1,123 @@ +/* + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2026 Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "checks.h" + +#include "check64bit.h" +#include "checkassert.h" +#include "checkautovariables.h" +#include "checkbool.h" +#include "checkbufferoverrun.h" +#include "checkclass.h" +#include "checkcondition.h" +#include "checkexceptionsafety.h" +#include "checkfunctions.h" +#include "checkinternal.h" +#include "checkio.h" +#include "checkleakautovar.h" +#include "checkmemoryleak.h" +#include "checknullpointer.h" +#include "checkother.h" +#include "checkpostfixoperator.h" +#include "checksizeof.h" +#include "checkstl.h" +#include "checkstring.h" +#include "checktype.h" +#include "checkuninitvar.h" +#include "checkunusedvar.h" +#include "checkvaarg.h" + +class CheckInstancesImpl +{ +private: +/* *INDENT-OFF* */ +#define UPI(c) std::unique_ptr m##c{new c} +/* *INDENT-ON* */ + UPI(Check64BitPortability); + UPI(CheckAssert); + UPI(CheckAutoVariables); + UPI(CheckBool); + UPI(CheckBufferOverrun); + UPI(CheckClass); + UPI(CheckCondition); + UPI(CheckExceptionSafety); + UPI(CheckFunctions); +#ifdef CHECK_INTERNAL + UPI(CheckInternal); +#endif + UPI(CheckIO); + UPI(CheckLeakAutoVar); + UPI(CheckMemoryLeakInFunction); + UPI(CheckMemoryLeakInClass); + UPI(CheckMemoryLeakStructMember); + UPI(CheckMemoryLeakNoVar); + UPI(CheckNullPointer); + UPI(CheckOther); + UPI(CheckPostfixOperator); + UPI(CheckSizeof); + UPI(CheckStl); + UPI(CheckString); + UPI(CheckType); + UPI(CheckUninitVar); + UPI(CheckUnusedVar); + UPI(CheckVaarg); +#undef UPI + +public: + const std::list& get() const + { + static std::list s_checks{ + mCheck64BitPortability.get(), + mCheckAssert.get(), + mCheckAutoVariables.get(), + mCheckBool.get(), + mCheckBufferOverrun.get(), + mCheckClass.get(), + mCheckCondition.get(), + mCheckExceptionSafety.get(), + mCheckFunctions.get(), + #ifdef CHECK_INTERNAL + mCheckInternal.get(), + #endif + mCheckIO.get(), + mCheckLeakAutoVar.get(), + mCheckMemoryLeakInFunction.get(), + mCheckMemoryLeakInClass.get(), + mCheckMemoryLeakStructMember.get(), + mCheckMemoryLeakNoVar.get(), + mCheckNullPointer.get(), + mCheckOther.get(), + mCheckPostfixOperator.get(), + mCheckSizeof.get(), + mCheckStl.get(), + mCheckString.get(), + mCheckType.get(), + mCheckUninitVar.get(), + mCheckUnusedVar.get(), + mCheckVaarg.get() + }; + + return s_checks; + } +}; + +const std::list& CheckInstances::get() +{ + static const CheckInstancesImpl s_impl; + return s_impl.get(); +} diff --git a/lib/checks.h b/lib/checks.h new file mode 100644 index 00000000000..ec4a78c2008 --- /dev/null +++ b/lib/checks.h @@ -0,0 +1,34 @@ +/* -*- C++ -*- + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2026 Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef checksH +#define checksH + +#include "config.h" + +#include + +class Check; + +namespace CheckInstances +{ + /** List of registered check classes. This is used by Cppcheck to run checks and generate documentation */ + CPPCHECKLIB const std::list& get(); +}; + +#endif // checksH diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index f7c0d44d399..134cca92b7f 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -34,11 +34,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckSizeof instance; -} - // CWE IDs used: static const CWE CWE467(467U); // Use of sizeof() on a Pointer Type static const CWE CWE682(682U); // Incorrect Calculation diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index faa6f25911d..b1543f4af37 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -46,11 +46,6 @@ #include #include -// Register this check class (by creating a static instance of it) -namespace { - CheckStl instance; -} - // CWE IDs used: static const CWE CWE398(398U); // Indicator of Poor Code Quality static const CWE CWE597(597U); // Use of Wrong Operator in String Comparison diff --git a/lib/checkstring.cpp b/lib/checkstring.cpp index 64b575df72d..580597bb10d 100644 --- a/lib/checkstring.cpp +++ b/lib/checkstring.cpp @@ -36,11 +36,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckString instance; -} - // CWE ids used: static const CWE CWE570(570U); // Expression is Always False static const CWE CWE571(571U); // Expression is Always True diff --git a/lib/checktype.cpp b/lib/checktype.cpp index 3f42bf075ef..eb222fbe6f5 100644 --- a/lib/checktype.cpp +++ b/lib/checktype.cpp @@ -44,11 +44,6 @@ //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckType instance; -} - //--------------------------------------------------------------------------- // Checking for shift by too many bits //--------------------------------------------------------------------------- diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index a7a4d8b1bf3..b88debda6f8 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -50,11 +50,6 @@ // CWE ids used: static const CWE CWE_USE_OF_UNINITIALIZED_VARIABLE(457U); -// Register this check class (by creating a static instance of it) -namespace { - CheckUninitVar instance; -} - //--------------------------------------------------------------------------- // get ast parent, skip possible address-of and casts diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 6dd98de078e..9531237a208 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -40,11 +40,6 @@ #include //--------------------------------------------------------------------------- -// Register this check class (by creating a static instance of it) -namespace { - CheckUnusedVar instance; -} - static const CWE CWE563(563U); // Assignment to Variable without Use ('Unused Variable') static const CWE CWE665(665U); // Improper Initialization diff --git a/lib/checkvaarg.cpp b/lib/checkvaarg.cpp index 8151957a7d7..e6efc8f5ed9 100644 --- a/lib/checkvaarg.cpp +++ b/lib/checkvaarg.cpp @@ -30,14 +30,6 @@ #include #include -//--------------------------------------------------------------------------- - -// Register this check class (by creating a static instance of it) -namespace { - CheckVaarg instance; -} - - //--------------------------------------------------------------------------- // Ensure that correct parameter is passed to va_start() //--------------------------------------------------------------------------- diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 652bd4f5bef..f39e64a938f 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -21,6 +21,7 @@ #include "addoninfo.h" #include "analyzerinfo.h" #include "check.h" +#include "checks.h" #include "checkunusedfunctions.h" #include "clangimport.h" #include "color.h" @@ -1338,7 +1339,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation const std::time_t maxTime = mSettings.checksMaxTime > 0 ? std::time(nullptr) + mSettings.checksMaxTime : 0; // call all "runChecks" in all registered Check classes - for (Check * const c : Check::instances()) { + for (Check * const c : CheckInstances::get()) { if (Settings::terminated()) return; @@ -1387,7 +1388,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation } if (!doUnusedFunctionOnly) { - for (const Check * const c : Check::instances()) { + for (const Check * const c : CheckInstances::get()) { if (Check::FileInfo * const fi = c->getFileInfo(tokenizer, mSettings, currentConfig)) { if (analyzerInformation) analyzerInformation->setFileInfo(c->name(), fi->toString()); @@ -1712,7 +1713,7 @@ void CppCheck::getErrorMessages(ErrorLogger &errorlogger) s.addEnabled("all"); // call all "getErrorMessages" in all registered Check classes - for (const Check * const c : Check::instances()) + for (const Check * const c : CheckInstances::get()) c->getErrorMessages(&errorlogger, &s); CheckUnusedFunctions::getErrorMessages(errorlogger); @@ -1830,7 +1831,7 @@ bool CppCheck::analyseWholeProgram() } } - for (Check * const c : Check::instances()) + for (Check * const c : CheckInstances::get()) errors |= c->analyseWholeProgram(ctu, mFileInfo, mSettings, mErrorLogger); // TODO: ctu } @@ -1861,7 +1862,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st ctuFileInfo.loadFromXml(e); return; } - for (const Check *check : Check::instances()) { + for (const Check *check : CheckInstances::get()) { if (checkattr == check->name()) { if (Check::FileInfo* fi = check->loadFileInfoFromXml(e)) { fi->file0 = filesTxtInfo.sourceFile; @@ -1878,7 +1879,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st } else { // Analyse the tokens - for (Check * const c : Check::instances()) + for (Check * const c : CheckInstances::get()) c->analyseWholeProgram(ctuFileInfo, fileInfoList, mSettings, mErrorLogger); } diff --git a/lib/cppcheck.vcxproj b/lib/cppcheck.vcxproj index b0e52a814fe..12bd4898d4a 100644 --- a/lib/cppcheck.vcxproj +++ b/lib/cppcheck.vcxproj @@ -57,6 +57,7 @@ + @@ -130,6 +131,7 @@ + diff --git a/oss-fuzz/Makefile b/oss-fuzz/Makefile index b2a42dba2a7..c93b8694065 100644 --- a/oss-fuzz/Makefile +++ b/oss-fuzz/Makefile @@ -65,6 +65,7 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/checknullpointer.o \ $(libcppdir)/checkother.o \ $(libcppdir)/checkpostfixoperator.o \ + $(libcppdir)/checks.o \ $(libcppdir)/checksizeof.o \ $(libcppdir)/checkstl.o \ $(libcppdir)/checkstring.o \ @@ -230,6 +231,9 @@ $(libcppdir)/checkother.o: ../lib/checkother.cpp ../lib/addoninfo.h ../lib/astut $(libcppdir)/checkpostfixoperator.o: ../lib/checkpostfixoperator.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkpostfixoperator.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp +$(libcppdir)/checks.o: ../lib/checks.cpp ../lib/check.h ../lib/check64bit.h ../lib/checkassert.h ../lib/checkautovariables.h ../lib/checkbool.h ../lib/checkbufferoverrun.h ../lib/checkclass.h ../lib/checkcondition.h ../lib/checkexceptionsafety.h ../lib/checkfunctions.h ../lib/checkinternal.h ../lib/checkio.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/checkother.h ../lib/checkpostfixoperator.h ../lib/checks.h ../lib/checksizeof.h ../lib/checkstl.h ../lib/checkstring.h ../lib/checktype.h ../lib/checkuninitvar.h ../lib/checkunusedvar.h ../lib/checkvaarg.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/standards.h ../lib/vfvalue.h + $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp + $(libcppdir)/checksizeof.o: ../lib/checksizeof.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checksizeof.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp @@ -260,7 +264,7 @@ $(libcppdir)/clangimport.o: ../lib/clangimport.cpp ../lib/clangimport.h ../lib/c $(libcppdir)/color.o: ../lib/color.cpp ../lib/color.h ../lib/config.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/color.cpp -$(libcppdir)/cppcheck.o: ../lib/cppcheck.cpp ../externals/picojson/picojson.h ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/check.h ../lib/checkers.h ../lib/checkunusedfunctions.h ../lib/clangimport.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/suppressions.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/version.h ../lib/vfvalue.h +$(libcppdir)/cppcheck.o: ../lib/cppcheck.cpp ../externals/picojson/picojson.h ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/check.h ../lib/checkers.h ../lib/checks.h ../lib/checkunusedfunctions.h ../lib/clangimport.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/suppressions.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/version.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/cppcheck.cpp $(libcppdir)/ctu.o: ../lib/ctu.cpp ../externals/tinyxml2/tinyxml2.h ../lib/astutils.h ../lib/check.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h diff --git a/test/fixture.h b/test/fixture.h index fe767a3a16a..bbf986d8e4d 100644 --- a/test/fixture.h +++ b/test/fixture.h @@ -21,6 +21,7 @@ #define fixtureH #include "check.h" +#include "checks.h" #include "color.h" #include "config.h" #include "errorlogger.h" @@ -138,7 +139,7 @@ class TestFixture : public ErrorLogger { template static T& getCheck() { - for (Check *check : Check::instances()) { + for (Check *check : CheckInstances::get()) { //cppcheck-suppress useStlAlgorithm if (T* c = dynamic_cast(check)) return *c; diff --git a/test/testcheck.cpp b/test/testcheck.cpp index b07c7e0db0c..3ae2cad3d8f 100644 --- a/test/testcheck.cpp +++ b/test/testcheck.cpp @@ -17,6 +17,7 @@ */ #include "check.h" +#include "checks.h" #include "fixture.h" #include @@ -28,23 +29,11 @@ class TestCheck : public TestFixture { private: void run() override { - TEST_CASE(instancesSorted); TEST_CASE(classInfoFormat); } - void instancesSorted() const { - const auto& checks = Check::instances(); - for (auto i = checks.cbegin(); i != checks.cend(); ++i) { - auto j = i; - ++j; - if (j != checks.cend()) { - ASSERT_EQUALS(true, (*i)->name() < (*j)->name()); - } - } - } - void classInfoFormat() const { - for (const Check * const c : Check::instances()) { + for (const Check * const c : CheckInstances::get()) { const std::string info = c->classInfo(); if (!info.empty()) { ASSERT('\n' != info[0]); // No \n in the beginning diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 38baa798fed..289b22b284e 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -17,6 +17,7 @@ */ #include "check.h" +#include "checks.h" #include "errortypes.h" #include "fixture.h" #include "helpers.h" @@ -285,7 +286,7 @@ class TestGarbage : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // call all "runChecks" in all registered Check classes - for (Check * const c : Check::instances()) { + for (Check * const c : CheckInstances::get()) { c->runChecks(tokenizer, this); } From d9016615387e63473eaf478d7eef10c38e55dad0 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 16 May 2026 19:12:58 +0200 Subject: [PATCH 008/171] Fix #14697 FN uninitMemberVarNoCtor when mixing (un)initialized member variables (#8557) After #8556 --------- Co-authored-by: chrchr-github --- lib/checkclass.cpp | 9 ++++++++- test/testconstructors.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 9c0ad424112..3313fb636ed 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -346,6 +346,8 @@ void CheckClass::constructors() // Variables with default initializers bool hasAnyDefaultInit = false; + bool hasAnySelfInit = false; + const bool cpp14OrLater = mSettings->standards.cpp >= Standards::CPP14; for (Usage& usage : usageList) { const Variable& var = *usage.var; @@ -353,9 +355,11 @@ void CheckClass::constructors() if (var.hasDefault()) { usage.init = true; hasAnyDefaultInit = true; + } else if (cpp14OrLater && !hasAnySelfInit && isInitialized(usage, FunctionType::eConstructor)) { + hasAnySelfInit = true; } } - if (!hasAnyDefaultInit) + if (!hasAnyDefaultInit && !hasAnySelfInit) continue; handleUnionMembers(usageList); @@ -366,6 +370,9 @@ void CheckClass::constructors() continue; const Variable& var = *usage.var; + if (var.typeScope() && var.typeScope()->numConstructors > 0) + continue; + if (diagVars.count(&var) == 0) uninitVarError(var.nameToken(), false, FunctionType::eConstructor, var.scope()->className, var.name(), false, false, true); } diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 7fb5889c88a..0eb91ba8cca 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -769,6 +769,34 @@ class TestConstructors : public TestFixture { " int a, b;\n" "};\n"); ASSERT_EQUALS("", errout_str()); + + check("struct S {\n" + " explicit S(int);\n" + " S(const S&);\n" + " int i;\n" + "};\n" + "struct T {\n" + " S s;\n" + " int j{};\n" + "};\n"); + ASSERT_EQUALS("", errout_str()); + + const char code[] = "struct S { int i = 0; };\n" // #14697 + "struct T {\n" + " S s;\n" + " int j;\n" + "};\n" + "struct U {\n" + " std::string a;\n" + " int k;\n" + "};\n"; + const Settings s = settingsBuilder(settings).cpp(Standards::CPP11).build(); + check(code, s); + ASSERT_EQUALS("", errout_str()); + check(code); + ASSERT_EQUALS("[test.cpp:4:9]: (warning) Member variable 'T::j' has no initializer. [uninitMemberVarNoCtor]\n" + "[test.cpp:8:9]: (warning) Member variable 'U::k' has no initializer. [uninitMemberVarNoCtor]\n", + errout_str()); } // ticket #4290 "False Positive: style (noConstructor): The class 'foo' does not have a constructor." From f4cc43a6770d9cdc53c519fabda7e4f9f679c078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Mon, 18 May 2026 10:38:52 +0200 Subject: [PATCH 009/171] ProcessExecutor: avoid explicit usage of suppressions (#4989) The `hasToLog()` call performs this check. --- cli/processexecutor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/processexecutor.cpp b/cli/processexecutor.cpp index a410f58d5ea..e77a75ba39e 100644 --- a/cli/processexecutor.cpp +++ b/cli/processexecutor.cpp @@ -515,7 +515,7 @@ void ProcessExecutor::reportInternalChildErr(const std::string &childname, const "cppcheckError", Certainty::normal); - if (!mSuppressions.nomsg.isSuppressed(errmsg, {})) + if (hasToLog(errmsg)) mErrorLogger.reportErr(errmsg); } From 39d9c01abd888f82984c083666fdaa80b9b9b12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Mon, 18 May 2026 10:39:19 +0200 Subject: [PATCH 010/171] testrunner: do not use global check instances (#8561) --- Makefile | 148 +++++++++++++++++------------------ test/fixture.h | 16 +--- test/testassert.cpp | 4 +- test/testautovariables.cpp | 3 +- test/testbool.cpp | 4 +- test/testbufferoverrun.cpp | 19 ++--- test/testclass.cpp | 7 +- test/testcondition.cpp | 11 +-- test/testexceptionsafety.cpp | 4 +- test/testfunctions.cpp | 3 +- test/testinternal.cpp | 4 +- test/testio.cpp | 3 +- test/testleakautovar.cpp | 32 +++----- test/testnullpointer.cpp | 24 +++--- test/testother.cpp | 12 +-- test/testsizeof.cpp | 8 +- test/teststl.cpp | 10 ++- test/teststring.cpp | 4 +- test/testtype.cpp | 12 +-- test/testuninitvar.cpp | 3 +- test/testvaarg.cpp | 4 +- 21 files changed, 161 insertions(+), 174 deletions(-) diff --git a/Makefile b/Makefile index 932a1ad302b..5a348e27001 100644 --- a/Makefile +++ b/Makefile @@ -732,238 +732,238 @@ cli/stacktrace.o: cli/stacktrace.cpp cli/stacktrace.h lib/config.h lib/utils.h cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/threadexecutor.cpp -test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h +test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/fixture.cpp test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/helpers.cpp -test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/main.cpp test/options.o: test/options.cpp lib/config.h lib/timer.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/options.cpp -test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/test64bit.cpp -test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testanalyzerinformation.cpp -test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testassert.cpp -test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testastutils.cpp -test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testautovariables.cpp -test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbool.cpp -test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbufferoverrun.cpp -test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcharvar.cpp test/testcheck.o: test/testcheck.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheck.cpp -test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheckersreport.cpp -test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclangimport.cpp -test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclass.cpp -test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcmdlineparser.cpp -test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcolor.cpp -test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcondition.cpp -test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testconstructors.cpp -test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcppcheck.cpp -test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h +test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testerrorlogger.cpp -test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexceptionsafety.cpp -test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexecutor.cpp -test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilelister.cpp -test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilesettings.cpp -test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfrontend.cpp -test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfunctions.cpp test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testgarbage.cpp -test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h +test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testimportproject.cpp -test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testincompletestatement.cpp -test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkinternal.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testinternal.cpp -test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkio.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testio.cpp -test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkleakautovar.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testleakautovar.cpp -test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testlibrary.cpp -test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmathlib.cpp -test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkmemoryleak.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmemleak.cpp -test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/checks.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testnullpointer.cpp -test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testoptions.cpp -test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testother.cpp -test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpath.cpp -test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpathmatch.cpp -test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testplatform.cpp -test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkpostfixoperator.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpostfixoperator.cpp -test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpreprocessor.cpp -test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprocessexecutor.cpp -test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprogrammemory.cpp -test/testregex.o: test/testregex.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testregex.o: test/testregex.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testregex.cpp -test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsarifreport.cpp -test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsettings.cpp -test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytemplate.cpp -test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytokens.cpp -test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytypedef.cpp -test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifyusing.cpp -test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsingleexecutor.cpp -test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsizeof.cpp -test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststandards.cpp -test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststl.cpp -test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststring.cpp -test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsummaries.cpp -test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsuppressions.cpp -test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsymboldatabase.cpp -test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testthreadexecutor.cpp -test/testtimer.o: test/testtimer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h +test/testtimer.o: test/testtimer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtimer.cpp -test/testtoken.o: test/testtoken.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtoken.o: test/testtoken.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtoken.cpp -test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenize.cpp -test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenlist.cpp -test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenrange.cpp -test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtype.cpp -test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testuninitvar.cpp -test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedfunctions.cpp -test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedprivfunc.cpp -test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedvar.cpp -test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testutils.cpp -test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvaarg.cpp -test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvalueflow.cpp -test/testvarid.o: test/testvarid.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvarid.o: test/testvarid.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvarid.cpp -test/testvfvalue.o: test/testvfvalue.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testvfvalue.o: test/testvfvalue.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvfvalue.cpp externals/simplecpp/simplecpp.o: externals/simplecpp/simplecpp.cpp externals/simplecpp/simplecpp.h diff --git a/test/fixture.h b/test/fixture.h index bbf986d8e4d..b927dc5de65 100644 --- a/test/fixture.h +++ b/test/fixture.h @@ -21,7 +21,6 @@ #define fixtureH #include "check.h" -#include "checks.h" #include "color.h" #include "config.h" #include "errorlogger.h" @@ -33,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -136,21 +134,13 @@ class TestFixture : public ErrorLogger { void processOptions(const options& args); - template - static T& getCheck() + static Check& getCheck(Check& check) { - for (Check *check : CheckInstances::get()) { - //cppcheck-suppress useStlAlgorithm - if (T* c = dynamic_cast(check)) - return *c; - } - throw std::runtime_error("instance not found"); + return check; } - template - static void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) + static void runChecks(Check& check, const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - Check& check = getCheck(); check.runChecks(tokenizer, errorLogger); } diff --git a/test/testassert.cpp b/test/testassert.cpp index 412a7cb750b..e14825e46b2 100644 --- a/test/testassert.cpp +++ b/test/testassert.cpp @@ -39,8 +39,8 @@ class TestAssert : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckAssert check; + runChecks(check, tokenizer, this); } void run() override { diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 008dc645419..2474c2fe6a5 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -47,7 +47,8 @@ class TestAutoVariables : public TestFixture { SimpleTokenizer tokenizer(settings1, *this, options.cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - runChecks(tokenizer, this); + CheckAutoVariables check; + runChecks(check, tokenizer, this); } void run() override { diff --git a/test/testbool.cpp b/test/testbool.cpp index 61bc1b36d9e..ccf4d7860c4 100644 --- a/test/testbool.cpp +++ b/test/testbool.cpp @@ -88,8 +88,8 @@ class TestBool : public TestFixture { SimpleTokenizer tokenizer(settings, *this, options.cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check... - runChecks(tokenizer, this); + CheckBool check; + runChecks(check, tokenizer, this); } diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 8a7c1d311b0..5d545606387 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -56,8 +56,8 @@ class TestBufferOverrun : public TestFixture { SimpleTokenizer tokenizer(settings, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for buffer overruns.. - runChecks(tokenizer, this); + CheckBufferOverrun check; + runChecks(check, tokenizer, this); } // TODO: get rid of this @@ -66,8 +66,8 @@ class TestBufferOverrun : public TestFixture { SimpleTokenizer tokenizer(settings0_i, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for buffer overruns.. - runChecks(tokenizer, this); + CheckBufferOverrun check; + runChecks(check, tokenizer, this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -79,8 +79,8 @@ class TestBufferOverrun : public TestFixture { // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Check for buffer overruns.. - runChecks(tokenizer, this); + CheckBufferOverrun check; + runChecks(check, tokenizer, this); } void run() override { @@ -5169,7 +5169,8 @@ class TestBufferOverrun : public TestFixture { void getErrorMessages() { // Ticket #2292: segmentation fault when using --errorlist - const Check& c = getCheck(); + CheckBufferOverrun check; + const Check& c = getCheck(check); c.getErrorMessages(this, nullptr); // we are not interested in the output - just consume it ignore_errout(); @@ -5362,9 +5363,9 @@ class TestBufferOverrun : public TestFixture { CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); - // Check code.. std::list fileInfo; - Check& c = getCheck(); + CheckBufferOverrun check; + Check& c = getCheck(check); fileInfo.push_back(c.getFileInfo(tokenizer, settings0, "")); c.analyseWholeProgram(*ctu, fileInfo, settings0, *this); // TODO: check result while (!fileInfo.empty()) { diff --git a/test/testclass.cpp b/test/testclass.cpp index 2cecdfe80f6..c1b801c208b 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -9278,7 +9278,8 @@ class TestClass : public TestFixture { void ctu(const std::vector &code) { - Check &check = getCheck(); + CheckClass checkClass; + Check &check = getCheck(checkClass); // getFileInfo std::list fileInfo; @@ -9330,8 +9331,8 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings1, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - const Check& c = getCheck(); + CheckClass check; + const Check& c = getCheck(check); Check::FileInfo * fileInfo = (c.getFileInfo)(tokenizer, settings1, ""); delete fileInfo; diff --git a/test/testcondition.cpp b/test/testcondition.cpp index f0764dd2bd6..9a15349aff0 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -149,8 +149,8 @@ class TestCondition : public TestFixture { // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Run checks.. - runChecks(tokenizer, this); + CheckCondition check; + runChecks(check, tokenizer, this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -162,8 +162,8 @@ class TestCondition : public TestFixture { // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Run checks.. - runChecks(tokenizer, this); + CheckCondition check; + runChecks(check, tokenizer, this); } void assignAndCompare() { @@ -527,7 +527,8 @@ class TestCondition : public TestFixture { SimpleTokenizer tokenizer(settings1, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - runChecks(tokenizer, this); + CheckCondition check; + runChecks(check, tokenizer, this); } void multicompare() { diff --git a/test/testexceptionsafety.cpp b/test/testexceptionsafety.cpp index 58b26ecbc27..46c995c231b 100644 --- a/test/testexceptionsafety.cpp +++ b/test/testexceptionsafety.cpp @@ -75,8 +75,8 @@ class TestExceptionSafety : public TestFixture { SimpleTokenizer tokenizer(settings1, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check char variable usage.. - runChecks(tokenizer, this); + CheckExceptionSafety check; + runChecks(check, tokenizer, this); } void destructors() { diff --git a/test/testfunctions.cpp b/test/testfunctions.cpp index 8bbd3d92c6b..9ddb4c1f43c 100644 --- a/test/testfunctions.cpp +++ b/test/testfunctions.cpp @@ -132,7 +132,8 @@ class TestFunctions : public TestFixture { SimpleTokenizer tokenizer(s, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - runChecks(tokenizer, this); + CheckFunctions check; + runChecks(check, tokenizer, this); } void prohibitedFunctions_posix() { diff --git a/test/testinternal.cpp b/test/testinternal.cpp index 009129c5dc1..10431adcd38 100644 --- a/test/testinternal.cpp +++ b/test/testinternal.cpp @@ -56,8 +56,8 @@ class TestInternal : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckInternal check; + runChecks(check, tokenizer, this); } void simplePatternInTokenMatch() { diff --git a/test/testio.cpp b/test/testio.cpp index 02180f12376..67f7aad7fe5 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -113,7 +113,8 @@ class TestIO : public TestFixture { checkIO.checkWrongPrintfScanfArguments(); return; } - runChecks(tokenizer, this); + CheckIO check; + runChecks(check, tokenizer, this); } void coutCerrMisusage() { diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index b038270dcb7..265e31bf3c2 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -226,23 +226,17 @@ class TestLeakAutoVar : public TestFixture { template void check_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) { const Settings& settings1 = options.s ? *options.s : settings; - - // Tokenize.. - SimpleTokenizer tokenizer(settings1, *this, options.cpp); - ASSERT_LOC(tokenizer.tokenize(code), file, line); - - // Check for leaks.. - runChecks(tokenizer, this); + check_(file, line, code, settings1, options.cpp); } template - void check_(const char* file, int line, const char (&code)[size], const Settings & s) { + void check_(const char* file, int line, const char (&code)[size], const Settings & s, bool cpp = true) { // Tokenize.. - SimpleTokenizer tokenizer(s, *this); + SimpleTokenizer tokenizer(s, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for leaks.. - runChecks(tokenizer, this); + CheckLeakAutoVar check; + runChecks(check, tokenizer, this); } void assign1() { @@ -3272,8 +3266,8 @@ class TestLeakAutoVarRecursiveCountLimit : public TestFixture { // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Check for leaks.. - runChecks(tokenizer, this); + CheckLeakAutoVar check; + runChecks(check, tokenizer, this); } void run() override { @@ -3319,8 +3313,8 @@ class TestLeakAutoVarStrcpy : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for leaks.. - runChecks(tokenizer, this); + CheckLeakAutoVar check; + runChecks(check, tokenizer, this); } void run() override { @@ -3424,8 +3418,8 @@ class TestLeakAutoVarWindows : public TestFixture { SimpleTokenizer tokenizer(settings, *this, false); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for leaks.. - runChecks(tokenizer, this); + CheckLeakAutoVar check; + runChecks(check, tokenizer, this); } void run() override { @@ -3497,8 +3491,8 @@ class TestLeakAutoVarPosix : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for leaks.. - runChecks(tokenizer, this); + CheckLeakAutoVar check; + runChecks(check, tokenizer, this); } void run() override { diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index c025d7462d4..a154bd0d9c2 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -190,23 +190,17 @@ class TestNullPointer : public TestFixture { template void check_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) { const Settings& settings1 = options.inconclusive ? settings_i : settings; - - // Tokenize.. - SimpleTokenizer tokenizer(settings1, *this, options.cpp); - ASSERT_LOC(tokenizer.tokenize(code), file, line); - - // Check for null pointer dereferences.. - runChecks(tokenizer, this); + check_(file, line, code, settings1, options.cpp); } template - void check_(const char* file, int line, const char (&code)[size], bool cpp, const Settings& s) { + void check_(const char* file, int line, const char (&code)[size], const Settings& s, bool cpp = true) { // Tokenize.. SimpleTokenizer tokenizer(s, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for null pointer dereferences.. - runChecks(tokenizer, this); + CheckNullPointer check; + runChecks(check, tokenizer, this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -217,8 +211,8 @@ class TestNullPointer : public TestFixture { // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Check for null pointer dereferences.. - runChecks(tokenizer, this); + CheckNullPointer check; + runChecks(check, tokenizer, this); } @@ -1349,7 +1343,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("[test.cpp:4:11]: (error) Null pointer dereference: i [nullPointer]\n", errout_str()); const Settings s = settingsBuilder(settings).c(Standards::C17).build(); - check(code, false, s); // C17 file => nullptr does not mean NULL + check(code, s, false); // C17 file => nullptr does not mean NULL ASSERT_EQUALS("", errout_str()); check(code, dinit(CheckOptions, $.cpp = false)); @@ -4698,9 +4692,9 @@ class TestNullPointer : public TestFixture { CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); - // Check code.. + CheckNullPointer check; + Check& c = getCheck(check); std::list fileInfo; - Check& c = getCheck(); fileInfo.push_back(c.getFileInfo(tokenizer, settings, "")); c.analyseWholeProgram(*ctu, fileInfo, settings, *this); // TODO: check result while (!fileInfo.empty()) { diff --git a/test/testother.cpp b/test/testother.cpp index cfdcffe05d3..9a18a067231 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -367,8 +367,8 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizer(*settings, *this, opt.cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckOther check; + runChecks(check, tokenizer, this); } struct CheckPOptions @@ -384,8 +384,8 @@ class TestOther : public TestFixture { // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Check.. - runChecks(tokenizer, this); + CheckOther check; + runChecks(check, tokenizer, this); } template @@ -12314,8 +12314,8 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizer(settings, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckOther check; + runChecks(check, tokenizer, this); } void testEvaluationOrder() { diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index ad8aa3192af..b25afe8d153 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -54,8 +54,8 @@ class TestSizeof : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check... - runChecks(tokenizer, this); + CheckSizeof check; + runChecks(check, tokenizer, this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -66,8 +66,8 @@ class TestSizeof : public TestFixture { // Tokenize.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Check... - runChecks(tokenizer, this); + CheckSizeof check; + runChecks(check, tokenizer, this); } void sizeofsizeof() { diff --git a/test/teststl.cpp b/test/teststl.cpp index 92933c37449..84dae0b0b35 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -199,7 +199,8 @@ class TestStl : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); - runChecks(tokenizer, this); + CheckStl check; + runChecks(check, tokenizer, this); } // TODO: get rid of this @@ -209,7 +210,8 @@ class TestStl : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); - runChecks(tokenizer, this); + CheckStl check; + runChecks(check, tokenizer, this); } #define checkNormal(...) checkNormal_(__FILE__, __LINE__, __VA_ARGS__) @@ -219,8 +221,8 @@ class TestStl : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckStl check; + runChecks(check, tokenizer, this); } void outOfBounds() { diff --git a/test/teststring.cpp b/test/teststring.cpp index 051aa870788..e0e401256e2 100644 --- a/test/teststring.cpp +++ b/test/teststring.cpp @@ -74,8 +74,8 @@ class TestString : public TestFixture { // Tokenize.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Check char variable usage.. - runChecks(tokenizer, this); + CheckString check; + runChecks(check, tokenizer, this); } void stringLiteralWrite() { diff --git a/test/testtype.cpp b/test/testtype.cpp index 280e3357f85..80c3dfd32b8 100644 --- a/test/testtype.cpp +++ b/test/testtype.cpp @@ -61,8 +61,8 @@ class TestType : public TestFixture { SimpleTokenizer tokenizer(settings1, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckType check; + runChecks(check, tokenizer, this); } // TODO: get rid of this @@ -73,8 +73,8 @@ class TestType : public TestFixture { SimpleTokenizer tokenizer(settings1, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckType check; + runChecks(check, tokenizer, this); } struct CheckPOptions @@ -93,8 +93,8 @@ class TestType : public TestFixture { // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); - // Check.. - runChecks(tokenizer, this); + CheckType check; + runChecks(check, tokenizer, this); } void checkTooBigShift_Unix32() { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index db499dabf72..6fe563a57ca 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -5580,7 +5580,8 @@ class TestUninitVar : public TestFixture { // Check code.. std::list fileInfo; - Check& c = getCheck(); + CheckUninitVar check; + Check& c = getCheck(check); fileInfo.push_back(c.getFileInfo(tokenizer, settings, "")); c.analyseWholeProgram(*ctu, fileInfo, settings, *this); // TODO: check result while (!fileInfo.empty()) { diff --git a/test/testvaarg.cpp b/test/testvaarg.cpp index 36e1d2cb038..33fb6c11389 100644 --- a/test/testvaarg.cpp +++ b/test/testvaarg.cpp @@ -38,8 +38,8 @@ class TestVaarg : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check.. - runChecks(tokenizer, this); + CheckVaarg check; + runChecks(check, tokenizer, this); } void run() override { From 978b9c5cf6073f1db271fbe494bf820d3c5d3ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Berder?= <18538310+francois-berder@users.noreply.github.com> Date: Mon, 18 May 2026 10:39:29 +0200 Subject: [PATCH 011/171] Fix #1473: warn when fclose() is used as a while loop condition (#8444) Using fclose() as a while loop condition closes the file on every iteration and operates on an already-closed file handle from the second iteration onward. --------- Signed-off-by: Francois Berder --- lib/checkio.cpp | 32 +++++++++++++++++++++ lib/checkio.h | 1 + man/checkers/fcloseInLoopCondition.md | 40 +++++++++++++++++++++++++++ releasenotes.txt | 1 + test/testio.cpp | 24 +++++++++++++++- 5 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 man/checkers/fcloseInLoopCondition.md diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 32bedf8024f..4161b9b224d 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -240,6 +240,28 @@ void CheckIO::checkFileUsage() } else if (tok->str() == "fclose") { fileTok = tok->tokAt(2); operation = Filepointer::Operation::CLOSE; + + // #1473 Check if fclose is in a while loop condition + if (fileTok && fileTok->isVariable()) { + const Token* loopTok = tok->astTop()->previous(); + + if (loopTok && loopTok->str() == "while") { + const Token* bodyEnd = nullptr; + const Token* bodyStart = nullptr; + + if (Token::simpleMatch(loopTok->previous(), "}") && loopTok->previous()->scope()->type == ScopeType::eDo) { // Handle do-while loops + bodyEnd = loopTok->previous(); + bodyStart = bodyEnd->link(); + } else { + bodyStart = loopTok->linkAt(1)->next(); + bodyEnd = bodyStart->link(); + } + + // Do not trigger a warning if the loop always exits or if the file is opened again in the loop. + if (!isReturnScope(bodyEnd, mSettings->library) && Token::findmatch(bodyStart, "%var% =", bodyEnd, fileTok->varId()) == nullptr) + fcloseInLoopConditionError(tok, fileTok->str()); + } + } } else if (whitelist.find(tok->str()) != whitelist.end()) { fileTok = tok->tokAt(2); if ((tok->str() == "ungetc" || tok->str() == "ungetwc") && fileTok) @@ -387,6 +409,15 @@ void CheckIO::useClosedFileError(const Token *tok) "useClosedFile", "Used file that is not opened.", CWE910, Certainty::normal); } +void CheckIO::fcloseInLoopConditionError(const Token *tok, const std::string &varname) +{ + reportError(tok, Severity::warning, + "fcloseInLoopCondition", + "fclose() used as loop condition may skip loop body or double-close file handle.\n" + "fclose() closes '" + varname + "' each time it is evaluated. On success the loop body might never execute, on failure fclose() might be called again on the already-closed file handle.", + CWE910, Certainty::normal); +} + void CheckIO::seekOnAppendedFileError(const Token *tok) { reportError(tok, Severity::warning, @@ -2038,6 +2069,7 @@ void CheckIO::getErrorMessages(ErrorLogger *errorLogger, const Settings *setting c.readWriteOnlyFileError(nullptr); c.writeReadOnlyFileError(nullptr); c.useClosedFileError(nullptr); + c.fcloseInLoopConditionError(nullptr, "fp"); c.seekOnAppendedFileError(nullptr); c.incompatibleFileOpenError(nullptr, "tmp"); c.invalidScanfError(nullptr); diff --git a/lib/checkio.h b/lib/checkio.h index e37a942770b..b3c86da3577 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -105,6 +105,7 @@ class CPPCHECKLIB CheckIO : public Check { void readWriteOnlyFileError(const Token *tok); void writeReadOnlyFileError(const Token *tok); void useClosedFileError(const Token *tok); + void fcloseInLoopConditionError(const Token *tok, const std::string &varname); void seekOnAppendedFileError(const Token *tok); void incompatibleFileOpenError(const Token *tok, const std::string &filename); void invalidScanfError(const Token *tok); diff --git a/man/checkers/fcloseInLoopCondition.md b/man/checkers/fcloseInLoopCondition.md new file mode 100644 index 00000000000..db7f0a584c6 --- /dev/null +++ b/man/checkers/fcloseInLoopCondition.md @@ -0,0 +1,40 @@ +# fcloseInLoopCondition + +**Message**: fclose() used as loop condition may skip loop body or double-close file handle.
+**Category**: Resource Management
+**Severity**: Warning
+**Language**: C and C++ + +## Description + +Using `fclose()` as a loop condition leads to two unwanted outcomes: + +- On **success**, the condition is false and the loop body never executes. The intent was likely to process the file inside the loop, but it is already closed. +- On **failure**, the condition is true and the loop body executes but `fclose()` is called again on the already-closed file handle on the next iteration, which is undefined behaviour. + +This pattern is almost always a misunderstanding of what `fclose()` returns, or confusion with a function that reads/processes data incrementally (like `fgets` or `fread`). Unlike those functions, `fclose()` is a one-shot teardown operation and has no meaningful retry or loop-until-done semantic. + +## How to fix + +Call `fclose()` outside the loop condition. If you need to check whether the close succeeded, store the return value and test it separately. + +Before: +```c +FILE *fp = fopen("data.txt", "r"); +while (fclose(fp)) { + /* process file */ +} +``` + +After: +```c +FILE *fp = fopen("data.txt", "r"); +/* process file */ +if (fclose(fp) != 0) { + /* handle close error */ +} +``` + +## Related checkers + +- `useClosedFile` - for using a file handle that has already been closed diff --git a/releasenotes.txt b/releasenotes.txt index ec8c6032da9..5d94da2ebc3 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -8,6 +8,7 @@ New checks: - MISRA C 2012 rule 10.3 now warns on assigning integer literals 0 and 1 to bool in C99 and later while preserving the existing C89 behavior. - funcArgNamesDifferentUnnamed warns on function declarations/definitions where a parameter in either location is unnamed - uninitMemberVarNoCtor warns on user-defined types where some but not all members requiring initialization have in-class initializers. +- fcloseInLoopCondition warns when fclose() is used as a while loop condition, which may skip the loop body or double-close the file handle. C/C++ support: - diff --git a/test/testio.cpp b/test/testio.cpp index 67f7aad7fe5..d3344f76b8d 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -545,7 +545,29 @@ class TestIO : public TestFixture { " FILE *a = fopen(\"aa\", \"r\");\n" " while (fclose(a)) {}\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3:5]: (error) Used file that is not opened. [useClosedFile]\n", "", errout_str()); + ASSERT_EQUALS("[test.cpp:3:12]: (warning) fclose() used as loop condition may skip loop body or double-close file handle. [fcloseInLoopCondition]\n", errout_str()); + + check("void foo() {\n" + " FILE *a = fopen(\"aa\", \"r\");\n" + " while (fclose(a)) {\n" + " break;\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout_str()); + + check("void foo() {\n" + " FILE *a = fopen(\"aa\", \"r\");\n" + " while (fclose(a)) {\n" + " a = fopen(\"aa\", \"r\");\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout_str()); + + check("void foo() {\n" + " FILE *a = fopen(\"aa\", \"r\");\n" + " do {} while (fclose(a));\n" + "}"); + ASSERT_EQUALS("[test.cpp:3:18]: (warning) fclose() used as loop condition may skip loop body or double-close file handle. [fcloseInLoopCondition]\n", errout_str()); // #6823 check("void foo() {\n" From 72547b3a7d7a1d98898448364a3d7e60943d9857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Mon, 18 May 2026 11:19:57 +0200 Subject: [PATCH 012/171] refs #12442 - generate a fuzzing corpus by extracting code from `testrunner` (#7232) --- .github/workflows/corpus.yml | 58 ++++++++++++++++++++++++++++++++++++ lib/tokenlist.cpp | 18 +++++++++++ 2 files changed, 76 insertions(+) create mode 100644 .github/workflows/corpus.yml diff --git a/.github/workflows/corpus.yml b/.github/workflows/corpus.yml new file mode 100644 index 00000000000..0c1aeda94de --- /dev/null +++ b/.github/workflows/corpus.yml @@ -0,0 +1,58 @@ +# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions +# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners +name: corpus + +on: + schedule: + - cron: '0 0 * * 0' + workflow_dispatch: + +permissions: + contents: read + +jobs: + corpus: + runs-on: ubuntu-22.04 + if: ${{ github.repository_owner == 'cppcheck-opensource' }} + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ${{ github.workflow }}-${{ runner.os }} + + - name: Install missing software on ubuntu + run: | + sudo apt-get update + sudo apt-get install -y fdupes + + - name: build testrunner + run: | + store_dir=$(pwd)/store + mkdir $store_dir + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + make -j$(nproc) CXXOPTS="-Werror" CPPOPTS="-DSTORE_INPUT_DIR=\"\\\"$store_dir\\\"\"" testrunner + + - name: run testrunner + run: | + ./testrunner -q + + - name: de-duplicate files + run: | + set -x + ls -l ./store | wc -l + echo "removing duplicates" + fdupes -qdN ./store > /dev/null + ls -l ./store | wc -l + # print largest size + ls -l ./store | cut -d' ' -f5 | sort -u -n -r | head -n1 + + - uses: actions/upload-artifact@v4 + if: success() + with: + name: corpus + path: ./store diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index f155a75014a..a345332961e 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -333,8 +333,26 @@ bool TokenList::createTokensFromBuffer(const char* data, size_t size) //--------------------------------------------------------------------------- +#ifdef STORE_INPUT_DIR +#include +#include + +static void storeInput(const char* data, size_t size) +{ + static std::atomic_uint64_t num(0); + { + std::ofstream out(STORE_INPUT_DIR "/" + std::to_string(num++)); + out.write(data, size); + } +} +#endif + bool TokenList::createTokensFromBufferInternal(const char* data, size_t size, const std::string& file0) { +#ifdef STORE_INPUT_DIR + storeInput(data, size); +#endif + simplecpp::OutputList outputList; simplecpp::TokenList tokens({data, size}, mFiles, file0, &outputList); From 8bc093cca0a27439a481de4ab1f694bfcfc6a094 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 20 May 2026 08:25:13 +0200 Subject: [PATCH 013/171] Add tests for #6796, #12896 (#8562) --- test/testcondition.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 9a15349aff0..8172f74aab6 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -6472,6 +6472,19 @@ class TestCondition : public TestFixture { " if (INT_MAX > ll * 8) {}\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("bool f(int a, int b) {\n" // #12896 + " if (a < INT_MIN && b > INT_MAX)\n" + " return true;\n" + " return false;\n" + "}\n" + "bool g(int x) {\n" // #6796 + " return (x > INT_MAX) ? true : false;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:13]: (style) Comparing expression of type 'signed int' against value -2147483648. Condition is always false. [compareValueOutOfTypeRangeError]\n" + "[test.cpp:2:28]: (style) Comparing expression of type 'signed int' against value 2147483647. Condition is always false. [compareValueOutOfTypeRangeError]\n" + "[test.cpp:7:17]: (style) Comparing expression of type 'signed int' against value 2147483647. Condition is always false. [compareValueOutOfTypeRangeError]\n", + errout_str()); } void knownConditionCast() { From b82e8664a4602e01129bb908103e3ad6a7534a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Thu, 21 May 2026 13:50:34 +0200 Subject: [PATCH 014/171] Fix #14744: Invalid AST for braced init and references/pointers (#8549) --- lib/checkstl.cpp | 3 +-- lib/tokenlist.cpp | 2 +- test/testtokenize.cpp | 31 +++++++++++++++++++------------ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index b1543f4af37..5a5e1b25ea4 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -1188,8 +1188,7 @@ void CheckStl::invalidContainer() if (info.tok->variable()->isReference() && !isVariableDecl(info.tok) && reaches(info.tok->variable()->nameToken(), tok, nullptr)) { - if ((assignExpr && Token::Match(assignExpr->astOperand1(), "& %varid%", info.tok->varId())) || // TODO: fix AST - Token::Match(assignExpr, "& %varid% {|(", info.tok->varId())) { + if ((assignExpr && Token::Match(assignExpr->astOperand1()->previous(), "& %varid%", info.tok->varId()))) { return false; } diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index a345332961e..6c4cd7eb981 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -1837,7 +1837,7 @@ static Token * createAstAtToken(Token *tok) } typetok = typetok->next(); } - if (Token::Match(typetok, "%var% =") && typetok->varId()) + if (Token::Match(typetok, "%var% [={]")) tok = typetok; // Do not create AST for function declaration diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 7b2bee0d80e..b6f84e1ec56 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -439,6 +439,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(astcompound); TEST_CASE(astfuncdecl); TEST_CASE(astarrayinit); + TEST_CASE(astbracedinit); TEST_CASE(startOfExecutableScope); @@ -6522,21 +6523,21 @@ class TestTokenizer : public TestFixture { tokenizer.createLinks2(); tokenizer.simplifyCAlternativeTokens(); tokenizer.list.front()->assignIndexes(); - } else { // Full - tokenizer.simplifyTokens1(""); - } - // set varid.. - for (Token *tok = tokenizer.list.front(); tok; tok = tok->next()) { - if (tok->str() == "var") - tok->varId(1); - } + // set varid.. + for (Token *tok = tokenizer.list.front(); tok; tok = tok->next()) { + if (tok->str() == "var") + tok->varId(1); + } - // Create AST.. - tokenizer.prepareTernaryOpForAST(); - tokenizer.list.createAst(); + // Create AST.. + tokenizer.prepareTernaryOpForAST(); + tokenizer.list.createAst(); - tokenizer.list.validateAst(false); + tokenizer.list.validateAst(false); + } else { // Full + tokenizer.simplifyTokens1(""); + } // Basic AST validation for (const Token *tok = tokenizer.list.front(); tok; tok = tok->next()) { @@ -7535,6 +7536,12 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS("a2[2[ 12, 34,{", testAst("int a[2][2]{ { 1, 2 }, { 3, 4 } };")); } + void astbracedinit() { + ASSERT_EQUALS("ab{", testAst("int &a { b };", AstStyle::Simple, ListSimplification::Full)); + ASSERT_EQUALS("a0{", testAst("int &&a { 0 };", AstStyle::Simple, ListSimplification::Full)); + ASSERT_EQUALS("anullptr{", testAst("int *a { nullptr };", AstStyle::Simple, ListSimplification::Full)); + } + #define isStartOfExecutableScope(offset, code) isStartOfExecutableScope_(offset, code, __FILE__, __LINE__) template bool isStartOfExecutableScope_(int offset, const char (&code)[size], const char* file, int line) { From a84a5a629365447a8f1aea5fec633cfebee64a9c Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 21 May 2026 14:07:06 +0200 Subject: [PATCH 015/171] Add tests for #11152, #13579 (#8571) --- test/testtokenize.cpp | 14 ++++++++++++++ test/testvalueflow.cpp | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index b6f84e1ec56..a81130c3114 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -479,6 +479,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(cppKeywordInCSource); TEST_CASE(cppcast); + TEST_CASE(ccast); TEST_CASE(checkHeader1); @@ -8418,6 +8419,19 @@ class TestTokenizer : public TestFixture { } } + void ccast() { + const char code[] = "a = (int)x;\n" // #13579 + "int (*p)[10];\n"; + + SimpleTokenizer tokenizer(settingsDefault, *this); + ASSERT(tokenizer.tokenize(code)); + + const Token* par = Token::findsimplematch(tokenizer.tokens(), "("); + ASSERT(par->isCast()); + par = Token::findsimplematch(par->next(), "("); + ASSERT(!par->isCast()); + } + #define checkHdrs(...) checkHdrs_(__FILE__, __LINE__, __VA_ARGS__) template std::string checkHdrs_(const char* file, int line, const char (&code)[size], bool checkHeadersFlag) { diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index dc5345ab3e3..c879b9cffd5 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -6290,6 +6290,14 @@ class TestValueFlow : public TestFixture { "}\n"; values = tokenValues(code, "x > 5", ValueFlow::Value::ValueType::UNINIT); ASSERT_EQUALS(0, values.size()); + + code = "void f() {\n" // #11152 + " char b[10];\n" + " sprintf(b, \"abc\");\n" + " printf(\"%s\", b);\n" + "}\n"; + values = tokenValues(code, "b )", ValueFlow::Value::ValueType::UNINIT); + ASSERT_EQUALS(0, values.size()); } void valueFlowConditionExpressions() { From bc04c0dbb3cbde4b5f6d4dc30665d06d0cd8eb33 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 22 May 2026 08:18:49 +0200 Subject: [PATCH 016/171] Fix #14764 FP uselessCallsRemove with brace init (#8565) --- lib/checkstl.cpp | 2 +- test/teststl.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 5a5e1b25ea4..c665d72757e 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2327,7 +2327,7 @@ void CheckStl::uselessCalls() !tok->tokAt(4)->astParent() && tok->next()->variable() && tok->next()->variable()->isStlType(stl_containers_with_empty_and_clear)) uselessCallsEmptyError(tok->next()); - else if (Token::Match(tok, "[{};] std :: remove|remove_if|unique (") && tok->tokAt(5)->nextArgument()) + else if (Token::Match(tok, "[{};] std :: remove|remove_if|unique (") && tok->tokAt(5)->nextArgument() && !tok->tokAt(4)->astParent()) uselessCallsRemoveError(tok->next(), tok->strAt(3)); else if (printPerformance && tok->valueType() && tok->valueType()->type == ValueType::CONTAINER) { if (Token::Match(tok, "%var% = { %var% . begin ( ) ,") && tok->varId() == tok->tokAt(3)->varId()) diff --git a/test/teststl.cpp b/test/teststl.cpp index 84dae0b0b35..18549e08f9f 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -4835,6 +4835,12 @@ class TestStl : public TestFixture { "[test.cpp:3:5]: (warning) Return value of std::remove_if() ignored. Elements remain in container. [uselessCallsRemove]\n" "[test.cpp:4:5]: (warning) Return value of std::unique() ignored. Elements remain in container. [uselessCallsRemove]\n", errout_str()); + check("void f(std::string& s) {\n" // #14764 + " auto it{ std::remove(s.begin(), s.end(), 'a') };\n" + " s.erase(it, s.end());\n" + "}"); + ASSERT_EQUALS("", errout_str()); + // #4431 - fp check("bool f() {\n" " return x ? true : (y.empty());\n" From bc33aee25669f7ab8db1f4941ff56e9ce6d22aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Berder?= <18538310+francois-berder@users.noreply.github.com> Date: Tue, 26 May 2026 08:48:42 +0200 Subject: [PATCH 017/171] Fix #8192: FN condition always false in for loop condition (#8446) When a for loop's condition is impossible given the initial value (e.g. `for (int i = 0; i > 10; i++)`), cppcheck was not emitting a knownConditionTrueFalse warning. Fix by populating memory1, memory2 and memoryAfter with the init state when the condition is immediately false (and no error occured). We can then set the value for the condition token and thus emit a knownConditionTrueFalse warning. Signed-off-by: Francois Berder --- lib/valueflow.cpp | 55 ++++++++++++++++++++++++++++-------------- test/testcondition.cpp | 2 +- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 3819bfc4b41..a63995a9728 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -5181,8 +5181,18 @@ static bool valueFlowForLoop2(const Token *tok, if (error) return false; execute(secondExpression, programMemory, &result, &error, settings); - if (result == 0) // 2nd expression is false => no looping + if (result == 0) { + if (!error) { // 2nd expression is false => no looping + ProgramMemory startMemory(programMemory); + ProgramMemory endMemory(programMemory); + + memory1.swap(startMemory); + memory2.swap(endMemory); + memoryAfter.swap(programMemory); + return true; + } return false; + } if (error) { // If a variable is reassigned in second expression, return false bool reassign = false; @@ -5388,23 +5398,32 @@ static void valueFlowForLoop(const TokenList &tokenlist, const SymbolDatabase& s } else { ProgramMemory mem1, mem2, memAfter; if (valueFlowForLoop2(tok, mem1, mem2, memAfter, settings)) { - for (const auto& p : mem1) { - if (!p.second.isIntValue()) - continue; - if (p.second.isImpossible()) - continue; - if (p.first.tok->varId() == 0) - continue; - valueFlowForLoopSimplify(bodyStart, p.first.tok, false, p.second.intvalue, tokenlist, errorLogger, settings); - } - for (const auto& p : mem2) { - if (!p.second.isIntValue()) - continue; - if (p.second.isImpossible()) - continue; - if (p.first.tok->varId() == 0) - continue; - valueFlowForLoopSimplify(bodyStart, p.first.tok, false, p.second.intvalue, tokenlist, errorLogger, settings); + if (mem1 == memAfter) { // #8192 check if loop never runs + Token* condTok = getCondTok(tok); + if (condTok && !condTok->hasKnownIntValue()) { + ValueFlow::Value v(0); + v.setKnown(); + ValueFlow::setTokenValue(condTok, std::move(v), settings); + } + } else { + for (const auto& p : mem1) { + if (!p.second.isIntValue()) + continue; + if (p.second.isImpossible()) + continue; + if (p.first.tok->varId() == 0) + continue; + valueFlowForLoopSimplify(bodyStart, p.first.tok, false, p.second.intvalue, tokenlist, errorLogger, settings); + } + for (const auto& p : mem2) { + if (!p.second.isIntValue()) + continue; + if (p.second.isImpossible()) + continue; + if (p.first.tok->varId() == 0) + continue; + valueFlowForLoopSimplify(bodyStart, p.first.tok, false, p.second.intvalue, tokenlist, errorLogger, settings); + } } for (const auto& p : memAfter) { if (!p.second.isIntValue()) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 8172f74aab6..46860d9f939 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -5680,7 +5680,7 @@ class TestCondition : public TestFixture { check("void f() {\n" // #8192 " for (int i = 0; i > 10; ++i) {}\n" "}\n"); - TODO_ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'i>10' is always false\n", "", errout_str()); + ASSERT_EQUALS("[test.cpp:2:23]: (style) Condition 'i>10' is always false [knownConditionTrueFalse]\n", errout_str()); check("void f() {\n" " for (int i = 1000; i < 20; ++i) {}\n" From 5e8ab5e2ac461a6568893519110ce6191ac2fe29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 26 May 2026 20:22:14 +0200 Subject: [PATCH 018/171] release-windows.yml: fixed build with Visual Studio 2026 [skip ci] (#8563) this is caused by `vs2025` now using Visual Studio 2026 --- .github/workflows/release-windows.yml | 2 +- releasenotes.txt | 1 + win_installer/config.wxi | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml index bacf32c8eaf..f59e77a2dca 100644 --- a/.github/workflows/release-windows.yml +++ b/.github/workflows/release-windows.yml @@ -56,7 +56,7 @@ jobs: cd pcre-%PCRE_VERSION% || exit /b !errorlevel! git apply --ignore-space-change ..\externals\pcre.patch || exit /b !errorlevel! cmake . -A x64 -DPCRE_BUILD_PCRECPP=OFF -DPCRE_BUILD_PCREGREP=OFF -DPCRE_BUILD_TESTS=OFF -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! - msbuild -m PCRE.sln -p:Configuration=Release -p:Platform=x64 || exit /b !errorlevel! + msbuild -m PCRE.slnx -p:Configuration=Release -p:Platform=x64 || exit /b !errorlevel! copy pcre.h ..\externals || exit /b !errorlevel! copy Release\pcre.lib ..\externals\pcre64.lib || exit /b !errorlevel! diff --git a/releasenotes.txt b/releasenotes.txt index 5d94da2ebc3..86aa9573ca4 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -26,4 +26,5 @@ Other: - Make it possible to specify the regular expression engine using the `engine` element in a rule XML. - Added CLI option `--exitcode-suppress` to specify an error ID which should not result in a non-zero exitcode. - Moved source code from https://github.com/danmar/cppcheck to https://github.com/cppcheck-opensource/cppcheck +- The official Windows binary is now built with Visual Studio 2026. - diff --git a/win_installer/config.wxi b/win_installer/config.wxi index 7bc613d1669..ae7fc8329f3 100644 --- a/win_installer/config.wxi +++ b/win_installer/config.wxi @@ -9,6 +9,6 @@ - + From 47aaa76dc9fb5fa65177cf2322b52cb518cd20a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 26 May 2026 20:22:35 +0200 Subject: [PATCH 019/171] iwyu.yml: disabled `HAVE_RULES` for now since Fedora no longer provides PCRE [skip ci] (#8564) --- .github/workflows/iwyu.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml index 05d5643bdf7..3b972dca443 100644 --- a/.github/workflows/iwyu.yml +++ b/.github/workflows/iwyu.yml @@ -71,7 +71,7 @@ jobs: - name: Install missing software on Fedora if: contains(matrix.image, 'fedora') run: | - dnf install -y cmake clang pcre-devel + dnf install -y cmake clang dnf install -y libglvnd-devel # fixes missing dependency for Qt in CMake dnf install -y p7zip-plugins # required as fallback for py7zr in Qt installation dnf install -y python3-pip # fixes missing pip module in jurplel/install-qt-action @@ -125,7 +125,8 @@ jobs: - name: Prepare CMake run: | - cmake -S . -B cmake.output -Werror=dev -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.stdlib == 'libc++' }} + # TODO: re-enable HAVE_RULES + cmake -S . -B cmake.output -Werror=dev -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=Off -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.stdlib == 'libc++' }} env: CC: clang CXX: clang++ @@ -232,7 +233,8 @@ jobs: - name: Prepare CMake run: | - cmake -S . -B cmake.output -Werror=dev -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.use_libcxx }} + # TODO: re-enable HAVE_RULES + cmake -S . -B cmake.output -Werror=dev -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=Off -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.use_libcxx }} env: CC: clang-22 CXX: clang++-22 From 96d4a9626ada9075c9c1b0a76ee08b9ddae483c7 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 27 May 2026 09:37:54 +0200 Subject: [PATCH 020/171] Fix #14774 FP bufferAccessOutOfBounds: Wrong size for sizeof( ref ) (#8572) --- lib/vf_common.cpp | 12 +++++++----- test/testvalueflow.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/lib/vf_common.cpp b/lib/vf_common.cpp index 261972cba63..282e0b9fddb 100644 --- a/lib/vf_common.cpp +++ b/lib/vf_common.cpp @@ -160,11 +160,13 @@ namespace ValueFlow value.setKnown(); setTokenValue(tok, std::move(value), settings); } else if (Token::simpleMatch(tok, "sizeof (")) { - if (tok->next()->astOperand2() && !tok->next()->astOperand2()->isLiteral() && tok->next()->astOperand2()->valueType() && - (tok->next()->astOperand2()->valueType()->pointer == 0 || // <- TODO this is a bailout, abort when there are array->pointer conversions - (tok->next()->astOperand2()->variable() && !tok->next()->astOperand2()->variable()->isArray())) && - !tok->next()->astOperand2()->valueType()->isEnum()) { // <- TODO this is a bailout, handle enum with non-int types - const size_t sz = tok->next()->astOperand2()->valueType()->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); + const Token* const obj = tok->next()->astOperand2(); + if (obj && !obj->isLiteral() && obj->valueType() && + (obj->valueType()->pointer == 0 || // <- TODO this is a bailout, abort when there are array->pointer conversions + (obj->variable() && !obj->variable()->isArray())) && + !obj->valueType()->isEnum()) { // <- TODO this is a bailout, handle enum with non-int types + const auto ptrPointee = obj->valueType()->pointer > 0 ? ValueType::SizeOf::Pointer : ValueType::SizeOf::Pointee; + const size_t sz = obj->valueType()->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ptrPointee); if (sz) { Value value(sz); value.setKnown(); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index c879b9cffd5..1f4879b7cca 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1396,6 +1396,30 @@ class TestValueFlow : public TestFixture { ASSERT_EQUALS(1U, values.size()); ASSERT_EQUALS(4, values.back().intvalue); + code = "char& r = i;\n" + "sizeof(r);"; + values = tokenValues(code, "( r"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(1, values.back().intvalue); + + code = "char* p;\n" + "sizeof(p);"; + values = tokenValues(code, "( p"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(settings.platform.sizeof_pointer, values.back().intvalue); + + code = "char*& pr = p;\n" + "sizeof(pr);"; + values = tokenValues(code, "( pr"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(settings.platform.sizeof_pointer, values.back().intvalue); + + code = "struct { char& r; char* p; } s{ x, y };\n" + "sizeof(s);\n"; + values = tokenValues(code, "( s"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(2 * settings.platform.sizeof_pointer, values.back().intvalue); + #define CHECK3(A, B, C) \ do { \ code = "void f() {\n" \ From 287ae6c10b23b5fdfa1b43c7f68ed44084eb0631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Wed, 27 May 2026 13:12:33 +0200 Subject: [PATCH 021/171] fixed #14788 - bumped simplecpp to 1.7.0 (#8582) --- .selfcheck_suppressions | 1 - externals/simplecpp/simplecpp.cpp | 59 +++++++++++++++++++++++-------- externals/simplecpp/simplecpp.h | 13 ++++--- releasenotes.txt | 1 + test/testpreprocessor.cpp | 4 +-- 5 files changed, 56 insertions(+), 22 deletions(-) diff --git a/.selfcheck_suppressions b/.selfcheck_suppressions index 1687753c268..f21492e783a 100644 --- a/.selfcheck_suppressions +++ b/.selfcheck_suppressions @@ -78,5 +78,4 @@ knownConditionTrueFalse:externals/tinyxml2/tinyxml2.cpp useStlAlgorithm:externals/simplecpp/simplecpp.cpp funcArgNamesDifferentUnnamed:externals/simplecpp/simplecpp.h missingMemberCopy:externals/simplecpp/simplecpp.h -shadowFunction:externals/simplecpp/simplecpp.cpp shadowFunction:externals/simplecpp/simplecpp.h diff --git a/externals/simplecpp/simplecpp.cpp b/externals/simplecpp/simplecpp.cpp index 7afc17ab735..47e674837ba 100644 --- a/externals/simplecpp/simplecpp.cpp +++ b/externals/simplecpp/simplecpp.cpp @@ -275,8 +275,10 @@ class simplecpp::TokenList::Stream { return ch; } - unsigned char peekChar() { - auto ch = static_cast(peek()); + int peekChar() { + int ch = peek(); + if (ch == EOF) + return ch; // For UTF-16 encoded files the BOM is 0xfeff/0xfffe. If the // character is non-ASCII character then replace it with 0xff @@ -285,7 +287,7 @@ class simplecpp::TokenList::Stream { const auto ch2 = static_cast(peek()); unget(); const int ch16 = makeUtf16Char(ch, ch2); - ch = static_cast(((ch16 >= 0x80) ? 0xff : ch16)); + ch = (ch16 >= 0x80) ? 0xff : ch16; } // Handling of newlines.. @@ -598,7 +600,7 @@ std::string simplecpp::TokenList::stringify(bool linenrs) const return ret.str(); } -static bool isNameChar(unsigned char ch) +static bool isNameChar(int ch) { return std::isalnum(ch) || ch == '_' || ch == '$'; } @@ -635,10 +637,10 @@ static bool isStringLiteralPrefix(const std::string &str) str == "R" || str == "uR" || str == "UR" || str == "LR" || str == "u8R"; } -void simplecpp::TokenList::lineDirective(unsigned int fileIndex, unsigned int line, Location &location) +void simplecpp::TokenList::lineDirective(unsigned int fileIndex_, unsigned int line, Location &location) { - if (fileIndex != location.fileIndex || line >= location.line) { - location.fileIndex = fileIndex; + if (fileIndex_ != location.fileIndex || line >= location.line) { + location.fileIndex = fileIndex_; location.line = line; return; } @@ -771,8 +773,21 @@ void simplecpp::TokenList::readfile(Stream &stream, const std::string &filename, ch = stream.readChar(); } stream.ungetChar(); - push_back(new Token(currentToken, location)); - location.adjust(currentToken); + std::string::size_type pos = 0; + unsigned int spliced = 0; + while ((pos = currentToken.find('\\', pos)) != std::string::npos) { + if (pos + 1 < currentToken.size() && currentToken[pos + 1] == '\n') { + currentToken.erase(pos, 2); + ++spliced; + } else { + ++pos; + } + } + if (!currentToken.empty()) { + push_back(new Token(currentToken, location)); + location.adjust(currentToken); + } + location.line += spliced; continue; } } @@ -1739,6 +1754,9 @@ namespace simplecpp { return tok; } + /** + * @throws Error thrown in case of __VA_OPT__ issues + */ bool parseDefine(const Token *nametoken) { nameTokDef = nametoken; variadic = false; @@ -2201,6 +2219,8 @@ namespace simplecpp { } output.push_back(newMacroToken(tok->str(), loc, true, tok)); + if (it != macros.end()) + output.back()->markExpandedFrom(&it->second); return tok->next; } @@ -3379,6 +3399,17 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL } output.clear(); return; + } catch (const simplecpp::Macro::Error& e) { + if (outputList) { + simplecpp::Output err{ + Output::DUI_ERROR, + {}, + e.what + }; + outputList->emplace_back(std::move(err)); + } + output.clear(); + return; } } @@ -3507,14 +3538,14 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL else it->second = macro; } - } catch (const std::runtime_error &) { + } catch (const std::runtime_error &err) { if (outputList) { - simplecpp::Output err{ + simplecpp::Output out{ Output::SYNTAX_ERROR, rawtok->location, - "Failed to parse #define" + std::string("Failed to parse #define, ") + err.what() }; - outputList->emplace_back(std::move(err)); + outputList->emplace_back(std::move(out)); } output.clear(); return; @@ -3671,7 +3702,7 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL bool closingAngularBracket = false; if (tok) { const std::string &sourcefile = rawtokens.file(rawtok->location); - const bool systemheader = (tok && tok->op == '<'); + const bool systemheader = tok->op == '<'; std::string header; if (systemheader) { diff --git a/externals/simplecpp/simplecpp.h b/externals/simplecpp/simplecpp.h index d499b132b69..f29166ff061 100644 --- a/externals/simplecpp/simplecpp.h +++ b/externals/simplecpp/simplecpp.h @@ -174,9 +174,9 @@ namespace simplecpp { bool isOneOf(const char ops[]) const; bool startsWithOneOf(const char c[]) const; bool endsWithOneOf(const char c[]) const; - static bool isNumberLike(const std::string& str) { - return std::isdigit(static_cast(str[0])) || - (str.size() > 1U && (str[0] == '-' || str[0] == '+') && std::isdigit(static_cast(str[1]))); + static bool isNumberLike(const std::string& s) { + return std::isdigit(static_cast(s[0])) || + (s.size() > 1U && (s[0] == '-' || s[0] == '+') && std::isdigit(static_cast(s[1]))); } TokenString macro; @@ -213,6 +213,9 @@ namespace simplecpp { bool isExpandedFrom(const Macro* m) const { return mExpandedFrom.find(m) != mExpandedFrom.end(); } + void markExpandedFrom(const Macro* m) { + mExpandedFrom.insert(m); + } void printAll() const; void printOut() const; @@ -376,7 +379,7 @@ namespace simplecpp { const std::string& file(const Location& loc) const; private: - TokenList(const unsigned char* data, std::size_t size, std::vector &filenames, const std::string &filename, OutputList *outputList, int unused); + TokenList(const unsigned char* data, std::size_t size, std::vector &filenames, const std::string &filename, OutputList *outputList, int /*unused*/); void combineOperators(); @@ -396,7 +399,7 @@ namespace simplecpp { void constFoldQuestionOp(Token *&tok1); std::string readUntil(Stream &stream, const Location &location, char start, char end, OutputList *outputList); - void lineDirective(unsigned int fileIndex, unsigned int line, Location &location); + void lineDirective(unsigned int fileIndex_, unsigned int line, Location &location); const Token* lastLineTok(int maxsize=1000) const; const Token* isLastLinePreprocessor(int maxsize=1000) const; diff --git a/releasenotes.txt b/releasenotes.txt index 86aa9573ca4..3e5a76b6915 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -27,4 +27,5 @@ Other: - Added CLI option `--exitcode-suppress` to specify an error ID which should not result in a non-zero exitcode. - Moved source code from https://github.com/danmar/cppcheck to https://github.com/cppcheck-opensource/cppcheck - The official Windows binary is now built with Visual Studio 2026. +- Updated simplecpp to 1.7.0. - diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 6846d49ff30..7e01f6f233b 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -1996,12 +1996,12 @@ class TestPreprocessor : public TestFixture { void invalid_define_1() { (void)getcode(settings0, *this, "#define =\n"); - ASSERT_EQUALS("[file.c:1:2]: (error) Failed to parse #define [syntaxError]\n", errout_str()); + ASSERT_EQUALS("[file.c:1:2]: (error) Failed to parse #define, bad macro syntax [syntaxError]\n", errout_str()); } void invalid_define_2() { // #4036 (void)getcode(settings0, *this, "#define () {(int f(x) }\n"); - ASSERT_EQUALS("[file.c:1:2]: (error) Failed to parse #define [syntaxError]\n", errout_str()); + ASSERT_EQUALS("[file.c:1:2]: (error) Failed to parse #define, bad macro syntax [syntaxError]\n", errout_str()); } void inline_suppressions() { From 652e06d4a82ed6cc3a49b0cbc0e0218e35f11a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= Date: Wed, 27 May 2026 11:23:16 +0000 Subject: [PATCH 022/171] gtk.cfg: Fix gtk_widget_destroy definition and usage (#8546) gtk_widget_destroy is only for GtkWidget derived objects. --- cfg/gtk.cfg | 28 +++++++++++++++++++++++----- test/cfg/gtk.c | 11 +++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/cfg/gtk.cfg b/cfg/gtk.cfg index b561aad91b2..14cd032945e 100644 --- a/cfg/gtk.cfg +++ b/cfg/gtk.cfg @@ -1003,7 +1003,6 @@ g_zlib_decompressor_new g_object_ref g_object_unref - gtk_widget_destroy
g_tree_new @@ -1019,6 +1018,11 @@ g_file_attribute_matcher_ref g_file_attribute_matcher_unref + + gtk_window_new + gtk_widget_destroy + gtk_window_destroy + false @@ -9787,6 +9791,14 @@ false + + + false + + + + false @@ -21229,10 +21241,6 @@ false - - - false - false @@ -21889,6 +21897,13 @@ false + + false + + + + + false @@ -23070,6 +23085,9 @@ + + + diff --git a/test/cfg/gtk.c b/test/cfg/gtk.c index bcee84c8264..cab41ffa1cd 100644 --- a/test/cfg/gtk.c +++ b/test/cfg/gtk.c @@ -585,3 +585,14 @@ void g_tree_test() { printf("%p\n", tree2); // cppcheck-suppress memleak } + +void gtk_widget_destroy_test() { + GtkWidget *widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_show(widget); + // cppcheck-suppress memleak + + widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_show(widget); + // cppcheck-suppress mismatchAllocDealloc + g_object_unref(widget); +} From 2cd2f46ae747d1ee4e47bf2c4588696bdfc7d262 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 27 May 2026 14:25:34 +0200 Subject: [PATCH 023/171] Fix #11614 FN knownConditionTrueFalse when assigned to bool (#8569) --- .selfcheck_suppressions | 1 + lib/checkcondition.cpp | 8 ++++++-- test/testcondition.cpp | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.selfcheck_suppressions b/.selfcheck_suppressions index f21492e783a..dcb7c06c893 100644 --- a/.selfcheck_suppressions +++ b/.selfcheck_suppressions @@ -76,6 +76,7 @@ funcArgNamesDifferentUnnamed:externals/tinyxml2/tinyxml2.h nullPointerRedundantCheck:externals/tinyxml2/tinyxml2.cpp knownConditionTrueFalse:externals/tinyxml2/tinyxml2.cpp useStlAlgorithm:externals/simplecpp/simplecpp.cpp +knownConditionTrueFalse:externals/simplecpp/simplecpp.cpp funcArgNamesDifferentUnnamed:externals/simplecpp/simplecpp.h missingMemberCopy:externals/simplecpp/simplecpp.h shadowFunction:externals/simplecpp/simplecpp.h diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index cec3293ad27..f70d9172832 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1540,8 +1540,11 @@ void CheckCondition::alwaysTrueFalse() { // is this a condition.. const Token *parent = tok->astParent(); - while (Token::Match(parent, "%oror%|&&")) + bool hasComp = false; + while (Token::Match(parent, "%oror%|&&")) { + hasComp = true; parent = parent->astParent(); + } if (!parent) continue; if (parent->str() == "?" && precedes(tok, parent)) @@ -1555,10 +1558,11 @@ void CheckCondition::alwaysTrueFalse() condition = parent->astParent()->astParent()->previous(); else if (Token::Match(tok, "%comp%")) condition = tok; - else if (tok->str() == "(" && astIsBool(parent) && Token::Match(parent, "%assign%")) + else if ((tok->str() == "(" || (hasComp && Token::Match(tok, "!|%var%"))) && astIsBool(parent) && Token::Match(parent, "%assign%")) condition = tok; else continue; + } // Skip already diagnosed values if (diag(tok, false)) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 46860d9f939..e5aedae6609 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -3675,7 +3675,7 @@ class TestCondition : public TestFixture { " f ? result = 42 : ret = -1;\n" " return ret;\n" "}"); - ASSERT_EQUALS("", errout_str()); + ASSERT_EQUALS("[test.cpp:4:9]: (style) Condition 'f' is always false [knownConditionTrueFalse]\n", errout_str()); check("int f(void *handle) {\n" " if (!handle) return 0;\n" @@ -6227,6 +6227,20 @@ class TestCondition : public TestFixture { check("enum E { E1 = 1, E2 = 2 };\n" "void f(int i) { if (i == E1 || E2) {} }\n"); ASSERT_EQUALS("[test.cpp:2:29]: (style) Condition 'i==E1||E2' is always true [knownConditionTrueFalse]\n", errout_str()); + + check("void f(bool a, bool b) {\n" // #11614 + " if (b) {\n" + " bool x = !b || a;\n" + " }\n" + "}\n" + "void g(bool a, bool b) {\n" + " if (!b) {\n" + " bool x = a || b;\n" + " }\n" + "}"); + ASSERT_EQUALS("[test.cpp:2:9] -> [test.cpp:3:18]: (style) Condition '!b' is always false [knownConditionTrueFalse]\n" + "[test.cpp:7:9] -> [test.cpp:8:23]: (style) Condition 'b' is always false [knownConditionTrueFalse]\n", + errout_str()); } void pointerAdditionResultNotNull() { From c3e93833aeae1a3acd8d4be2d8475a2f3c62633d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 27 May 2026 14:26:28 +0200 Subject: [PATCH 024/171] Refs #13296: Fix FP clarifyCondition for cast to pointer to member function (#8577) Co-authored-by: chrchr-github --- lib/tokenlist.cpp | 2 +- test/testtokenize.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 6c4cd7eb981..1ab00ee3574 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -547,7 +547,7 @@ static bool iscast(const Token *tok, bool cpp) if (!Token::Match(tok2, "%name%|*|::")) return false; - if (tok2->isStandardType() && (tok2->strAt(1) != "(" || Token::Match(tok2->next(), "( * *| )"))) + if (tok2->isStandardType() && (tok2->strAt(1) != "(" || Token::simpleMatch(tok2->linkAt(1)->tokAt(-1), "* )"))) type = true; } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index a81130c3114..a7e8c40cd37 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -8421,7 +8421,8 @@ class TestTokenizer : public TestFixture { void ccast() { const char code[] = "a = (int)x;\n" // #13579 - "int (*p)[10];\n"; + "int (*p)[10];\n" + "b = (void (S::*)(int) const)&y;"; SimpleTokenizer tokenizer(settingsDefault, *this); ASSERT(tokenizer.tokenize(code)); @@ -8430,6 +8431,8 @@ class TestTokenizer : public TestFixture { ASSERT(par->isCast()); par = Token::findsimplematch(par->next(), "("); ASSERT(!par->isCast()); + par = Token::findsimplematch(par->next(), "("); + ASSERT(par->isCast()); } #define checkHdrs(...) checkHdrs_(__FILE__, __LINE__, __VA_ARGS__) From cf483821bbef296f596fdb8217be01da2b59cdaf Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 27 May 2026 18:17:13 +0200 Subject: [PATCH 025/171] Fix CI: unmatchedSuppression in simplecpp.cpp (#8589) --- .selfcheck_suppressions | 1 - 1 file changed, 1 deletion(-) diff --git a/.selfcheck_suppressions b/.selfcheck_suppressions index dcb7c06c893..f21492e783a 100644 --- a/.selfcheck_suppressions +++ b/.selfcheck_suppressions @@ -76,7 +76,6 @@ funcArgNamesDifferentUnnamed:externals/tinyxml2/tinyxml2.h nullPointerRedundantCheck:externals/tinyxml2/tinyxml2.cpp knownConditionTrueFalse:externals/tinyxml2/tinyxml2.cpp useStlAlgorithm:externals/simplecpp/simplecpp.cpp -knownConditionTrueFalse:externals/simplecpp/simplecpp.cpp funcArgNamesDifferentUnnamed:externals/simplecpp/simplecpp.h missingMemberCopy:externals/simplecpp/simplecpp.h shadowFunction:externals/simplecpp/simplecpp.h From 594b44263611dd561a7e807cf9b461f6a1fa406b Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 27 May 2026 18:32:05 +0200 Subject: [PATCH 026/171] Fix #11754 Confusing message: Size of pointer 'p' used instead of size of its data. (#8566) --- lib/checksizeof.cpp | 3 ++- test/testsizeof.cpp | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index 134cca92b7f..e211764ad3a 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -233,7 +233,8 @@ void CheckSizeof::checkSizeofForPointerSize() // Now check for the sizeof usage: Does the level of pointer indirection match? const Token * const tokLink = tokSize->linkAt(1); if (tokLink && tokLink->strAt(-1) == "*") { - if (variable && variable->valueType() && variable->valueType()->pointer == 1 && variable->valueType()->type != ValueType::VOID) + if (variable && variable->valueType() && variable->valueType()->pointer == 1 && variable->valueType()->type != ValueType::VOID && + variable->valueType()->isTypeEqual(tokSize->next()->astOperand2()->valueType())) sizeofForPointerError(variable, variable->str()); else if (variable2 && variable2->valueType() && variable2->valueType()->pointer == 1 && variable2->valueType()->type != ValueType::VOID) sizeofForPointerError(variable2, variable2->str()); diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index b25afe8d153..fca8cb7ed7a 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -722,6 +722,12 @@ class TestSizeof : public TestFixture { " return AtomName;\n" "}"); ASSERT_EQUALS("", errout_str()); + + check("void* f(size_t n) {\n" // #11754 + " char* p = malloc(n * sizeof(void*));\n" + " return p;\n" + "}"); + ASSERT_EQUALS("", errout_str()); } void checkPointerSizeofStruct() { From 6e46c6ba91cf69cb6ea65885933bcd25a08ed769 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 27 May 2026 18:39:55 +0200 Subject: [PATCH 027/171] Fix #14790 Performance regression (hang) in 2.21dev (#8587) --- lib/tokenlist.cpp | 2 +- test/testtokenize.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 1ab00ee3574..f98335badb7 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -609,7 +609,7 @@ static bool iscpp11init_impl(const Token * const tok) if (Token::Match(nameToken, "]|*")) { const Token* tok2 = nameToken; if (tok2->link()) { - while (tok2 && tok2->link()) + while (tok2 && precedes(tok2->link(), nameToken)) tok2 = tok2->link()->previous(); } else diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index a7e8c40cd37..5f4d59503e2 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -8712,6 +8712,10 @@ class TestTokenizer : public TestFixture { "{ 1", Token::Cpp11init::CPP11INIT); + testIsCpp11init("void f() { g([] { if (int x = 1; x) {} }); }", // #14790 + "{ int", + Token::Cpp11init::NOINIT); // don't hang + ASSERT_NO_THROW(tokenizeAndStringify("template struct X {};\n" // don't crash "template auto f(T t) -> X {}\n")); ASSERT_EQUALS("[test.cpp:2:22]: (debug) auto token with no type. [autoNoType]\n", errout_str()); From 91ceb735c8806d72a8f969202c48b95b6d364963 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 28 May 2026 10:49:09 +0200 Subject: [PATCH 028/171] Update entry for uninitMemberVarNoCtor in releasenotes.txt (#8585) [skip ci] --- releasenotes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releasenotes.txt b/releasenotes.txt index 3e5a76b6915..4fb45b90070 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -7,7 +7,7 @@ Major bug fixes & crashes: New checks: - MISRA C 2012 rule 10.3 now warns on assigning integer literals 0 and 1 to bool in C99 and later while preserving the existing C89 behavior. - funcArgNamesDifferentUnnamed warns on function declarations/definitions where a parameter in either location is unnamed -- uninitMemberVarNoCtor warns on user-defined types where some but not all members requiring initialization have in-class initializers. +- uninitMemberVarNoCtor warns on user-defined types where (1) some but not all members requiring initialization have in-class initializers or (2) there is a mixture of members which do/do not require initialization. - fcloseInLoopCondition warns when fclose() is used as a while loop condition, which may skip the loop body or double-close the file handle. C/C++ support: From f1379d63a5e0ab4ce360e56e96e1b128c5c87e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Thu, 28 May 2026 13:47:32 +0200 Subject: [PATCH 029/171] split the actual check implementations from the instances (#5323) --- Makefile | 114 +++++++-------- lib/astutils.cpp | 2 +- lib/check.h | 65 +-------- lib/check64bit.cpp | 14 +- lib/check64bit.h | 34 ++--- lib/checkassert.cpp | 14 +- lib/checkassert.h | 27 ++-- lib/checkautovariables.cpp | 40 +++--- lib/checkautovariables.h | 47 +++--- lib/checkbool.cpp | 48 +++---- lib/checkbool.h | 47 +++--- lib/checkbufferoverrun.cpp | 63 ++++----- lib/checkbufferoverrun.h | 57 ++++---- lib/checkclass.cpp | 192 ++++++++++++------------- lib/checkclass.h | 95 ++++++------- lib/checkcondition.cpp | 100 ++++++------- lib/checkcondition.h | 59 ++++---- lib/checkexceptionsafety.cpp | 34 ++--- lib/checkexceptionsafety.h | 49 ++++--- lib/checkfunctions.cpp | 60 ++++---- lib/checkfunctions.h | 49 +++---- lib/{check.cpp => checkimpl.cpp} | 53 ++----- lib/checkimpl.h | 85 +++++++++++ lib/checkinternal.cpp | 34 ++--- lib/checkinternal.h | 34 ++--- lib/checkio.cpp | 96 ++++++------- lib/checkio.h | 50 +++---- lib/checkleakautovar.cpp | 48 +++---- lib/checkleakautovar.h | 30 ++-- lib/checkmemoryleak.cpp | 172 +++++++++++----------- lib/checkmemoryleak.h | 213 +++++++++++++++------------- lib/checknullpointer.cpp | 51 +++---- lib/checknullpointer.h | 63 ++++----- lib/checkother.cpp | 236 +++++++++++++++---------------- lib/checkother.h | 152 ++++++++++---------- lib/checkpostfixoperator.cpp | 9 +- lib/checkpostfixoperator.h | 29 ++-- lib/checksizeof.cpp | 44 +++--- lib/checksizeof.h | 46 +++--- lib/checkstl.cpp | 146 +++++++++---------- lib/checkstl.h | 66 ++++----- lib/checkstring.cpp | 38 ++--- lib/checkstring.h | 44 +++--- lib/checktype.cpp | 41 +++--- lib/checktype.h | 42 +++--- lib/checkuninitvar.cpp | 55 +++---- lib/checkuninitvar.h | 58 ++++---- lib/checkunusedvar.cpp | 23 +-- lib/checkunusedvar.h | 45 +++--- lib/checkvaarg.cpp | 18 +-- lib/checkvaarg.h | 37 ++--- lib/cppcheck.vcxproj | 13 +- lib/valueflow.cpp | 2 +- oss-fuzz/Makefile | 60 ++++---- test/test64bit.cpp | 3 +- test/testcharvar.cpp | 2 +- test/testclass.cpp | 38 ++--- test/testconstructors.cpp | 2 +- test/testincompletestatement.cpp | 2 +- test/testio.cpp | 2 +- test/testmemleak.cpp | 25 ++-- test/testnullpointer.cpp | 4 +- test/testother.cpp | 6 +- test/testpostfixoperator.cpp | 3 +- test/testuninitvar.cpp | 6 +- test/testunusedprivfunc.cpp | 2 +- test/testunusedvar.cpp | 8 +- tools/dmake/dmake.cpp | 3 +- 68 files changed, 1729 insertions(+), 1720 deletions(-) rename lib/{check.cpp => checkimpl.cpp} (60%) create mode 100644 lib/checkimpl.h diff --git a/Makefile b/Makefile index 5a348e27001..684e79179cf 100644 --- a/Makefile +++ b/Makefile @@ -208,7 +208,6 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/addoninfo.o \ $(libcppdir)/analyzerinfo.o \ $(libcppdir)/astutils.o \ - $(libcppdir)/check.o \ $(libcppdir)/check64bit.o \ $(libcppdir)/checkassert.o \ $(libcppdir)/checkautovariables.o \ @@ -221,6 +220,7 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/checkersreport.o \ $(libcppdir)/checkexceptionsafety.o \ $(libcppdir)/checkfunctions.o \ + $(libcppdir)/checkimpl.o \ $(libcppdir)/checkinternal.o \ $(libcppdir)/checkio.o \ $(libcppdir)/checkleakautovar.o \ @@ -483,7 +483,7 @@ check-nonneg: ###### Build -$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/check.h lib/checkers.h lib/checkuninitvar.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp $(libcppdir)/tokenize.o: lib/tokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h @@ -498,31 +498,28 @@ $(libcppdir)/addoninfo.o: lib/addoninfo.cpp externals/picojson/picojson.h lib/ad $(libcppdir)/analyzerinfo.o: lib/analyzerinfo.cpp externals/tinyxml2/tinyxml2.h lib/analyzerinfo.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/mathlib.h lib/path.h lib/platform.h lib/standards.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp -$(libcppdir)/astutils.o: lib/astutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/config.h lib/errortypes.h lib/findtoken.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/astutils.o: lib/astutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/findtoken.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/astutils.cpp -$(libcppdir)/check.o: lib/check.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h - $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check.cpp - -$(libcppdir)/check64bit.o: lib/check64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/check64bit.o: lib/check64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check64bit.cpp -$(libcppdir)/checkassert.o: lib/checkassert.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkassert.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkassert.o: lib/checkassert.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkassert.cpp -$(libcppdir)/checkautovariables.o: lib/checkautovariables.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkautovariables.o: lib/checkautovariables.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkautovariables.cpp -$(libcppdir)/checkbool.o: lib/checkbool.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbool.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkbool.o: lib/checkbool.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbool.cpp -$(libcppdir)/checkbufferoverrun.o: lib/checkbufferoverrun.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkbufferoverrun.o: lib/checkbufferoverrun.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbufferoverrun.cpp -$(libcppdir)/checkclass.o: lib/checkclass.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkclass.o: lib/checkclass.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkclass.cpp -$(libcppdir)/checkcondition.o: lib/checkcondition.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkother.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkcondition.o: lib/checkcondition.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkcondition.cpp $(libcppdir)/checkers.o: lib/checkers.cpp lib/checkers.h lib/config.h @@ -534,58 +531,61 @@ $(libcppdir)/checkersidmapping.o: lib/checkersidmapping.cpp lib/checkers.h lib/c $(libcppdir)/checkersreport.o: lib/checkersreport.cpp lib/addoninfo.h lib/checkers.h lib/checkersreport.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersreport.cpp -$(libcppdir)/checkexceptionsafety.o: lib/checkexceptionsafety.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkexceptionsafety.o: lib/checkexceptionsafety.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkexceptionsafety.cpp -$(libcppdir)/checkfunctions.o: lib/checkfunctions.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkfunctions.o: lib/checkfunctions.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkfunctions.cpp -$(libcppdir)/checkinternal.o: lib/checkinternal.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkinternal.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkimpl.o: lib/checkimpl.cpp lib/addoninfo.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h + $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkimpl.cpp + +$(libcppdir)/checkinternal.o: lib/checkinternal.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkinternal.cpp -$(libcppdir)/checkio.o: lib/checkio.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkio.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkio.o: lib/checkio.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkio.cpp -$(libcppdir)/checkleakautovar.o: lib/checkleakautovar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkleakautovar.o: lib/checkleakautovar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkleakautovar.cpp -$(libcppdir)/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkmemoryleak.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkmemoryleak.cpp -$(libcppdir)/checknullpointer.o: lib/checknullpointer.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checknullpointer.o: lib/checknullpointer.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checknullpointer.cpp -$(libcppdir)/checkother.o: lib/checkother.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkother.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkother.o: lib/checkother.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkother.cpp -$(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp -$(libcppdir)/checks.o: lib/checks.cpp lib/check.h lib/check64bit.h lib/checkassert.h lib/checkautovariables.h lib/checkbool.h lib/checkbufferoverrun.h lib/checkclass.h lib/checkcondition.h lib/checkexceptionsafety.h lib/checkfunctions.h lib/checkinternal.h lib/checkio.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/checkother.h lib/checkpostfixoperator.h lib/checks.h lib/checksizeof.h lib/checkstl.h lib/checkstring.h lib/checktype.h lib/checkuninitvar.h lib/checkunusedvar.h lib/checkvaarg.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/standards.h lib/vfvalue.h +$(libcppdir)/checks.o: lib/checks.cpp lib/check.h lib/check64bit.h lib/checkassert.h lib/checkautovariables.h lib/checkbool.h lib/checkbufferoverrun.h lib/checkclass.h lib/checkcondition.h lib/checkexceptionsafety.h lib/checkfunctions.h lib/checkimpl.h lib/checkinternal.h lib/checkio.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/checkother.h lib/checkpostfixoperator.h lib/checks.h lib/checksizeof.h lib/checkstl.h lib/checkstring.h lib/checktype.h lib/checkuninitvar.h lib/checkunusedvar.h lib/checkvaarg.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/standards.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp -$(libcppdir)/checksizeof.o: lib/checksizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checksizeof.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checksizeof.o: lib/checksizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp -$(libcppdir)/checkstl.o: lib/checkstl.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/checkstl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/pathanalysis.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkstl.o: lib/checkstl.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkstl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/pathanalysis.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstl.cpp -$(libcppdir)/checkstring.o: lib/checkstring.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkstring.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkstring.o: lib/checkstring.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstring.cpp -$(libcppdir)/checktype.o: lib/checktype.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checktype.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checktype.o: lib/checktype.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checktype.cpp -$(libcppdir)/checkuninitvar.o: lib/checkuninitvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/checkuninitvar.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkuninitvar.o: lib/checkuninitvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkuninitvar.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkuninitvar.cpp $(libcppdir)/checkunusedfunctions.o: lib/checkunusedfunctions.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/astutils.h lib/checkers.h lib/checkunusedfunctions.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedfunctions.cpp -$(libcppdir)/checkunusedvar.o: lib/checkunusedvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkunusedvar.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkunusedvar.o: lib/checkunusedvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedvar.cpp -$(libcppdir)/checkvaarg.o: lib/checkvaarg.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkvaarg.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkvaarg.o: lib/checkvaarg.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkvaarg.cpp $(libcppdir)/clangimport.o: lib/clangimport.cpp lib/clangimport.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h @@ -744,28 +744,28 @@ test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/c test/options.o: test/options.cpp lib/config.h lib/timer.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/options.cpp -test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/test64bit.cpp test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testanalyzerinformation.cpp -test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testassert.cpp test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testastutils.cpp -test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testautovariables.cpp -test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbool.cpp -test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbufferoverrun.cpp -test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcharvar.cpp test/testcheck.o: test/testcheck.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h @@ -777,7 +777,7 @@ test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclangimport.cpp -test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclass.cpp test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h @@ -786,10 +786,10 @@ test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmd test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcolor.cpp -test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcondition.cpp -test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testconstructors.cpp test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h @@ -798,7 +798,7 @@ test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/a test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testerrorlogger.cpp -test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexceptionsafety.cpp test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h @@ -813,7 +813,7 @@ test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h l test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfrontend.cpp -test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfunctions.cpp test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h @@ -822,16 +822,16 @@ test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checker test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testimportproject.cpp -test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testincompletestatement.cpp -test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testinternal.cpp -test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testio.cpp -test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testleakautovar.cpp test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h @@ -840,16 +840,16 @@ test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checker test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmathlib.cpp -test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmemleak.cpp -test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testnullpointer.cpp test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testoptions.cpp -test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testother.cpp test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h @@ -861,7 +861,7 @@ test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/che test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testplatform.cpp -test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpostfixoperator.cpp test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h @@ -897,16 +897,16 @@ test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsingleexecutor.cpp -test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsizeof.cpp test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststandards.cpp -test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststl.cpp -test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststring.cpp test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h @@ -936,25 +936,25 @@ test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenrange.cpp -test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtype.cpp -test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testuninitvar.cpp test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedfunctions.cpp -test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedprivfunc.cpp -test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedvar.cpp test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testutils.cpp -test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvaarg.cpp test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 56a9489d00e..8dfd03596d3 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2157,7 +2157,7 @@ bool isWithoutSideEffects(const Token* tok, bool checkArrayAccess, bool checkRef if (tok && tok->varId()) { const Variable* var = tok->variable(); return var && ((!var->isClass() && (checkReference || !var->isReference())) || var->isPointer() || - (checkArrayAccess ? var->isArray() || (var->isStlType() && !var->isStlType(CheckClass::stl_containers_not_const)) : var->isStlType())); + (checkArrayAccess ? var->isArray() || (var->isStlType() && !var->isStlType(CheckClassImpl::stl_containers_not_const)) : var->isStlType())); } return true; } diff --git a/lib/check.h b/lib/check.h index 9a50e64baa1..768cc889c62 100644 --- a/lib/check.h +++ b/lib/check.h @@ -22,7 +22,6 @@ //--------------------------------------------------------------------------- #include "config.h" -#include "errortypes.h" #include #include @@ -36,14 +35,8 @@ namespace CTU { class FileInfo; } -namespace ValueFlow { - class Value; -} - class Settings; -class Token; class ErrorLogger; -class ErrorMessage; class Tokenizer; /** Use WRONG_DATA in checkers to mark conditions that check that data is correct */ @@ -57,21 +50,14 @@ class Tokenizer; * All checking classes must inherit from this class */ class CPPCHECKLIB Check { -public: - /** This constructor is used when registering the CheckClass */ - explicit Check(std::string aname); - protected: - /** This constructor is used when running checks. */ - Check(std::string aname, const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : mTokenizer(tokenizer), mSettings(settings), mErrorLogger(errorLogger), mName(std::move(aname)) {} - -private: - static std::list &instances_internal(); - -public: + /** This constructor is used when registering the check */ + explicit Check(std::string aname) + : mName(std::move(aname)) + {} virtual ~Check() = default; +public: Check(const Check &) = delete; Check& operator=(const Check &) = delete; @@ -89,13 +75,6 @@ class CPPCHECKLIB Check { /** get information about this class, used to generate documentation */ virtual std::string classInfo() const = 0; - /** - * Write given error to stdout in xml format. - * This is for for printout out the error list with --errorlist - * @param errmsg Error message to write - */ - static void writeToErrorList(const ErrorMessage &errmsg); - /** Base class used for whole-program analysis */ class CPPCHECKLIB FileInfo { public: @@ -121,40 +100,6 @@ class CPPCHECKLIB Check { return false; } -protected: - static std::string getMessageId(const ValueFlow::Value &value, const char id[]); - - const Tokenizer* const mTokenizer{}; - const Settings* const mSettings{}; - ErrorLogger* const mErrorLogger{}; - - /** report an error */ - void reportError(const Token *tok, const Severity severity, const std::string &id, const std::string &msg) { - reportError(tok, severity, id, msg, CWE(0U), Certainty::normal); - } - - /** report an error */ - void reportError(const Token *tok, const Severity severity, const std::string &id, const std::string &msg, const CWE &cwe, Certainty certainty) { - const std::list callstack(1, tok); - reportError(callstack, severity, id, msg, cwe, certainty); - } - - /** report an error */ - void reportError(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe, Certainty certainty); - - void reportError(ErrorPath errorPath, Severity severity, const char id[], const std::string &msg, const CWE &cwe, Certainty certainty); - - /** log checker */ - void logChecker(const char id[]); - - ErrorPath getErrorPath(const Token* errtok, const ValueFlow::Value* value, std::string bug) const; - - /** - * Use WRONG_DATA in checkers when you check for wrong data. That - * will call this method - */ - bool wrongData(const Token *tok, const char *str); - private: const std::string mName; }; diff --git a/lib/check64bit.cpp b/lib/check64bit.cpp index b33ab5bdbcb..e1e6f086ff3 100644 --- a/lib/check64bit.cpp +++ b/lib/check64bit.cpp @@ -51,7 +51,7 @@ static bool isFunctionPointer(const Token* tok) return Tokenizer::isFunctionPointer(tok->variable()->nameToken()); } -void Check64BitPortability::pointerassignment() +void Check64BitPortabilityImpl::pointerassignment() { if (!mSettings->severity.isEnabled(Severity::portability)) return; @@ -139,7 +139,7 @@ void Check64BitPortability::pointerassignment() } } -void Check64BitPortability::assignmentAddressToIntegerError(const Token *tok) +void Check64BitPortabilityImpl::assignmentAddressToIntegerError(const Token *tok) { reportError(tok, Severity::portability, "AssignmentAddressToInteger", @@ -150,7 +150,7 @@ void Check64BitPortability::assignmentAddressToIntegerError(const Token *tok) "way is to store addresses only in pointer types (or typedefs like uintptr_t).", CWE758, Certainty::normal); } -void Check64BitPortability::assignmentIntegerToAddressError(const Token *tok) +void Check64BitPortabilityImpl::assignmentIntegerToAddressError(const Token *tok) { reportError(tok, Severity::portability, "AssignmentIntegerToAddress", @@ -161,7 +161,7 @@ void Check64BitPortability::assignmentIntegerToAddressError(const Token *tok) "way is to store addresses only in pointer types (or typedefs like uintptr_t).", CWE758, Certainty::normal); } -void Check64BitPortability::returnPointerError(const Token *tok) +void Check64BitPortabilityImpl::returnPointerError(const Token *tok) { reportError(tok, Severity::portability, "CastAddressToIntegerAtReturn", @@ -172,7 +172,7 @@ void Check64BitPortability::returnPointerError(const Token *tok) "to 32-bit integer. The safe way is to return a type such as intptr_t.", CWE758, Certainty::normal); } -void Check64BitPortability::returnIntegerError(const Token *tok) +void Check64BitPortabilityImpl::returnIntegerError(const Token *tok) { reportError(tok, Severity::portability, "CastIntegerToAddressAtReturn", @@ -185,13 +185,13 @@ void Check64BitPortability::returnIntegerError(const Token *tok) void Check64BitPortability::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - Check64BitPortability check64BitPortability(&tokenizer, &tokenizer.getSettings(), errorLogger); + Check64BitPortabilityImpl check64BitPortability(&tokenizer, &tokenizer.getSettings(), errorLogger); check64BitPortability.pointerassignment(); } void Check64BitPortability::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - Check64BitPortability c(nullptr, settings, errorLogger); + Check64BitPortabilityImpl c(nullptr, settings, errorLogger); c.assignmentAddressToIntegerError(nullptr); c.assignmentIntegerToAddressError(nullptr); c.returnIntegerError(nullptr); diff --git a/lib/check64bit.h b/lib/check64bit.h index 79397e98e5f..1996d91ee23 100644 --- a/lib/check64bit.h +++ b/lib/check64bit.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -44,36 +45,35 @@ class CPPCHECKLIB Check64BitPortability : public Check { public: /** This constructor is used when registering the Check64BitPortability */ - Check64BitPortability() : Check(myName()) {} + Check64BitPortability() : Check("64-bit portability") {} private: - /** This constructor is used when running checks. */ - Check64BitPortability(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - /** Check for pointer assignment */ - void pointerassignment(); - - void assignmentAddressToIntegerError(const Token *tok); - void assignmentIntegerToAddressError(const Token *tok); - void returnIntegerError(const Token *tok); - void returnPointerError(const Token *tok); - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - static std::string myName() { - return "64-bit portability"; - } - std::string classInfo() const override { return "Check if there is 64-bit portability issues:\n" "- assign address to/from int/long\n" "- casting address from/to integer when returning from function\n"; } }; + +class CPPCHECKLIB Check64BitPortabilityImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + Check64BitPortabilityImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + + /** Check for pointer assignment */ + void pointerassignment(); + + void assignmentAddressToIntegerError(const Token *tok); + void assignmentIntegerToAddressError(const Token *tok); + void returnIntegerError(const Token *tok); + void returnPointerError(const Token *tok); +}; /// @} //--------------------------------------------------------------------------- #endif // check64bitH diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index ce2d7c62169..5242b595e67 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -39,7 +39,7 @@ // CWE ids used static const CWE CWE398(398U); // Indicator of Poor Code Quality -void CheckAssert::assertWithSideEffects() +void CheckAssertImpl::assertWithSideEffects() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -117,7 +117,7 @@ void CheckAssert::assertWithSideEffects() //--------------------------------------------------------------------------- -void CheckAssert::sideEffectInAssertError(const Token *tok, const std::string& functionName) +void CheckAssertImpl::sideEffectInAssertError(const Token *tok, const std::string& functionName) { reportError(tok, Severity::warning, "assertWithSideEffect", @@ -129,7 +129,7 @@ void CheckAssert::sideEffectInAssertError(const Token *tok, const std::string& f "builds, this is a bug.", CWE398, Certainty::normal); } -void CheckAssert::assignmentInAssertError(const Token *tok, const std::string& varname) +void CheckAssertImpl::assignmentInAssertError(const Token *tok, const std::string& varname) { reportError(tok, Severity::warning, "assignmentInAssert", @@ -142,7 +142,7 @@ void CheckAssert::assignmentInAssertError(const Token *tok, const std::string& v } // checks if side effects happen on the variable prior to tmp -void CheckAssert::checkVariableAssignment(const Token* assignTok, const Scope *assertionScope) +void CheckAssertImpl::checkVariableAssignment(const Token* assignTok, const Scope *assertionScope) { if (!assignTok->isAssignmentOp() && assignTok->tokType() != Token::eIncDecOp) return; @@ -172,7 +172,7 @@ void CheckAssert::checkVariableAssignment(const Token* assignTok, const Scope *a // TODO: function calls on var } -bool CheckAssert::inSameScope(const Token* returnTok, const Token* assignTok) +bool CheckAssertImpl::inSameScope(const Token* returnTok, const Token* assignTok) { // TODO: even if a return is in the same scope, the assignment might not affect it. return returnTok->scope() == assignTok->scope(); @@ -180,13 +180,13 @@ bool CheckAssert::inSameScope(const Token* returnTok, const Token* assignTok) void CheckAssert::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckAssert checkAssert(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckAssertImpl checkAssert(&tokenizer, &tokenizer.getSettings(), errorLogger); checkAssert.assertWithSideEffects(); } void CheckAssert::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckAssert c(nullptr, settings, errorLogger); + CheckAssertImpl c(nullptr, settings, errorLogger); c.sideEffectInAssertError(nullptr, "function"); c.assignmentInAssertError(nullptr, "var"); } diff --git a/lib/checkassert.h b/lib/checkassert.h index b01831a5eec..3fac8f5af83 100644 --- a/lib/checkassert.h +++ b/lib/checkassert.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -42,14 +43,22 @@ class Tokenizer; class CPPCHECKLIB CheckAssert : public Check { public: - CheckAssert() : Check(myName()) {} + CheckAssert() : Check("Assert") {} private: - CheckAssert(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** run checks, the token list is not simplified */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Warn if there are side effects in assert statements (since this cause different behaviour in debug/release builds).\n"; + } +}; + +class CPPCHECKLIB CheckAssertImpl : public CheckImpl { +public: + CheckAssertImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} void assertWithSideEffects(); @@ -58,16 +67,6 @@ class CPPCHECKLIB CheckAssert : public Check { void sideEffectInAssertError(const Token *tok, const std::string& functionName); void assignmentInAssertError(const Token *tok, const std::string &varname); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Assert"; - } - - std::string classInfo() const override { - return "Warn if there are side effects in assert statements (since this cause different behaviour in debug/release builds).\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index fdc5deceefa..0d3cae1c2fa 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -202,7 +202,7 @@ static bool variableIsUsedInScope(const Token* start, nonneg int varId, const Sc return false; } -void CheckAutoVariables::assignFunctionArg() +void CheckAutoVariablesImpl::assignFunctionArg() { const bool printStyle = mSettings->severity.isEnabled(Severity::style); const bool printWarning = mSettings->severity.isEnabled(Severity::warning); @@ -280,7 +280,7 @@ static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Settin return true; } -void CheckAutoVariables::autoVariables() +void CheckAutoVariablesImpl::autoVariables() { logChecker("CheckAutoVariables::autoVariables"); @@ -343,7 +343,7 @@ void CheckAutoVariables::autoVariables() } } -bool CheckAutoVariables::checkAutoVariableAssignment(const Token *expr, bool inconclusive, const Token *startToken) +bool CheckAutoVariablesImpl::checkAutoVariableAssignment(const Token *expr, bool inconclusive, const Token *startToken) { if (!startToken) startToken = Token::findsimplematch(expr, "=")->next(); @@ -386,7 +386,7 @@ bool CheckAutoVariables::checkAutoVariableAssignment(const Token *expr, bool inc //--------------------------------------------------------------------------- -void CheckAutoVariables::errorAutoVariableAssignment(const Token *tok, bool inconclusive) +void CheckAutoVariablesImpl::errorAutoVariableAssignment(const Token *tok, bool inconclusive) { diag(tok); @@ -409,7 +409,7 @@ void CheckAutoVariables::errorAutoVariableAssignment(const Token *tok, bool inco } } -void CheckAutoVariables::errorUselessAssignmentArg(const Token *tok) +void CheckAutoVariablesImpl::errorUselessAssignmentArg(const Token *tok) { reportError(tok, Severity::style, @@ -417,7 +417,7 @@ void CheckAutoVariables::errorUselessAssignmentArg(const Token *tok) "Assignment of function parameter has no effect outside the function.", CWE398, Certainty::normal); } -void CheckAutoVariables::errorUselessAssignmentPtrArg(const Token *tok) +void CheckAutoVariablesImpl::errorUselessAssignmentPtrArg(const Token *tok) { reportError(tok, Severity::warning, @@ -425,7 +425,7 @@ void CheckAutoVariables::errorUselessAssignmentPtrArg(const Token *tok) "Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?", CWE398, Certainty::normal); } -bool CheckAutoVariables::diag(const Token* tokvalue) +bool CheckAutoVariablesImpl::diag(const Token* tokvalue) { if (!tokvalue) return true; @@ -562,7 +562,7 @@ static bool isAssignedToNonLocal(const Token* tok) return !var->isLocal() || var->isStatic(); } -void CheckAutoVariables::checkVarLifetimeScope(const Token * start, const Token * end) +void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const Token * end) { const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); if (!start) @@ -705,7 +705,7 @@ void CheckAutoVariables::checkVarLifetimeScope(const Token * start, const Token } } -void CheckAutoVariables::checkVarLifetime() +void CheckAutoVariablesImpl::checkVarLifetime() { logChecker("CheckAutoVariables::checkVarLifetime"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -716,7 +716,7 @@ void CheckAutoVariables::checkVarLifetime() } } -void CheckAutoVariables::errorReturnDanglingLifetime(const Token *tok, const ValueFlow::Value *val) +void CheckAutoVariablesImpl::errorReturnDanglingLifetime(const Token *tok, const ValueFlow::Value *val) { const bool inconclusive = val ? val->isInconclusive() : false; ErrorPath errorPath = val ? val->errorPath : ErrorPath(); @@ -725,7 +725,7 @@ void CheckAutoVariables::errorReturnDanglingLifetime(const Token *tok, const Val reportError(std::move(errorPath), Severity::error, "returnDanglingLifetime", msg + " that will be invalid when returning.", CWE562, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckAutoVariables::errorInvalidLifetime(const Token *tok, const ValueFlow::Value* val) +void CheckAutoVariablesImpl::errorInvalidLifetime(const Token *tok, const ValueFlow::Value* val) { const bool inconclusive = val ? val->isInconclusive() : false; ErrorPath errorPath = val ? val->errorPath : ErrorPath(); @@ -734,7 +734,7 @@ void CheckAutoVariables::errorInvalidLifetime(const Token *tok, const ValueFlow: reportError(std::move(errorPath), Severity::error, "invalidLifetime", msg + " that is out of scope.", CWE562, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckAutoVariables::errorDanglingTemporaryLifetime(const Token* tok, const ValueFlow::Value* val, const Token* tempTok) +void CheckAutoVariablesImpl::errorDanglingTemporaryLifetime(const Token* tok, const ValueFlow::Value* val, const Token* tempTok) { const bool inconclusive = val ? val->isInconclusive() : false; ErrorPath errorPath = val ? val->errorPath : ErrorPath(); @@ -749,7 +749,7 @@ void CheckAutoVariables::errorDanglingTemporaryLifetime(const Token* tok, const inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckAutoVariables::errorDanglngLifetime(const Token *tok, const ValueFlow::Value *val, bool isStatic) +void CheckAutoVariablesImpl::errorDanglngLifetime(const Token *tok, const ValueFlow::Value *val, bool isStatic) { const bool inconclusive = val ? val->isInconclusive() : false; ErrorPath errorPath = val ? val->errorPath : ErrorPath(); @@ -760,21 +760,21 @@ void CheckAutoVariables::errorDanglngLifetime(const Token *tok, const ValueFlow: reportError(std::move(errorPath), Severity::error, "danglingLifetime", msg + ".", CWE562, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckAutoVariables::errorDanglingTempReference(const Token* tok, ErrorPath errorPath, bool inconclusive) +void CheckAutoVariablesImpl::errorDanglingTempReference(const Token* tok, ErrorPath errorPath, bool inconclusive) { errorPath.emplace_back(tok, ""); reportError( std::move(errorPath), Severity::error, "danglingTempReference", "Using reference to dangling temporary.", CWE562, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckAutoVariables::errorReturnReference(const Token* tok, ErrorPath errorPath, bool inconclusive) +void CheckAutoVariablesImpl::errorReturnReference(const Token* tok, ErrorPath errorPath, bool inconclusive) { errorPath.emplace_back(tok, ""); reportError( std::move(errorPath), Severity::error, "returnReference", "Reference to local variable returned.", CWE562, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckAutoVariables::errorDanglingReference(const Token *tok, const Variable *var, ErrorPath errorPath) +void CheckAutoVariablesImpl::errorDanglingReference(const Token *tok, const Variable *var, ErrorPath errorPath) { std::string tokName = tok ? tok->str() : "x"; std::string varName = var ? var->name() : "y"; @@ -783,14 +783,14 @@ void CheckAutoVariables::errorDanglingReference(const Token *tok, const Variable reportError(std::move(errorPath), Severity::error, "danglingReference", msg, CWE562, Certainty::normal); } -void CheckAutoVariables::errorReturnTempReference(const Token* tok, ErrorPath errorPath, bool inconclusive) +void CheckAutoVariablesImpl::errorReturnTempReference(const Token* tok, ErrorPath errorPath, bool inconclusive) { errorPath.emplace_back(tok, ""); reportError( std::move(errorPath), Severity::error, "returnTempReference", "Reference to temporary returned.", CWE562, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckAutoVariables::errorInvalidDeallocation(const Token *tok, const ValueFlow::Value *val) +void CheckAutoVariablesImpl::errorInvalidDeallocation(const Token *tok, const ValueFlow::Value *val) { const Variable *var = val ? val->tokvalue->variable() : (tok ? tok->variable() : nullptr); @@ -819,7 +819,7 @@ void CheckAutoVariables::errorInvalidDeallocation(const Token *tok, const ValueF void CheckAutoVariables::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckAutoVariables checkAutoVariables(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckAutoVariablesImpl checkAutoVariables(&tokenizer, &tokenizer.getSettings(), errorLogger); checkAutoVariables.assignFunctionArg(); checkAutoVariables.autoVariables(); checkAutoVariables.checkVarLifetime(); @@ -827,7 +827,7 @@ void CheckAutoVariables::runChecks(const Tokenizer &tokenizer, ErrorLogger *erro void CheckAutoVariables::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckAutoVariables c(nullptr,settings,errorLogger); + CheckAutoVariablesImpl c(nullptr,settings,errorLogger); c.errorAutoVariableAssignment(nullptr, false); c.errorReturnReference(nullptr, ErrorPath{}, false); c.errorDanglingReference(nullptr, nullptr, ErrorPath{}); diff --git a/lib/checkautovariables.h b/lib/checkautovariables.h index d94f254508f..39e6ceb10d5 100644 --- a/lib/checkautovariables.h +++ b/lib/checkautovariables.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include "errortypes.h" @@ -47,16 +48,33 @@ namespace ValueFlow { class CPPCHECKLIB CheckAutoVariables : public Check { public: /** This constructor is used when registering the CheckClass */ - CheckAutoVariables() : Check(myName()) {} + CheckAutoVariables() : Check("Auto Variables") {} private: - /** This constructor is used when running checks. */ - CheckAutoVariables(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "A pointer to a variable is only valid as long as the variable is in scope.\n" + "Check:\n" + "- returning a pointer to auto or temporary variable\n" + "- assigning address of an variable to an effective parameter of a function\n" + "- returning reference to local/temporary variable\n" + "- returning address of function parameter\n" + "- suspicious assignment of pointer argument\n" + "- useless assignment of function argument\n"; + } +}; + +class CPPCHECKLIB CheckAutoVariablesImpl : public CheckImpl +{ +public: + /** This constructor is used when running checks. */ + CheckAutoVariablesImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** assign function argument */ void assignFunctionArg(); @@ -69,7 +87,6 @@ class CPPCHECKLIB CheckAutoVariables : public Check { bool checkAutoVariableAssignment(const Token *expr, bool inconclusive, const Token *startToken = nullptr); void checkVarLifetime(); - void checkVarLifetimeScope(const Token * start, const Token * end); void errorAutoVariableAssignment(const Token *tok, bool inconclusive); @@ -85,24 +102,8 @@ class CPPCHECKLIB CheckAutoVariables : public Check { void errorUselessAssignmentArg(const Token *tok); void errorUselessAssignmentPtrArg(const Token *tok); - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Auto Variables"; - } - - std::string classInfo() const override { - return "A pointer to a variable is only valid as long as the variable is in scope.\n" - "Check:\n" - "- returning a pointer to auto or temporary variable\n" - "- assigning address of an variable to an effective parameter of a function\n" - "- returning reference to local/temporary variable\n" - "- returning address of function parameter\n" - "- suspicious assignment of pointer argument\n" - "- useless assignment of function argument\n"; - } - /** returns true if tokvalue has already been diagnosed */ +private: bool diag(const Token* tokvalue); std::set mDiagDanglingTemp; diff --git a/lib/checkbool.cpp b/lib/checkbool.cpp index c9a66876317..e4f55f26085 100644 --- a/lib/checkbool.cpp +++ b/lib/checkbool.cpp @@ -43,7 +43,7 @@ static bool isBool(const Variable* var) } //--------------------------------------------------------------------------- -void CheckBool::checkIncrementBoolean() +void CheckBoolImpl::checkIncrementBoolean() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("incrementboolean")) return; @@ -60,7 +60,7 @@ void CheckBool::checkIncrementBoolean() } } -void CheckBool::incrementBooleanError(const Token *tok) +void CheckBoolImpl::incrementBooleanError(const Token *tok) { reportError( tok, @@ -83,7 +83,7 @@ static bool isConvertedToBool(const Token* tok) // if (bool & bool) -> if (bool && bool) // if (bool | bool) -> if (bool || bool) //--------------------------------------------------------------------------- -void CheckBool::checkBitwiseOnBoolean() +void CheckBoolImpl::checkBitwiseOnBoolean() { if (!mSettings->isPremiumEnabled("bitwiseOnBoolean") && !mSettings->severity.isEnabled(Severity::style) && @@ -127,7 +127,7 @@ void CheckBool::checkBitwiseOnBoolean() } } -void CheckBool::bitwiseOnBooleanError(const Token* tok, const std::string& expression, const std::string& op, bool isCompound) +void CheckBoolImpl::bitwiseOnBooleanError(const Token* tok, const std::string& expression, const std::string& op, bool isCompound) { std::string msg = "Boolean expression '" + expression + "' is used in bitwise operation."; if (!isCompound) @@ -144,7 +144,7 @@ void CheckBool::bitwiseOnBooleanError(const Token* tok, const std::string& expre // if (!x==3) <- Probably meant to be "x!=3" //--------------------------------------------------------------------------- -void CheckBool::checkComparisonOfBoolWithInt() +void CheckBoolImpl::checkComparisonOfBoolWithInt() { if (!mSettings->severity.isEnabled(Severity::warning) || !mTokenizer->isCPP()) return; @@ -171,7 +171,7 @@ void CheckBool::checkComparisonOfBoolWithInt() } } -void CheckBool::comparisonOfBoolWithInvalidComparator(const Token *tok, const std::string &expression) +void CheckBoolImpl::comparisonOfBoolWithInvalidComparator(const Token *tok, const std::string &expression) { reportError(tok, Severity::warning, "comparisonOfBoolWithInvalidComparator", "Comparison of a boolean value using relational operator (<, >, <= or >=).\n" @@ -195,7 +195,7 @@ static bool tokenIsFunctionReturningBool(const Token* tok) return false; } -void CheckBool::checkComparisonOfFuncReturningBool() +void CheckBoolImpl::checkComparisonOfFuncReturningBool() { if (!mSettings->severity.isEnabled(Severity::style)) return; @@ -239,7 +239,7 @@ void CheckBool::checkComparisonOfFuncReturningBool() } } -void CheckBool::comparisonOfFuncReturningBoolError(const Token *tok, const std::string &expression) +void CheckBoolImpl::comparisonOfFuncReturningBoolError(const Token *tok, const std::string &expression) { reportError(tok, Severity::style, "comparisonOfFuncReturningBoolError", "Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n" @@ -248,7 +248,7 @@ void CheckBool::comparisonOfFuncReturningBoolError(const Token *tok, const std:: " operator could cause unexpected results.", CWE398, Certainty::normal); } -void CheckBool::comparisonOfTwoFuncsReturningBoolError(const Token *tok, const std::string &expression1, const std::string &expression2) +void CheckBoolImpl::comparisonOfTwoFuncsReturningBoolError(const Token *tok, const std::string &expression1, const std::string &expression2) { reportError(tok, Severity::style, "comparisonOfTwoFuncsReturningBoolError", "Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n" @@ -261,7 +261,7 @@ void CheckBool::comparisonOfTwoFuncsReturningBoolError(const Token *tok, const s // Comparison of bool with bool //------------------------------------------------------------------------------- -void CheckBool::checkComparisonOfBoolWithBool() +void CheckBoolImpl::checkComparisonOfBoolWithBool() { if (!mSettings->severity.isEnabled(Severity::style)) return; @@ -302,7 +302,7 @@ void CheckBool::checkComparisonOfBoolWithBool() } } -void CheckBool::comparisonOfBoolWithBoolError(const Token *tok, const std::string &expression) +void CheckBoolImpl::comparisonOfBoolWithBoolError(const Token *tok, const std::string &expression) { reportError(tok, Severity::style, "comparisonOfBoolWithBoolError", "Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n" @@ -312,7 +312,7 @@ void CheckBool::comparisonOfBoolWithBoolError(const Token *tok, const std::strin } //----------------------------------------------------------------------------- -void CheckBool::checkAssignBoolToPointer() +void CheckBoolImpl::checkAssignBoolToPointer() { logChecker("CheckBool::checkAssignBoolToPointer"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -325,7 +325,7 @@ void CheckBool::checkAssignBoolToPointer() } } -void CheckBool::assignBoolToPointerError(const Token *tok) +void CheckBoolImpl::assignBoolToPointerError(const Token *tok) { reportError(tok, Severity::error, "assignBoolToPointer", "Boolean value assigned to pointer.", CWE587, Certainty::normal); @@ -333,7 +333,7 @@ void CheckBool::assignBoolToPointerError(const Token *tok) //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -void CheckBool::checkComparisonOfBoolExpressionWithInt() +void CheckBoolImpl::checkComparisonOfBoolExpressionWithInt() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("compareBoolExpressionWithInt")) return; @@ -393,7 +393,7 @@ void CheckBool::checkComparisonOfBoolExpressionWithInt() } } -void CheckBool::comparisonOfBoolExpressionWithIntError(const Token *tok, bool not0or1) +void CheckBoolImpl::comparisonOfBoolExpressionWithIntError(const Token *tok, bool not0or1) { if (not0or1) reportError(tok, Severity::warning, "compareBoolExpressionWithInt", @@ -404,7 +404,7 @@ void CheckBool::comparisonOfBoolExpressionWithIntError(const Token *tok, bool no } -void CheckBool::pointerArithBool() +void CheckBoolImpl::pointerArithBool() { logChecker("CheckBool::pointerArithBool"); @@ -427,7 +427,7 @@ void CheckBool::pointerArithBool() } } -void CheckBool::pointerArithBoolCond(const Token *tok) +void CheckBoolImpl::pointerArithBoolCond(const Token *tok) { if (!tok) return; @@ -447,7 +447,7 @@ void CheckBool::pointerArithBoolCond(const Token *tok) pointerArithBoolError(tok); } -void CheckBool::pointerArithBoolError(const Token *tok) +void CheckBoolImpl::pointerArithBoolError(const Token *tok) { reportError(tok, Severity::error, @@ -456,7 +456,7 @@ void CheckBool::pointerArithBoolError(const Token *tok) "Converting pointer arithmetic result to bool. The boolean result is always true unless there is pointer arithmetic overflow, and overflow is undefined behaviour. Probably a dereference is forgotten.", CWE571, Certainty::normal); } -void CheckBool::checkAssignBoolToFloat() +void CheckBoolImpl::checkAssignBoolToFloat() { if (!mTokenizer->isCPP()) return; @@ -473,13 +473,13 @@ void CheckBool::checkAssignBoolToFloat() } } -void CheckBool::assignBoolToFloatError(const Token *tok) +void CheckBoolImpl::assignBoolToFloatError(const Token *tok) { reportError(tok, Severity::style, "assignBoolToFloat", "Boolean value assigned to floating point variable.", CWE704, Certainty::normal); } -void CheckBool::returnValueOfFunctionReturningBool() +void CheckBoolImpl::returnValueOfFunctionReturningBool() { if (!mSettings->severity.isEnabled(Severity::style)) return; @@ -507,14 +507,14 @@ void CheckBool::returnValueOfFunctionReturningBool() } } -void CheckBool::returnValueBoolError(const Token *tok) +void CheckBoolImpl::returnValueBoolError(const Token *tok) { reportError(tok, Severity::style, "returnNonBoolInBooleanFunction", "Non-boolean value returned from function returning bool"); } void CheckBool::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckBool checkBool(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckBoolImpl checkBool(&tokenizer, &tokenizer.getSettings(), errorLogger); // Checks checkBool.checkComparisonOfBoolExpressionWithInt(); @@ -531,7 +531,7 @@ void CheckBool::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) void CheckBool::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckBool c(nullptr, settings, errorLogger); + CheckBoolImpl c(nullptr, settings, errorLogger); c.assignBoolToPointerError(nullptr); c.assignBoolToFloatError(nullptr); c.comparisonOfFuncReturningBoolError(nullptr, "func_name"); diff --git a/lib/checkbool.h b/lib/checkbool.h index 65e5d0254ea..607d9c4a4b7 100644 --- a/lib/checkbool.h +++ b/lib/checkbool.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -41,16 +42,34 @@ class Tokenizer; class CPPCHECKLIB CheckBool : public Check { public: /** @brief This constructor is used when registering the CheckClass */ - CheckBool() : Check(myName()) {} + CheckBool() : Check("Boolean") {} private: - /** @brief This constructor is used when running checks. */ - CheckBool(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Boolean type checks\n" + "- using increment on boolean\n" + "- comparison of a boolean expression with an integer other than 0 or 1\n" + "- comparison of a function returning boolean value using relational operator\n" + "- comparison of a boolean value with boolean value using relational operator\n" + "- using bool in bitwise expression\n" + "- pointer addition in condition (either dereference is forgot or pointer overflow is required to make the condition false)\n" + "- Assigning bool value to pointer or float\n" + "- Returning an integer other than 0 or 1 from a function with boolean return value\n"; + } +}; + +class CPPCHECKLIB CheckBoolImpl : public CheckImpl +{ +public: + /** @brief This constructor is used when running checks. */ + CheckBoolImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** @brief %Check for comparison of function returning bool*/ void checkComparisonOfFuncReturningBool(); @@ -94,24 +113,6 @@ class CPPCHECKLIB CheckBool : public Check { void comparisonOfBoolExpressionWithIntError(const Token *tok, bool not0or1); void pointerArithBoolError(const Token *tok); void returnValueBoolError(const Token *tok); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Boolean"; - } - - std::string classInfo() const override { - return "Boolean type checks\n" - "- using increment on boolean\n" - "- comparison of a boolean expression with an integer other than 0 or 1\n" - "- comparison of a function returning boolean value using relational operator\n" - "- comparison of a boolean value with boolean value using relational operator\n" - "- using bool in bitwise expression\n" - "- pointer addition in condition (either dereference is forgot or pointer overflow is required to make the condition false)\n" - "- Assigning bool value to pointer or float\n" - "- Returning an integer other than 0 or 1 from a function with boolean return value\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 3ba41882316..592e4268f58 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -284,7 +284,7 @@ static std::vector getOverrunIndexValues(const Token* tok, return {}; } -void CheckBufferOverrun::arrayIndex() +void CheckBufferOverrunImpl::arrayIndex() { logChecker("CheckBufferOverrun::arrayIndex"); @@ -405,9 +405,9 @@ static std::string arrayIndexMessage(const Token* tok, return errmsg.str(); } -void CheckBufferOverrun::arrayIndexError(const Token* tok, - const std::vector& dimensions, - const std::vector& indexes) +void CheckBufferOverrunImpl::arrayIndexError(const Token* tok, + const std::vector& dimensions, + const std::vector& indexes) { if (!tok) { reportError(tok, Severity::error, "arrayIndexOutOfBounds", "Array 'arr[16]' accessed at index 16, which is out of bounds.", CWE_BUFFER_OVERRUN, Certainty::normal); @@ -434,9 +434,9 @@ void CheckBufferOverrun::arrayIndexError(const Token* tok, index->isInconclusive() ? Certainty::inconclusive : Certainty::normal); } -void CheckBufferOverrun::negativeIndexError(const Token* tok, - const std::vector& dimensions, - const std::vector& indexes) +void CheckBufferOverrunImpl::negativeIndexError(const Token* tok, + const std::vector& dimensions, + const std::vector& indexes) { if (!tok) { reportError(tok, Severity::error, "negativeIndex", "Negative array index", CWE_BUFFER_UNDERRUN, Certainty::normal); @@ -464,7 +464,7 @@ void CheckBufferOverrun::negativeIndexError(const Token* tok, //--------------------------------------------------------------------------- -void CheckBufferOverrun::pointerArithmetic() +void CheckBufferOverrunImpl::pointerArithmetic() { if (!mSettings->severity.isEnabled(Severity::portability) && !mSettings->isPremiumEnabled("pointerOutOfBounds")) return; @@ -528,7 +528,7 @@ void CheckBufferOverrun::pointerArithmetic() } } -void CheckBufferOverrun::pointerArithmeticError(const Token *tok, const Token *indexToken, const ValueFlow::Value *indexValue) +void CheckBufferOverrunImpl::pointerArithmeticError(const Token *tok, const Token *indexToken, const ValueFlow::Value *indexValue) { if (!tok) { reportError(tok, Severity::portability, "pointerOutOfBounds", "Pointer arithmetic overflow.", CWE_POINTER_ARITHMETIC_OVERFLOW, Certainty::normal); @@ -552,7 +552,7 @@ void CheckBufferOverrun::pointerArithmeticError(const Token *tok, const Token *i //--------------------------------------------------------------------------- -ValueFlow::Value CheckBufferOverrun::getBufferSize(const Token *bufTok) const +ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok) const { if (!bufTok->valueType()) return ValueFlow::Value(-1); @@ -634,7 +634,7 @@ static bool checkBufferSize(const Token *ftok, const Library::ArgumentChecks::Mi } -void CheckBufferOverrun::bufferOverflow() +void CheckBufferOverrunImpl::bufferOverflow() { logChecker("CheckBufferOverrun::bufferOverflow"); @@ -691,14 +691,14 @@ void CheckBufferOverrun::bufferOverflow() } } -void CheckBufferOverrun::bufferOverflowError(const Token *tok, const ValueFlow::Value *value, Certainty certainty) +void CheckBufferOverrunImpl::bufferOverflowError(const Token *tok, const ValueFlow::Value *value, Certainty certainty) { reportError(getErrorPath(tok, value, "Buffer overrun"), Severity::error, "bufferAccessOutOfBounds", "Buffer is accessed out of bounds: " + (tok ? getRealBufferTok(tok)->expressionString() : "buf"), CWE_BUFFER_OVERRUN, certainty); } //--------------------------------------------------------------------------- -void CheckBufferOverrun::arrayIndexThenCheck() +void CheckBufferOverrunImpl::arrayIndexThenCheck() { if (!mSettings->severity.isEnabled(Severity::style)) return; @@ -742,7 +742,7 @@ void CheckBufferOverrun::arrayIndexThenCheck() } } -void CheckBufferOverrun::arrayIndexThenCheckError(const Token *tok, const std::string &indexName) +void CheckBufferOverrunImpl::arrayIndexThenCheckError(const Token *tok, const std::string &indexName) { reportError(tok, Severity::style, "arrayIndexThenCheck", "$symbol:" + indexName + "\n" @@ -755,7 +755,7 @@ void CheckBufferOverrun::arrayIndexThenCheckError(const Token *tok, const std::s //--------------------------------------------------------------------------- -void CheckBufferOverrun::stringNotZeroTerminated() +void CheckBufferOverrunImpl::stringNotZeroTerminated() { // this is currently 'inconclusive'. See TestBufferOverrun::terminateStrncpy3 if (!mSettings->severity.isEnabled(Severity::warning) || !mSettings->certainty.isEnabled(Certainty::inconclusive)) @@ -808,7 +808,7 @@ void CheckBufferOverrun::stringNotZeroTerminated() } } -void CheckBufferOverrun::terminateStrncpyError(const Token *tok, const std::string &varname) +void CheckBufferOverrunImpl::terminateStrncpyError(const Token *tok, const std::string &varname) { const std::string shortMessage = "The buffer '$symbol' may not be null-terminated after the call to strncpy()."; reportError(tok, Severity::warning, "terminateStrncpy", @@ -821,7 +821,7 @@ void CheckBufferOverrun::terminateStrncpyError(const Token *tok, const std::stri } //--------------------------------------------------------------------------- -void CheckBufferOverrun::argumentSize() +void CheckBufferOverrunImpl::argumentSize() { // Check '%type% x[10]' arguments if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("argumentSize")) @@ -869,7 +869,7 @@ void CheckBufferOverrun::argumentSize() } } -void CheckBufferOverrun::argumentSizeError(const Token *tok, const std::string &functionName, nonneg int paramIndex, const std::string ¶mExpression, const Variable *paramVar, const Variable *functionArg) +void CheckBufferOverrunImpl::argumentSizeError(const Token *tok, const std::string &functionName, nonneg int paramIndex, const std::string ¶mExpression, const Variable *paramVar, const Variable *functionArg) { const std::string strParamNum = std::to_string(paramIndex + 1) + getOrdinalText(paramIndex + 1); ErrorPath errorPath; @@ -920,7 +920,7 @@ namespace }; } -bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset, int type) +bool CheckBufferOverrunImpl::isCtuUnsafeBufferUsage(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset, int type) { if (!offset) return false; @@ -941,12 +941,12 @@ bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings &settings, const return true; } -bool CheckBufferOverrun::isCtuUnsafeArrayIndex(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset) +bool CheckBufferOverrunImpl::isCtuUnsafeArrayIndex(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset) { return isCtuUnsafeBufferUsage(settings, argtok, offset, 1); } -bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings &settings, const Token *argtok, CTU::FileInfo::Value* offset) +bool CheckBufferOverrunImpl::isCtuUnsafePointerArith(const Settings &settings, const Token *argtok, CTU::FileInfo::Value* offset) { return isCtuUnsafeBufferUsage(settings, argtok, offset, 2); } @@ -954,8 +954,8 @@ bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings &settings, const /** @brief Parse current TU and extract file info */ Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const { - const std::list &unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafeArrayIndex); - const std::list &unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafePointerArith); + const std::list &unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, CheckBufferOverrunImpl::isCtuUnsafeArrayIndex); + const std::list &unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, CheckBufferOverrunImpl::isCtuUnsafePointerArith); if (unsafeArrayIndex.empty() && unsafePointerArith.empty()) { return nullptr; } @@ -967,7 +967,6 @@ Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, con Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const { - // cppcheck-suppress shadowFunction - TODO: fix this const std::string arrayIndex("array-index"); const std::string pointerArith("pointer-arith"); @@ -991,7 +990,7 @@ Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLEle /** @brief Analyse all file infos for all TU */ bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) { - CheckBufferOverrun dummy(nullptr, &settings, &errorLogger); + CheckBufferOverrunImpl dummy(nullptr, &settings, &errorLogger); dummy. logChecker("CheckBufferOverrun::analyseWholeProgram"); @@ -1058,7 +1057,7 @@ bool CheckBufferOverrun::analyseWholeProgram1(const std::mapgetSymbolDatabase(); @@ -1130,7 +1129,7 @@ void CheckBufferOverrun::objectIndex() } } -void CheckBufferOverrun::objectIndexError(const Token *tok, const ValueFlow::Value *v, bool known) +void CheckBufferOverrunImpl::objectIndexError(const Token *tok, const ValueFlow::Value *v, bool known) { ErrorPath errorPath; std::string name; @@ -1167,7 +1166,7 @@ static bool isVLAIndex(const Token* tok) return isVLAIndex(tok->astOperand1()) || isVLAIndex(tok->astOperand2()); } -void CheckBufferOverrun::negativeArraySize() +void CheckBufferOverrunImpl::negativeArraySize() { logChecker("CheckBufferOverrun::negativeArraySize"); const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -1197,7 +1196,7 @@ void CheckBufferOverrun::negativeArraySize() } } -void CheckBufferOverrun::negativeArraySizeError(const Token* tok) +void CheckBufferOverrunImpl::negativeArraySizeError(const Token* tok) { const std::string arrayName = tok ? tok->expressionString() : std::string(); const std::string line1 = arrayName.empty() ? std::string() : ("$symbol:" + arrayName + '\n'); @@ -1206,7 +1205,7 @@ void CheckBufferOverrun::negativeArraySizeError(const Token* tok) "Declaration of array '" + arrayName + "' with negative size is undefined behaviour", CWE758, Certainty::normal); } -void CheckBufferOverrun::negativeMemoryAllocationSizeError(const Token* tok, const ValueFlow::Value* value) +void CheckBufferOverrunImpl::negativeMemoryAllocationSizeError(const Token* tok, const ValueFlow::Value* value) { const std::string msg = "Memory allocation size is negative."; ErrorPath errorPath = getErrorPath(tok, value, msg); @@ -1217,7 +1216,7 @@ void CheckBufferOverrun::negativeMemoryAllocationSizeError(const Token* tok, con void CheckBufferOverrun::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckBufferOverrun checkBufferOverrun(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckBufferOverrunImpl checkBufferOverrun(&tokenizer, &tokenizer.getSettings(), errorLogger); checkBufferOverrun.arrayIndex(); checkBufferOverrun.pointerArithmetic(); checkBufferOverrun.bufferOverflow(); @@ -1230,7 +1229,7 @@ void CheckBufferOverrun::runChecks(const Tokenizer &tokenizer, ErrorLogger *erro void CheckBufferOverrun::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckBufferOverrun c(nullptr, settings, errorLogger); + CheckBufferOverrunImpl c(nullptr, settings, errorLogger); c.arrayIndexError(nullptr, std::vector(), std::vector()); c.pointerArithmeticError(nullptr, nullptr, nullptr); c.negativeIndexError(nullptr, std::vector(), std::vector()); diff --git a/lib/checkbufferoverrun.h b/lib/checkbufferoverrun.h index 9c6e1f0386d..fdf47121bb8 100644 --- a/lib/checkbufferoverrun.h +++ b/lib/checkbufferoverrun.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include "ctu.h" @@ -60,23 +61,44 @@ namespace ValueFlow class CPPCHECKLIB CheckBufferOverrun : public Check { public: /** This constructor is used when registering the CheckClass */ - CheckBufferOverrun() : Check(myName()) {} + CheckBufferOverrun() : Check("Bounds checking") {} private: - /** This constructor is used when running checks. */ - CheckBufferOverrun(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - /** @brief Parse current TU and extract file info */ Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; /** @brief Analyse all file infos for all TU */ bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + + std::string classInfo() const override { + return "Out of bounds checking:\n" + "- Array index out of bounds\n" + "- Pointer arithmetic overflow\n" + "- Buffer overflow\n" + "- Dangerous usage of strncat()\n" + "- Using array index before checking it\n" + "- Partial string write that leads to buffer that is not zero terminated.\n" + "- Check for large enough arrays being passed to functions\n" + "- Allocating memory with a negative size\n"; + } + + static bool analyseWholeProgram1(const std::map> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage, + int type, ErrorLogger &errorLogger, int maxCtuDepth, const std::string& file0); +}; + +class CPPCHECKLIB CheckBufferOverrunImpl : public CheckImpl +{ +public: + /** This constructor is used when running checks. */ + CheckBufferOverrunImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + void arrayIndex(); void arrayIndexError(const Token* tok, const std::vector& dimensions, @@ -113,27 +135,6 @@ class CPPCHECKLIB CheckBufferOverrun : public Check { static bool isCtuUnsafeBufferUsage(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset, int type); static bool isCtuUnsafeArrayIndex(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset); static bool isCtuUnsafePointerArith(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset); - - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; - static bool analyseWholeProgram1(const std::map> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage, - int type, ErrorLogger &errorLogger, int maxCtuDepth, const std::string& file0); - - - static std::string myName() { - return "Bounds checking"; - } - - std::string classInfo() const override { - return "Out of bounds checking:\n" - "- Array index out of bounds\n" - "- Pointer arithmetic overflow\n" - "- Buffer overflow\n" - "- Dangerous usage of strncat()\n" - "- Using array index before checking it\n" - "- Partial string write that leads to buffer that is not zero terminated.\n" - "- Check for large enough arrays being passed to functions\n" - "- Allocating memory with a negative size\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 3313fb636ed..c5b8507f301 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -106,12 +106,12 @@ static bool isVclTypeInit(const Type *type) } //--------------------------------------------------------------------------- -CheckClass::CheckClass(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger), +CheckClassImpl::CheckClassImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger), mSymbolDatabase(tokenizer?tokenizer->getSymbolDatabase():nullptr) {} -bool CheckClass::isInitialized(const CheckClass::Usage& usage, FunctionType funcType) const +bool CheckClassImpl::isInitialized(const Usage& usage, FunctionType funcType) const { const Variable& var = *usage.var; @@ -170,7 +170,7 @@ bool CheckClass::isInitialized(const CheckClass::Usage& usage, FunctionType func return false; } -void CheckClass::handleUnionMembers(std::vector& usageList) +void CheckClassImpl::handleUnionMembers(std::vector& usageList) { // Assign 1 union member => assign all union members for (const Usage& usage : usageList) { @@ -199,7 +199,7 @@ void CheckClass::handleUnionMembers(std::vector& usageList) // ClassCheck: Check that all class constructors are ok. //--------------------------------------------------------------------------- -void CheckClass::constructors() +void CheckClassImpl::constructors() { const bool printStyle = mSettings->severity.isEnabled(Severity::style); const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); @@ -385,7 +385,7 @@ static bool isPermissibleConversion(const std::string& type) return type == "std::initializer_list" || type == "std::nullptr_t"; } -void CheckClass::checkExplicitConstructors() +void CheckClassImpl::checkExplicitConstructors() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("noExplicitConstructor")) return; @@ -454,7 +454,7 @@ static bool hasNonCopyableBase(const Scope *scope, bool *unknown) return false; } -void CheckClass::copyconstructors() +void CheckClassImpl::copyconstructors() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -611,7 +611,7 @@ void CheckClass::copyconstructors() } */ -void CheckClass::copyConstructorShallowCopyError(const Token *tok, const std::string& varname) +void CheckClassImpl::copyConstructorShallowCopyError(const Token *tok, const std::string& varname) { reportError(tok, Severity::warning, "copyCtorPointerCopying", "$symbol:" + varname + "\nValue of pointer '$symbol', which points to allocated memory, is copied in copy constructor instead of allocating new memory.", CWE398, Certainty::normal); @@ -637,22 +637,22 @@ static std::string noMemberErrorMessage(const Scope *scope, const char function[ return errmsg; } -void CheckClass::noCopyConstructorError(const Scope *scope, bool isdefault, const Token *alloc, bool inconclusive) +void CheckClassImpl::noCopyConstructorError(const Scope *scope, bool isdefault, const Token *alloc, bool inconclusive) { reportError(alloc, Severity::warning, "noCopyConstructor", noMemberErrorMessage(scope, "copy constructor", isdefault), CWE398, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckClass::noOperatorEqError(const Scope *scope, bool isdefault, const Token *alloc, bool inconclusive) +void CheckClassImpl::noOperatorEqError(const Scope *scope, bool isdefault, const Token *alloc, bool inconclusive) { reportError(alloc, Severity::warning, "noOperatorEq", noMemberErrorMessage(scope, "operator=", isdefault), CWE398, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckClass::noDestructorError(const Scope *scope, bool isdefault, const Token *alloc) +void CheckClassImpl::noDestructorError(const Scope *scope, bool isdefault, const Token *alloc) { reportError(alloc, Severity::warning, "noDestructor", noMemberErrorMessage(scope, "destructor", isdefault), CWE398, Certainty::normal); } -bool CheckClass::canNotCopy(const Scope *scope) +bool CheckClassImpl::canNotCopy(const Scope *scope) { bool constructor = false; bool publicAssign = false; @@ -676,7 +676,7 @@ bool CheckClass::canNotCopy(const Scope *scope) return constructor && !(publicAssign || publicCopy); } -bool CheckClass::canNotMove(const Scope *scope) +bool CheckClassImpl::canNotMove(const Scope *scope) { bool constructor = false; bool publicAssign = false; @@ -721,7 +721,7 @@ static void getAllVariableMembers(const Scope *scope, std::vector CheckClass::createUsageList(const Scope *scope) +std::vector CheckClassImpl::createUsageList(const Scope *scope) { std::vector ret; std::vector varlist; @@ -733,7 +733,7 @@ std::vector CheckClass::createUsageList(const Scope *scope) return ret; } -void CheckClass::assignVar(std::vector &usageList, nonneg int varid) +void CheckClassImpl::assignVar(std::vector &usageList, nonneg int varid) { auto it = std::find_if(usageList.begin(), usageList.end(), [varid](const Usage& usage) { return usage.var->declarationId() == varid; @@ -742,7 +742,7 @@ void CheckClass::assignVar(std::vector &usageList, nonneg int varid) it->assign = true; } -void CheckClass::assignVar(std::vector &usageList, const Token* vartok) +void CheckClassImpl::assignVar(std::vector &usageList, const Token* vartok) { if (vartok->varId() > 0) { assignVar(usageList, vartok->varId()); @@ -756,7 +756,7 @@ void CheckClass::assignVar(std::vector &usageList, const Token* vartok) it->assign = true; } -void CheckClass::initVar(std::vector &usageList, nonneg int varid) +void CheckClassImpl::initVar(std::vector &usageList, nonneg int varid) { auto it = std::find_if(usageList.begin(), usageList.end(), [varid](const Usage& usage) { return usage.var->declarationId() == varid; @@ -765,13 +765,13 @@ void CheckClass::initVar(std::vector &usageList, nonneg int varid) it->init = true; } -void CheckClass::assignAllVar(std::vector &usageList) +void CheckClassImpl::assignAllVar(std::vector &usageList) { for (Usage & i : usageList) i.assign = true; } -void CheckClass::assignAllVarsVisibleFromScope(std::vector& usageList, const Scope* scope) +void CheckClassImpl::assignAllVarsVisibleFromScope(std::vector& usageList, const Scope* scope) { for (Usage& usage : usageList) { if (usage.var->scope() == scope) @@ -787,7 +787,7 @@ void CheckClass::assignAllVarsVisibleFromScope(std::vector& usageList, co } } -void CheckClass::clearAllVar(std::vector &usageList) +void CheckClassImpl::clearAllVar(std::vector &usageList) { for (Usage & i : usageList) { i.assign = false; @@ -795,7 +795,7 @@ void CheckClass::clearAllVar(std::vector &usageList) } } -bool CheckClass::isBaseClassMutableMemberFunc(const Token *tok, const Scope *scope) +bool CheckClassImpl::isBaseClassMutableMemberFunc(const Token *tok, const Scope *scope) { // Iterate through each base class... for (const Type::BaseInfo & i : scope->definedType->derivedFrom) { @@ -822,7 +822,7 @@ bool CheckClass::isBaseClassMutableMemberFunc(const Token *tok, const Scope *sco return false; } -void CheckClass::initializeVarList(const Function &func, std::list &callstack, const Scope *scope, std::vector &usage) const +void CheckClassImpl::initializeVarList(const Function &func, std::list &callstack, const Scope *scope, std::vector &usage) const { if (!func.functionScope) return; @@ -1154,7 +1154,7 @@ void CheckClass::initializeVarList(const Function &func, std::listseverity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedPrivateFunction")) return; @@ -1422,7 +1422,7 @@ void CheckClass::privateFunctions() } } -void CheckClass::unusedPrivateFunctionError(const Token* tok1, const Token *tok2, const std::string &classname, const std::string &funcname) +void CheckClassImpl::unusedPrivateFunctionError(const Token* tok1, const Token *tok2, const std::string &classname, const std::string &funcname) { std::list toks{ tok1 }; if (tok2) @@ -1444,7 +1444,7 @@ static const Scope* findFunctionOf(const Scope* scope) return nullptr; } -void CheckClass::checkMemset() +void CheckClassImpl::checkMemset() { logChecker("CheckClass::checkMemset"); const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); @@ -1540,7 +1540,7 @@ void CheckClass::checkMemset() } } -void CheckClass::checkMemsetType(const Scope *start, const Token *tok, const Scope *type, bool allocation, std::set parsedTypes) +void CheckClassImpl::checkMemsetType(const Scope *start, const Token *tok, const Scope *type, bool allocation, std::set parsedTypes) { // If type has been checked there is no need to check it again if (parsedTypes.find(type) != parsedTypes.end()) @@ -1606,7 +1606,7 @@ void CheckClass::checkMemsetType(const Scope *start, const Token *tok, const Sco } } -void CheckClass::mallocOnClassWarning(const Token* tok, const std::string &memfunc, const Token* classTok) +void CheckClassImpl::mallocOnClassWarning(const Token* tok, const std::string &memfunc, const Token* classTok) { std::list toks = { tok, classTok }; reportError(toks, Severity::warning, "mallocOnClassWarning", @@ -1616,7 +1616,7 @@ void CheckClass::mallocOnClassWarning(const Token* tok, const std::string &memfu "since no constructor is called and class members remain uninitialized. Consider using 'new' instead.", CWE762, Certainty::normal); } -void CheckClass::mallocOnClassError(const Token* tok, const std::string &memfunc, const Token* classTok, const std::string &classname) +void CheckClassImpl::mallocOnClassError(const Token* tok, const std::string &memfunc, const Token* classTok, const std::string &classname) { std::list toks = { tok, classTok }; reportError(toks, Severity::error, "mallocOnClassError", @@ -1627,7 +1627,7 @@ void CheckClass::mallocOnClassError(const Token* tok, const std::string &memfunc "since no constructor is called and class members remain uninitialized. Consider using 'new' instead.", CWE665, Certainty::normal); } -void CheckClass::memsetError(const Token *tok, const std::string &memfunc, const std::string &classname, const std::string &type, bool isContainer) +void CheckClassImpl::memsetError(const Token *tok, const std::string &memfunc, const std::string &classname, const std::string &type, bool isContainer) { const std::string typeStr = isContainer ? std::string() : (type + " that contains a "); const std::string msg = "$symbol:" + memfunc + "\n" @@ -1639,14 +1639,14 @@ void CheckClass::memsetError(const Token *tok, const std::string &memfunc, const reportError(tok, Severity::error, "memsetClass", msg, CWE762, Certainty::normal); } -void CheckClass::memsetErrorReference(const Token *tok, const std::string &memfunc, const std::string &type) +void CheckClassImpl::memsetErrorReference(const Token *tok, const std::string &memfunc, const std::string &type) { reportError(tok, Severity::error, "memsetClassReference", "$symbol:" + memfunc +"\n" "Using '" + memfunc + "' on " + type + " that contains a reference.", CWE665, Certainty::normal); } -void CheckClass::memsetErrorFloat(const Token *tok, const std::string &type) +void CheckClassImpl::memsetErrorFloat(const Token *tok, const std::string &type) { reportError(tok, Severity::portability, "memsetClassFloat", "Using memset() on " + type + " which contains a floating point number.\n" "Using memset() on " + type + " which contains a floating point number." @@ -1661,7 +1661,7 @@ void CheckClass::memsetErrorFloat(const Token *tok, const std::string &type) // operator= should return a reference to *this //--------------------------------------------------------------------------- -void CheckClass::operatorEqRetRefThis() +void CheckClassImpl::operatorEqRetRefThis() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("operatorEqRetRefThis")) return; @@ -1680,13 +1680,13 @@ void CheckClass::operatorEqRetRefThis() } } -void CheckClass::checkReturnPtrThis(const Scope *scope, const Function *func, const Token *tok, const Token *last) +void CheckClassImpl::checkReturnPtrThis(const Scope *scope, const Function *func, const Token *tok, const Token *last) { std::set analyzedFunctions; checkReturnPtrThis(scope, func, tok, last, analyzedFunctions); } -void CheckClass::checkReturnPtrThis(const Scope *scope, const Function *func, const Token *tok, const Token *last, std::set& analyzedFunctions) +void CheckClassImpl::checkReturnPtrThis(const Scope *scope, const Function *func, const Token *tok, const Token *last, std::set& analyzedFunctions) { bool foundReturn = false; @@ -1772,17 +1772,17 @@ void CheckClass::checkReturnPtrThis(const Scope *scope, const Function *func, co operatorEqMissingReturnStatementError(func->token, func->access == AccessControl::Public); } -void CheckClass::operatorEqRetRefThisError(const Token *tok) +void CheckClassImpl::operatorEqRetRefThisError(const Token *tok) { reportError(tok, Severity::style, "operatorEqRetRefThis", "'operator=' should return reference to 'this' instance.", CWE398, Certainty::normal); } -void CheckClass::operatorEqShouldBeLeftUnimplementedError(const Token *tok) +void CheckClassImpl::operatorEqShouldBeLeftUnimplementedError(const Token *tok) { reportError(tok, Severity::style, "operatorEqShouldBeLeftUnimplemented", "'operator=' should either return reference to 'this' instance or be declared private and left unimplemented.", CWE398, Certainty::normal); } -void CheckClass::operatorEqMissingReturnStatementError(const Token *tok, bool error) +void CheckClassImpl::operatorEqMissingReturnStatementError(const Token *tok, bool error) { if (error) { reportError(tok, Severity::error, "operatorEqMissingReturnStatement", "No 'return' statement in non-void function causes undefined behavior.", CWE398, Certainty::normal); @@ -1805,7 +1805,7 @@ void CheckClass::operatorEqMissingReturnStatementError(const Token *tok, bool er // assignment to self. //--------------------------------------------------------------------------- -void CheckClass::operatorEqToSelf() +void CheckClassImpl::operatorEqToSelf() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("operatorEqToSelf")) return; @@ -1846,7 +1846,7 @@ void CheckClass::operatorEqToSelf() } } -bool CheckClass::hasAllocationInIfScope(const Function *func, const Scope* scope, const Token *ifStatementScopeStart) const +bool CheckClassImpl::hasAllocationInIfScope(const Function *func, const Scope* scope, const Token *ifStatementScopeStart) const { const Token *end; if (ifStatementScopeStart->str() == "{") @@ -1856,12 +1856,12 @@ bool CheckClass::hasAllocationInIfScope(const Function *func, const Scope* scope return hasAllocation(func, scope, ifStatementScopeStart, end); } -bool CheckClass::hasAllocation(const Function *func, const Scope* scope) const +bool CheckClassImpl::hasAllocation(const Function *func, const Scope* scope) const { return hasAllocation(func, scope, func->functionScope->bodyStart, func->functionScope->bodyEnd); } -bool CheckClass::hasAllocation(const Function *func, const Scope* scope, const Token *start, const Token *end) const +bool CheckClassImpl::hasAllocation(const Function *func, const Scope* scope, const Token *start, const Token *end) const { if (!end) end = func->functionScope->bodyEnd; @@ -1907,7 +1907,7 @@ static bool isFalseKeyword(const Token* tok) * Checks if self-assignment test is inverse * For example 'if (this == &rhs)' */ -CheckClass::Bool CheckClass::isInverted(const Token *tok, const Token *rhs) +CheckClassImpl::Bool CheckClassImpl::isInverted(const Token *tok, const Token *rhs) { bool res = true; for (const Token *itr = tok; itr && itr->str()!="("; itr=itr->astParent()) { @@ -1936,7 +1936,7 @@ CheckClass::Bool CheckClass::isInverted(const Token *tok, const Token *rhs) return Bool::False; } -const Token * CheckClass::getIfStmtBodyStart(const Token *tok, const Token *rhs) +const Token * CheckClassImpl::getIfStmtBodyStart(const Token *tok, const Token *rhs) { const Token *top = tok->astTop(); if (Token::simpleMatch(top->link(), ") {")) { @@ -1952,7 +1952,7 @@ const Token * CheckClass::getIfStmtBodyStart(const Token *tok, const Token *rhs) return nullptr; } -bool CheckClass::hasAssignSelf(const Function *func, const Token *rhs, const Token *&out_ifStatementScopeStart) +bool CheckClassImpl::hasAssignSelf(const Function *func, const Token *rhs, const Token *&out_ifStatementScopeStart) { if (!rhs) return false; @@ -1986,7 +1986,7 @@ bool CheckClass::hasAssignSelf(const Function *func, const Token *rhs, const Tok return false; } -void CheckClass::operatorEqToSelfError(const Token *tok) +void CheckClassImpl::operatorEqToSelfError(const Token *tok) { reportError(tok, Severity::warning, "operatorEqToSelf", "'operator=' should check for assignment to self to avoid problems with dynamic memory.\n" @@ -1998,7 +1998,7 @@ void CheckClass::operatorEqToSelfError(const Token *tok) // A destructor in a base class should be virtual //--------------------------------------------------------------------------- -void CheckClass::virtualDestructor() +void CheckClassImpl::virtualDestructor() { // This error should only be given if: // * base class doesn't have virtual destructor @@ -2133,7 +2133,7 @@ void CheckClass::virtualDestructor() virtualDestructorError(func->tokenDef, func->name(), "", true); } -void CheckClass::virtualDestructorError(const Token *tok, const std::string &Base, const std::string &Derived, bool inconclusive) +void CheckClassImpl::virtualDestructorError(const Token *tok, const std::string &Base, const std::string &Derived, bool inconclusive) { if (inconclusive) { if (mSettings->severity.isEnabled(Severity::warning)) @@ -2154,7 +2154,7 @@ void CheckClass::virtualDestructorError(const Token *tok, const std::string &Bas // warn for "this-x". The indented code may be "this->x" //--------------------------------------------------------------------------- -void CheckClass::thisSubtraction() +void CheckClassImpl::thisSubtraction() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -2174,7 +2174,7 @@ void CheckClass::thisSubtraction() } } -void CheckClass::thisSubtractionError(const Token *tok) +void CheckClassImpl::thisSubtractionError(const Token *tok) { reportError(tok, Severity::warning, "thisSubtraction", "Suspicious pointer subtraction. Did you intend to write '->'?", CWE398, Certainty::normal); } @@ -2183,7 +2183,7 @@ void CheckClass::thisSubtractionError(const Token *tok) // can member function be const? //--------------------------------------------------------------------------- -void CheckClass::checkConst() +void CheckClassImpl::checkConst() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("functionConst") && @@ -2319,7 +2319,7 @@ static const Token* getFuncTokFromThis(const Token* tok) { return Token::Match(tok, "%name% (") ? tok : nullptr; } -bool CheckClass::isMemberVar(const Scope *scope, const Token *tok) const +bool CheckClassImpl::isMemberVar(const Scope *scope, const Token *tok) const { bool again = false; @@ -2406,7 +2406,7 @@ bool CheckClass::isMemberVar(const Scope *scope, const Token *tok) const return false; } -bool CheckClass::isMemberFunc(const Scope *scope, const Token *tok) +bool CheckClassImpl::isMemberFunc(const Scope *scope, const Token *tok) { if (!tok->function()) { if (Token::simpleMatch(tok->astParent(), ".") && Token::simpleMatch(tok->astParent()->astOperand1(), "this")) @@ -2449,7 +2449,7 @@ bool CheckClass::isMemberFunc(const Scope *scope, const Token *tok) return false; } -bool CheckClass::isConstMemberFunc(const Scope *scope, const Token *tok) +bool CheckClassImpl::isConstMemberFunc(const Scope *scope, const Token *tok) { if (!tok->function()) return false; @@ -2474,7 +2474,7 @@ bool CheckClass::isConstMemberFunc(const Scope *scope, const Token *tok) return false; } -const std::set CheckClass::stl_containers_not_const = { "map", "unordered_map", "std :: map|unordered_map <" }; // start pattern +const std::set CheckClassImpl::stl_containers_not_const = { "map", "unordered_map", "std :: map|unordered_map <" }; // start pattern static bool isNonConstPtrCast(const Token* tok) { @@ -2484,7 +2484,7 @@ static bool isNonConstPtrCast(const Token* tok) return !vt || (vt->pointer > 0 && !vt->isConst(vt->pointer)); } -bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, MemberAccess& memberAccessed) const +bool CheckClassImpl::checkConstFunc(const Scope *scope, const Function *func, MemberAccess& memberAccessed) const { if (mTokenizer->hasIfdef(func->functionScope->bodyStart, func->functionScope->bodyEnd)) return false; @@ -2758,12 +2758,12 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, Member return true; } -void CheckClass::checkConstError(const Token *tok, const std::string &classname, const std::string &funcname, bool suggestStatic, bool foundAllBaseClasses) +void CheckClassImpl::checkConstError(const Token *tok, const std::string &classname, const std::string &funcname, bool suggestStatic, bool foundAllBaseClasses) { checkConstError2(tok, nullptr, classname, funcname, suggestStatic, foundAllBaseClasses); } -void CheckClass::checkConstError2(const Token *tok1, const Token *tok2, const std::string &classname, const std::string &funcname, bool suggestStatic, bool foundAllBaseClasses) +void CheckClassImpl::checkConstError2(const Token *tok1, const Token *tok2, const std::string &classname, const std::string &funcname, bool suggestStatic, bool foundAllBaseClasses) { std::list toks{ tok1 }; if (tok2) @@ -2804,7 +2804,7 @@ namespace { // avoid one-definition-rule violation }; } -void CheckClass::initializerListOrder() +void CheckClassImpl::initializerListOrder() { if (!mSettings->isPremiumEnabled("initializerList")) { if (!mSettings->severity.isEnabled(Severity::style)) @@ -2883,7 +2883,7 @@ void CheckClass::initializerListOrder() } } -void CheckClass::initializerListError(const Token *tok1, const Token *tok2, const std::string &classname, const std::string &varname, const std::string& argname) +void CheckClassImpl::initializerListError(const Token *tok1, const Token *tok2, const std::string &classname, const std::string &varname, const std::string& argname) { std::list toks = { tok1, tok2 }; const std::string msg = argname.empty() ? @@ -2904,7 +2904,7 @@ void CheckClass::initializerListError(const Token *tok1, const Token *tok2, cons // Check for self initialization in initialization list //--------------------------------------------------------------------------- -void CheckClass::checkSelfInitialization() +void CheckClassImpl::checkSelfInitialization() { logChecker("CheckClass::checkSelfInitialization"); @@ -2933,7 +2933,7 @@ void CheckClass::checkSelfInitialization() } } -void CheckClass::selfInitializationError(const Token* tok, const std::string& varname) +void CheckClassImpl::selfInitializationError(const Token* tok, const std::string& varname) { reportError(tok, Severity::error, "selfInitialization", "$symbol:" + varname + "\nMember variable '$symbol' is initialized by itself.", CWE665, Certainty::normal); } @@ -2943,7 +2943,7 @@ void CheckClass::selfInitializationError(const Token* tok, const std::string& va // Check for virtual function calls in constructor/destructor //--------------------------------------------------------------------------- -void CheckClass::checkVirtualFunctionCallInConstructor() +void CheckClassImpl::checkVirtualFunctionCallInConstructor() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -2973,8 +2973,8 @@ void CheckClass::checkVirtualFunctionCallInConstructor() } } -const std::list & CheckClass::getVirtualFunctionCalls(const Function & function, - std::map> & virtualFunctionCallsMap) +const std::list & CheckClassImpl::getVirtualFunctionCalls(const Function & function, + std::map> & virtualFunctionCallsMap) { const auto found = utils::as_const(virtualFunctionCallsMap).find(&function); if (found != virtualFunctionCallsMap.end()) @@ -3031,7 +3031,7 @@ const std::list & CheckClass::getVirtualFunctionCalls(const Funct return virtualFunctionCalls; } -void CheckClass::getFirstVirtualFunctionCallStack( +void CheckClassImpl::getFirstVirtualFunctionCallStack( std::map> & virtualFunctionCallsMap, const Token * callToken, std::list & pureFuncStack) @@ -3051,7 +3051,7 @@ void CheckClass::getFirstVirtualFunctionCallStack( getFirstVirtualFunctionCallStack(virtualFunctionCallsMap, firstCall, pureFuncStack); } -void CheckClass::virtualFunctionCallInConstructorError( +void CheckClassImpl::virtualFunctionCallInConstructorError( const Function * scopeFunction, const std::list & tokStack, const std::string &funcname) @@ -3089,7 +3089,7 @@ void CheckClass::virtualFunctionCallInConstructorError( "Virtual function '" + funcname + "' is called from " + scopeFunctionTypeName + " '" + constructorName + "' at line " + std::to_string(lineNumber) + ". Dynamic binding is not used.", CWE(0U), Certainty::normal); } -void CheckClass::pureVirtualFunctionCallInConstructorError( +void CheckClassImpl::pureVirtualFunctionCallInConstructorError( const Function * scopeFunction, const std::list & tokStack, const std::string &purefuncname) @@ -3114,7 +3114,7 @@ void CheckClass::pureVirtualFunctionCallInConstructorError( // Check for members hiding inherited members with the same name //--------------------------------------------------------------------------- -void CheckClass::checkDuplInheritedMembers() +void CheckClassImpl::checkDuplInheritedMembers() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("duplInheritedMember")) return; @@ -3203,7 +3203,7 @@ static std::vector getDuplInheritedMemberFunctionsRecursive( return results; } -void CheckClass::checkDuplInheritedMembersRecursive(const Type* typeCurrent, const Type* typeBase) +void CheckClassImpl::checkDuplInheritedMembersRecursive(const Type* typeCurrent, const Type* typeBase) { const auto resultsVar = getDuplInheritedMembersRecursive(typeCurrent, typeBase); for (const auto& r : resultsVar) { @@ -3222,9 +3222,9 @@ void CheckClass::checkDuplInheritedMembersRecursive(const Type* typeCurrent, con } } -void CheckClass::duplInheritedMembersError(const Token *tok1, const Token* tok2, - const std::string &derivedName, const std::string &baseName, - const std::string &memberName, bool derivedIsStruct, bool baseIsStruct, bool isFunction) +void CheckClassImpl::duplInheritedMembersError(const Token *tok1, const Token* tok2, + const std::string &derivedName, const std::string &baseName, + const std::string &memberName, bool derivedIsStruct, bool baseIsStruct, bool isFunction) { ErrorPath errorPath; const std::string member = isFunction ? "function" : "variable"; @@ -3250,7 +3250,7 @@ enum class CtorType : std::uint8_t { WITH_BODY }; -void CheckClass::checkCopyCtorAndEqOperator() +void CheckClassImpl::checkCopyCtorAndEqOperator() { // TODO: This is disabled because of #8388 // The message must be clarified. How is the behaviour different? @@ -3302,7 +3302,7 @@ void CheckClass::checkCopyCtorAndEqOperator() } } -void CheckClass::copyCtorAndEqOperatorError(const Token *tok, const std::string &classname, bool isStruct, bool hasCopyCtor) +void CheckClassImpl::copyCtorAndEqOperatorError(const Token *tok, const std::string &classname, bool isStruct, bool hasCopyCtor) { const std::string message = "$symbol:" + classname + "\n" "The " + std::string(isStruct ? "struct" : "class") + " '$symbol' has '" + @@ -3312,7 +3312,7 @@ void CheckClass::copyCtorAndEqOperatorError(const Token *tok, const std::string reportError(tok, Severity::warning, "copyCtorAndEqOperator", message); } -void CheckClass::checkOverride() +void CheckClassImpl::checkOverride() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("missingOverride")) return; @@ -3336,7 +3336,7 @@ void CheckClass::checkOverride() } } -void CheckClass::overrideError(const Function *funcInBase, const Function *funcInDerived) +void CheckClassImpl::overrideError(const Function *funcInBase, const Function *funcInDerived) { const std::string functionName = funcInDerived ? ((funcInDerived->isDestructor() ? "~" : "") + funcInDerived->name()) : ""; const std::string funcType = (funcInDerived && funcInDerived->isDestructor()) ? "destructor" : "function"; @@ -3354,7 +3354,7 @@ void CheckClass::overrideError(const Function *funcInBase, const Function *funcI Certainty::normal); } -void CheckClass::uselessOverrideError(const Function *funcInBase, const Function *funcInDerived, bool isSameCode) +void CheckClassImpl::uselessOverrideError(const Function *funcInBase, const Function *funcInDerived, bool isSameCode) { const std::string functionName = funcInDerived ? ((funcInDerived->isDestructor() ? "~" : "") + funcInDerived->name()) : ""; const std::string funcType = (funcInDerived && funcInDerived->isDestructor()) ? "destructor" : "function"; @@ -3418,7 +3418,7 @@ static bool compareTokenRanges(const Token* start1, const Token* end1, const Tok return isEqual; } -void CheckClass::checkUselessOverride() +void CheckClassImpl::checkUselessOverride() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("uselessOverride")) return; @@ -3499,7 +3499,7 @@ static const Variable* getSingleReturnVar(const Scope* scope) { return tok->variable(); } -void CheckClass::checkReturnByReference() +void CheckClassImpl::checkReturnByReference() { if (!mSettings->severity.isEnabled(Severity::performance) && !mSettings->isPremiumEnabled("returnByReference")) return; @@ -3542,14 +3542,14 @@ void CheckClass::checkReturnByReference() } } -void CheckClass::returnByReferenceError(const Function* func, const Variable* var) +void CheckClassImpl::returnByReferenceError(const Function* func, const Variable* var) { const Token* tok = func ? func->tokenDef : nullptr; const std::string message = "Function '" + (func ? func->name() : "func") + "()' should return member '" + (var ? var->name() : "var") + "' by const reference."; reportError(tok, Severity::performance, "returnByReference", message); } -void CheckClass::checkThisUseAfterFree() +void CheckClassImpl::checkThisUseAfterFree() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -3598,7 +3598,7 @@ void CheckClass::checkThisUseAfterFree() } } -bool CheckClass::checkThisUseAfterFreeRecursive(const Scope *classScope, const Function *func, const Variable *selfPointer, std::set callstack, const Token *&freeToken) +bool CheckClassImpl::checkThisUseAfterFreeRecursive(const Scope *classScope, const Function *func, const Variable *selfPointer, std::set callstack, const Token *&freeToken) { if (!func || !func->functionScope) return false; @@ -3637,7 +3637,7 @@ bool CheckClass::checkThisUseAfterFreeRecursive(const Scope *classScope, const F return false; } -void CheckClass::thisUseAfterFree(const Token *self, const Token *free, const Token *use) +void CheckClassImpl::thisUseAfterFree(const Token *self, const Token *free, const Token *use) { std::string selfPointer = self ? self->str() : "ptr"; ErrorPath errorPath = { ErrorPathItem(self, "Assuming '" + selfPointer + "' is used as 'this'"), ErrorPathItem(free, "Delete '" + selfPointer + "', invalidating 'this'"), ErrorPathItem(use, "Call method when 'this' is invalid") }; @@ -3649,7 +3649,7 @@ void CheckClass::thisUseAfterFree(const Token *self, const Token *free, const To CWE(0), Certainty::normal); } -void CheckClass::checkUnsafeClassRefMember() +void CheckClassImpl::checkUnsafeClassRefMember() { if (!mSettings->safeChecks.classes || !mSettings->severity.isEnabled(Severity::warning)) return; @@ -3673,7 +3673,7 @@ void CheckClass::checkUnsafeClassRefMember() } } -void CheckClass::unsafeClassRefMemberError(const Token *tok, const std::string &varname) +void CheckClassImpl::unsafeClassRefMemberError(const Token *tok, const std::string &varname) { reportError(tok, Severity::warning, "unsafeClassRefMember", "$symbol:" + varname + "\n" @@ -3833,7 +3833,7 @@ bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list @@ -54,18 +55,56 @@ class CPPCHECKLIB CheckClass : public Check { public: /** @brief This constructor is used when registering the CheckClass */ - CheckClass() : Check(myName()) {} - - /** @brief Set of the STL types whose operator[] is not const */ - static const std::set stl_containers_not_const; - -private: - /** @brief This constructor is used when running checks. */ - CheckClass(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger); + CheckClass() : Check("Class") {} /** @brief Run checks on the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + /** @brief Parse current TU and extract file info */ + Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const override; + + Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + + /** @brief Analyse all file infos for all TU */ + bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Check the code for each class.\n" + "- Missing constructors and copy constructors\n" + //"- Missing allocation of memory in copy constructor\n" + "- Constructors which should be explicit\n" + "- Are all variables initialized by the constructors?\n" + "- Are all variables assigned by 'operator='?\n" + "- Warn if memset, memcpy etc are used on a class\n" + "- Warn if memory for classes is allocated with malloc()\n" + "- If it's a base class, check that the destructor is virtual\n" + "- Are there unused private functions?\n" + "- 'operator=' should check for assignment to self\n" + "- Constness for member functions\n" + "- Order of initializations\n" + "- Suggest usage of initialization list\n" + "- Initialization of a member with itself\n" + "- Suspicious subtraction from 'this'\n" + "- Call of pure virtual function in constructor/destructor\n" + "- Duplicated inherited data members\n" + // disabled for now "- If 'copy constructor' defined, 'operator=' also should be defined and vice versa\n" + "- Check that arbitrary usage of public interface does not result in division by zero\n" + "- Delete \"self pointer\" and then access 'this'\n" + "- Check that the 'override' keyword is used when overriding virtual functions\n" + "- Check that the 'one definition rule' is not violated\n"; + } +}; + +class CPPCHECKLIB CheckClassImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckClassImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger); + + /** @brief Set of the STL types whose operator[] is not const */ + static const std::set stl_containers_not_const; + /** @brief %Check that all class constructors are ok */ void constructors(); @@ -137,14 +176,6 @@ class CPPCHECKLIB CheckClass : public Check { /** @brief Unsafe class check - const reference member */ void checkUnsafeClassRefMember(); - /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const override; - - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; - - /** @brief Analyse all file infos for all TU */ - bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - const SymbolDatabase* mSymbolDatabase{}; // Reporting errors.. @@ -187,38 +218,6 @@ class CPPCHECKLIB CheckClass : public Check { void unsafeClassRefMemberError(const Token *tok, const std::string &varname); void checkDuplInheritedMembersRecursive(const Type* typeCurrent, const Type* typeBase); - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Class"; - } - - std::string classInfo() const override { - return "Check the code for each class.\n" - "- Missing constructors and copy constructors\n" - //"- Missing allocation of memory in copy constructor\n" - "- Constructors which should be explicit\n" - "- Are all variables initialized by the constructors?\n" - "- Are all variables assigned by 'operator='?\n" - "- Warn if memset, memcpy etc are used on a class\n" - "- Warn if memory for classes is allocated with malloc()\n" - "- If it's a base class, check that the destructor is virtual\n" - "- Are there unused private functions?\n" - "- 'operator=' should check for assignment to self\n" - "- Constness for member functions\n" - "- Order of initializations\n" - "- Suggest usage of initialization list\n" - "- Initialization of a member with itself\n" - "- Suspicious subtraction from 'this'\n" - "- Call of pure virtual function in constructor/destructor\n" - "- Duplicated inherited data members\n" - // disabled for now "- If 'copy constructor' defined, 'operator=' also should be defined and vice versa\n" - "- Check that arbitrary usage of public interface does not result in division by zero\n" - "- Delete \"self pointer\" and then access 'this'\n" - "- Check that the 'override' keyword is used when overriding virtual functions\n" - "- Check that the 'one definition rule' is not violated\n"; - } - // operatorEqRetRefThis helper functions void checkReturnPtrThis(const Scope *scope, const Function *func, const Token *tok, const Token *last); void checkReturnPtrThis(const Scope *scope, const Function *func, const Token *tok, const Token *last, std::set& analyzedFunctions); diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index f70d9172832..163b05cc445 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -52,7 +52,7 @@ static const CWE CWE571(571U); // Expression is Always True //--------------------------------------------------------------------------- -bool CheckCondition::diag(const Token* tok, bool insert) +bool CheckConditionImpl::diag(const Token* tok, bool insert) { if (!tok) return false; @@ -73,14 +73,14 @@ bool CheckCondition::diag(const Token* tok, bool insert) return true; } -bool CheckCondition::diag(const Token* tok1, const Token* tok2) +bool CheckConditionImpl::diag(const Token* tok1, const Token* tok2) { const bool b1 = diag(tok1); const bool b2 = diag(tok2); return b1 && b2; } -bool CheckCondition::isAliased(const std::set &vars) const +bool CheckConditionImpl::isAliased(const std::set &vars) const { for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { if (Token::Match(tok, "= & %var% ;") && vars.find(tok->tokAt(2)->varId()) != vars.end()) @@ -89,7 +89,7 @@ bool CheckCondition::isAliased(const std::set &vars) const return false; } -void CheckCondition::assignIf() +void CheckConditionImpl::assignIf() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("assignIfError")) return; @@ -162,12 +162,12 @@ static bool isParameterChanged(const Token *partok) } /** parse scopes recursively */ -bool CheckCondition::assignIfParseScope(const Token * const assignTok, - const Token * const startTok, - const nonneg int varid, - const bool islocal, - const char bitop, - const MathLib::bigint num) +bool CheckConditionImpl::assignIfParseScope(const Token * const assignTok, + const Token * const startTok, + const nonneg int varid, + const bool islocal, + const char bitop, + const MathLib::bigint num) { bool ret = false; @@ -240,7 +240,7 @@ bool CheckCondition::assignIfParseScope(const Token * const assignTok, return false; } -void CheckCondition::assignIfError(const Token *tok1, const Token *tok2, const std::string &condition, bool result) +void CheckConditionImpl::assignIfError(const Token *tok1, const Token *tok2, const std::string &condition, bool result) { if (tok2 && diag(tok2->tokAt(2))) return; @@ -252,7 +252,7 @@ void CheckCondition::assignIfError(const Token *tok1, const Token *tok2, const s } -void CheckCondition::mismatchingBitAndError(const Token *tok1, const MathLib::bigint num1, const Token *tok2, const MathLib::bigint num2) +void CheckConditionImpl::mismatchingBitAndError(const Token *tok1, const MathLib::bigint num1, const Token *tok2, const MathLib::bigint num2) { std::list locations = { tok1, tok2 }; @@ -308,7 +308,7 @@ static bool isOperandExpanded(const Token *tok) return false; } -void CheckCondition::checkBadBitmaskCheck() +void CheckConditionImpl::checkBadBitmaskCheck() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("badBitmaskCheck")) return; @@ -348,7 +348,7 @@ void CheckCondition::checkBadBitmaskCheck() } } -void CheckCondition::badBitmaskCheckError(const Token *tok, bool isNoOp) +void CheckConditionImpl::badBitmaskCheckError(const Token *tok, bool isNoOp) { if (isNoOp) reportError(tok, Severity::style, "badBitmaskCheck", "Operator '|' with one operand equal to zero is redundant.", CWE571, Certainty::normal); @@ -356,7 +356,7 @@ void CheckCondition::badBitmaskCheckError(const Token *tok, bool isNoOp) reportError(tok, Severity::warning, "badBitmaskCheck", "Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?", CWE571, Certainty::normal); } -void CheckCondition::comparison() +void CheckConditionImpl::comparison() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("comparisonError")) return; @@ -421,7 +421,7 @@ void CheckCondition::comparison() } } -void CheckCondition::comparisonError(const Token *tok, const std::string &bitop, MathLib::bigint value1, const std::string &op, MathLib::bigint value2, bool result) +void CheckConditionImpl::comparisonError(const Token *tok, const std::string &bitop, MathLib::bigint value1, const std::string &op, MathLib::bigint value2, bool result) { std::ostringstream expression; expression << std::hex << "(X " << bitop << " 0x" << value1 << ") " << op << " 0x" << value2; @@ -435,7 +435,7 @@ void CheckCondition::comparisonError(const Token *tok, const std::string &bitop, reportError(tok, Severity::style, "comparisonError", errmsg, CWE398, Certainty::normal); } -bool CheckCondition::isOverlappingCond(const Token * const cond1, const Token * const cond2, bool pure) const +bool CheckConditionImpl::isOverlappingCond(const Token * const cond1, const Token * const cond2, bool pure) const { if (!cond1 || !cond2) return false; @@ -476,7 +476,7 @@ bool CheckCondition::isOverlappingCond(const Token * const cond1, const Token * return false; } -void CheckCondition::duplicateCondition() +void CheckConditionImpl::duplicateCondition() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("duplicateCondition")) return; @@ -515,7 +515,7 @@ void CheckCondition::duplicateCondition() } } -void CheckCondition::duplicateConditionError(const Token *tok1, const Token *tok2, ErrorPath errorPath) +void CheckConditionImpl::duplicateConditionError(const Token *tok1, const Token *tok2, ErrorPath errorPath) { if (diag(tok1, tok2)) return; @@ -527,7 +527,7 @@ void CheckCondition::duplicateConditionError(const Token *tok1, const Token *tok reportError(std::move(errorPath), Severity::style, "duplicateCondition", msg, CWE398, Certainty::normal); } -void CheckCondition::multiCondition() +void CheckConditionImpl::multiCondition() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("multiCondition")) return; @@ -570,7 +570,7 @@ void CheckCondition::multiCondition() } } -void CheckCondition::overlappingElseIfConditionError(const Token *tok, nonneg int line1) +void CheckConditionImpl::overlappingElseIfConditionError(const Token *tok, nonneg int line1) { if (diag(tok)) return; @@ -581,7 +581,7 @@ void CheckCondition::overlappingElseIfConditionError(const Token *tok, nonneg in reportError(tok, Severity::style, "multiCondition", errmsg.str(), CWE398, Certainty::normal); } -void CheckCondition::oppositeElseIfConditionError(const Token *ifCond, const Token *elseIfCond, ErrorPath errorPath) +void CheckConditionImpl::oppositeElseIfConditionError(const Token *ifCond, const Token *elseIfCond, ErrorPath errorPath) { if (diag(ifCond, elseIfCond)) return; @@ -629,7 +629,7 @@ static bool isNestedInLambda(const Scope* inner, const Scope* outer) return false; } -void CheckCondition::multiCondition2() +void CheckConditionImpl::multiCondition2() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("identicalConditionAfterEarlyExit") && @@ -861,7 +861,7 @@ static std::string innerSmtString(const Token * tok) return top->str(); } -void CheckCondition::oppositeInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) +void CheckConditionImpl::oppositeInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) { if (diag(tok1, tok2)) return; @@ -876,7 +876,7 @@ void CheckCondition::oppositeInnerConditionError(const Token *tok1, const Token* reportError(std::move(errorPath), Severity::warning, "oppositeInnerCondition", msg, CWE398, Certainty::normal); } -void CheckCondition::overlappingInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) +void CheckConditionImpl::overlappingInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) { if (diag(tok1, tok2)) return; @@ -891,7 +891,7 @@ void CheckCondition::overlappingInnerConditionError(const Token *tok1, const To reportError(std::move(errorPath), Severity::warning, "overlappingInnerCondition", msg, CWE398, Certainty::normal); } -void CheckCondition::identicalInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) +void CheckConditionImpl::identicalInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) { if (diag(tok1, tok2)) return; @@ -906,7 +906,7 @@ void CheckCondition::identicalInnerConditionError(const Token *tok1, const Token reportError(std::move(errorPath), Severity::warning, "identicalInnerCondition", msg, CWE398, Certainty::normal); } -void CheckCondition::identicalConditionAfterEarlyExitError(const Token *cond1, const Token* cond2, ErrorPath errorPath) +void CheckConditionImpl::identicalConditionAfterEarlyExitError(const Token *cond1, const Token* cond2, ErrorPath errorPath) { if (diag(cond1, cond2)) return; @@ -1156,7 +1156,7 @@ static bool isIfConstexpr(const Token* tok) { return Token::simpleMatch(top->astOperand1(), "if") && top->astOperand1()->isConstexpr(); } -void CheckCondition::checkIncorrectLogicOperator() +void CheckConditionImpl::checkIncorrectLogicOperator() { const bool printStyle = mSettings->severity.isEnabled(Severity::style); const bool printWarning = mSettings->severity.isEnabled(Severity::warning); @@ -1367,7 +1367,7 @@ void CheckCondition::checkIncorrectLogicOperator() } } -void CheckCondition::incorrectLogicOperatorError(const Token *tok, const std::string &condition, bool always, bool inconclusive, ErrorPath errors) +void CheckConditionImpl::incorrectLogicOperatorError(const Token *tok, const std::string &condition, bool always, bool inconclusive, ErrorPath errors) { if (diag(tok)) return; @@ -1384,7 +1384,7 @@ void CheckCondition::incorrectLogicOperatorError(const Token *tok, const std::st "Are these conditions necessary? Did you intend to use || instead? Are the numbers correct? Are you comparing the correct variables?", CWE570, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckCondition::redundantConditionError(const Token *tok, const std::string &text, bool inconclusive) +void CheckConditionImpl::redundantConditionError(const Token *tok, const std::string &text, bool inconclusive) { if (diag(tok)) return; @@ -1394,7 +1394,7 @@ void CheckCondition::redundantConditionError(const Token *tok, const std::string //----------------------------------------------------------------------------- // Detect "(var % val1) > val2" where val2 is >= val1. //----------------------------------------------------------------------------- -void CheckCondition::checkModuloAlwaysTrueFalse() +void CheckConditionImpl::checkModuloAlwaysTrueFalse() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -1424,7 +1424,7 @@ void CheckCondition::checkModuloAlwaysTrueFalse() } } -void CheckCondition::moduloAlwaysTrueFalseError(const Token* tok, const std::string& maxVal) +void CheckConditionImpl::moduloAlwaysTrueFalseError(const Token* tok, const std::string& maxVal) { if (diag(tok)) return; @@ -1450,7 +1450,7 @@ static int countPar(const Token *tok1, const Token *tok2) // Clarify condition '(x = a < 0)' into '((x = a) < 0)' or '(x = (a < 0))' // Clarify condition '(a & b == c)' into '((a & b) == c)' or '(a & (b == c))' //--------------------------------------------------------------------------- -void CheckCondition::clarifyCondition() +void CheckConditionImpl::clarifyCondition() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("clarifyCondition")) return; @@ -1491,7 +1491,7 @@ void CheckCondition::clarifyCondition() } } -void CheckCondition::clarifyConditionError(const Token *tok, bool assign, bool boolop) +void CheckConditionImpl::clarifyConditionError(const Token *tok, bool assign, bool boolop) { std::string errmsg; @@ -1514,7 +1514,7 @@ void CheckCondition::clarifyConditionError(const Token *tok, bool assign, bool b errmsg, CWE398, Certainty::normal); } -void CheckCondition::alwaysTrueFalse() +void CheckConditionImpl::alwaysTrueFalse() { const bool pedantic = mSettings->isPremiumEnabled("alwaysTrue") || mSettings->isPremiumEnabled("alwaysFalse") || @@ -1613,8 +1613,8 @@ void CheckCondition::alwaysTrueFalse() { const ValueFlow::Value *zeroValue = nullptr; const Token *nonZeroExpr = nullptr; - if (CheckOther::comparisonNonZeroExpressionLessThanZero(tok, zeroValue, nonZeroExpr, /*suppress*/ true) || - CheckOther::testIfNonZeroExpressionIsPositive(tok, zeroValue, nonZeroExpr)) + if (CheckOtherImpl::comparisonNonZeroExpressionLessThanZero(tok, zeroValue, nonZeroExpr, /*suppress*/ true) || + CheckOtherImpl::testIfNonZeroExpressionIsPositive(tok, zeroValue, nonZeroExpr)) continue; } @@ -1673,7 +1673,7 @@ static std::string getConditionString(const Token* condition) return "Condition"; } -void CheckCondition::alwaysTrueFalseError(const Token* tok, const Token* condition, const ValueFlow::Value* value) +void CheckConditionImpl::alwaysTrueFalseError(const Token* tok, const Token* condition, const ValueFlow::Value* value) { const bool alwaysTrue = value && (value->intvalue != 0 || value->isImpossible()); const std::string expr = tok ? tok->expressionString() : std::string("x"); @@ -1687,7 +1687,7 @@ void CheckCondition::alwaysTrueFalseError(const Token* tok, const Token* conditi (alwaysTrue ? CWE571 : CWE570), Certainty::normal); } -void CheckCondition::checkInvalidTestForOverflow() +void CheckConditionImpl::checkInvalidTestForOverflow() { // Interesting blogs: // https://www.airs.com/blog/archives/120 @@ -1775,7 +1775,7 @@ void CheckCondition::checkInvalidTestForOverflow() } } -void CheckCondition::invalidTestForOverflow(const Token* tok, const ValueType *valueType, const std::string &replace) +void CheckConditionImpl::invalidTestForOverflow(const Token* tok, const ValueType *valueType, const std::string &replace) { const std::string expr = (tok ? tok->expressionString() : std::string("x + c < x")); const std::string overflow = (valueType && valueType->pointer) ? "pointer overflow" : "signed integer overflow"; @@ -1790,7 +1790,7 @@ void CheckCondition::invalidTestForOverflow(const Token* tok, const ValueType *v } -void CheckCondition::checkPointerAdditionResultNotNull() +void CheckConditionImpl::checkPointerAdditionResultNotNull() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -1831,13 +1831,13 @@ void CheckCondition::checkPointerAdditionResultNotNull() } } -void CheckCondition::pointerAdditionResultNotNullError(const Token *tok, const Token *calc) +void CheckConditionImpl::pointerAdditionResultNotNullError(const Token *tok, const Token *calc) { const std::string s = calc ? calc->expressionString() : "ptr+1"; reportError(tok, Severity::warning, "pointerAdditionResultNotNull", "Comparison is wrong. Result of '" + s + "' can't be 0 unless there is pointer overflow, and pointer overflow is undefined behaviour."); } -void CheckCondition::checkDuplicateConditionalAssign() +void CheckConditionImpl::checkDuplicateConditionalAssign() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("duplicateConditionalAssign")) return; @@ -1894,7 +1894,7 @@ void CheckCondition::checkDuplicateConditionalAssign() } } -void CheckCondition::duplicateConditionalAssignError(const Token *condTok, const Token* assignTok, bool isRedundant) +void CheckConditionImpl::duplicateConditionalAssignError(const Token *condTok, const Token* assignTok, bool isRedundant) { ErrorPath errors; std::string msg = "Duplicate expression for the condition and assignment."; @@ -1916,7 +1916,7 @@ void CheckCondition::duplicateConditionalAssignError(const Token *condTok, const } -void CheckCondition::checkAssignmentInCondition() +void CheckConditionImpl::checkAssignmentInCondition() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("assignmentInCondition")) return; @@ -1950,7 +1950,7 @@ void CheckCondition::checkAssignmentInCondition() } } -void CheckCondition::assignmentInCondition(const Token *eq) +void CheckConditionImpl::assignmentInCondition(const Token *eq) { std::string expr = eq ? eq->expressionString() : "x=y"; @@ -1963,7 +1963,7 @@ void CheckCondition::assignmentInCondition(const Token *eq) Certainty::normal); } -void CheckCondition::checkCompareValueOutOfTypeRange() +void CheckConditionImpl::checkCompareValueOutOfTypeRange() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("compareValueOutOfTypeRangeError")) return; @@ -2084,7 +2084,7 @@ void CheckCondition::checkCompareValueOutOfTypeRange() } } -void CheckCondition::compareValueOutOfTypeRangeError(const Token *comparisonTok, const std::string &type, MathLib::bigint value, bool result) +void CheckConditionImpl::compareValueOutOfTypeRangeError(const Token *comparisonTok, const std::string &type, MathLib::bigint value, bool result) { reportError( comparisonTok, @@ -2097,7 +2097,7 @@ void CheckCondition::compareValueOutOfTypeRangeError(const Token *comparisonTok, void CheckCondition::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckCondition checkCondition(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckConditionImpl checkCondition(&tokenizer, &tokenizer.getSettings(), errorLogger); checkCondition.multiCondition(); checkCondition.clarifyCondition(); // not simplified because ifAssign checkCondition.multiCondition2(); @@ -2117,7 +2117,7 @@ void CheckCondition::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog void CheckCondition::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckCondition c(nullptr, settings, errorLogger); + CheckConditionImpl c(nullptr, settings, errorLogger); c.assignIfError(nullptr, nullptr, "", false); c.badBitmaskCheckError(nullptr); diff --git a/lib/checkcondition.h b/lib/checkcondition.h index 2ea20158b11..be06dfbbfd2 100644 --- a/lib/checkcondition.h +++ b/lib/checkcondition.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include "mathlib.h" #include "errortypes.h" @@ -50,15 +51,39 @@ namespace ValueFlow { class CPPCHECKLIB CheckCondition : public Check { public: /** This constructor is used when registering the CheckAssignIf */ - CheckCondition() : Check(myName()) {} + CheckCondition() : Check("Condition") {} private: - /** This constructor is used when running checks. */ - CheckCondition(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Match conditions with assignments and other conditions:\n" + "- Mismatching assignment and comparison => comparison is always true/false\n" + "- Mismatching lhs and rhs in comparison => comparison is always true/false\n" + "- Detect usage of | where & should be used\n" + "- Duplicate condition and assignment\n" + "- Detect matching 'if' and 'else if' conditions\n" + "- Mismatching bitand (a &= 0xf0; a &= 1; => a = 0)\n" + "- Opposite inner condition is always false\n" + "- Identical condition after early exit is always false\n" + "- Condition that is always true/false\n" + "- Mutual exclusion over || always evaluating to true\n" + "- Comparisons of modulo results that are always true/false.\n" + "- Known variable values => condition is always true/false\n" + "- Invalid test for overflow. Some mainstream compilers remove such overflow tests when optimising code.\n" + "- Suspicious assignment of container/iterator in condition => condition is always true.\n"; + } +}; + + +class CPPCHECKLIB CheckConditionImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckConditionImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** mismatching assignment / comparison */ void assignIf(); @@ -157,30 +182,6 @@ class CPPCHECKLIB CheckCondition : public Check { void checkCompareValueOutOfTypeRange(); void compareValueOutOfTypeRangeError(const Token *comparisonTok, const std::string &type, MathLib::bigint value, bool result); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Condition"; - } - - std::string classInfo() const override { - return "Match conditions with assignments and other conditions:\n" - "- Mismatching assignment and comparison => comparison is always true/false\n" - "- Mismatching lhs and rhs in comparison => comparison is always true/false\n" - "- Detect usage of | where & should be used\n" - "- Duplicate condition and assignment\n" - "- Detect matching 'if' and 'else if' conditions\n" - "- Mismatching bitand (a &= 0xf0; a &= 1; => a = 0)\n" - "- Opposite inner condition is always false\n" - "- Identical condition after early exit is always false\n" - "- Condition that is always true/false\n" - "- Mutual exclusion over || always evaluating to true\n" - "- Comparisons of modulo results that are always true/false.\n" - "- Known variable values => condition is always true/false\n" - "- Invalid test for overflow. Some mainstream compilers remove such overflow tests when optimising code.\n" - "- Suspicious assignment of container/iterator in condition => condition is always true.\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkexceptionsafety.cpp b/lib/checkexceptionsafety.cpp index 6da5281e80a..463e47bea1c 100644 --- a/lib/checkexceptionsafety.cpp +++ b/lib/checkexceptionsafety.cpp @@ -40,7 +40,7 @@ static const CWE CWE480(480U); // Use of Incorrect Operator //--------------------------------------------------------------------------- -void CheckExceptionSafety::destructors() +void CheckExceptionSafetyImpl::destructors() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -78,7 +78,7 @@ void CheckExceptionSafety::destructors() } } -void CheckExceptionSafety::destructorsError(const Token * const tok, const std::string &className) +void CheckExceptionSafetyImpl::destructorsError(const Token * const tok, const std::string &className) { reportError(tok, Severity::warning, "exceptThrowInDestructor", "Class " + className + " is not safe, destructor throws exception\n" @@ -88,7 +88,7 @@ void CheckExceptionSafety::destructorsError(const Token * const tok, const std:: } -void CheckExceptionSafety::deallocThrow() +void CheckExceptionSafetyImpl::deallocThrow() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("exceptDeallocThrow")) return; @@ -151,7 +151,7 @@ void CheckExceptionSafety::deallocThrow() } } -void CheckExceptionSafety::deallocThrowError(const Token * const tok, const std::string &varname) +void CheckExceptionSafetyImpl::deallocThrowError(const Token * const tok, const std::string &varname) { reportError(tok, Severity::warning, "exceptDeallocThrow", "Exception thrown in invalid state, '" + varname + "' points at deallocated memory.", CWE398, Certainty::normal); @@ -163,7 +163,7 @@ void CheckExceptionSafety::deallocThrowError(const Token * const tok, const std: // throw err; // <- should be just "throw;" // } //--------------------------------------------------------------------------- -void CheckExceptionSafety::checkRethrowCopy() +void CheckExceptionSafetyImpl::checkRethrowCopy() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("exceptRethrowCopy")) return; @@ -196,7 +196,7 @@ void CheckExceptionSafety::checkRethrowCopy() } } -void CheckExceptionSafety::rethrowCopyError(const Token * const tok, const std::string &varname) +void CheckExceptionSafetyImpl::rethrowCopyError(const Token * const tok, const std::string &varname) { reportError(tok, Severity::style, "exceptRethrowCopy", "Throwing a copy of the caught exception instead of rethrowing the original exception.\n" @@ -207,7 +207,7 @@ void CheckExceptionSafety::rethrowCopyError(const Token * const tok, const std:: //--------------------------------------------------------------------------- // try {} catch (std::exception err) {} <- Should be "std::exception& err" //--------------------------------------------------------------------------- -void CheckExceptionSafety::checkCatchExceptionByValue() +void CheckExceptionSafetyImpl::checkCatchExceptionByValue() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("catchExceptionByValue")) return; @@ -228,7 +228,7 @@ void CheckExceptionSafety::checkCatchExceptionByValue() } } -void CheckExceptionSafety::catchExceptionByValueError(const Token *tok) +void CheckExceptionSafetyImpl::catchExceptionByValueError(const Token *tok) { reportError(tok, Severity::style, "catchExceptionByValue", "Exception should be caught by reference.\n" @@ -281,7 +281,7 @@ static const Token * functionThrows(const Function * function) // void func() throw() { throw x; } // void func() __attribute__((nothrow)); void func() { throw x; } //-------------------------------------------------------------------------- -void CheckExceptionSafety::nothrowThrows() +void CheckExceptionSafetyImpl::nothrowThrows() { logChecker("CheckExceptionSafety::nothrowThrows"); @@ -313,12 +313,12 @@ void CheckExceptionSafety::nothrowThrows() } } -void CheckExceptionSafety::noexceptThrowError(const Token * const tok) +void CheckExceptionSafetyImpl::noexceptThrowError(const Token * const tok) { reportError(tok, Severity::error, "throwInNoexceptFunction", "Unhandled exception thrown in function declared not to throw exceptions.", CWE398, Certainty::normal); } -void CheckExceptionSafety::entryPointThrowError(const Token * const tok) +void CheckExceptionSafetyImpl::entryPointThrowError(const Token * const tok) { reportError(tok, Severity::error, "throwInEntryPoint", "Unhandled exception thrown in function that is an entry point.", CWE398, Certainty::normal); } @@ -326,7 +326,7 @@ void CheckExceptionSafety::entryPointThrowError(const Token * const tok) //-------------------------------------------------------------------------- // void func() { functionWithExceptionSpecification(); } //-------------------------------------------------------------------------- -void CheckExceptionSafety::unhandledExceptionSpecification() +void CheckExceptionSafetyImpl::unhandledExceptionSpecification() { if ((!mSettings->severity.isEnabled(Severity::style) || !mSettings->certainty.isEnabled(Certainty::inconclusive)) && !mSettings->isPremiumEnabled("unhandledExceptionSpecification")) @@ -356,7 +356,7 @@ void CheckExceptionSafety::unhandledExceptionSpecification() } } -void CheckExceptionSafety::unhandledExceptionSpecificationError(const Token * const tok1, const Token * const tok2, const std::string & funcname) +void CheckExceptionSafetyImpl::unhandledExceptionSpecificationError(const Token * const tok1, const Token * const tok2, const std::string & funcname) { const std::string str1(tok1 ? tok1->str() : "foo"); const std::list locationList = { tok1, tok2 }; @@ -369,7 +369,7 @@ void CheckExceptionSafety::unhandledExceptionSpecificationError(const Token * co //-------------------------------------------------------------------------- // 7.6.18.4 If no exception is presently being handled, evaluating a throw-expression with no operand calls std​::​​terminate(). //-------------------------------------------------------------------------- -void CheckExceptionSafety::rethrowNoCurrentException() +void CheckExceptionSafetyImpl::rethrowNoCurrentException() { logChecker("CheckExceptionSafety::rethrowNoCurrentException"); const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -400,7 +400,7 @@ void CheckExceptionSafety::rethrowNoCurrentException() } } -void CheckExceptionSafety::rethrowNoCurrentExceptionError(const Token *tok) +void CheckExceptionSafetyImpl::rethrowNoCurrentExceptionError(const Token *tok) { reportError(tok, Severity::error, "rethrowNoCurrentException", "Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow." @@ -414,7 +414,7 @@ void CheckExceptionSafety::runChecks(const Tokenizer &tokenizer, ErrorLogger *er if (tokenizer.isC()) return; - CheckExceptionSafety checkExceptionSafety(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckExceptionSafetyImpl checkExceptionSafety(&tokenizer, &tokenizer.getSettings(), errorLogger); checkExceptionSafety.destructors(); checkExceptionSafety.deallocThrow(); checkExceptionSafety.checkRethrowCopy(); @@ -426,7 +426,7 @@ void CheckExceptionSafety::runChecks(const Tokenizer &tokenizer, ErrorLogger *er void CheckExceptionSafety::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckExceptionSafety c(nullptr, settings, errorLogger); + CheckExceptionSafetyImpl c(nullptr, settings, errorLogger); c.destructorsError(nullptr, "Class"); c.deallocThrowError(nullptr, "p"); c.rethrowCopyError(nullptr, "varname"); diff --git a/lib/checkexceptionsafety.h b/lib/checkexceptionsafety.h index 7c5a52b5605..bd44a649b1e 100644 --- a/lib/checkexceptionsafety.h +++ b/lib/checkexceptionsafety.h @@ -22,6 +22,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -46,15 +47,33 @@ class Tokenizer; class CPPCHECKLIB CheckExceptionSafety : public Check { public: /** This constructor is used when registering the CheckClass */ - CheckExceptionSafety() : Check(myName()) {} + CheckExceptionSafety() : Check("Exception Safety") {} private: - /** This constructor is used when running checks. */ - CheckExceptionSafety(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + /** Generate all possible errors (for --errorlist) */ + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + /** wiki formatted description of the class (for --doc) */ + std::string classInfo() const override { + return "Checking exception safety\n" + "- Throwing exceptions in destructors\n" + "- Throwing exception during invalid state\n" + "- Throwing a copy of a caught exception instead of rethrowing the original exception\n" + "- Exception caught by value instead of by reference\n" + "- Throwing exception in noexcept, nothrow(), __attribute__((nothrow)) or __declspec(nothrow) function\n" + "- Unhandled exception specification when calling function foo()\n" + "- Rethrow without currently handled exception\n"; + } +}; + +class CPPCHECKLIB CheckExceptionSafetyImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckExceptionSafetyImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** Don't throw exceptions in destructors */ void destructors(); @@ -87,26 +106,6 @@ class CPPCHECKLIB CheckExceptionSafety : public Check { void unhandledExceptionSpecificationError(const Token * tok1, const Token * tok2, const std::string & funcname); /** Rethrow without currently handled exception */ void rethrowNoCurrentExceptionError(const Token *tok); - - /** Generate all possible errors (for --errorlist) */ - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - /** Short description of class (for --doc) */ - static std::string myName() { - return "Exception Safety"; - } - - /** wiki formatted description of the class (for --doc) */ - std::string classInfo() const override { - return "Checking exception safety\n" - "- Throwing exceptions in destructors\n" - "- Throwing exception during invalid state\n" - "- Throwing a copy of a caught exception instead of rethrowing the original exception\n" - "- Exception caught by value instead of by reference\n" - "- Throwing exception in noexcept, nothrow(), __attribute__((nothrow)) or __declspec(nothrow) function\n" - "- Unhandled exception specification when calling function foo()\n" - "- Rethrow without currently handled exception\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index 733b868814e..47a3828de31 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -52,7 +52,7 @@ static const CWE CWE686(686U); // Function Call With Incorrect Argument Type static const CWE CWE687(687U); // Function Call With Incorrectly Specified Argument Value static const CWE CWE688(688U); // Function Call With Incorrect Variable or Reference as Argument -void CheckFunctions::checkProhibitedFunctions() +void CheckFunctionsImpl::checkProhibitedFunctions() { const bool checkAlloca = mSettings->severity.isEnabled(Severity::warning) && ((mTokenizer->isC() && mSettings->standards.c >= Standards::C99) || mSettings->standards.cpp >= Standards::CPP11); @@ -88,7 +88,8 @@ void CheckFunctions::checkProhibitedFunctions() if (wi) { if (mSettings->severity.isEnabled(wi->severity) && ((tok->isC() && mSettings->standards.c >= wi->standards.c) || (tok->isCpp() && mSettings->standards.cpp >= wi->standards.cpp))) { const std::string daca = mSettings->daca ? "prohibited" : ""; - reportError(tok, wi->severity, daca + tok->str() + "Called", wi->message, CWE477, Certainty::normal); + const std::string prefix = daca + tok->str(); + functionCalledError(tok, wi->severity, prefix, wi->message); } } } @@ -96,10 +97,15 @@ void CheckFunctions::checkProhibitedFunctions() } } +void CheckFunctionsImpl::functionCalledError(const Token* tok, Severity severity, const std::string& prefix, const std::string& msg) +{ + reportError(tok, severity, prefix + "Called", msg, CWE477, Certainty::normal); +} + //--------------------------------------------------------------------------- // Check , and //--------------------------------------------------------------------------- -void CheckFunctions::invalidFunctionUsage() +void CheckFunctionsImpl::invalidFunctionUsage() { logChecker("CheckFunctions::invalidFunctionUsage"); const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -191,7 +197,7 @@ void CheckFunctions::invalidFunctionUsage() } } -void CheckFunctions::invalidFunctionArgError(const Token *tok, const std::string &functionName, int argnr, const ValueFlow::Value *invalidValue, const std::string &validstr) +void CheckFunctionsImpl::invalidFunctionArgError(const Token *tok, const std::string &functionName, int argnr, const ValueFlow::Value *invalidValue, const std::string &validstr) { std::ostringstream errmsg; errmsg << "$symbol:" << functionName << '\n'; @@ -220,7 +226,7 @@ void CheckFunctions::invalidFunctionArgError(const Token *tok, const std::string Certainty::normal); } -void CheckFunctions::invalidFunctionArgBoolError(const Token *tok, const std::string &functionName, int argnr) +void CheckFunctionsImpl::invalidFunctionArgBoolError(const Token *tok, const std::string &functionName, int argnr) { std::ostringstream errmsg; errmsg << "$symbol:" << functionName << '\n'; @@ -228,7 +234,7 @@ void CheckFunctions::invalidFunctionArgBoolError(const Token *tok, const std::st reportError(tok, Severity::error, "invalidFunctionArgBool", errmsg.str(), CWE628, Certainty::normal); } -void CheckFunctions::invalidFunctionArgStrError(const Token *tok, const std::string &functionName, nonneg int argnr) +void CheckFunctionsImpl::invalidFunctionArgStrError(const Token *tok, const std::string &functionName, nonneg int argnr) { std::ostringstream errmsg; errmsg << "$symbol:" << functionName << '\n'; @@ -239,7 +245,7 @@ void CheckFunctions::invalidFunctionArgStrError(const Token *tok, const std::str //--------------------------------------------------------------------------- // Check for ignored return values. //--------------------------------------------------------------------------- -void CheckFunctions::checkIgnoredReturnValue() +void CheckFunctionsImpl::checkIgnoredReturnValue() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->severity.isEnabled(Severity::style) && @@ -290,13 +296,13 @@ void CheckFunctions::checkIgnoredReturnValue() } } -void CheckFunctions::ignoredReturnValueError(const Token* tok, const std::string& function) +void CheckFunctionsImpl::ignoredReturnValueError(const Token* tok, const std::string& function) { reportError(tok, Severity::warning, "ignoredReturnValue", "$symbol:" + function + "\nReturn value of function $symbol() is not used.", CWE252, Certainty::normal); } -void CheckFunctions::ignoredReturnErrorCode(const Token* tok, const std::string& function) +void CheckFunctionsImpl::ignoredReturnErrorCode(const Token* tok, const std::string& function) { reportError(tok, Severity::style, "ignoredReturnErrorCode", "$symbol:" + function + "\nError code from the return value of function $symbol() is not used.", CWE252, Certainty::normal); @@ -307,7 +313,7 @@ void CheckFunctions::ignoredReturnErrorCode(const Token* tok, const std::string& //--------------------------------------------------------------------------- static const Token *checkMissingReturnScope(const Token *tok, const Library &library); -void CheckFunctions::checkMissingReturn() +void CheckFunctionsImpl::checkMissingReturn() { logChecker("CheckFunctions::checkMissingReturn"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -425,7 +431,7 @@ static const Token *checkMissingReturnScope(const Token *tok, const Library &lib return nullptr; } -void CheckFunctions::missingReturnError(const Token* tok) +void CheckFunctionsImpl::missingReturnError(const Token* tok) { reportError(tok, Severity::error, "missingReturn", "Found an exit path from function with non-void return type that has missing return statement", CWE758, Certainty::normal); @@ -433,7 +439,7 @@ void CheckFunctions::missingReturnError(const Token* tok) //--------------------------------------------------------------------------- // Detect passing wrong values to functions like atan(0, x); //--------------------------------------------------------------------------- -void CheckFunctions::checkMathFunctions() +void CheckFunctionsImpl::checkMathFunctions() { const bool styleC99 = mSettings->severity.isEnabled(Severity::style) && ((mTokenizer->isC() && mSettings->standards.c != Standards::C89) || (mTokenizer->isCPP() && mSettings->standards.cpp != Standards::CPP03)); const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); @@ -494,7 +500,7 @@ void CheckFunctions::checkMathFunctions() } } -void CheckFunctions::mathfunctionCallWarning(const Token *tok, const nonneg int numParam) +void CheckFunctionsImpl::mathfunctionCallWarning(const Token *tok, const nonneg int numParam) { if (tok) { if (numParam == 1) @@ -505,7 +511,7 @@ void CheckFunctions::mathfunctionCallWarning(const Token *tok, const nonneg int reportError(tok, Severity::warning, "wrongmathcall", "Passing value '#' to #() leads to implementation-defined result.", CWE758, Certainty::normal); } -void CheckFunctions::mathfunctionCallWarning(const Token *tok, const std::string& oldexp, const std::string& newexp) +void CheckFunctionsImpl::mathfunctionCallWarning(const Token *tok, const std::string& oldexp, const std::string& newexp) { reportError(tok, Severity::style, "unpreciseMathCall", "Expression '" + oldexp + "' can be replaced by '" + newexp + "' to avoid loss of precision.", CWE758, Certainty::normal); } @@ -513,7 +519,7 @@ void CheckFunctions::mathfunctionCallWarning(const Token *tok, const std::string //--------------------------------------------------------------------------- // memset(p, y, 0 /* bytes to fill */) <- 2nd and 3rd arguments inverted //--------------------------------------------------------------------------- -void CheckFunctions::memsetZeroBytes() +void CheckFunctionsImpl::memsetZeroBytes() { // FIXME: // Replace this with library configuration. @@ -542,7 +548,7 @@ void CheckFunctions::memsetZeroBytes() } } -void CheckFunctions::memsetZeroBytesError(const Token *tok) +void CheckFunctionsImpl::memsetZeroBytesError(const Token *tok) { const std::string summary("memset() called to fill 0 bytes."); const std::string verbose(summary + " The second and third arguments might be inverted." @@ -551,7 +557,7 @@ void CheckFunctions::memsetZeroBytesError(const Token *tok) reportError(tok, Severity::warning, "memsetZeroBytes", summary + "\n" + verbose, CWE687, Certainty::normal); } -void CheckFunctions::memsetInvalid2ndParam() +void CheckFunctionsImpl::memsetInvalid2ndParam() { // FIXME: // Replace this with library configuration. @@ -599,7 +605,7 @@ void CheckFunctions::memsetInvalid2ndParam() } } -void CheckFunctions::memsetFloatError(const Token *tok, const std::string &var_value) +void CheckFunctionsImpl::memsetFloatError(const Token *tok, const std::string &var_value) { const std::string message("The 2nd memset() argument '" + var_value + "' is a float, its representation is implementation defined."); @@ -608,7 +614,7 @@ void CheckFunctions::memsetFloatError(const Token *tok, const std::string &var_v reportError(tok, Severity::portability, "memsetFloat", message + "\n" + verbose, CWE688, Certainty::normal); } -void CheckFunctions::memsetValueOutOfRangeError(const Token *tok, const std::string &value) +void CheckFunctionsImpl::memsetValueOutOfRangeError(const Token *tok, const std::string &value) { const std::string message("The 2nd memset() argument '" + value + "' doesn't fit into an 'unsigned char'."); const std::string verbose(message + " The 2nd parameter is passed as an 'int', but the function fills the block of memory using the 'unsigned char' conversion of this value."); @@ -619,7 +625,7 @@ void CheckFunctions::memsetValueOutOfRangeError(const Token *tok, const std::str // --check-library => warn for unconfigured functions //--------------------------------------------------------------------------- -void CheckFunctions::checkLibraryMatchFunctions() +void CheckFunctionsImpl::checkLibraryMatchFunctions() { if (!mSettings->checkLibrary) return; @@ -697,7 +703,7 @@ void CheckFunctions::checkLibraryMatchFunctions() // Check for problems to compiler apply (Named) Return Value Optimization for local variable // Technically we have different guarantees between standard versions // details: https://en.cppreference.com/w/cpp/language/copy_elision -void CheckFunctions::returnLocalStdMove() +void CheckFunctionsImpl::returnLocalStdMove() { if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11) return; @@ -727,7 +733,7 @@ void CheckFunctions::returnLocalStdMove() } } -void CheckFunctions::copyElisionError(const Token *tok) +void CheckFunctionsImpl::copyElisionError(const Token *tok) { reportError(tok, Severity::performance, @@ -736,7 +742,7 @@ void CheckFunctions::copyElisionError(const Token *tok) " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local"); } -void CheckFunctions::useStandardLibrary() +void CheckFunctionsImpl::useStandardLibrary() { if (!mSettings->severity.isEnabled(Severity::style)) return; @@ -840,7 +846,7 @@ void CheckFunctions::useStandardLibrary() } } -void CheckFunctions::useStandardLibraryError(const Token *tok, const std::string& expected) +void CheckFunctionsImpl::useStandardLibraryError(const Token *tok, const std::string& expected) { reportError(tok, Severity::style, "useStandardLibrary", @@ -849,7 +855,7 @@ void CheckFunctions::useStandardLibraryError(const Token *tok, const std::string void CheckFunctions::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckFunctions checkFunctions(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckFunctionsImpl checkFunctions(&tokenizer, &tokenizer.getSettings(), errorLogger); checkFunctions.checkIgnoredReturnValue(); checkFunctions.checkMissingReturn(); // Missing "return" in exit path @@ -868,10 +874,10 @@ void CheckFunctions::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog void CheckFunctions::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckFunctions c(nullptr, settings, errorLogger); + CheckFunctionsImpl c(nullptr, settings, errorLogger); for (auto i = settings->library.functionwarn().cbegin(); i != settings->library.functionwarn().cend(); ++i) { - c.reportError(nullptr, Severity::style, i->first+"Called", i->second.message); + c.functionCalledError(nullptr, Severity::style, i->first, i->second.message); } c.invalidFunctionArgError(nullptr, "func_name", 1, nullptr,"1:4"); diff --git a/lib/checkfunctions.h b/lib/checkfunctions.h index f5954d14043..7ea9e2833a2 100644 --- a/lib/checkfunctions.h +++ b/lib/checkfunctions.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -47,16 +48,34 @@ namespace ValueFlow { class CPPCHECKLIB CheckFunctions : public Check { public: /** This constructor is used when registering the CheckFunctions */ - CheckFunctions() : Check(myName()) {} + CheckFunctions() : Check("Check function usage") {} private: - /** This constructor is used when running checks. */ - CheckFunctions(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Check function usage:\n" + "- missing 'return' in non-void function\n" + "- return value of certain functions not used\n" + "- invalid input values for functions\n" + "- Warn if a function is called whose usage is discouraged\n" + "- memset() third argument is zero\n" + "- memset() with a value out of range as the 2nd parameter\n" + "- memset() with a float as the 2nd parameter\n" + "- copy elision optimization for returning value affected by std::move\n" + "- use memcpy()/memset() instead of for loop\n"; + } +}; + +class CPPCHECKLIB CheckFunctionsImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckFunctionsImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** Check for functions that should not be used */ void checkProhibitedFunctions(); @@ -106,25 +125,7 @@ class CPPCHECKLIB CheckFunctions : public Check { void missingReturnError(const Token *tok); void copyElisionError(const Token *tok); void useStandardLibraryError(const Token *tok, const std::string& expected); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Check function usage"; - } - - std::string classInfo() const override { - return "Check function usage:\n" - "- missing 'return' in non-void function\n" - "- return value of certain functions not used\n" - "- invalid input values for functions\n" - "- Warn if a function is called whose usage is discouraged\n" - "- memset() third argument is zero\n" - "- memset() with a value out of range as the 2nd parameter\n" - "- memset() with a float as the 2nd parameter\n" - "- copy elision optimization for returning value affected by std::move\n" - "- use memcpy()/memset() instead of for loop\n"; - } + void functionCalledError(const Token* tok, Severity severity, const std::string& prefix, const std::string& msg); }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/check.cpp b/lib/checkimpl.cpp similarity index 60% rename from lib/check.cpp rename to lib/checkimpl.cpp index 4033378e927..43e56cfa360 100644 --- a/lib/check.cpp +++ b/lib/checkimpl.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,9 +16,7 @@ * along with this program. If not, see . */ -//--------------------------------------------------------------------------- - -#include "check.h" +#include "checkimpl.h" #include "errorlogger.h" #include "settings.h" @@ -26,59 +24,35 @@ #include "tokenize.h" #include "vfvalue.h" -#include -#include +#include #include -//--------------------------------------------------------------------------- - -Check::Check(std::string aname) - : mName(std::move(aname)) -{} - -void Check::writeToErrorList(const ErrorMessage &errmsg) +void CheckImpl::reportError(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe, Certainty certainty) { - std::cout << errmsg.toXML() << std::endl; -} - + assert(mErrorLogger); -void Check::reportError(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe, Certainty certainty) -{ // TODO: report debug warning when error is for a disabled severity const ErrorMessage errmsg(callstack, mTokenizer ? &mTokenizer->list : nullptr, severity, id, msg, cwe, certainty); - if (mErrorLogger) - mErrorLogger->reportErr(errmsg); - else - writeToErrorList(errmsg); + mErrorLogger->reportErr(errmsg); } -void Check::reportError(ErrorPath errorPath, Severity severity, const char id[], const std::string &msg, const CWE &cwe, Certainty certainty) +void CheckImpl::reportError(ErrorPath errorPath, Severity severity, const char id[], const std::string &msg, const CWE &cwe, Certainty certainty) { + assert(mErrorLogger); + // TODO: report debug warning when error is for a disabled severity const ErrorMessage errmsg(std::move(errorPath), mTokenizer ? &mTokenizer->list : nullptr, severity, id, msg, cwe, certainty); - if (mErrorLogger) - mErrorLogger->reportErr(errmsg); - else - writeToErrorList(errmsg); + mErrorLogger->reportErr(errmsg); } -bool Check::wrongData(const Token *tok, const char *str) +bool CheckImpl::wrongData(const Token *tok, const char *str) { if (mSettings->daca) reportError(tok, Severity::debug, "DacaWrongData", "Wrong data detected by condition " + std::string(str)); return true; } -std::string Check::getMessageId(const ValueFlow::Value &value, const char id[]) -{ - if (value.condition != nullptr) - return id + std::string("Cond"); - if (value.safe) - return std::string("safe") + static_cast(std::toupper(id[0])) + (id + 1); - return id; -} - -ErrorPath Check::getErrorPath(const Token* errtok, const ValueFlow::Value* value, std::string bug) const +ErrorPath CheckImpl::getErrorPath(const Token* errtok, const ValueFlow::Value* value, std::string bug) const { ErrorPath errorPath; if (!value) { @@ -96,9 +70,8 @@ ErrorPath Check::getErrorPath(const Token* errtok, const ValueFlow::Value* value return errorPath; } -void Check::logChecker(const char id[]) +void CheckImpl::logChecker(const char id[]) { if (!mSettings->buildDir.empty() || mSettings->collectLogCheckers()) reportError(nullptr, Severity::internal, "logChecker", id); } - diff --git a/lib/checkimpl.h b/lib/checkimpl.h new file mode 100644 index 00000000000..35e70bbaae5 --- /dev/null +++ b/lib/checkimpl.h @@ -0,0 +1,85 @@ +/* + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2026 Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef checkimplH +#define checkimplH + +#include "config.h" +#include "errortypes.h" + +#include +#include + +class Settings; +class ErrorLogger; +class Tokenizer; +class Token; +namespace ValueFlow { + class Value; +} + +class CPPCHECKLIB CheckImpl +{ +protected: + /** This constructor is used when running checks. */ + CheckImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : mTokenizer(tokenizer), mSettings(settings), mErrorLogger(errorLogger) {} + +public: + CheckImpl(const CheckImpl &) = delete; + CheckImpl& operator=(const CheckImpl &) = delete; + +protected: + const Tokenizer* const mTokenizer{}; + const Settings* const mSettings{}; + ErrorLogger* const mErrorLogger{}; + + /** report an error */ + void reportError(const Token *tok, const Severity severity, const std::string &id, const std::string &msg) { + reportError(tok, severity, id, msg, CWE(0U), Certainty::normal); + } + + /** report an error */ + void reportError(const Token *tok, const Severity severity, const std::string &id, const std::string &msg, const CWE &cwe, Certainty certainty) { + const std::list callstack(1, tok); + reportError(callstack, severity, id, msg, cwe, certainty); + } + + /** report an error */ + void reportError(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg) { + reportError(callstack, severity, id, msg, CWE(0U), Certainty::normal); + } + + /** report an error */ + void reportError(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe, Certainty certainty); + + void reportError(ErrorPath errorPath, Severity severity, const char id[], const std::string &msg, const CWE &cwe, Certainty certainty); + + ErrorPath getErrorPath(const Token* errtok, const ValueFlow::Value* value, std::string bug) const; + + /** + * Use WRONG_DATA in checkers when you check for wrong data. That + * will call this method + */ + bool wrongData(const Token *tok, const char *str); + +public: // TODO: should be protected + void logChecker(const char id[]); +}; + +#endif // checkimplH diff --git a/lib/checkinternal.cpp b/lib/checkinternal.cpp index ed39b4db96a..10af0543cec 100644 --- a/lib/checkinternal.cpp +++ b/lib/checkinternal.cpp @@ -31,7 +31,7 @@ #include #include -void CheckInternal::checkTokenMatchPatterns() +void CheckInternalImpl::checkTokenMatchPatterns() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope *scope : symbolDatabase->functionScopes) { @@ -82,7 +82,7 @@ void CheckInternal::checkTokenMatchPatterns() } } -void CheckInternal::checkRedundantTokCheck() +void CheckInternalImpl::checkRedundantTokCheck() { for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { if (Token::Match(tok, "&& Token :: simpleMatch|Match|findsimplematch|findmatch (")) { @@ -117,13 +117,13 @@ void CheckInternal::checkRedundantTokCheck() } -void CheckInternal::checkRedundantTokCheckError(const Token* tok) +void CheckInternalImpl::checkRedundantTokCheckError(const Token* tok) { reportError(tok, Severity::style, "redundantTokCheck", "Unnecessary check of \"" + (tok? tok->expressionString(): "") + "\", match-function already checks if it is null."); } -void CheckInternal::checkTokenSimpleMatchPatterns() +void CheckInternalImpl::checkTokenSimpleMatchPatterns() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope* scope : symbolDatabase->functionScopes) { @@ -207,7 +207,7 @@ namespace { }; } -void CheckInternal::checkMissingPercentCharacter() +void CheckInternalImpl::checkMissingPercentCharacter() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope* scope : symbolDatabase->functionScopes) { @@ -248,7 +248,7 @@ void CheckInternal::checkMissingPercentCharacter() } } -void CheckInternal::checkUnknownPattern() +void CheckInternalImpl::checkUnknownPattern() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope* scope : symbolDatabase->functionScopes) { @@ -282,7 +282,7 @@ void CheckInternal::checkUnknownPattern() } } -void CheckInternal::checkRedundantNextPrevious() +void CheckInternalImpl::checkRedundantNextPrevious() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope* scope : symbolDatabase->functionScopes) { @@ -305,7 +305,7 @@ void CheckInternal::checkRedundantNextPrevious() } } -void CheckInternal::checkExtraWhitespace() +void CheckInternalImpl::checkExtraWhitespace() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope* scope : symbolDatabase->functionScopes) { @@ -331,46 +331,46 @@ void CheckInternal::checkExtraWhitespace() } } -void CheckInternal::simplePatternError(const Token* tok, const std::string& pattern, const std::string &funcname) +void CheckInternalImpl::simplePatternError(const Token* tok, const std::string& pattern, const std::string &funcname) { reportError(tok, Severity::warning, "simplePatternError", "Found simple pattern inside Token::" + funcname + "() call: \"" + pattern + "\"" ); } -void CheckInternal::complexPatternError(const Token* tok, const std::string& pattern, const std::string &funcname) +void CheckInternalImpl::complexPatternError(const Token* tok, const std::string& pattern, const std::string &funcname) { reportError(tok, Severity::error, "complexPatternError", "Found complex pattern inside Token::" + funcname + "() call: \"" + pattern + "\"" ); } -void CheckInternal::missingPercentCharacterError(const Token* tok, const std::string& pattern, const std::string& funcname) +void CheckInternalImpl::missingPercentCharacterError(const Token* tok, const std::string& pattern, const std::string& funcname) { reportError(tok, Severity::error, "missingPercentCharacter", "Missing percent end character in Token::" + funcname + "() pattern: \"" + pattern + "\"" ); } -void CheckInternal::unknownPatternError(const Token* tok, const std::string& pattern) +void CheckInternalImpl::unknownPatternError(const Token* tok, const std::string& pattern) { reportError(tok, Severity::error, "unknownPattern", "Unknown pattern used: \"" + pattern + "\""); } -void CheckInternal::redundantNextPreviousError(const Token* tok, const std::string& func1, const std::string& func2) +void CheckInternalImpl::redundantNextPreviousError(const Token* tok, const std::string& func1, const std::string& func2) { reportError(tok, Severity::style, "redundantNextPrevious", "Call to 'Token::" + func1 + "()' followed by 'Token::" + func2 + "()' can be simplified."); } -void CheckInternal::orInComplexPattern(const Token* tok, const std::string& pattern, const std::string &funcname) +void CheckInternalImpl::orInComplexPattern(const Token* tok, const std::string& pattern, const std::string &funcname) { reportError(tok, Severity::error, "orInComplexPattern", "Token::" + funcname + "() pattern \"" + pattern + "\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\"."); } -void CheckInternal::extraWhitespaceError(const Token* tok, const std::string& pattern, const std::string &funcname) +void CheckInternalImpl::extraWhitespaceError(const Token* tok, const std::string& pattern, const std::string &funcname) { reportError(tok, Severity::warning, "extraWhitespaceError", "Found extra whitespace inside Token::" + funcname + "() call: \"" + pattern + "\"" @@ -382,7 +382,7 @@ void CheckInternal::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogg if (!tokenizer.getSettings().checks.isEnabled(Checks::internalCheck)) return; - CheckInternal checkInternal(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckInternalImpl checkInternal(&tokenizer, &tokenizer.getSettings(), errorLogger); checkInternal.checkTokenMatchPatterns(); checkInternal.checkTokenSimpleMatchPatterns(); @@ -395,7 +395,7 @@ void CheckInternal::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogg void CheckInternal::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckInternal c(nullptr, settings, errorLogger); + CheckInternalImpl c(nullptr, settings, errorLogger); c.simplePatternError(nullptr, "class {", "Match"); c.complexPatternError(nullptr, "%type% ( )", "Match"); c.missingPercentCharacterError(nullptr, "%num", "Match"); diff --git a/lib/checkinternal.h b/lib/checkinternal.h index d62d9698b8d..2d95e3ed7e4 100644 --- a/lib/checkinternal.h +++ b/lib/checkinternal.h @@ -25,6 +25,7 @@ #ifdef CHECK_INTERNAL #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -42,15 +43,26 @@ class Settings; class CPPCHECKLIB CheckInternal : public Check { public: /** This constructor is used when registering the CheckClass */ - CheckInternal() : Check(myName()) {} + CheckInternal() : Check("cppcheck internal API usage") {} private: - /** This constructor is used when running checks. */ - CheckInternal(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + // Don't include these checks on the WIKI where people can read what + // checks there are. These checks are not intended for users. + return ""; + } +}; + +class CPPCHECKLIB CheckInternalImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckInternalImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** @brief %Check if a simple pattern is used inside Token::Match or Token::findmatch */ void checkTokenMatchPatterns(); @@ -80,18 +92,6 @@ class CPPCHECKLIB CheckInternal : public Check { void orInComplexPattern(const Token *tok, const std::string &pattern, const std::string &funcname); void extraWhitespaceError(const Token *tok, const std::string &pattern, const std::string &funcname); void checkRedundantTokCheckError(const Token *tok); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "cppcheck internal API usage"; - } - - std::string classInfo() const override { - // Don't include these checks on the WIKI where people can read what - // checks there are. These checks are not intended for users. - return ""; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 4161b9b224d..f1cb4670c50 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -58,7 +58,7 @@ static const CWE CWE910(910U); // Use of Expired File Descriptor //--------------------------------------------------------------------------- // std::cout << std::cout; //--------------------------------------------------------------------------- -void CheckIO::checkCoutCerrMisusage() +void CheckIOImpl::checkCoutCerrMisusage() { if (mTokenizer->isC()) return; @@ -80,7 +80,7 @@ void CheckIO::checkCoutCerrMisusage() } } -void CheckIO::coutCerrMisusageError(const Token* tok, const std::string& streamName) +void CheckIOImpl::coutCerrMisusageError(const Token* tok, const std::string& streamName) { reportError(tok, Severity::error, "coutCerrMisusage", "Invalid usage of output stream: '<< std::" + streamName + "'.", CWE398, Certainty::normal); } @@ -119,7 +119,7 @@ namespace { const std::unordered_set whitelist = { "clearerr", "feof", "ferror", "fgetpos", "ftell", "setbuf", "setvbuf", "ungetc", "ungetwc" }; } -void CheckIO::checkFileUsage() +void CheckIOImpl::checkFileUsage() { const bool windows = mSettings->platform.isWindows(); const bool printPortability = mSettings->severity.isEnabled(Severity::portability); @@ -379,37 +379,37 @@ void CheckIO::checkFileUsage() } } -void CheckIO::fflushOnInputStreamError(const Token *tok, const std::string &varname) +void CheckIOImpl::fflushOnInputStreamError(const Token *tok, const std::string &varname) { reportError(tok, Severity::portability, "fflushOnInputStream", "fflush() called on input stream '" + varname + "' may result in undefined behaviour on non-linux systems.", CWE398, Certainty::normal); } -void CheckIO::ioWithoutPositioningError(const Token *tok) +void CheckIOImpl::ioWithoutPositioningError(const Token *tok) { reportError(tok, Severity::error, "IOWithoutPositioning", "Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.", CWE664, Certainty::normal); } -void CheckIO::readWriteOnlyFileError(const Token *tok) +void CheckIOImpl::readWriteOnlyFileError(const Token *tok) { reportError(tok, Severity::error, "readWriteOnlyFile", "Read operation on a file that was opened only for writing.", CWE664, Certainty::normal); } -void CheckIO::writeReadOnlyFileError(const Token *tok) +void CheckIOImpl::writeReadOnlyFileError(const Token *tok) { reportError(tok, Severity::error, "writeReadOnlyFile", "Write operation on a file that was opened only for reading.", CWE664, Certainty::normal); } -void CheckIO::useClosedFileError(const Token *tok) +void CheckIOImpl::useClosedFileError(const Token *tok) { reportError(tok, Severity::error, "useClosedFile", "Used file that is not opened.", CWE910, Certainty::normal); } -void CheckIO::fcloseInLoopConditionError(const Token *tok, const std::string &varname) +void CheckIOImpl::fcloseInLoopConditionError(const Token *tok, const std::string &varname) { reportError(tok, Severity::warning, "fcloseInLoopCondition", @@ -418,13 +418,13 @@ void CheckIO::fcloseInLoopConditionError(const Token *tok, const std::string &va CWE910, Certainty::normal); } -void CheckIO::seekOnAppendedFileError(const Token *tok) +void CheckIOImpl::seekOnAppendedFileError(const Token *tok) { reportError(tok, Severity::warning, "seekOnAppendedFile", "Repositioning operation performed on a file opened in append mode has no effect.", CWE398, Certainty::normal); } -void CheckIO::incompatibleFileOpenError(const Token *tok, const std::string &filename) +void CheckIOImpl::incompatibleFileOpenError(const Token *tok, const std::string &filename) { reportError(tok, Severity::warning, "incompatibleFileOpen", "The file '" + filename + "' is opened for read and write access at the same time on different streams", CWE664, Certainty::normal); @@ -434,7 +434,7 @@ void CheckIO::incompatibleFileOpenError(const Token *tok, const std::string &fil //--------------------------------------------------------------------------- // scanf without field width limits can crash with huge input data //--------------------------------------------------------------------------- -void CheckIO::invalidScanf() +void CheckIOImpl::invalidScanf() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("invalidscanf")) return; @@ -481,7 +481,7 @@ void CheckIO::invalidScanf() } } -void CheckIO::invalidScanfError(const Token *tok) +void CheckIOImpl::invalidScanfError(const Token *tok) { const std::string fname = (tok ? tok->str() : std::string("scanf")); reportError(tok, Severity::warning, @@ -553,7 +553,7 @@ static inline bool typesMatch(const std::string& iToTest, const std::string& iTy return (iToTest == iTypename) || (iToTest == iOptionalPrefix + iTypename); } -void CheckIO::checkWrongPrintfScanfArguments() +void CheckIOImpl::checkWrongPrintfScanfArguments() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); const bool isWindows = mSettings->platform.isWindows(); @@ -625,11 +625,11 @@ void CheckIO::checkWrongPrintfScanfArguments() } } -void CheckIO::checkFormatString(const Token * const tok, - const Token * const formatStringTok, - const Token * argListTok, - const bool scan, - const bool scanf_s) +void CheckIOImpl::checkFormatString(const Token * const tok, + const Token * const formatStringTok, + const Token * argListTok, + const bool scan, + const bool scanf_s) { const bool isWindows = mSettings->platform.isWindows(); const bool printWarning = mSettings->severity.isEnabled(Severity::warning); @@ -1368,7 +1368,7 @@ void CheckIO::checkFormatString(const Token * const tok, // We currently only support string literals, variables, and functions. /// @todo add non-string literals, and generic expressions -CheckIO::ArgumentInfo::ArgumentInfo(const Token * arg, const Settings &settings, bool _isCPP) +CheckIOImpl::ArgumentInfo::ArgumentInfo(const Token * arg, const Settings &settings, bool _isCPP) : isCPP(_isCPP) { if (!arg) @@ -1582,7 +1582,7 @@ CheckIO::ArgumentInfo::ArgumentInfo(const Token * arg, const Settings &settings, } } -CheckIO::ArgumentInfo::~ArgumentInfo() +CheckIOImpl::ArgumentInfo::~ArgumentInfo() { if (tempToken) { while (tempToken->next()) @@ -1597,7 +1597,7 @@ namespace { const std::set stl_string = { "string", "u16string", "u32string", "wstring" }; } -bool CheckIO::ArgumentInfo::isStdVectorOrString() +bool CheckIOImpl::ArgumentInfo::isStdVectorOrString() { if (!isCPP) return false; @@ -1659,7 +1659,7 @@ static const std::set stl_container = { "unordered_map", "unordered_multimap", "unordered_multiset", "unordered_set", "vector" }; -bool CheckIO::ArgumentInfo::isStdContainer(const Token *tok) +bool CheckIOImpl::ArgumentInfo::isStdContainer(const Token *tok) { if (!isCPP) return false; @@ -1691,7 +1691,7 @@ bool CheckIO::ArgumentInfo::isStdContainer(const Token *tok) return false; } -bool CheckIO::ArgumentInfo::isArrayOrPointer() const +bool CheckIOImpl::ArgumentInfo::isArrayOrPointer() const { if (address) return true; @@ -1704,7 +1704,7 @@ bool CheckIO::ArgumentInfo::isArrayOrPointer() const return tok && tok->strAt(1) == "*"; } -bool CheckIO::ArgumentInfo::isComplexType() const +bool CheckIOImpl::ArgumentInfo::isComplexType() const { if (variableInfo->type()) return true; @@ -1716,7 +1716,7 @@ bool CheckIO::ArgumentInfo::isComplexType() const return ((variableInfo->isStlStringType() || (varTypeTok->strAt(1) == "<" && varTypeTok->linkAt(1) && varTypeTok->linkAt(1)->strAt(1) != "::")) && !variableInfo->isArrayOrPointer()); } -bool CheckIO::ArgumentInfo::isKnownType() const +bool CheckIOImpl::ArgumentInfo::isKnownType() const { if (variableInfo) return (typeToken->isStandardType() || typeToken->next()->isStandardType() || isComplexType()); @@ -1726,15 +1726,15 @@ bool CheckIO::ArgumentInfo::isKnownType() const return typeToken->isStandardType() || Token::Match(typeToken, "std :: string|wstring"); } -bool CheckIO::ArgumentInfo::isLibraryType(const Settings &settings) const +bool CheckIOImpl::ArgumentInfo::isLibraryType(const Settings &settings) const { return typeToken && typeToken->isStandardType() && settings.library.podtype(typeToken->str()); } -void CheckIO::wrongPrintfScanfArgumentsError(const Token* tok, - const std::string &functionName, - nonneg int numFormat, - nonneg int numFunction) +void CheckIOImpl::wrongPrintfScanfArgumentsError(const Token* tok, + const std::string &functionName, + nonneg int numFormat, + nonneg int numFunction) { const Severity severity = numFormat > numFunction ? Severity::error : Severity::warning; if (severity != Severity::error && !mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("wrongPrintfScanfArgNum")) @@ -1753,8 +1753,8 @@ void CheckIO::wrongPrintfScanfArgumentsError(const Token* tok, reportError(tok, severity, "wrongPrintfScanfArgNum", errmsg.str(), CWE685, Certainty::normal); } -void CheckIO::wrongPrintfScanfPosixParameterPositionError(const Token* tok, const std::string& functionName, - nonneg int index, nonneg int numFunction) +void CheckIOImpl::wrongPrintfScanfPosixParameterPositionError(const Token* tok, const std::string& functionName, + nonneg int index, nonneg int numFunction) { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("wrongPrintfScanfParameterPositionError")) return; @@ -1768,7 +1768,7 @@ void CheckIO::wrongPrintfScanfPosixParameterPositionError(const Token* tok, cons reportError(tok, Severity::warning, "wrongPrintfScanfParameterPositionError", errmsg.str(), CWE685, Certainty::normal); } -void CheckIO::invalidScanfArgTypeError_s(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidScanfArgTypeError_s(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1784,7 +1784,7 @@ void CheckIO::invalidScanfArgTypeError_s(const Token* tok, nonneg int numFormat, errmsg << "."; reportError(tok, severity, "invalidScanfArgType_s", errmsg.str(), CWE686, Certainty::normal); } -void CheckIO::invalidScanfArgTypeError_int(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo, bool isUnsigned) +void CheckIOImpl::invalidScanfArgTypeError_int(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo, bool isUnsigned) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1829,7 +1829,7 @@ void CheckIO::invalidScanfArgTypeError_int(const Token* tok, nonneg int numForma errmsg << "."; reportError(tok, severity, "invalidScanfArgType_int", errmsg.str(), CWE686, Certainty::normal); } -void CheckIO::invalidScanfArgTypeError_float(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidScanfArgTypeError_float(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1848,7 +1848,7 @@ void CheckIO::invalidScanfArgTypeError_float(const Token* tok, nonneg int numFor reportError(tok, severity, "invalidScanfArgType_float", errmsg.str(), CWE686, Certainty::normal); } -void CheckIO::invalidPrintfArgTypeError_s(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidPrintfArgTypeError_s(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1859,7 +1859,7 @@ void CheckIO::invalidPrintfArgTypeError_s(const Token* tok, nonneg int numFormat errmsg << "."; reportError(tok, severity, "invalidPrintfArgType_s", errmsg.str(), CWE686, Certainty::normal); } -void CheckIO::invalidPrintfArgTypeError_n(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidPrintfArgTypeError_n(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1870,7 +1870,7 @@ void CheckIO::invalidPrintfArgTypeError_n(const Token* tok, nonneg int numFormat errmsg << "."; reportError(tok, severity, "invalidPrintfArgType_n", errmsg.str(), CWE686, Certainty::normal); } -void CheckIO::invalidPrintfArgTypeError_p(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidPrintfArgTypeError_p(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1920,7 +1920,7 @@ static void printfFormatType(std::ostream& os, const std::string& specifier, boo os << "\'"; } -void CheckIO::invalidPrintfArgTypeError_uint(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidPrintfArgTypeError_uint(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1934,7 +1934,7 @@ void CheckIO::invalidPrintfArgTypeError_uint(const Token* tok, nonneg int numFor reportError(tok, severity, "invalidPrintfArgType_uint", errmsg.str(), CWE686, Certainty::normal); } -void CheckIO::invalidPrintfArgTypeError_sint(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidPrintfArgTypeError_sint(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1947,7 +1947,7 @@ void CheckIO::invalidPrintfArgTypeError_sint(const Token* tok, nonneg int numFor errmsg << "."; reportError(tok, severity, "invalidPrintfArgType_sint", errmsg.str(), CWE686, Certainty::normal); } -void CheckIO::invalidPrintfArgTypeError_float(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) +void CheckIOImpl::invalidPrintfArgTypeError_float(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); if (!mSettings->severity.isEnabled(severity)) @@ -1962,12 +1962,12 @@ void CheckIO::invalidPrintfArgTypeError_float(const Token* tok, nonneg int numFo reportError(tok, severity, "invalidPrintfArgType_float", errmsg.str(), CWE686, Certainty::normal); } -Severity CheckIO::getSeverity(const CheckIO::ArgumentInfo *argInfo) +Severity CheckIOImpl::getSeverity(const ArgumentInfo *argInfo) { return (argInfo && argInfo->typeToken && !argInfo->typeToken->originalName().empty()) ? Severity::portability : Severity::warning; } -void CheckIO::argumentType(std::ostream& os, const ArgumentInfo * argInfo) +void CheckIOImpl::argumentType(std::ostream& os, const ArgumentInfo * argInfo) { if (argInfo) { os << "\'"; @@ -2017,7 +2017,7 @@ void CheckIO::argumentType(std::ostream& os, const ArgumentInfo * argInfo) os << "Unknown"; } -void CheckIO::invalidLengthModifierError(const Token* tok, nonneg int numFormat, const std::string& modifier) +void CheckIOImpl::invalidLengthModifierError(const Token* tok, nonneg int numFormat, const std::string& modifier) { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("invalidLengthModifierError")) return; @@ -2026,7 +2026,7 @@ void CheckIO::invalidLengthModifierError(const Token* tok, nonneg int numFormat, reportError(tok, Severity::warning, "invalidLengthModifierError", errmsg.str(), CWE704, Certainty::normal); } -void CheckIO::invalidScanfFormatWidthError(const Token* tok, nonneg int numFormat, int width, const Variable *var, const std::string& specifier) +void CheckIOImpl::invalidScanfFormatWidthError(const Token* tok, nonneg int numFormat, int width, const Variable *var, const std::string& specifier) { MathLib::bigint arrlen = 0; std::string varname; @@ -2052,7 +2052,7 @@ void CheckIO::invalidScanfFormatWidthError(const Token* tok, nonneg int numForma void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckIO checkIO(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckIOImpl checkIO(&tokenizer, &tokenizer.getSettings(), errorLogger); checkIO.checkWrongPrintfScanfArguments(); checkIO.checkCoutCerrMisusage(); @@ -2062,7 +2062,7 @@ void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) void CheckIO::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckIO c(nullptr, settings, errorLogger); + CheckIOImpl c(nullptr, settings, errorLogger); c.coutCerrMisusageError(nullptr, "cout"); c.fflushOnInputStreamError(nullptr, "stdin"); c.ioWithoutPositioningError(nullptr); diff --git a/lib/checkio.h b/lib/checkio.h index b3c86da3577..acad40de136 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -22,6 +22,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -45,16 +46,35 @@ class CPPCHECKLIB CheckIO : public Check { public: /** @brief This constructor is used when registering CheckIO */ - CheckIO() : Check(myName()) {} + CheckIO() : Check("IO using format string") {} private: - /** @brief This constructor is used when running checks. */ - CheckIO(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks on the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Check format string input/output operations.\n" + "- Bad usage of the function 'sprintf' (overlapping data)\n" + "- Missing or wrong width specifiers in 'scanf' format string\n" + "- Use a file that has been closed\n" + "- File input/output without positioning results in undefined behaviour\n" + "- Read to a file that has only been opened for writing (or vice versa)\n" + "- Repositioning operation on a file opened in append mode\n" + "- The same file can't be open for read and write at the same time on different streams\n" + "- Using fflush() on an input stream\n" + "- Invalid usage of output stream. For example: 'std::cout << std::cout;'\n" + "- Wrong number of arguments given to 'printf' or 'scanf;'\n"; + } +}; + +class CPPCHECKLIB CheckIOImpl : public CheckImpl { +public: + /** @brief This constructor is used when running checks. */ + CheckIOImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** @brief %Check for missusage of std::cout */ void checkCoutCerrMisusage(); @@ -128,26 +148,6 @@ class CPPCHECKLIB CheckIO : public Check { void invalidScanfFormatWidthError(const Token* tok, nonneg int numFormat, int width, const Variable *var, const std::string& specifier); static void argumentType(std::ostream & os, const ArgumentInfo * argInfo); static Severity getSeverity(const ArgumentInfo *argInfo); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "IO using format string"; - } - - std::string classInfo() const override { - return "Check format string input/output operations.\n" - "- Bad usage of the function 'sprintf' (overlapping data)\n" - "- Missing or wrong width specifiers in 'scanf' format string\n" - "- Use a file that has been closed\n" - "- File input/output without positioning results in undefined behaviour\n" - "- Read to a file that has only been opened for writing (or vice versa)\n" - "- Repositioning operation on a file opened in append mode\n" - "- The same file can't be open for read and write at the same time on different streams\n" - "- Using fflush() on an input stream\n" - "- Invalid usage of output stream. For example: 'std::cout << std::cout;'\n" - "- Wrong number of arguments given to 'printf' or 'scanf;'\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 1c9a7283161..7e12872c3d4 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -107,35 +107,35 @@ void VarInfo::possibleUsageAll(const std::pair& functionUsa } -void CheckLeakAutoVar::leakError(const Token *tok, const std::string &varname, int type) const +void CheckLeakAutoVarImpl::leakError(const Token *tok, const std::string &varname, int type) const { - const CheckMemoryLeak checkmemleak(mTokenizer, mErrorLogger, mSettings); + const CheckMemoryLeakImpl checkmemleak(mTokenizer, mSettings, mErrorLogger); if (Library::isresource(type)) checkmemleak.resourceLeakError(tok, varname); else checkmemleak.memleakError(tok, varname); } -void CheckLeakAutoVar::mismatchError(const Token *deallocTok, const Token *allocTok, const std::string &varname) const +void CheckLeakAutoVarImpl::mismatchError(const Token *deallocTok, const Token *allocTok, const std::string &varname) const { - const CheckMemoryLeak c(mTokenizer, mErrorLogger, mSettings); + const CheckMemoryLeakImpl c(mTokenizer, mSettings, mErrorLogger); const std::list callstack = { allocTok, deallocTok }; c.mismatchAllocDealloc(callstack, varname); } -void CheckLeakAutoVar::deallocUseError(const Token *tok, const std::string &varname) const +void CheckLeakAutoVarImpl::deallocUseError(const Token *tok, const std::string &varname) const { - const CheckMemoryLeak c(mTokenizer, mErrorLogger, mSettings); + const CheckMemoryLeakImpl c(mTokenizer, mSettings, mErrorLogger); c.deallocuseError(tok, varname); } -void CheckLeakAutoVar::deallocReturnError(const Token *tok, const Token *deallocTok, const std::string &varname) +void CheckLeakAutoVarImpl::deallocReturnError(const Token *tok, const Token *deallocTok, const std::string &varname) { const std::list locations = { deallocTok, tok }; reportError(locations, Severity::error, "deallocret", "$symbol:" + varname + "\nReturning/dereferencing '$symbol' after it is deallocated / released", CWE672, Certainty::normal); } -void CheckLeakAutoVar::configurationInfo(const Token* tok, const std::pair& functionUsage) +void CheckLeakAutoVarImpl::configurationInfo(const Token* tok, const std::pair& functionUsage) { if (mSettings->checkLibrary && functionUsage.second == VarInfo::USED && (!functionUsage.first || !functionUsage.first->function() || !functionUsage.first->function()->hasBody())) { @@ -149,7 +149,7 @@ void CheckLeakAutoVar::configurationInfo(const Token* tok, const std::pair locations = { prevFreeTok, tok }; @@ -160,7 +160,7 @@ void CheckLeakAutoVar::doubleFreeError(const Token *tok, const Token *prevFreeTo } -void CheckLeakAutoVar::check() +void CheckLeakAutoVarImpl::check() { if (mSettings->clang) return; @@ -303,10 +303,10 @@ static std::vector getComparisonTokens(const Token* tok) return result; } -bool CheckLeakAutoVar::checkScope(const Token * const startToken, - VarInfo &varInfo, - std::set notzero, - nonneg int recursiveCount) +bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, + VarInfo &varInfo, + std::set notzero, + nonneg int recursiveCount) { #if ASAN static const nonneg int recursiveLimit = 300; @@ -887,7 +887,7 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken, } -const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const tok, VarInfo &varInfo, bool inFuncCall) +const Token * CheckLeakAutoVarImpl::checkTokenInsideExpression(const Token * const tok, VarInfo &varInfo, bool inFuncCall) { // Deallocation and then dereferencing pointer.. if (tok->varId() > 0) { @@ -896,7 +896,7 @@ const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const t if (var != varInfo.alloctype.end()) { bool unknown = false; if (var->second.status == VarInfo::DEALLOC && tok->valueType() && tok->valueType()->pointer && - CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings, /*checkNullArg*/ false) && !unknown) { + CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings, /*checkNullArg*/ false) && !unknown) { deallocUseError(tok, tok->str()); } else if (Token::simpleMatch(tok->tokAt(-2), "= &")) { varInfo.erase(tok->varId()); @@ -956,7 +956,7 @@ const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const t } -void CheckLeakAutoVar::changeAllocStatusIfRealloc(std::map &alloctype, const Token *fTok, const Token *retTok) const +void CheckLeakAutoVarImpl::changeAllocStatusIfRealloc(std::map &alloctype, const Token *fTok, const Token *retTok) const { const Library::AllocFunc* f = mSettings->library.getReallocFuncInfo(fTok); if (f && f->arg == -1 && f->reallocArg > 0 && f->reallocArg <= numberOfArguments(fTok)) { @@ -977,7 +977,7 @@ void CheckLeakAutoVar::changeAllocStatusIfRealloc(std::map &alloctype = varInfo.alloctype; const auto var = alloctype.find(arg->varId()); @@ -1014,7 +1014,7 @@ void CheckLeakAutoVar::changeAllocStatus(VarInfo &varInfo, const VarInfo::AllocI } } -void CheckLeakAutoVar::functionCall(const Token *tokName, const Token *tokOpeningPar, VarInfo &varInfo, const VarInfo::AllocInfo& allocation, const Library::AllocFunc* af) +void CheckLeakAutoVarImpl::functionCall(const Token *tokName, const Token *tokOpeningPar, VarInfo &varInfo, const VarInfo::AllocInfo& allocation, const Library::AllocFunc* af) { // Ignore function call? const bool isLeakIgnore = mSettings->library.isLeakIgnore(mSettings->library.getFunctionName(tokName)); @@ -1153,8 +1153,8 @@ void CheckLeakAutoVar::functionCall(const Token *tokName, const Token *tokOpenin } -void CheckLeakAutoVar::leakIfAllocated(const Token *vartok, - const VarInfo &varInfo) +void CheckLeakAutoVarImpl::leakIfAllocated(const Token *vartok, + const VarInfo &varInfo) { const std::map &alloctype = varInfo.alloctype; const auto& possibleUsage = varInfo.possibleUsage; @@ -1176,7 +1176,7 @@ static bool isSafeCast(const ValueType* vt, const Settings& settings) return sizeOf == 0 || sizeOf >= settings.platform.sizeof_pointer; } -void CheckLeakAutoVar::ret(const Token *tok, VarInfo &varInfo, const bool isEndOfScope) +void CheckLeakAutoVarImpl::ret(const Token *tok, VarInfo &varInfo, const bool isEndOfScope) { const std::map &alloctype = varInfo.alloctype; const auto& possibleUsage = varInfo.possibleUsage; @@ -1280,13 +1280,13 @@ void CheckLeakAutoVar::ret(const Token *tok, VarInfo &varInfo, const bool isEndO void CheckLeakAutoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckLeakAutoVar checkLeakAutoVar(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckLeakAutoVarImpl checkLeakAutoVar(&tokenizer, &tokenizer.getSettings(), errorLogger); checkLeakAutoVar.check(); } void CheckLeakAutoVar::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckLeakAutoVar c(nullptr, settings, errorLogger); + CheckLeakAutoVarImpl c(nullptr, settings, errorLogger); c.deallocReturnError(nullptr, nullptr, "p"); c.configurationInfo(nullptr, { nullptr, VarInfo::USED }); // user configuration is needed to complete analysis c.doubleFreeError(nullptr, nullptr, "varname", 0); diff --git a/lib/checkleakautovar.h b/lib/checkleakautovar.h index d7d8d390b3d..ce7e1ddbd8b 100644 --- a/lib/checkleakautovar.h +++ b/lib/checkleakautovar.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include "library.h" @@ -107,15 +108,24 @@ class CPPCHECKLIB VarInfo { class CPPCHECKLIB CheckLeakAutoVar : public Check { public: /** This constructor is used when registering the CheckLeakAutoVar */ - CheckLeakAutoVar() : Check(myName()) {} + CheckLeakAutoVar() : Check("Leaks (auto variables)") {} private: - /** This constructor is used when running checks. */ - CheckLeakAutoVar(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Detect when a auto variable is allocated but not deallocated or deallocated twice.\n"; + } +}; + +class CPPCHECKLIB CheckLeakAutoVarImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckLeakAutoVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** check for leaks in all scopes */ void check(); @@ -157,16 +167,6 @@ class CPPCHECKLIB CheckLeakAutoVar : public Check { /** message: user configuration is needed to complete analysis */ void configurationInfo(const Token* tok, const std::pair& functionUsage); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Leaks (auto variables)"; - } - - std::string classInfo() const override { - return "Detect when a auto variable is allocated but not deallocated or deallocated twice.\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index b2f97693cd6..cef03b1a538 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -31,6 +31,7 @@ #include "utils.h" #include +#include #include #include #include @@ -45,7 +46,8 @@ static const CWE CWE772(772U); // Missing Release of Resource after Effective L //--------------------------------------------------------------------------- -CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2, nonneg int varid, std::list *callstack) const + +CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getAllocationType(const Token *tok2, nonneg int varid, std::list *callstack) const { // What we may have... // * var = (char *)malloc(10); @@ -93,7 +95,7 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2, return New; } - if (mSettings_->hasLib("posix")) { + if (mSettings->hasLib("posix")) { if (Token::Match(tok2, "open|openat|creat|mkstemp|mkostemp|socket (")) { // simple sanity check of function parameters.. // TODO: Make such check for all these functions @@ -112,11 +114,11 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2, } // Does tok2 point on a Library allocation function? - const int alloctype = mSettings_->library.getAllocId(tok2, -1); + const int alloctype = mSettings->library.getAllocId(tok2, -1); if (alloctype > 0) { - if (alloctype == mSettings_->library.deallocId("free")) + if (alloctype == mSettings->library.deallocId("free")) return Malloc; - if (alloctype == mSettings_->library.deallocId("fclose")) + if (alloctype == mSettings->library.deallocId("fclose")) return File; return Library::ismemory(alloctype) ? OtherMem : OtherRes; } @@ -143,7 +145,7 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2, } -CheckMemoryLeak::AllocType CheckMemoryLeak::getReallocationType(const Token *tok2, nonneg int varid) const +CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getReallocationType(const Token *tok2, nonneg int varid) const { // What we may have... // * var = (char *)realloc(..; @@ -157,7 +159,7 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getReallocationType(const Token *tok if (!Token::Match(tok2, "%name% (")) return No; - const Library::AllocFunc *f = mSettings_->library.getReallocFuncInfo(tok2); + const Library::AllocFunc *f = mSettings->library.getReallocFuncInfo(tok2); if (!(f && f->reallocArg > 0 && f->reallocArg <= numberOfArguments(tok2))) return No; const auto args = getArguments(tok2); @@ -171,11 +173,11 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getReallocationType(const Token *tok if (varid > 0 && !Token::Match(arg, "%varid% [,)]", varid)) return No; - const int realloctype = mSettings_->library.getReallocId(tok2, -1); + const int realloctype = mSettings->library.getReallocId(tok2, -1); if (realloctype > 0) { - if (realloctype == mSettings_->library.deallocId("free")) + if (realloctype == mSettings->library.deallocId("free")) return Malloc; - if (realloctype == mSettings_->library.deallocId("fclose")) + if (realloctype == mSettings->library.deallocId("fclose")) return File; return Library::ismemory(realloctype) ? OtherMem : OtherRes; } @@ -183,7 +185,7 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getReallocationType(const Token *tok } -CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok, nonneg int varid) const +CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getDeallocationType(const Token *tok, nonneg int varid) const { if (tok->isCpp() && tok->str() == "delete" && tok->astOperand1()) { const Token* vartok = tok->astOperand1(); @@ -214,7 +216,7 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok if (tok->str() == "realloc" && Token::simpleMatch(vartok->next(), ", 0 )")) return Malloc; - if (mSettings_->hasLib("posix")) { + if (mSettings->hasLib("posix")) { if (tok->str() == "close") return Fd; if (tok->str() == "pclose") @@ -222,11 +224,11 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok } // Does tok point on a Library deallocation function? - const int dealloctype = mSettings_->library.getDeallocId(tok, argNr); + const int dealloctype = mSettings->library.getDeallocId(tok, argNr); if (dealloctype > 0) { - if (dealloctype == mSettings_->library.deallocId("free")) + if (dealloctype == mSettings->library.deallocId("free")) return Malloc; - if (dealloctype == mSettings_->library.deallocId("fclose")) + if (dealloctype == mSettings->library.deallocId("fclose")) return File; return Library::ismemory(dealloctype) ? OtherMem : OtherRes; } @@ -238,10 +240,10 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok return No; } -bool CheckMemoryLeak::isReopenStandardStream(const Token *tok) const +bool CheckMemoryLeakImpl::isReopenStandardStream(const Token *tok) const { if (getReallocationType(tok, 0) == File) { - const Library::AllocFunc *f = mSettings_->library.getReallocFuncInfo(tok); + const Library::AllocFunc *f = mSettings->library.getReallocFuncInfo(tok); if (f && f->reallocArg > 0 && f->reallocArg <= numberOfArguments(tok)) { const Token* arg = getArguments(tok).at(f->reallocArg - 1); if (Token::Match(arg, "stdin|stdout|stderr")) @@ -251,9 +253,9 @@ bool CheckMemoryLeak::isReopenStandardStream(const Token *tok) const return false; } -bool CheckMemoryLeak::isOpenDevNull(const Token *tok) const +bool CheckMemoryLeakImpl::isOpenDevNull(const Token *tok) const { - if (mSettings_->hasLib("posix") && tok->str() == "open" && numberOfArguments(tok) == 2) { + if (mSettings->hasLib("posix") && tok->str() == "open" && numberOfArguments(tok) == 2) { const Token* arg = getArguments(tok).at(0); if (Token::simpleMatch(arg, "\"/dev/null\"")) return true; @@ -261,24 +263,18 @@ bool CheckMemoryLeak::isOpenDevNull(const Token *tok) const return false; } -//-------------------------------------------------------------------------- - - -//-------------------------------------------------------------------------- - -void CheckMemoryLeak::memoryLeak(const Token *tok, const std::string &varname, AllocType alloctype) const +void CheckMemoryLeakImpl::memoryLeak(const Token *tok, const std::string &varname, AllocType alloctype) const { - if (alloctype == CheckMemoryLeak::File || - alloctype == CheckMemoryLeak::Pipe || - alloctype == CheckMemoryLeak::Fd || - alloctype == CheckMemoryLeak::OtherRes) + if (alloctype == File || + alloctype == Pipe || + alloctype == Fd || + alloctype == OtherRes) resourceLeakError(tok, varname); else memleakError(tok, varname); } -//--------------------------------------------------------------------------- -void CheckMemoryLeak::reportErr(const Token *tok, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe) const +void CheckMemoryLeakImpl::reportErr(const Token *tok, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe) const { std::list callstack; @@ -288,26 +284,25 @@ void CheckMemoryLeak::reportErr(const Token *tok, Severity severity, const std:: reportErr(callstack, severity, id, msg, cwe); } -void CheckMemoryLeak::reportErr(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe) const +void CheckMemoryLeakImpl::reportErr(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe) const { - const ErrorMessage errmsg(callstack, mTokenizer_ ? &mTokenizer_->list : nullptr, severity, id, msg, cwe, Certainty::normal); - if (mErrorLogger_) - mErrorLogger_->reportErr(errmsg); - else - Check::writeToErrorList(errmsg); + assert(mErrorLogger); + + const ErrorMessage errmsg(callstack, mTokenizer ? &mTokenizer->list : nullptr, severity, id, msg, cwe, Certainty::normal); + mErrorLogger->reportErr(errmsg); } -void CheckMemoryLeak::memleakError(const Token *tok, const std::string &varname) const +void CheckMemoryLeakImpl::memleakError(const Token *tok, const std::string &varname) const { reportErr(tok, Severity::error, "memleak", "$symbol:" + varname + "\nMemory leak: $symbol", CWE(401U)); } -void CheckMemoryLeak::memleakUponReallocFailureError(const Token *tok, const std::string &reallocfunction, const std::string &varname) const +void CheckMemoryLeakImpl::memleakUponReallocFailureError(const Token *tok, const std::string &reallocfunction, const std::string &varname) const { reportErr(tok, Severity::error, "memleakOnRealloc", "$symbol:" + varname + "\nCommon " + reallocfunction + " mistake: \'$symbol\' nulled but not freed upon failure", CWE(401U)); } -void CheckMemoryLeak::resourceLeakError(const Token *tok, const std::string &varname) const +void CheckMemoryLeakImpl::resourceLeakError(const Token *tok, const std::string &varname) const { std::string errmsg("Resource leak"); if (!varname.empty()) @@ -315,17 +310,17 @@ void CheckMemoryLeak::resourceLeakError(const Token *tok, const std::string &var reportErr(tok, Severity::error, "resourceLeak", errmsg, CWE(775U)); } -void CheckMemoryLeak::deallocuseError(const Token *tok, const std::string &varname) const +void CheckMemoryLeakImpl::deallocuseError(const Token *tok, const std::string &varname) const { reportErr(tok, Severity::error, "deallocuse", "$symbol:" + varname + "\nDereferencing '$symbol' after it is deallocated / released", CWE(416U)); } -void CheckMemoryLeak::mismatchAllocDealloc(const std::list &callstack, const std::string &varname) const +void CheckMemoryLeakImpl::mismatchAllocDealloc(const std::list &callstack, const std::string &varname) const { reportErr(callstack, Severity::error, "mismatchAllocDealloc", "$symbol:" + varname + "\nMismatching allocation and deallocation: $symbol", CWE(762U)); } -CheckMemoryLeak::AllocType CheckMemoryLeak::functionReturnType(const Function* func, std::list *callstack) const +CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::functionReturnType(const Function* func, std::list *callstack) const { if (!func || !func->hasBody() || !func->functionScope) return No; @@ -423,7 +418,7 @@ static bool ifvar(const Token *tok, nonneg int varid, const std::string &comp, c // a = malloc(10); a = realloc(a, 100); //--------------------------------------------------------------------------- -void CheckMemoryLeakInFunction::checkReallocUsage() +void CheckMemoryLeakInFunctionImpl::checkReallocUsage() { logChecker("CheckMemoryLeakInFunction::checkReallocUsage"); @@ -494,17 +489,16 @@ void CheckMemoryLeakInFunction::checkReallocUsage() } } } -//--------------------------------------------------------------------------- void CheckMemoryLeakInFunction::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckMemoryLeakInFunction checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); checkMemoryLeak.checkReallocUsage(); } void CheckMemoryLeakInFunction::getErrorMessages(ErrorLogger *e, const Settings *settings) const { - CheckMemoryLeakInFunction c(nullptr, settings, e); + CheckMemoryLeakInFunctionImpl c(nullptr, settings, e); c.memleakError(nullptr, "varname"); c.resourceLeakError(nullptr, "varname"); c.deallocuseError(nullptr, "varname"); @@ -517,8 +511,7 @@ void CheckMemoryLeakInFunction::getErrorMessages(ErrorLogger *e, const Settings // Checks for memory leaks in classes.. //--------------------------------------------------------------------------- - -void CheckMemoryLeakInClass::check() +void CheckMemoryLeakInClassImpl::check() { logChecker("CheckMemoryLeakInClass::check"); @@ -543,15 +536,15 @@ void CheckMemoryLeakInClass::check() } -void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarname) +void CheckMemoryLeakInClassImpl::variable(const Scope *scope, const Token *tokVarname) { const std::string& varname = tokVarname->str(); const int varid = tokVarname->varId(); const std::string& classname = scope->className; // Check if member variable has been allocated and deallocated.. - CheckMemoryLeak::AllocType memberAlloc = CheckMemoryLeak::No; - CheckMemoryLeak::AllocType memberDealloc = CheckMemoryLeak::No; + AllocType memberAlloc = AllocType::No; + AllocType memberDealloc = AllocType::No; bool allocInConstructor = false; bool deallocInDestructor = false; @@ -563,7 +556,7 @@ void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarnam if (!func.hasBody()) { if (destructor && !func.isDefault()) { // implementation for destructor is not seen and not defaulted => assume it deallocates all variables properly deallocInDestructor = true; - memberDealloc = CheckMemoryLeak::Many; + memberDealloc = AllocType::Many; } continue; } @@ -596,14 +589,14 @@ void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarnam allocTok = tok->astParent()->astParent()->astOperand2(); AllocType alloc = getAllocationType(allocTok, 0); - if (alloc != CheckMemoryLeak::No) { + if (alloc != AllocType::No) { if (constructor) allocInConstructor = true; - if (memberAlloc != No && memberAlloc != alloc) - alloc = CheckMemoryLeak::Many; + if (memberAlloc != AllocType::No && memberAlloc != alloc) + alloc = AllocType::Many; - if (alloc != CheckMemoryLeak::Many && memberDealloc != CheckMemoryLeak::No && memberDealloc != CheckMemoryLeak::Many && memberDealloc != alloc) { + if (alloc != AllocType::Many && memberDealloc != AllocType::No && memberDealloc != AllocType::Many && memberDealloc != alloc) { mismatchAllocDealloc({tok}, classname + "::" + varname); } @@ -619,18 +612,18 @@ void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarnam // some usage in the destructor => assume it's related // to deallocation if (destructor && tok->str() == varname) - dealloc = CheckMemoryLeak::Many; - if (dealloc != CheckMemoryLeak::No) { + dealloc = AllocType::Many; + if (dealloc != AllocType::No) { if (destructor) deallocInDestructor = true; - if (dealloc != CheckMemoryLeak::Many && memberAlloc != CheckMemoryLeak::No && memberAlloc != Many && memberAlloc != dealloc) { + if (dealloc != AllocType::Many && memberAlloc != AllocType::No && memberAlloc != Many && memberAlloc != dealloc) { mismatchAllocDealloc({tok}, classname + "::" + varname); } // several types of allocation/deallocation? - if (memberDealloc != CheckMemoryLeak::No && memberDealloc != dealloc) - dealloc = CheckMemoryLeak::Many; + if (memberDealloc != AllocType::No && memberDealloc != dealloc) + dealloc = AllocType::Many; memberDealloc = dealloc; } @@ -645,12 +638,12 @@ void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarnam if (allocInConstructor && !deallocInDestructor) { unsafeClassError(tokVarname, classname, classname + "::" + varname /*, memberAlloc*/); - } else if (memberAlloc != CheckMemoryLeak::No && memberDealloc == CheckMemoryLeak::No) { + } else if (memberAlloc != AllocType::No && memberDealloc == AllocType::No) { unsafeClassError(tokVarname, classname, classname + "::" + varname /*, memberAlloc*/); } } -void CheckMemoryLeakInClass::unsafeClassError(const Token *tok, const std::string &classname, const std::string &varname) +void CheckMemoryLeakInClassImpl::unsafeClassError(const Token *tok, const std::string &classname, const std::string &varname) { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unsafeClassCanLeak")) return; @@ -663,7 +656,7 @@ void CheckMemoryLeakInClass::unsafeClassError(const Token *tok, const std::strin } -void CheckMemoryLeakInClass::checkPublicFunctions(const Scope *scope, const Token *classtok) +void CheckMemoryLeakInClassImpl::checkPublicFunctions(const Scope *scope, const Token *classtok) { // Check that public functions deallocate the pointers that they allocate. // There is no checking how these functions are used and therefore it @@ -680,20 +673,20 @@ void CheckMemoryLeakInClass::checkPublicFunctions(const Scope *scope, const Toke func.access == AccessControl::Public && func.hasBody()) { const Token *tok2 = func.functionScope->bodyStart->next(); if (Token::Match(tok2, "%varid% =", varid)) { - const CheckMemoryLeak::AllocType alloc = getAllocationType(tok2->tokAt(2), varid); - if (alloc != CheckMemoryLeak::No) + const AllocType alloc = getAllocationType(tok2->tokAt(2), varid); + if (alloc != AllocType::No) publicAllocationError(tok2, tok2->str()); } else if (Token::Match(tok2, "%type% :: %varid% =", varid) && tok2->str() == scope->className) { - const CheckMemoryLeak::AllocType alloc = getAllocationType(tok2->tokAt(4), varid); - if (alloc != CheckMemoryLeak::No) + const AllocType alloc = getAllocationType(tok2->tokAt(4), varid); + if (alloc != AllocType::No) publicAllocationError(tok2, tok2->strAt(2)); } } } } -void CheckMemoryLeakInClass::publicAllocationError(const Token *tok, const std::string &varname) +void CheckMemoryLeakInClassImpl::publicAllocationError(const Token *tok, const std::string &varname) { reportError(tok, Severity::warning, "publicAllocationError", "$symbol:" + varname + "\nPossible leak in public function. The pointer '$symbol' is not deallocated before it is allocated.", CWE398, Certainty::normal); } @@ -703,19 +696,18 @@ void CheckMemoryLeakInClass::runChecks(const Tokenizer &tokenizer, ErrorLogger * if (!tokenizer.isCPP()) return; - CheckMemoryLeakInClass checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } void CheckMemoryLeakInClass::getErrorMessages(ErrorLogger *e, const Settings *settings) const { - CheckMemoryLeakInClass c(nullptr, settings, e); + CheckMemoryLeakInClassImpl c(nullptr, settings, e); c.publicAllocationError(nullptr, "varname"); c.unsafeClassError(nullptr, "class", "class::varname"); } - -void CheckMemoryLeakStructMember::check() +void CheckMemoryLeakStructMemberImpl::check() { if (mSettings->clang) return; @@ -734,7 +726,7 @@ void CheckMemoryLeakStructMember::check() } } -bool CheckMemoryLeakStructMember::isMalloc(const Variable *variable) const +bool CheckMemoryLeakStructMemberImpl::isMalloc(const Variable *variable) const { if (!variable) return false; @@ -756,7 +748,7 @@ bool CheckMemoryLeakStructMember::isMalloc(const Variable *variable) const return alloc; } -void CheckMemoryLeakStructMember::checkStructVariable(const Variable* const variable) const +void CheckMemoryLeakStructMemberImpl::checkStructVariable(const Variable* const variable) const { if (!variable) return; @@ -976,15 +968,17 @@ void CheckMemoryLeakStructMember::checkStructVariable(const Variable* const vari void CheckMemoryLeakStructMember::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckMemoryLeakStructMember checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakStructMemberImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } -void CheckMemoryLeakStructMember::getErrorMessages(ErrorLogger * /*errorLogger*/, const Settings * /*settings*/) const -{} - +void CheckMemoryLeakStructMember::getErrorMessages(ErrorLogger * errorLogger, const Settings * settings) const +{ + (void)errorLogger; + (void)settings; +} -void CheckMemoryLeakNoVar::check() +void CheckMemoryLeakNoVarImpl::check() { logChecker("CheckMemoryLeakNoVar::check"); @@ -1010,7 +1004,7 @@ void CheckMemoryLeakNoVar::check() // Checks if an input argument to a function is the return value of an allocation function // like malloc(), and the function does not release it. //--------------------------------------------------------------------------- -void CheckMemoryLeakNoVar::checkForUnreleasedInputArgument(const Scope *scope) +void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scope) { // parse the executable scope until tok is reached... for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) { @@ -1083,7 +1077,7 @@ void CheckMemoryLeakNoVar::checkForUnreleasedInputArgument(const Scope *scope) //--------------------------------------------------------------------------- // Checks if a call to an allocation function like malloc() is made and its return value is not assigned. //--------------------------------------------------------------------------- -void CheckMemoryLeakNoVar::checkForUnusedReturnValue(const Scope *scope) +void CheckMemoryLeakNoVarImpl::checkForUnusedReturnValue(const Scope *scope) { for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) { const bool isNew = tok->isCpp() && tok->str() == "new"; @@ -1150,7 +1144,7 @@ void CheckMemoryLeakNoVar::checkForUnusedReturnValue(const Scope *scope) // f(shared_ptr(new int(42)), g()); // } //--------------------------------------------------------------------------- -void CheckMemoryLeakNoVar::checkForUnsafeArgAlloc(const Scope *scope) +void CheckMemoryLeakNoVarImpl::checkForUnsafeArgAlloc(const Scope *scope) { // This test only applies to C++ source if (!mTokenizer->isCPP()) @@ -1200,17 +1194,17 @@ void CheckMemoryLeakNoVar::checkForUnsafeArgAlloc(const Scope *scope) } } -void CheckMemoryLeakNoVar::functionCallLeak(const Token *loc, const std::string &alloc, const std::string &functionCall) +void CheckMemoryLeakNoVarImpl::functionCallLeak(const Token *loc, const std::string &alloc, const std::string &functionCall) { reportError(loc, Severity::error, "leakNoVarFunctionCall", "Allocation with " + alloc + ", " + functionCall + " doesn't release it.", CWE772, Certainty::normal); } -void CheckMemoryLeakNoVar::returnValueNotUsedError(const Token *tok, const std::string &alloc) +void CheckMemoryLeakNoVarImpl::returnValueNotUsedError(const Token *tok, const std::string &alloc) { reportError(tok, Severity::error, "leakReturnValNotUsed", "$symbol:" + alloc + "\nReturn value of allocation function '$symbol' is not stored.", CWE771, Certainty::normal); } -void CheckMemoryLeakNoVar::unsafeArgAllocError(const Token *tok, const std::string &funcName, const std::string &ptrType, const std::string& objType) +void CheckMemoryLeakNoVarImpl::unsafeArgAllocError(const Token *tok, const std::string &funcName, const std::string &ptrType, const std::string& objType) { const std::string factoryFunc = ptrType == "shared_ptr" ? "make_shared" : "make_unique"; reportError(tok, Severity::warning, "leakUnsafeArgAlloc", @@ -1222,13 +1216,13 @@ void CheckMemoryLeakNoVar::unsafeArgAllocError(const Token *tok, const std::stri void CheckMemoryLeakNoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckMemoryLeakNoVar checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakNoVarImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } void CheckMemoryLeakNoVar::getErrorMessages(ErrorLogger *e, const Settings *settings) const { - CheckMemoryLeakNoVar c(nullptr, settings, e); + CheckMemoryLeakNoVarImpl c(nullptr, settings, e); c.functionCallLeak(nullptr, "funcName", "funcName"); c.returnValueNotUsedError(nullptr, "funcName"); c.unsafeArgAllocError(nullptr, "funcName", "shared_ptr", "int"); diff --git a/lib/checkmemoryleak.h b/lib/checkmemoryleak.h index c9fb2274252..047cf3295ae 100644 --- a/lib/checkmemoryleak.h +++ b/lib/checkmemoryleak.h @@ -33,6 +33,7 @@ */ #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -52,18 +53,103 @@ enum class Severity : std::uint8_t; /// @addtogroup Core /// @{ -/** @brief Base class for memory leaks checking */ -class CPPCHECKLIB CheckMemoryLeak { + +/** + * @brief %CheckMemoryLeakInFunction detects when a function variable is allocated but not deallocated properly. + * + * The checking is done by looking at each function variable separately. By repeating these 4 steps over and over: + * -# locate a function variable + * -# create a simple token list that describes the usage of the function variable. + * -# simplify the token list. + * -# finally, check if the simplified token list contain any leaks. + */ + +class CPPCHECKLIB CheckMemoryLeakInFunction : public Check { + friend class TestMemleakInFunction; + +public: + /** @brief This constructor is used when registering this class */ + CheckMemoryLeakInFunction() : Check("Memory leaks (function variables)") {} + +private: + void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + + /** Report all possible errors (for the --errorlist) */ + void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; + + /** + * Get class information (--doc) + * @return Wiki formatted information about this class + */ + std::string classInfo() const override { + return "Is there any allocated memory when a function goes out of scope\n"; + } +}; + + +/** + * @brief %Check class variables, variables that are allocated in the constructor should be deallocated in the destructor + */ + +class CPPCHECKLIB CheckMemoryLeakInClass : public Check { + friend class TestMemleakInClass; + +public: + CheckMemoryLeakInClass() : Check("Memory leaks (class variables)") {} + +private: + void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + + void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; + + std::string classInfo() const override { + return "If the constructor allocate memory then the destructor must deallocate it.\n"; + } +}; + + + +/** @brief detect simple memory leaks for struct members */ + +class CPPCHECKLIB CheckMemoryLeakStructMember : public Check { + friend class TestMemleakStructMember; + +public: + CheckMemoryLeakStructMember() : Check("Memory leaks (struct members)") {} + +private: + void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + + void getErrorMessages(ErrorLogger * errorLogger, const Settings * settings) const override; + + std::string classInfo() const override { + return "Don't forget to deallocate struct members\n"; + } +}; + + + +/** @brief detect simple memory leaks (address not taken) */ + +class CPPCHECKLIB CheckMemoryLeakNoVar : public Check { + friend class TestMemleakNoVar; + +public: + CheckMemoryLeakNoVar() : Check("Memory leaks (address not taken)") {} + private: - /** For access to the tokens */ - const Tokenizer * const mTokenizer_; + void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - /** ErrorLogger used to report errors */ - ErrorLogger * const mErrorLogger_; + void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; - /** Enabled standards */ - const Settings * const mSettings_; + std::string classInfo() const override { + return "Not taking the address to allocated memory\n"; + } +}; +/** @brief Base class for memory leaks checking */ +class CPPCHECKLIB CheckMemoryLeakImpl : public CheckImpl { +private: /** * Report error. Similar with the function Check::reportError * @param tok the token where the error occurs @@ -85,12 +171,12 @@ class CPPCHECKLIB CheckMemoryLeak { void reportErr(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe) const; public: - CheckMemoryLeak() = delete; - CheckMemoryLeak(const CheckMemoryLeak &) = delete; - CheckMemoryLeak& operator=(const CheckMemoryLeak &) = delete; + CheckMemoryLeakImpl() = delete; + CheckMemoryLeakImpl(const CheckMemoryLeakImpl &) = delete; + CheckMemoryLeakImpl& operator=(const CheckMemoryLeakImpl &) = delete; - CheckMemoryLeak(const Tokenizer *t, ErrorLogger *e, const Settings *s) - : mTokenizer_(t), mErrorLogger_(e), mSettings_(s) {} + CheckMemoryLeakImpl(const Tokenizer *t, const Settings *s, ErrorLogger *e) + : CheckImpl(t, s, e) {} /** @brief What type of allocation are used.. the "Many" means that several types of allocation and deallocation are used */ enum AllocType : std::uint8_t { No, Malloc, New, NewArray, File, Fd, Pipe, OtherMem, OtherRes, Many }; @@ -165,43 +251,16 @@ class CPPCHECKLIB CheckMemoryLeak { * -# finally, check if the simplified token list contain any leaks. */ -class CPPCHECKLIB CheckMemoryLeakInFunction : public Check, public CheckMemoryLeak { - friend class TestMemleakInFunction; - +class CPPCHECKLIB CheckMemoryLeakInFunctionImpl : public CheckMemoryLeakImpl { public: - /** @brief This constructor is used when registering this class */ - CheckMemoryLeakInFunction() : Check(myName()), CheckMemoryLeak(nullptr, nullptr, nullptr) {} - -private: /** @brief This constructor is used when running checks */ - CheckMemoryLeakInFunction(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger), CheckMemoryLeak(tokenizer, errorLogger, settings) {} - - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + CheckMemoryLeakInFunctionImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} /** * Checking for a memory leak caused by improper realloc usage. */ void checkReallocUsage(); - - /** Report all possible errors (for the --errorlist) */ - void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; - - /** - * Get name of class (--doc) - * @return name of class - */ - static std::string myName() { - return "Memory leaks (function variables)"; - } - - /** - * Get class information (--doc) - * @return Wiki formatted information about this class - */ - std::string classInfo() const override { - return "Is there any allocated memory when a function goes out of scope\n"; - } }; @@ -210,17 +269,10 @@ class CPPCHECKLIB CheckMemoryLeakInFunction : public Check, public CheckMemoryLe * @brief %Check class variables, variables that are allocated in the constructor should be deallocated in the destructor */ -class CPPCHECKLIB CheckMemoryLeakInClass : public Check, private CheckMemoryLeak { - friend class TestMemleakInClass; - +class CPPCHECKLIB CheckMemoryLeakInClassImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakInClass() : Check(myName()), CheckMemoryLeak(nullptr, nullptr, nullptr) {} - -private: - CheckMemoryLeakInClass(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger), CheckMemoryLeak(tokenizer, errorLogger, settings) {} - - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + CheckMemoryLeakInClassImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); @@ -231,33 +283,17 @@ class CPPCHECKLIB CheckMemoryLeakInClass : public Check, private CheckMemoryLeak void publicAllocationError(const Token *tok, const std::string &varname); void unsafeClassError(const Token *tok, const std::string &classname, const std::string &varname); - - void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; - - static std::string myName() { - return "Memory leaks (class variables)"; - } - - std::string classInfo() const override { - return "If the constructor allocate memory then the destructor must deallocate it.\n"; - } }; /** @brief detect simple memory leaks for struct members */ -class CPPCHECKLIB CheckMemoryLeakStructMember : public Check, private CheckMemoryLeak { - friend class TestMemleakStructMember; - +class CPPCHECKLIB CheckMemoryLeakStructMemberImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakStructMember() : Check(myName()), CheckMemoryLeak(nullptr, nullptr, nullptr) {} -private: - CheckMemoryLeakStructMember(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger), CheckMemoryLeak(tokenizer, errorLogger, settings) {} - - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + CheckMemoryLeakStructMemberImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); @@ -265,33 +301,16 @@ class CPPCHECKLIB CheckMemoryLeakStructMember : public Check, private CheckMemor bool isMalloc(const Variable *variable) const; void checkStructVariable(const Variable* variable) const; - - void getErrorMessages(ErrorLogger* /*errorLogger*/, const Settings* /*settings*/) const override; - - static std::string myName() { - return "Memory leaks (struct members)"; - } - - std::string classInfo() const override { - return "Don't forget to deallocate struct members\n"; - } }; /** @brief detect simple memory leaks (address not taken) */ -class CPPCHECKLIB CheckMemoryLeakNoVar : public Check, private CheckMemoryLeak { - friend class TestMemleakNoVar; - +class CPPCHECKLIB CheckMemoryLeakNoVarImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakNoVar() : Check(myName()), CheckMemoryLeak(nullptr, nullptr, nullptr) {} - -private: - CheckMemoryLeakNoVar(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger), CheckMemoryLeak(tokenizer, errorLogger, settings) {} - - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + CheckMemoryLeakNoVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); @@ -317,16 +336,6 @@ class CPPCHECKLIB CheckMemoryLeakNoVar : public Check, private CheckMemoryLeak { void functionCallLeak(const Token *loc, const std::string &alloc, const std::string &functionCall); void returnValueNotUsedError(const Token* tok, const std::string &alloc); void unsafeArgAllocError(const Token *tok, const std::string &funcName, const std::string &ptrType, const std::string &objType); - - void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; - - static std::string myName() { - return "Memory leaks (address not taken)"; - } - - std::string classInfo() const override { - return "Not taking the address to allocated memory\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 5bd602488b4..2dbff296cf0 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -54,7 +54,7 @@ static bool checkNullpointerFunctionCallPlausibility(const Function* func, unsig return !func || (func->argCount() >= arg && func->getArgumentVar(arg - 1) && func->getArgumentVar(arg - 1)->isPointer()); } -std::list CheckNullPointer::parseFunctionCall(const Token &tok, const Library &library, bool checkNullArg) +std::list CheckNullPointerImpl::parseFunctionCall(const Token &tok, const Library &library, bool checkNullArg) { if (Token::Match(&tok, "%name% ( )") || !tok.tokAt(2)) return {}; @@ -128,21 +128,12 @@ namespace { }; } -/** - * Is there a pointer dereference? Everything that should result in - * a nullpointer dereference error message will result in a true - * return value. If it's unknown if the pointer is dereferenced false - * is returned. - * @param tok token for the pointer - * @param unknown it is not known if there is a pointer dereference (could be reported as a debug message) - * @return true => there is a dereference - */ -bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown) const +bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown) const { return isPointerDeRef(tok, unknown, *mSettings); } -bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings, bool checkNullArg) +bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings, bool checkNullArg) { unknown = false; @@ -155,7 +146,7 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Set ftok = ftok->previous(); } if (ftok && ftok->previous()) { - const std::list varlist = parseFunctionCall(*ftok->previous(), settings.library, checkNullArg); + const std::list varlist = CheckNullPointerImpl::parseFunctionCall(*ftok->previous(), settings.library, checkNullArg); if (std::find(varlist.cbegin(), varlist.cend(), tok) != varlist.cend()) { return true; } @@ -273,7 +264,7 @@ static bool isNullablePointer(const Token* tok) return false; } -void CheckNullPointer::nullPointerByDeRefAndCheck() +void CheckNullPointerImpl::nullPointerByDeRefAndCheck() { const bool printInconclusive = (mSettings->certainty.isEnabled(Certainty::inconclusive)); @@ -307,7 +298,7 @@ void CheckNullPointer::nullPointerByDeRefAndCheck() // Pointer dereference. bool unknown = false; - if (!isPointerDeRef(tok, unknown)) { + if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings)) { if (unknown) nullPointerError(tok, tok->expressionString(), value, true); continue; @@ -318,7 +309,7 @@ void CheckNullPointer::nullPointerByDeRefAndCheck() } } -void CheckNullPointer::nullPointer() +void CheckNullPointerImpl::nullPointer() { logChecker("CheckNullPointer::nullPointer"); nullPointerByDeRefAndCheck(); @@ -332,7 +323,7 @@ namespace { } /** Dereferencing null constant (simplified token list) */ -void CheckNullPointer::nullConstantDereference() +void CheckNullPointerImpl::nullConstantDereference() { logChecker("CheckNullPointer::nullConstantDereference"); @@ -425,14 +416,14 @@ void CheckNullPointer::nullConstantDereference() } } -void CheckNullPointer::nullPointerError(const Token *tok) +void CheckNullPointerImpl::nullPointerError(const Token *tok) { ValueFlow::Value v(0); v.setKnown(); nullPointerError(tok, "", &v, false); } -void CheckNullPointer::nullPointerError(const Token *tok, const std::string &varname, const ValueFlow::Value *value, bool inconclusive) +void CheckNullPointerImpl::nullPointerError(const Token *tok, const std::string &varname, const ValueFlow::Value *value, bool inconclusive) { const std::string errmsgcond("$symbol:" + varname + '\n' + ValueFlow::eitherTheConditionIsRedundant(value ? value->condition : nullptr) + " or there is possible null pointer dereference: $symbol."); const std::string errmsgdefarg("$symbol:" + varname + "\nPossible null pointer dereference if the default parameter value is used: $symbol"); @@ -486,7 +477,7 @@ void CheckNullPointer::nullPointerError(const Token *tok, const std::string &var } } -void CheckNullPointer::arithmetic() +void CheckNullPointerImpl::arithmetic() { logChecker("CheckNullPointer::arithmetic"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -533,7 +524,7 @@ static std::string arithmeticTypeString(const Token *tok) return "arithmetic"; } -void CheckNullPointer::pointerArithmeticError(const Token* tok, const ValueFlow::Value *value, bool inconclusive) +void CheckNullPointerImpl::pointerArithmeticError(const Token* tok, const ValueFlow::Value *value, bool inconclusive) { // cppcheck-suppress shadowFunction - TODO: fix this std::string arithmetic = arithmeticTypeString(tok); @@ -563,7 +554,7 @@ void CheckNullPointer::pointerArithmeticError(const Token* tok, const ValueFlow: inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckNullPointer::redundantConditionWarning(const Token* tok, const ValueFlow::Value *value, const Token *condition, bool inconclusive) +void CheckNullPointerImpl::redundantConditionWarning(const Token* tok, const ValueFlow::Value *value, const Token *condition, bool inconclusive) { // cppcheck-suppress shadowFunction - TODO: fix this std::string arithmetic = arithmeticTypeString(tok); @@ -587,7 +578,7 @@ static bool isUnsafeUsage(const Settings &settings, const Token *vartok, CTU::Fi { (void)value; bool unknown = false; - return CheckNullPointer::isPointerDeRef(vartok, unknown, settings); + return CheckNullPointerImpl::isPointerDeRef(vartok, unknown, settings); } // a Clang-built executable will crash when using the anonymous MyFileInfo later on - so put it in a unique namespace for now @@ -613,9 +604,11 @@ namespace }; } -Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const +Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const { - const std::list &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, isUnsafeUsage); + (void)currentConfig; + + const std::list &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, ::isUnsafeUsage); if (unsafeUsage.empty()) return nullptr; @@ -639,9 +632,9 @@ bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std:: { (void)settings; - CheckNullPointer dummy(nullptr, &settings, &errorLogger); + CheckNullPointerImpl dummy(nullptr, &settings, &errorLogger); dummy. - logChecker("CheckNullPointer::analyseWholeProgram"); // unusedfunctions + logChecker("CheckNullPointer::analyseWholeProgram"); if (fileInfo.empty()) return false; @@ -701,7 +694,7 @@ bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std:: void CheckNullPointer::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckNullPointer checkNullPointer(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckNullPointerImpl checkNullPointer(&tokenizer, &tokenizer.getSettings(), errorLogger); checkNullPointer.nullPointer(); checkNullPointer.arithmetic(); checkNullPointer.nullConstantDereference(); @@ -709,7 +702,7 @@ void CheckNullPointer::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorL void CheckNullPointer::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckNullPointer c(nullptr, settings, errorLogger); + CheckNullPointerImpl c(nullptr, settings, errorLogger); c.nullPointerError(nullptr, "pointer", nullptr, false); c.pointerArithmeticError(nullptr, nullptr, false); // TODO: nullPointerArithmeticOutOfMemory diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index c02feae303e..f9f78280fea 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -51,7 +52,36 @@ class CPPCHECKLIB CheckNullPointer : public Check { public: /** @brief This constructor is used when registering the CheckNullPointer */ - CheckNullPointer() : Check(myName()) {} + CheckNullPointer() : Check("Null pointer") {} + +private: + /** @brief Run checks against the normal token list */ + void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + + /** @brief Parse current TU and extract file info */ + Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const override; + + Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + + /** @brief Analyse all file infos for all TU */ + bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + + /** Get error messages. Used by --errorlist */ + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + /** class info in WIKI format. Used by --doc */ + std::string classInfo() const override { + return "Null pointers\n" + "- null pointer dereferencing\n" + "- undefined null pointer arithmetic\n"; + } +}; + +class CPPCHECKLIB CheckNullPointerImpl : public CheckImpl { +public: + /** @brief This constructor is used when running checks. */ + CheckNullPointerImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} /** * Is there a pointer dereference? Everything that should result in @@ -66,7 +96,6 @@ class CPPCHECKLIB CheckNullPointer : public Check { static bool isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings, bool checkNullArg = true); -private: /** * @brief parse a function call and extract information about variable usage * @param tok first token @@ -76,13 +105,6 @@ class CPPCHECKLIB CheckNullPointer : public Check { */ static std::list parseFunctionCall(const Token &tok, const Library &library, bool checkNullArg = true); - /** @brief This constructor is used when running checks. */ - CheckNullPointer(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - - /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - /** @brief possible null pointer dereference */ void nullPointer(); @@ -92,29 +114,6 @@ class CPPCHECKLIB CheckNullPointer : public Check { void nullPointerError(const Token *tok); void nullPointerError(const Token *tok, const std::string &varname, const ValueFlow::Value* value, bool inconclusive); - /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; - - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; - - /** @brief Analyse all file infos for all TU */ - bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - - /** Get error messages. Used by --errorlist */ - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - /** Name of check */ - static std::string myName() { - return "Null pointer"; - } - - /** class info in WIKI format. Used by --doc */ - std::string classInfo() const override { - return "Null pointers\n" - "- null pointer dereferencing\n" - "- undefined null pointer arithmetic\n"; - } - /** * @brief Does one part of the check for nullPointer(). * Dereferencing a pointer and then checking if it's NULL.. diff --git a/lib/checkother.cpp b/lib/checkother.cpp index b454c4410cf..6edbef63c0e 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -80,7 +80,7 @@ static const CWE CWE783(783U); // Operator Precedence Logic Error // - http://www.cplusplus.com/reference/cstdio/getchar/ // - http://www.cplusplus.com/reference/cstdio/ungetc/ ... //---------------------------------------------------------------------------------- -void CheckOther::checkCastIntToCharAndBack() +void CheckOtherImpl::checkCastIntToCharAndBack() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -130,7 +130,7 @@ void CheckOther::checkCastIntToCharAndBack() } } -void CheckOther::checkCastIntToCharAndBackError(const Token *tok, const std::string &strFunctionName) +void CheckOtherImpl::checkCastIntToCharAndBackError(const Token *tok, const std::string &strFunctionName) { reportError( tok, @@ -150,7 +150,7 @@ void CheckOther::checkCastIntToCharAndBackError(const Token *tok, const std::str //--------------------------------------------------------------------------- // Clarify calculation precedence for ternary operators. //--------------------------------------------------------------------------- -void CheckOther::clarifyCalculation() +void CheckOtherImpl::clarifyCalculation() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("clarifyCalculation")) return; @@ -199,7 +199,7 @@ void CheckOther::clarifyCalculation() } } -void CheckOther::clarifyCalculationError(const Token *tok, const std::string &op) +void CheckOtherImpl::clarifyCalculationError(const Token *tok, const std::string &op) { // suspicious calculation const std::string calc("'a" + op + "b?c:d'"); @@ -221,7 +221,7 @@ void CheckOther::clarifyCalculationError(const Token *tok, const std::string &op //--------------------------------------------------------------------------- // Clarify (meaningless) statements like *foo++; with parentheses. //--------------------------------------------------------------------------- -void CheckOther::clarifyStatement() +void CheckOtherImpl::clarifyStatement() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -247,7 +247,7 @@ void CheckOther::clarifyStatement() } } -void CheckOther::clarifyStatementError(const Token *tok) +void CheckOtherImpl::clarifyStatementError(const Token *tok) { reportError(tok, Severity::warning, "clarifyStatement", "In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n" "A statement like '*A++;' might not do what you intended. Postfix 'operator++' is executed before 'operator*'. " @@ -257,7 +257,7 @@ void CheckOther::clarifyStatementError(const Token *tok) //--------------------------------------------------------------------------- // Check for suspicious occurrences of 'if(); {}'. //--------------------------------------------------------------------------- -void CheckOther::checkSuspiciousSemicolon() +void CheckOtherImpl::checkSuspiciousSemicolon() { if (!mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning)) return; @@ -281,7 +281,7 @@ void CheckOther::checkSuspiciousSemicolon() } } -void CheckOther::suspiciousSemicolonError(const Token* tok) +void CheckOtherImpl::suspiciousSemicolonError(const Token* tok) { reportError(tok, Severity::warning, "suspiciousSemicolon", "Suspicious use of ; at the end of '" + (tok ? tok->str() : std::string()) + "' statement.", CWE398, Certainty::normal); @@ -329,7 +329,7 @@ static bool isDangerousTypeConversion(const Token* const tok) //--------------------------------------------------------------------------- // For C++ code, warn if C-style casts are used on pointer types //--------------------------------------------------------------------------- -void CheckOther::warningOldStylePointerCast() +void CheckOtherImpl::warningOldStylePointerCast() { // Only valid on C++ code if (!mTokenizer->isCPP()) @@ -394,7 +394,7 @@ void CheckOther::warningOldStylePointerCast() } } -void CheckOther::cstyleCastError(const Token *tok, bool isPtr) +void CheckOtherImpl::cstyleCastError(const Token *tok, bool isPtr) { const std::string type = isPtr ? "pointer" : "reference"; reportError(tok, Severity::style, "cstyleCast", @@ -405,7 +405,7 @@ void CheckOther::cstyleCastError(const Token *tok, bool isPtr) "which kind of cast is expected.", CWE398, Certainty::normal); } -void CheckOther::warningDangerousTypeCast() +void CheckOtherImpl::warningDangerousTypeCast() { // Only valid on C++ code if (!mTokenizer->isCPP()) @@ -433,7 +433,7 @@ void CheckOther::warningDangerousTypeCast() } } -void CheckOther::dangerousTypeCastError(const Token *tok, bool isPtr) +void CheckOtherImpl::dangerousTypeCastError(const Token *tok, bool isPtr) { //const std::string type = isPtr ? "pointer" : "reference"; (void)isPtr; @@ -442,7 +442,7 @@ void CheckOther::dangerousTypeCastError(const Token *tok, bool isPtr) CWE398, Certainty::normal); } -void CheckOther::warningIntToPointerCast() +void CheckOtherImpl::warningIntToPointerCast() { if (!mSettings->severity.isEnabled(Severity::portability) && !mSettings->isPremiumEnabled("cstyleCast")) return; @@ -471,14 +471,14 @@ void CheckOther::warningIntToPointerCast() } } -void CheckOther::intToPointerCastError(const Token *tok, const std::string& format) +void CheckOtherImpl::intToPointerCastError(const Token *tok, const std::string& format) { reportError(tok, Severity::portability, "intToPointerCast", "Casting non-zero " + format + " integer literal to pointer.", CWE398, Certainty::normal); } -void CheckOther::suspiciousFloatingPointCast() +void CheckOtherImpl::suspiciousFloatingPointCast() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("suspiciousFloatingPointCast")) return; @@ -528,7 +528,7 @@ void CheckOther::suspiciousFloatingPointCast() } } -void CheckOther::suspiciousFloatingPointCastError(const Token* tok) +void CheckOtherImpl::suspiciousFloatingPointCastError(const Token* tok) { reportError(tok, Severity::style, "suspiciousFloatingPointCast", "Floating-point cast causes loss of precision.\n" @@ -539,7 +539,7 @@ void CheckOther::suspiciousFloatingPointCastError(const Token* tok) // float* f; double* d = (double*)f; <-- Pointer cast to a type with an incompatible binary data representation //--------------------------------------------------------------------------- -void CheckOther::invalidPointerCast() +void CheckOtherImpl::invalidPointerCast() { if (!mSettings->severity.isEnabled(Severity::portability)) return; @@ -579,7 +579,7 @@ void CheckOther::invalidPointerCast() } -void CheckOther::invalidPointerCastError(const Token* tok, const std::string& from, const std::string& to, bool inconclusive, bool toIsInt) +void CheckOtherImpl::invalidPointerCastError(const Token* tok, const std::string& from, const std::string& to, bool inconclusive, bool toIsInt) { if (toIsInt) { // If we cast something to int*, this can be useful to play with its binary data representation reportError(tok, Severity::portability, "invalidPointerCast", "Casting from " + from + " to " + to + " is not portable due to different binary data representations on different platforms.", CWE704, inconclusive ? Certainty::inconclusive : Certainty::normal); @@ -592,7 +592,7 @@ void CheckOther::invalidPointerCastError(const Token* tok, const std::string& fr // Detect redundant assignments: x = 0; x = 4; //--------------------------------------------------------------------------- -void CheckOther::checkRedundantAssignment() +void CheckOtherImpl::checkRedundantAssignment() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("redundantAssignment") && @@ -729,7 +729,7 @@ void CheckOther::checkRedundantAssignment() } } -void CheckOther::redundantCopyError(const Token *tok1, const Token* tok2, const std::string& var) +void CheckOtherImpl::redundantCopyError(const Token *tok1, const Token* tok2, const std::string& var) { const std::list callstack = { tok1, tok2 }; reportError(callstack, Severity::performance, "redundantCopy", @@ -737,7 +737,7 @@ void CheckOther::redundantCopyError(const Token *tok1, const Token* tok2, const "Buffer '$symbol' is being written before its old content has been used.", CWE563, Certainty::normal); } -void CheckOther::redundantAssignmentError(const Token *tok1, const Token* tok2, const std::string& var, bool inconclusive) +void CheckOtherImpl::redundantAssignmentError(const Token *tok1, const Token* tok2, const std::string& var, bool inconclusive) { ErrorPath errorPath = { ErrorPathItem(tok1, var + " is assigned"), ErrorPathItem(tok2, var + " is overwritten") }; if (inconclusive) @@ -751,7 +751,7 @@ void CheckOther::redundantAssignmentError(const Token *tok1, const Token* tok2, "Variable '$symbol' is reassigned a value before the old one has been used.", CWE563, Certainty::normal); } -void CheckOther::redundantInitializationError(const Token *tok1, const Token* tok2, const std::string& var, bool inconclusive) +void CheckOtherImpl::redundantInitializationError(const Token *tok1, const Token* tok2, const std::string& var, bool inconclusive) { ErrorPath errorPath = { ErrorPathItem(tok1, var + " is initialized"), ErrorPathItem(tok2, var + " is overwritten") }; reportError(std::move(errorPath), Severity::style, "redundantInitialization", @@ -760,7 +760,7 @@ void CheckOther::redundantInitializationError(const Token *tok1, const Token* to inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckOther::redundantAssignmentInSwitchError(const Token *tok1, const Token* tok2, const std::string &var) +void CheckOtherImpl::redundantAssignmentInSwitchError(const Token *tok1, const Token* tok2, const std::string &var) { ErrorPath errorPath = { ErrorPathItem(tok1, "$symbol is assigned"), ErrorPathItem(tok2, "$symbol is overwritten") }; reportError(std::move(errorPath), Severity::style, "redundantAssignInSwitch", @@ -768,7 +768,7 @@ void CheckOther::redundantAssignmentInSwitchError(const Token *tok1, const Token "Variable '$symbol' is reassigned a value before the old one has been used. 'break;' missing?", CWE563, Certainty::normal); } -void CheckOther::redundantAssignmentSameValueError(const Token *tok, const ValueFlow::Value* val, const std::string &var) +void CheckOtherImpl::redundantAssignmentSameValueError(const Token *tok, const ValueFlow::Value* val, const std::string &var) { auto errorPath = val->errorPath; errorPath.emplace_back(tok, ""); @@ -792,7 +792,7 @@ static inline bool isFunctionOrBreakPattern(const Token *tok) return Token::Match(tok, "%name% (") || Token::Match(tok, "break|continue|return|exit|goto|throw"); } -void CheckOther::redundantBitwiseOperationInSwitchError() +void CheckOtherImpl::redundantBitwiseOperationInSwitchError() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -909,7 +909,7 @@ void CheckOther::redundantBitwiseOperationInSwitchError() } } -void CheckOther::redundantBitwiseOperationInSwitchError(const Token *tok, const std::string &varname) +void CheckOtherImpl::redundantBitwiseOperationInSwitchError(const Token *tok, const std::string &varname) { reportError(tok, Severity::style, "redundantBitwiseOperationInSwitch", @@ -921,7 +921,7 @@ void CheckOther::redundantBitwiseOperationInSwitchError(const Token *tok, const //--------------------------------------------------------------------------- // Check for statements like case A||B: in switch() //--------------------------------------------------------------------------- -void CheckOther::checkSuspiciousCaseInSwitch() +void CheckOtherImpl::checkSuspiciousCaseInSwitch() { if (!mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning)) return; @@ -955,7 +955,7 @@ void CheckOther::checkSuspiciousCaseInSwitch() } } -void CheckOther::suspiciousCaseInSwitchError(const Token* tok, const std::string& operatorString) +void CheckOtherImpl::suspiciousCaseInSwitchError(const Token* tok, const std::string& operatorString) { reportError(tok, Severity::warning, "suspiciousCase", "Found suspicious case label in switch(). Operator '" + operatorString + "' probably doesn't work as intended.\n" @@ -1005,7 +1005,7 @@ static bool isVardeclInSwitch(const Token* tok) // Detect dead code, that follows such a statement. e.g.: // return(0); foo(); //--------------------------------------------------------------------------- -void CheckOther::checkUnreachableCode() +void CheckOtherImpl::checkUnreachableCode() { // misra-c-2012-2.1 // misra-c-2023-2.1 @@ -1125,7 +1125,7 @@ void CheckOther::checkUnreachableCode() } } -void CheckOther::duplicateBreakError(const Token *tok, bool inconclusive) +void CheckOtherImpl::duplicateBreakError(const Token *tok, bool inconclusive) { reportError(tok, Severity::style, "duplicateBreak", "Consecutive return, break, continue, goto or throw statements are unnecessary.\n" @@ -1133,7 +1133,7 @@ void CheckOther::duplicateBreakError(const Token *tok, bool inconclusive) "The second statement can never be executed, and so should be removed.", CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckOther::unreachableCodeError(const Token *tok, const Token* noreturn, bool inconclusive) +void CheckOtherImpl::unreachableCodeError(const Token *tok, const Token* noreturn, bool inconclusive) { std::string msg = "Statements following "; if (noreturn && (noreturn->function() || mSettings->library.isnoreturn(noreturn))) @@ -1147,7 +1147,7 @@ void CheckOther::unreachableCodeError(const Token *tok, const Token* noreturn, b msg, CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckOther::redundantContinueError(const Token *tok) +void CheckOtherImpl::redundantContinueError(const Token *tok) { reportError(tok, Severity::style, "redundantContinue", "'continue' is redundant since it is the last statement in a loop.", CWE561, Certainty::normal); @@ -1183,7 +1183,7 @@ static bool isSimpleExpr(const Token* tok, const Variable* var, const Settings& //--------------------------------------------------------------------------- // Check scope of variables.. //--------------------------------------------------------------------------- -void CheckOther::checkVariableScope() +void CheckOtherImpl::checkVariableScope() { if (mSettings->clang) return; @@ -1335,7 +1335,7 @@ static bool isOnlyUsedInCurrentScope(const Variable* var, const Token *tok, cons return !Token::findmatch(tok->scope()->bodyEnd, "%varid%", var->scope()->bodyEnd, var->declarationId()); } -bool CheckOther::checkInnerScope(const Token *tok, const Variable* var, bool& used) const +bool CheckOtherImpl::checkInnerScope(const Token *tok, const Variable* var, bool& used) const { const Scope* scope = tok->next()->scope(); bool loopVariable = scope->isLoopScope(); @@ -1446,7 +1446,7 @@ bool CheckOther::checkInnerScope(const Token *tok, const Variable* var, bool& us return true; } -void CheckOther::variableScopeError(const Token *tok, const std::string &varname) +void CheckOtherImpl::variableScopeError(const Token *tok, const std::string &varname) { reportError(tok, Severity::style, @@ -1473,7 +1473,7 @@ void CheckOther::variableScopeError(const Token *tok, const std::string &varname //--------------------------------------------------------------------------- // Comma in return statement: return a+1, b++;. (experimental) //--------------------------------------------------------------------------- -void CheckOther::checkCommaSeparatedReturn() +void CheckOtherImpl::checkCommaSeparatedReturn() { // TODO: This is experimental for now. See #5076 if ((true) || !mSettings->severity.isEnabled(Severity::style)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) @@ -1500,7 +1500,7 @@ void CheckOther::checkCommaSeparatedReturn() } } -void CheckOther::commaSeparatedReturnError(const Token *tok) +void CheckOtherImpl::commaSeparatedReturnError(const Token *tok) { reportError(tok, Severity::style, @@ -1538,7 +1538,7 @@ static bool isLargeContainer(const Variable* var, const Settings& settings) return arraySize > maxByValueSize; } -void CheckOther::checkPassByReference() +void CheckOtherImpl::checkPassByReference() { if (!mSettings->severity.isEnabled(Severity::performance) || mTokenizer->isC()) return; @@ -1617,7 +1617,7 @@ void CheckOther::checkPassByReference() } } -void CheckOther::passedByValueError(const Variable* var, bool inconclusive, bool isRangeBasedFor) +void CheckOtherImpl::passedByValueError(const Variable* var, bool inconclusive, bool isRangeBasedFor) { std::string id = isRangeBasedFor ? "iterateByValue" : "passedByValue"; const std::string action = isRangeBasedFor ? "declared as": "passed by"; @@ -1682,7 +1682,7 @@ static bool isCastToVoid(const Variable* var) return false; } -void CheckOther::checkConstVariable() +void CheckOtherImpl::checkConstVariable() { if ((!mSettings->severity.isEnabled(Severity::style) || mTokenizer->isC()) && !mSettings->isPremiumEnabled("constVariable")) return; @@ -1875,7 +1875,7 @@ static const Function* getEnclosingFunction(const Variable* var) return scope ? scope->function : nullptr; } -void CheckOther::checkConstPointer() +void CheckOtherImpl::checkConstPointer() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("constParameter") && @@ -2051,7 +2051,7 @@ void CheckOther::checkConstPointer() } } -void CheckOther::constVariableError(const Variable *var, const Function *function) +void CheckOtherImpl::constVariableError(const Variable *var, const Function *function) { if (!var) { reportError(nullptr, Severity::style, "constParameter", "Parameter 'x' can be declared with const"); @@ -2089,7 +2089,7 @@ void CheckOther::constVariableError(const Variable *var, const Function *functio // Check usage of char variables.. //--------------------------------------------------------------------------- -void CheckOther::checkCharVariable() +void CheckOtherImpl::checkCharVariable() { const bool warning = mSettings->severity.isEnabled(Severity::warning); const bool portability = mSettings->severity.isEnabled(Severity::portability); @@ -2140,7 +2140,7 @@ void CheckOther::checkCharVariable() } } -void CheckOther::signedCharArrayIndexError(const Token *tok) +void CheckOtherImpl::signedCharArrayIndexError(const Token *tok) { reportError(tok, Severity::warning, @@ -2151,7 +2151,7 @@ void CheckOther::signedCharArrayIndexError(const Token *tok) "because of sign extension.", CWE128, Certainty::normal); } -void CheckOther::unknownSignCharArrayIndexError(const Token *tok) +void CheckOtherImpl::unknownSignCharArrayIndexError(const Token *tok) { reportError(tok, Severity::portability, @@ -2161,7 +2161,7 @@ void CheckOther::unknownSignCharArrayIndexError(const Token *tok) "treated depending on whether 'char' is signed or unsigned on target platform.", CWE758, Certainty::normal); } -void CheckOther::charBitOpError(const Token *tok) +void CheckOtherImpl::charBitOpError(const Token *tok) { reportError(tok, Severity::warning, @@ -2348,7 +2348,7 @@ static bool isConstTop(const Token *tok) return false; } -void CheckOther::checkIncompleteStatement() +void CheckOtherImpl::checkIncompleteStatement() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("constStatement")) @@ -2410,7 +2410,7 @@ void CheckOther::checkIncompleteStatement() } } -void CheckOther::constStatementError(const Token *tok, const std::string &type, bool inconclusive) +void CheckOtherImpl::constStatementError(const Token *tok, const std::string &type, bool inconclusive) { const Token *valueTok = tok; while (valueTok && valueTok->isCast()) @@ -2465,7 +2465,7 @@ void CheckOther::constStatementError(const Token *tok, const std::string &type, //--------------------------------------------------------------------------- // Detect division by zero. //--------------------------------------------------------------------------- -void CheckOther::checkZeroDivision() +void CheckOtherImpl::checkZeroDivision() { logChecker("CheckOther::checkZeroDivision"); @@ -2486,7 +2486,7 @@ void CheckOther::checkZeroDivision() } } -void CheckOther::zerodivError(const Token *tok, const ValueFlow::Value *value) +void CheckOtherImpl::zerodivError(const Token *tok, const ValueFlow::Value *value) { if (!tok && !value) { reportError(tok, Severity::error, "zerodiv", "Division by zero.", CWE369, Certainty::normal); @@ -2515,7 +2515,7 @@ void CheckOther::zerodivError(const Token *tok, const ValueFlow::Value *value) // double d = 1.0 / 0.0 + 100.0; //--------------------------------------------------------------------------- -void CheckOther::checkNanInArithmeticExpression() +void CheckOtherImpl::checkNanInArithmeticExpression() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("nanInArithmeticExpression")) return; @@ -2530,7 +2530,7 @@ void CheckOther::checkNanInArithmeticExpression() } } -void CheckOther::nanInArithmeticExpressionError(const Token *tok) +void CheckOtherImpl::nanInArithmeticExpressionError(const Token *tok) { reportError(tok, Severity::style, "nanInArithmeticExpression", "Using NaN/Inf in a computation.\n" @@ -2541,7 +2541,7 @@ void CheckOther::nanInArithmeticExpressionError(const Token *tok) //--------------------------------------------------------------------------- // Creating instance of classes which are destroyed immediately //--------------------------------------------------------------------------- -void CheckOther::checkMisusedScopedObject() +void CheckOtherImpl::checkMisusedScopedObject() { // Skip this check for .c files if (mTokenizer->isC()) @@ -2616,7 +2616,7 @@ void CheckOther::checkMisusedScopedObject() } } -void CheckOther::misusedScopeObjectError(const Token *tok, const std::string& varname, bool isAssignment) +void CheckOtherImpl::misusedScopeObjectError(const Token *tok, const std::string& varname, bool isAssignment) { std::string msg = "Instance of '$symbol' object is destroyed immediately"; msg += isAssignment ? ", assignment has no effect." : "."; @@ -2641,7 +2641,7 @@ static const Token * getSingleExpressionInBlock(const Token * tok) // check for duplicate code in if and else branches // if (a) { b = true; } else { b = true; } //----------------------------------------------------------------------------- -void CheckOther::checkDuplicateBranch() +void CheckOtherImpl::checkDuplicateBranch() { // This is inconclusive since in practice most warnings are noise: // * There can be unfixed low-priority todos. The code is fine as it @@ -2720,7 +2720,7 @@ void CheckOther::checkDuplicateBranch() } } -void CheckOther::duplicateBranchError(const Token *tok1, const Token *tok2, ErrorPath errors) +void CheckOtherImpl::duplicateBranchError(const Token *tok1, const Token *tok2, ErrorPath errors) { errors.emplace_back(tok2, ""); errors.emplace_back(tok1, ""); @@ -2737,7 +2737,7 @@ void CheckOther::duplicateBranchError(const Token *tok1, const Token *tok2, Erro // char* p = malloc(100); // free(p + 10); //----------------------------------------------------------------------------- -void CheckOther::checkInvalidFree() +void CheckOtherImpl::checkInvalidFree() { std::map inconclusive; std::map allocation; @@ -2811,7 +2811,7 @@ void CheckOther::checkInvalidFree() } } -void CheckOther::invalidFreeError(const Token *tok, const std::string &allocation, bool inconclusive) +void CheckOtherImpl::invalidFreeError(const Token *tok, const std::string &allocation, bool inconclusive) { std::string alloc = allocation; if (alloc != "new") @@ -2870,7 +2870,7 @@ isStaticAssert(const Settings &settings, const Token *tok) return false; } -void CheckOther::checkDuplicateExpression() +void CheckOtherImpl::checkDuplicateExpression() { { const bool styleEnabled = mSettings->severity.isEnabled(Severity::style); @@ -3068,7 +3068,7 @@ void CheckOther::checkDuplicateExpression() } } -void CheckOther::oppositeExpressionError(const Token *opTok, ErrorPath errors) +void CheckOtherImpl::oppositeExpressionError(const Token *opTok, ErrorPath errors) { errors.emplace_back(opTok, ""); @@ -3080,7 +3080,7 @@ void CheckOther::oppositeExpressionError(const Token *opTok, ErrorPath errors) "determine if it is correct.", CWE398, Certainty::normal); } -void CheckOther::duplicateExpressionError(const Token *tok1, const Token *tok2, const Token *opTok, ErrorPath errors, bool hasMultipleExpr) +void CheckOtherImpl::duplicateExpressionError(const Token *tok1, const Token *tok2, const Token *opTok, ErrorPath errors, bool hasMultipleExpr) { errors.emplace_back(opTok, ""); @@ -3108,7 +3108,7 @@ void CheckOther::duplicateExpressionError(const Token *tok1, const Token *tok2, "determine if it is correct.", CWE398, Certainty::normal); } -void CheckOther::duplicateAssignExpressionError(const Token *tok1, const Token *tok2, bool inconclusive) +void CheckOtherImpl::duplicateAssignExpressionError(const Token *tok1, const Token *tok2, bool inconclusive) { const std::list toks = { tok2, tok1 }; @@ -3122,7 +3122,7 @@ void CheckOther::duplicateAssignExpressionError(const Token *tok1, const Token * "determine if it is correct.", CWE398, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckOther::duplicateExpressionTernaryError(const Token *tok, ErrorPath errors) +void CheckOtherImpl::duplicateExpressionTernaryError(const Token *tok, ErrorPath errors) { errors.emplace_back(tok, ""); reportError(std::move(errors), Severity::style, "duplicateExpressionTernary", "Same expression in both branches of ternary operator.\n" @@ -3130,14 +3130,14 @@ void CheckOther::duplicateExpressionTernaryError(const Token *tok, ErrorPath err "the same code is executed regardless of the condition.", CWE398, Certainty::normal); } -void CheckOther::duplicateValueTernaryError(const Token *tok) +void CheckOtherImpl::duplicateValueTernaryError(const Token *tok) { reportError(tok, Severity::style, "duplicateValueTernary", "Same value in both branches of ternary operator.\n" "Finding the same value in both branches of ternary operator is suspicious as " "the same code is executed regardless of the condition.", CWE398, Certainty::normal); } -void CheckOther::selfAssignmentError(const Token *tok, const std::string &varname) +void CheckOtherImpl::selfAssignmentError(const Token *tok, const std::string &varname) { reportError(tok, Severity::style, "selfAssignment", @@ -3154,7 +3154,7 @@ void CheckOther::selfAssignmentError(const Token *tok, const std::string &varnam // Reference: // - http://www.cplusplus.com/reference/cmath/ //----------------------------------------------------------------------------- -void CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalse() +void CheckOtherImpl::checkComparisonFunctionIsAlwaysTrueOrFalse() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -3184,7 +3184,7 @@ void CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalse() } } } -void CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalseError(const Token* tok, const std::string &functionName, const std::string &varName, const bool result) +void CheckOtherImpl::checkComparisonFunctionIsAlwaysTrueOrFalseError(const Token* tok, const std::string &functionName, const std::string &varName, const bool result) { const std::string strResult = bool_to_string(result); const CWE cweResult = result ? CWE571 : CWE570; @@ -3199,7 +3199,7 @@ void CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalseError(const Token* to //--------------------------------------------------------------------------- // Check testing sign of unsigned variables and pointers. //--------------------------------------------------------------------------- -void CheckOther::checkSignOfUnsignedVariable() +void CheckOtherImpl::checkSignOfUnsignedVariable() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unsignedLessThanZero")) return; @@ -3230,7 +3230,7 @@ void CheckOther::checkSignOfUnsignedVariable() } } -bool CheckOther::comparisonNonZeroExpressionLessThanZero(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr, bool suppress) +bool CheckOtherImpl::comparisonNonZeroExpressionLessThanZero(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr, bool suppress) { if (!tok->isComparisonOp() || !tok->astOperand1() || !tok->astOperand2()) return false; @@ -3256,7 +3256,7 @@ bool CheckOther::comparisonNonZeroExpressionLessThanZero(const Token *tok, const return vt && (vt->pointer || vt->sign == ValueType::UNSIGNED); } -bool CheckOther::testIfNonZeroExpressionIsPositive(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr) +bool CheckOtherImpl::testIfNonZeroExpressionIsPositive(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr) { if (!tok->isComparisonOp() || !tok->astOperand1() || !tok->astOperand2()) return false; @@ -3278,7 +3278,7 @@ bool CheckOther::testIfNonZeroExpressionIsPositive(const Token *tok, const Value return vt && (vt->pointer || vt->sign == ValueType::UNSIGNED); } -void CheckOther::unsignedLessThanZeroError(const Token *tok, const ValueFlow::Value * v, const std::string &varname) +void CheckOtherImpl::unsignedLessThanZeroError(const Token *tok, const ValueFlow::Value * v, const std::string &varname) { reportError(getErrorPath(tok, v, "Unsigned less than zero"), Severity::style, "unsignedLessThanZero", "$symbol:" + varname + "\n" @@ -3287,20 +3287,20 @@ void CheckOther::unsignedLessThanZeroError(const Token *tok, const ValueFlow::Va "is either pointless or an error to check if it is.", CWE570, Certainty::normal); } -void CheckOther::pointerLessThanZeroError(const Token *tok, const ValueFlow::Value *v) +void CheckOtherImpl::pointerLessThanZeroError(const Token *tok, const ValueFlow::Value *v) { reportError(getErrorPath(tok, v, "Pointer less than zero"), Severity::style, "pointerLessThanZero", "A pointer can not be negative so it is either pointless or an error to check if it is.", CWE570, Certainty::normal); } -void CheckOther::unsignedPositiveError(const Token *tok, const ValueFlow::Value * v, const std::string &varname) +void CheckOtherImpl::unsignedPositiveError(const Token *tok, const ValueFlow::Value * v, const std::string &varname) { reportError(getErrorPath(tok, v, "Unsigned positive"), Severity::style, "unsignedPositive", "$symbol:" + varname + "\n" "Unsigned expression '$symbol' can't be negative so it is unnecessary to test it.", CWE570, Certainty::normal); } -void CheckOther::pointerPositiveError(const Token *tok, const ValueFlow::Value * v) +void CheckOtherImpl::pointerPositiveError(const Token *tok, const ValueFlow::Value * v) { reportError(getErrorPath(tok, v, "Pointer positive"), Severity::style, "pointerPositive", "A pointer can not be negative so it is either pointless or an error to check if it is not.", CWE570, Certainty::normal); @@ -3383,7 +3383,7 @@ static bool checkVariableAssignment(const Token* tok, const ValueType* vtLhs, co return scope && scope->function && (!scope->functionOf || scope->function->isConst() || scope->function->isStatic()); } -void CheckOther::checkRedundantCopy() +void CheckOtherImpl::checkRedundantCopy() { if (!mSettings->severity.isEnabled(Severity::performance) || mTokenizer->isC() || !mSettings->certainty.isEnabled(Certainty::inconclusive)) return; @@ -3421,7 +3421,7 @@ void CheckOther::checkRedundantCopy() } } -void CheckOther::redundantCopyError(const Token *tok,const std::string& varname) +void CheckOtherImpl::redundantCopyError(const Token *tok,const std::string& varname) { reportError(tok, Severity::performance, "redundantCopyLocalConst", "$symbol:" + varname + "\n" @@ -3441,7 +3441,7 @@ static bool isNegative(const Token *tok, const Settings &settings) return tok->valueType() && tok->valueType()->sign == ValueType::SIGNED && tok->getValueLE(-1LL, settings); } -void CheckOther::checkNegativeBitwiseShift() +void CheckOtherImpl::checkNegativeBitwiseShift() { const bool portability = mSettings->severity.isEnabled(Severity::portability); @@ -3483,7 +3483,7 @@ void CheckOther::checkNegativeBitwiseShift() } -void CheckOther::negativeBitwiseShiftError(const Token *tok, int op) +void CheckOtherImpl::negativeBitwiseShiftError(const Token *tok, int op) { if (op == 1) // LHS - this is used by intention in various software, if it @@ -3497,7 +3497,7 @@ void CheckOther::negativeBitwiseShiftError(const Token *tok, int op) //--------------------------------------------------------------------------- // Check for incompletely filled buffers. //--------------------------------------------------------------------------- -void CheckOther::checkIncompleteArrayFill() +void CheckOtherImpl::checkIncompleteArrayFill() { if (!mSettings->certainty.isEnabled(Certainty::inconclusive)) return; @@ -3546,7 +3546,7 @@ void CheckOther::checkIncompleteArrayFill() } } -void CheckOther::incompleteArrayFillError(const Token* tok, const std::string& buffer, const std::string& function, bool boolean) +void CheckOtherImpl::incompleteArrayFillError(const Token* tok, const std::string& buffer, const std::string& function, bool boolean) { if (boolean) reportError(tok, Severity::portability, "incompleteArrayFill", @@ -3566,7 +3566,7 @@ void CheckOther::incompleteArrayFillError(const Token* tok, const std::string& b // Detect NULL being passed to variadic function. //--------------------------------------------------------------------------- -void CheckOther::checkVarFuncNullUB() +void CheckOtherImpl::checkVarFuncNullUB() { if (!mSettings->severity.isEnabled(Severity::portability)) return; @@ -3604,7 +3604,7 @@ void CheckOther::checkVarFuncNullUB() } } -void CheckOther::varFuncNullUBError(const Token *tok) +void CheckOtherImpl::varFuncNullUBError(const Token *tok) { reportError(tok, Severity::portability, @@ -3651,7 +3651,7 @@ void CheckOther::varFuncNullUBError(const Token *tok) "}", CWE475, Certainty::normal); } -void CheckOther::checkRedundantPointerOp() +void CheckOtherImpl::checkRedundantPointerOp() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("redundantPointerOp")) return; @@ -3690,14 +3690,14 @@ void CheckOther::checkRedundantPointerOp() } } -void CheckOther::redundantPointerOpError(const Token* tok, const std::string &varname, bool inconclusive, bool addressOfDeref) +void CheckOtherImpl::redundantPointerOpError(const Token* tok, const std::string &varname, bool inconclusive, bool addressOfDeref) { std::string msg = "$symbol:" + varname + "\nRedundant pointer operation on '$symbol' - it's already a "; msg += addressOfDeref ? "pointer." : "variable."; reportError(tok, Severity::style, "redundantPointerOp", msg, CWE398, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckOther::checkInterlockedDecrement() +void CheckOtherImpl::checkInterlockedDecrement() { if (!mSettings->platform.isWindows()) { return; @@ -3737,13 +3737,13 @@ void CheckOther::checkInterlockedDecrement() } } -void CheckOther::raceAfterInterlockedDecrementError(const Token* tok) +void CheckOtherImpl::raceAfterInterlockedDecrementError(const Token* tok) { reportError(tok, Severity::error, "raceAfterInterlockedDecrement", "Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.", CWE362, Certainty::normal); } -void CheckOther::checkUnusedLabel() +void CheckOtherImpl::checkUnusedLabel() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("unusedLabel")) return; @@ -3766,7 +3766,7 @@ void CheckOther::checkUnusedLabel() } } -void CheckOther::unusedLabelError(const Token* tok, bool inSwitch, bool hasIfdef) +void CheckOtherImpl::unusedLabelError(const Token* tok, bool inSwitch, bool hasIfdef) { if (tok && !mSettings->severity.isEnabled(inSwitch ? Severity::warning : Severity::style) && !mSettings->isPremiumEnabled("unusedLabel")) return; @@ -3860,7 +3860,7 @@ static bool checkEvaluationOrderCpp17(const Token * tok, const Token * tok2, con return foundUndefined || foundUnspecified; } -void CheckOther::checkEvaluationOrder() +void CheckOtherImpl::checkEvaluationOrder() { logChecker("CheckOther::checkEvaluationOrder"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -3922,7 +3922,7 @@ void CheckOther::checkEvaluationOrder() } } -void CheckOther::unknownEvaluationOrder(const Token* tok, bool isUnspecifiedBehavior) +void CheckOtherImpl::unknownEvaluationOrder(const Token* tok, bool isUnspecifiedBehavior) { isUnspecifiedBehavior ? reportError(tok, Severity::portability, "unknownEvaluationOrder", @@ -3931,7 +3931,7 @@ void CheckOther::unknownEvaluationOrder(const Token* tok, bool isUnspecifiedBeha "Expression '" + (tok ? tok->expressionString() : std::string("x = x++;")) + "' depends on order of evaluation of side effects", CWE768, Certainty::normal); } -void CheckOther::checkAccessOfMovedVariable() +void CheckOtherImpl::checkAccessOfMovedVariable() { if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11) return; @@ -3978,7 +3978,7 @@ void CheckOther::checkAccessOfMovedVariable() } } -void CheckOther::accessMovedError(const Token *tok, const std::string &varname, const ValueFlow::Value *value, bool inconclusive) +void CheckOtherImpl::accessMovedError(const Token *tok, const std::string &varname, const ValueFlow::Value *value, bool inconclusive) { if (!tok) { reportError(tok, Severity::warning, "accessMoved", "Access of moved variable 'v'.", CWE672, Certainty::normal); @@ -4007,7 +4007,7 @@ void CheckOther::accessMovedError(const Token *tok, const std::string &varname, -void CheckOther::checkFuncArgNamesDifferent() +void CheckOtherImpl::checkFuncArgNamesDifferent() { const bool style = mSettings->severity.isEnabled(Severity::style); const bool inconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); @@ -4090,8 +4090,8 @@ void CheckOther::checkFuncArgNamesDifferent() } } -void CheckOther::funcArgNamesDifferent(const std::string & functionName, nonneg int index, - const Token* declaration, const Token* definition) +void CheckOtherImpl::funcArgNamesDifferent(const std::string & functionName, nonneg int index, + const Token* declaration, const Token* definition) { std::list tokens = { declaration,definition }; const std::string id = (declaration != nullptr) == (definition != nullptr) ? "funcArgNamesDifferent" : "funcArgNamesDifferentUnnamed"; @@ -4102,10 +4102,10 @@ void CheckOther::funcArgNamesDifferent(const std::string & functionName, nonneg (definition ? definition->str() : "") + "'.", CWE628, Certainty::inconclusive); } -void CheckOther::funcArgOrderDifferent(const std::string & functionName, - const Token* declaration, const Token* definition, - const std::vector & declarations, - const std::vector & definitions) +void CheckOtherImpl::funcArgOrderDifferent(const std::string & functionName, + const Token* declaration, const Token* definition, + const std::vector & declarations, + const std::vector & definitions) { std::list tokens = { !declarations.empty() ? declarations[0] ? declarations[0] : declaration : nullptr, @@ -4153,7 +4153,7 @@ static const Token *findShadowed(const Scope *scope, const Variable& var, int li return shadowed; } -void CheckOther::checkShadowVariables() +void CheckOtherImpl::checkShadowVariables() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("shadowVariable")) return; @@ -4213,8 +4213,8 @@ void CheckOther::checkShadowVariables() } } -void CheckOther::shadowError(const Token *shadows, const std::string &shadowsType, - const Token *shadowed, const std::string &shadowedType) +void CheckOtherImpl::shadowError(const Token *shadows, const std::string &shadowsType, + const Token *shadowed, const std::string &shadowedType) { ErrorPath errorPath; errorPath.emplace_back(shadowed, "Shadowed " + shadowedType); @@ -4254,7 +4254,7 @@ static bool isVariableExprHidden(const Token* tok) return false; } -void CheckOther::checkKnownArgument() +void CheckOtherImpl::checkKnownArgument() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("knownArgument")) return; @@ -4323,7 +4323,7 @@ void CheckOther::checkKnownArgument() } } -void CheckOther::knownArgumentError(const Token *tok, const Token *ftok, const ValueFlow::Value *value, const std::string &varexpr, bool isVariableExpressionHidden) +void CheckOtherImpl::knownArgumentError(const Token *tok, const Token *ftok, const ValueFlow::Value *value, const std::string &varexpr, bool isVariableExpressionHidden) { if (!tok) { reportError(tok, Severity::style, "knownArgument", "Argument 'x-x' to function 'func' is always 0. It does not matter what value 'x' has."); @@ -4355,7 +4355,7 @@ void CheckOther::knownArgumentError(const Token *tok, const Token *ftok, const V reportError(std::move(errorPath), Severity::style, id, errmsg, CWE570, Certainty::normal); } -void CheckOther::checkKnownPointerToBool() +void CheckOtherImpl::checkKnownPointerToBool() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("knownPointerToBool")) return; @@ -4385,7 +4385,7 @@ void CheckOther::checkKnownPointerToBool() } } -void CheckOther::knownPointerToBoolError(const Token* tok, const ValueFlow::Value* value) +void CheckOtherImpl::knownPointerToBoolError(const Token* tok, const ValueFlow::Value* value) { if (!tok) { reportError(tok, Severity::style, "knownPointerToBool", "Pointer expression 'p' converted to bool is always true."); @@ -4398,7 +4398,7 @@ void CheckOther::knownPointerToBoolError(const Token* tok, const ValueFlow::Valu reportError(std::move(errorPath), Severity::style, "knownPointerToBool", errmsg, CWE570, Certainty::normal); } -void CheckOther::checkComparePointers() +void CheckOtherImpl::checkComparePointers() { logChecker("CheckOther::checkComparePointers"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -4439,7 +4439,7 @@ void CheckOther::checkComparePointers() } } -void CheckOther::comparePointersError(const Token *tok, const ValueFlow::Value *v1, const ValueFlow::Value *v2) +void CheckOtherImpl::comparePointersError(const Token *tok, const ValueFlow::Value *v1, const ValueFlow::Value *v2) { ErrorPath errorPath; std::string verb = "Comparing"; @@ -4459,7 +4459,7 @@ void CheckOther::comparePointersError(const Token *tok, const ValueFlow::Value * std::move(errorPath), Severity::error, id, verb + " pointers that point to different objects", CWE758, Certainty::normal); } -void CheckOther::checkModuloOfOne() +void CheckOtherImpl::checkModuloOfOne() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("moduloofone")) return; @@ -4481,7 +4481,7 @@ void CheckOther::checkModuloOfOne() } } -void CheckOther::checkModuloOfOneError(const Token *tok) +void CheckOtherImpl::checkModuloOfOneError(const Token *tok) { reportError(tok, Severity::style, "moduloofone", "Modulo of one is always equal to zero"); } @@ -4569,7 +4569,7 @@ static bool isZeroInitializer(const Token *tok) } -void CheckOther::checkUnionZeroInit() +void CheckOtherImpl::checkUnionZeroInit() { if (!mSettings->severity.isEnabled(Severity::portability)) return; @@ -4607,8 +4607,8 @@ void CheckOther::checkUnionZeroInit() } } -void CheckOther::unionZeroInitError(const Token *tok, - const UnionMember& largestMember) +void CheckOtherImpl::unionZeroInitError(const Token *tok, + const UnionMember& largestMember) { reportError(tok, Severity::portability, "UnionZeroInit", (tok != nullptr ? "$symbol:" + tok->str() + "\n" : "") + @@ -4679,7 +4679,7 @@ static bool getBufAndOffset(const Token *expr, const Token *&buf, MathLib::bigin return true; } -void CheckOther::checkOverlappingWrite() +void CheckOtherImpl::checkOverlappingWrite() { logChecker("CheckOther::checkOverlappingWrite"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -4777,19 +4777,19 @@ void CheckOther::checkOverlappingWrite() } } -void CheckOther::overlappingWriteUnion(const Token *tok) +void CheckOtherImpl::overlappingWriteUnion(const Token *tok) { reportError(tok, Severity::error, "overlappingWriteUnion", "Overlapping read/write of union is undefined behavior"); } -void CheckOther::overlappingWriteFunction(const Token *tok, const std::string& funcname) +void CheckOtherImpl::overlappingWriteFunction(const Token *tok, const std::string& funcname) { reportError(tok, Severity::error, "overlappingWriteFunction", "Overlapping read/write in " + funcname + "() is undefined behavior"); } void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckOther checkOther(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckOtherImpl checkOther(&tokenizer, &tokenizer.getSettings(), errorLogger); // Checks checkOther.warningOldStylePointerCast(); @@ -4841,7 +4841,7 @@ void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) void CheckOther::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckOther c(nullptr, settings, errorLogger); + CheckOtherImpl c(nullptr, settings, errorLogger); // error c.zerodivError(nullptr, nullptr); diff --git a/lib/checkother.h b/lib/checkother.h index f779141f499..6f6460bdfde 100644 --- a/lib/checkother.h +++ b/lib/checkother.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include "errortypes.h" @@ -55,22 +56,85 @@ class CPPCHECKLIB CheckOther : public Check { public: /** @brief This constructor is used when registering the CheckClass */ - CheckOther() : Check(myName()) {} + CheckOther() : Check("Other") {} - /** Is expression a comparison that checks if a nonzero (unsigned/pointer) expression is less than zero? */ - static bool comparisonNonZeroExpressionLessThanZero(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr, bool suppress = false); +private: + /** @brief Run checks against the normal token list */ + void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - /** Is expression a comparison that checks if a nonzero (unsigned/pointer) expression is positive? */ - static bool testIfNonZeroExpressionIsPositive(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr); + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; -private: + std::string classInfo() const override { + return "Other checks\n" + + // error + "- division with zero\n" + "- scoped object destroyed immediately after construction\n" + "- assignment in an assert statement\n" + "- free() or delete of an invalid memory location\n" + "- bitwise operation with negative right operand\n" + "- cast the return values of getc(),fgetc() and getchar() to character and compare it to EOF\n" + "- race condition with non-interlocked access after InterlockedDecrement() call\n" + "- expression 'x = x++;' depends on order of evaluation of side effects\n" + "- overlapping write of union\n" + + // warning + "- either division by zero or useless condition\n" + "- access of moved or forwarded variable.\n" + + // performance + "- redundant data copying for const variable\n" + "- subsequent assignment or copying to a variable or buffer\n" + "- passing parameter by value\n" + + // portability + "- Passing NULL pointer to function with variable number of arguments leads to UB.\n" + + // style + "- C-style pointer cast in C++ code\n" + "- casting between incompatible pointer types\n" + "- [Incomplete statement](IncompleteStatement)\n" + "- [check how signed char variables are used](CharVar)\n" + "- variable scope can be limited\n" + "- unusual pointer arithmetic. For example: \"abc\" + 'd'\n" + "- redundant assignment, increment, or bitwise operation in a switch statement\n" + "- redundant strcpy in a switch statement\n" + "- Suspicious case labels in switch()\n" + "- assignment of a variable to itself\n" + "- Comparison of values leading always to true or false\n" + "- Clarify calculation with parentheses\n" + "- suspicious comparison of '\\0' with a char\\* variable\n" + "- duplicate break statement\n" + "- unreachable code\n" + "- testing if unsigned variable is negative/positive\n" + "- Suspicious use of ; at the end of 'if/for/while' statement.\n" + "- Array filled incompletely using memset/memcpy/memmove.\n" + "- NaN (not a number) value used in arithmetic expression.\n" + "- comma in return statement (the comma can easily be misread as a semicolon).\n" + "- prefer erfc, expm1 or log1p to avoid loss of precision.\n" + "- identical code in both branches of if/else or ternary operator.\n" + "- redundant pointer operation on pointer like &\\*some_ptr.\n" + "- find unused 'goto' labels.\n" + "- function declaration and definition argument names different.\n" + "- function declaration and definition argument order different.\n" + "- shadow variable.\n" + "- variable can be declared const.\n" + "- calculating modulo of one.\n" + "- known function argument, suspicious calculation.\n"; + } +}; + +class CPPCHECKLIB CheckOtherImpl : public CheckImpl { +public: /** @brief This constructor is used when running checks. */ - CheckOther(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} + CheckOtherImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** Is expression a comparison that checks if a nonzero (unsigned/pointer) expression is less than zero? */ + static bool comparisonNonZeroExpressionLessThanZero(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr, bool suppress = false); - /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + /** Is expression a comparison that checks if a nonzero (unsigned/pointer) expression is positive? */ + static bool testIfNonZeroExpressionIsPositive(const Token *tok, const ValueFlow::Value *&zeroValue, const Token *&nonZeroExpr); /** @brief Clarify calculation for ".. a * b ? .." */ void clarifyCalculation(); @@ -265,74 +329,6 @@ class CPPCHECKLIB CheckOther : public Check { void checkModuloOfOneError(const Token *tok); void unionZeroInitError(const Token *tok, const UnionMember& largestMember); - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Other"; - } - - std::string classInfo() const override { - return "Other checks\n" - - // error - "- division with zero\n" - "- scoped object destroyed immediately after construction\n" - "- assignment in an assert statement\n" - "- free() or delete of an invalid memory location\n" - "- bitwise operation with negative right operand\n" - "- cast the return values of getc(),fgetc() and getchar() to character and compare it to EOF\n" - "- race condition with non-interlocked access after InterlockedDecrement() call\n" - "- expression 'x = x++;' depends on order of evaluation of side effects\n" - "- overlapping write of union\n" - - // warning - "- either division by zero or useless condition\n" - "- access of moved or forwarded variable.\n" - "- potentially dangerous C style type cast of pointer/reference to object.\n" - - // performance - "- redundant data copying for const variable\n" - "- subsequent assignment or copying to a variable or buffer\n" - "- passing parameter by value\n" - - // portability - "- Passing NULL pointer to function with variable number of arguments leads to UB.\n" - "- Casting non-zero integer literal in decimal or octal format to pointer.\n" - "- Incorrect zero initialization of unions can lead to access of uninitialized memory.\n" - - // style - "- C-style pointer cast in C++ code\n" - "- casting between incompatible pointer types\n" - "- [Incomplete statement](IncompleteStatement)\n" - "- [check how signed char variables are used](CharVar)\n" - "- variable scope can be limited\n" - "- unusual pointer arithmetic. For example: \"abc\" + 'd'\n" - "- redundant assignment, increment, or bitwise operation in a switch statement\n" - "- redundant strcpy in a switch statement\n" - "- Suspicious case labels in switch()\n" - "- assignment of a variable to itself\n" - "- Comparison of values leading always to true or false\n" - "- Clarify calculation with parentheses\n" - "- suspicious comparison of '\\0' with a char\\* variable\n" - "- duplicate break statement\n" - "- unreachable code\n" - "- testing if unsigned variable is negative/positive\n" - "- Suspicious use of ; at the end of 'if/for/while' statement.\n" - "- Array filled incompletely using memset/memcpy/memmove.\n" - "- NaN (not a number) value used in arithmetic expression.\n" - "- comma in return statement (the comma can easily be misread as a semicolon).\n" - "- prefer erfc, expm1 or log1p to avoid loss of precision.\n" - "- identical code in both branches of if/else or ternary operator.\n" - "- redundant pointer operation on pointer like &\\*some_ptr.\n" - "- find unused 'goto' labels.\n" - "- function declaration and definition argument names different.\n" - "- function declaration and definition argument order different.\n" - "- shadow variable.\n" - "- variable can be declared const.\n" - "- calculating modulo of one.\n" - "- known function argument, suspicious calculation.\n"; - } - bool diag(const Token* tok) { return !mRedundantAssignmentDiag.emplace(tok).second; } diff --git a/lib/checkpostfixoperator.cpp b/lib/checkpostfixoperator.cpp index d771177b2d2..0b02313b672 100644 --- a/lib/checkpostfixoperator.cpp +++ b/lib/checkpostfixoperator.cpp @@ -37,8 +37,7 @@ // CWE ids used static const CWE CWE398(398U); // Indicator of Poor Code Quality - -void CheckPostfixOperator::postfixOperator() +void CheckPostfixOperatorImpl::postfixOperator() { if (!mSettings->severity.isEnabled(Severity::performance)) return; @@ -84,7 +83,7 @@ void CheckPostfixOperator::postfixOperator() //--------------------------------------------------------------------------- -void CheckPostfixOperator::postfixOperatorError(const Token *tok) +void CheckPostfixOperatorImpl::postfixOperatorError(const Token *tok) { reportError(tok, Severity::performance, "postfixOperator", "Prefer prefix ++/-- operators for non-primitive types.\n" @@ -100,12 +99,12 @@ void CheckPostfixOperator::runChecks(const Tokenizer &tokenizer, ErrorLogger *er if (tokenizer.isC()) return; - CheckPostfixOperator checkPostfixOperator(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, &tokenizer.getSettings(), errorLogger); checkPostfixOperator.postfixOperator(); } void CheckPostfixOperator::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckPostfixOperator c(nullptr, settings, errorLogger); + CheckPostfixOperatorImpl c(nullptr, settings, errorLogger); c.postfixOperatorError(nullptr); } diff --git a/lib/checkpostfixoperator.h b/lib/checkpostfixoperator.h index c9f58a7e143..03ab54eed11 100644 --- a/lib/checkpostfixoperator.h +++ b/lib/checkpostfixoperator.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -44,30 +45,28 @@ class CPPCHECKLIB CheckPostfixOperator : public Check { public: /** This constructor is used when registering the CheckPostfixOperator */ - CheckPostfixOperator() : Check(myName()) {} + CheckPostfixOperator() : Check("Using postfix operators") {} private: - /** This constructor is used when running checks. */ - CheckPostfixOperator(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + std::string classInfo() const override { + return "Warn if using postfix operators ++ or -- rather than prefix operator\n"; + } +}; + +class CPPCHECKLIB CheckPostfixOperatorImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckPostfixOperatorImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** Check postfix operators */ void postfixOperator(); /** Report Error */ void postfixOperatorError(const Token *tok); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Using postfix operators"; - } - - std::string classInfo() const override { - return "Warn if using postfix operators ++ or -- rather than prefix operator\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index e211764ad3a..ab398dda570 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -39,7 +39,7 @@ static const CWE CWE467(467U); // Use of sizeof() on a Pointer Type static const CWE CWE682(682U); // Incorrect Calculation //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- -void CheckSizeof::checkSizeofForNumericParameter() +void CheckSizeofImpl::checkSizeofForNumericParameter() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -57,7 +57,7 @@ void CheckSizeof::checkSizeofForNumericParameter() } } -void CheckSizeof::sizeofForNumericParameterError(const Token *tok) +void CheckSizeofImpl::sizeofForNumericParameterError(const Token *tok) { reportError(tok, Severity::warning, "sizeofwithnumericparameter", "Suspicious usage of 'sizeof' with a numeric constant as parameter.\n" @@ -69,7 +69,7 @@ void CheckSizeof::sizeofForNumericParameterError(const Token *tok) //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- -void CheckSizeof::checkSizeofForArrayParameter() +void CheckSizeofImpl::checkSizeofForArrayParameter() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -94,7 +94,7 @@ void CheckSizeof::checkSizeofForArrayParameter() } } -void CheckSizeof::sizeofForArrayParameterError(const Token *tok) +void CheckSizeofImpl::sizeofForArrayParameterError(const Token *tok) { reportError(tok, Severity::warning, "sizeofwithsilentarraypointer", "Using 'sizeof' on array given as function argument " @@ -110,7 +110,7 @@ void CheckSizeof::sizeofForArrayParameterError(const Token *tok) ); } -void CheckSizeof::checkSizeofForPointerSize() +void CheckSizeofImpl::checkSizeofForPointerSize() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -263,7 +263,7 @@ void CheckSizeof::checkSizeofForPointerSize() } } -void CheckSizeof::sizeofForPointerError(const Token *tok, const std::string &varname) +void CheckSizeofImpl::sizeofForPointerError(const Token *tok, const std::string &varname) { reportError(tok, Severity::warning, "pointerSize", "Size of pointer '" + varname + "' used instead of size of its data.\n" @@ -272,7 +272,7 @@ void CheckSizeof::sizeofForPointerError(const Token *tok, const std::string &var "write 'sizeof(*" + varname + ")'.", CWE467, Certainty::normal); } -void CheckSizeof::divideBySizeofError(const Token *tok, const std::string &memfunc) +void CheckSizeofImpl::divideBySizeofError(const Token *tok, const std::string &memfunc) { reportError(tok, Severity::warning, "sizeofDivisionMemfunc", "Division by result of sizeof(). " + memfunc + "() expects a size in bytes, did you intend to multiply instead?", CWE682, Certainty::normal); @@ -280,7 +280,7 @@ void CheckSizeof::divideBySizeofError(const Token *tok, const std::string &memfu //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -void CheckSizeof::sizeofsizeof() +void CheckSizeofImpl::sizeofsizeof() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -295,7 +295,7 @@ void CheckSizeof::sizeofsizeof() } } -void CheckSizeof::sizeofsizeofError(const Token *tok) +void CheckSizeofImpl::sizeofsizeofError(const Token *tok) { reportError(tok, Severity::warning, "sizeofsizeof", "Calling 'sizeof' on 'sizeof'.\n" @@ -306,7 +306,7 @@ void CheckSizeof::sizeofsizeofError(const Token *tok) //----------------------------------------------------------------------------- -void CheckSizeof::sizeofCalculation() +void CheckSizeofImpl::sizeofCalculation() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -344,7 +344,7 @@ void CheckSizeof::sizeofCalculation() } } -void CheckSizeof::sizeofCalculationError(const Token *tok, bool inconclusive) +void CheckSizeofImpl::sizeofCalculationError(const Token *tok, bool inconclusive) { reportError(tok, Severity::warning, "sizeofCalculation", "Found calculation inside sizeof().", CWE682, inconclusive ? Certainty::inconclusive : Certainty::normal); @@ -352,7 +352,7 @@ void CheckSizeof::sizeofCalculationError(const Token *tok, bool inconclusive) //----------------------------------------------------------------------------- -void CheckSizeof::sizeofFunction() +void CheckSizeofImpl::sizeofFunction() { if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("sizeofFunctionCall")) return; @@ -386,7 +386,7 @@ void CheckSizeof::sizeofFunction() } } -void CheckSizeof::sizeofFunctionError(const Token *tok) +void CheckSizeofImpl::sizeofFunctionError(const Token *tok) { reportError(tok, Severity::warning, "sizeofFunctionCall", "Found function call inside sizeof().", CWE682, Certainty::normal); @@ -395,7 +395,7 @@ void CheckSizeof::sizeofFunctionError(const Token *tok) //----------------------------------------------------------------------------- // Check for code like sizeof()*sizeof() or sizeof(ptr)/value //----------------------------------------------------------------------------- -void CheckSizeof::suspiciousSizeofCalculation() +void CheckSizeofImpl::suspiciousSizeofCalculation() { if (!mSettings->severity.isEnabled(Severity::warning) || !mSettings->certainty.isEnabled(Certainty::inconclusive)) return; @@ -425,13 +425,13 @@ void CheckSizeof::suspiciousSizeofCalculation() } } -void CheckSizeof::multiplySizeofError(const Token *tok) +void CheckSizeofImpl::multiplySizeofError(const Token *tok) { reportError(tok, Severity::warning, "multiplySizeof", "Multiplying sizeof() with sizeof() indicates a logic error.", CWE682, Certainty::inconclusive); } -void CheckSizeof::divideSizeofError(const Token *tok) +void CheckSizeofImpl::divideSizeofError(const Token *tok) { reportError(tok, Severity::warning, "divideSizeof", "Division of result of sizeof() on pointer type.\n" @@ -439,7 +439,7 @@ void CheckSizeof::divideSizeofError(const Token *tok) "not the size of the memory area it points to.", CWE682, Certainty::inconclusive); } -void CheckSizeof::sizeofVoid() +void CheckSizeofImpl::sizeofVoid() { if (!mSettings->severity.isEnabled(Severity::portability)) return; @@ -477,21 +477,21 @@ void CheckSizeof::sizeofVoid() } } -void CheckSizeof::sizeofVoidError(const Token *tok) +void CheckSizeofImpl::sizeofVoidError(const Token *tok) { const std::string message = "Behaviour of 'sizeof(void)' is not covered by the ISO C standard."; const std::string verbose = message + " A value for 'sizeof(void)' is defined only as part of a GNU C extension, which defines 'sizeof(void)' to be 1."; reportError(tok, Severity::portability, "sizeofVoid", message + "\n" + verbose, CWE682, Certainty::normal); } -void CheckSizeof::sizeofDereferencedVoidPointerError(const Token *tok, const std::string &varname) +void CheckSizeofImpl::sizeofDereferencedVoidPointerError(const Token *tok, const std::string &varname) { const std::string message = "'*" + varname + "' is of type 'void', the behaviour of 'sizeof(void)' is not covered by the ISO C standard."; const std::string verbose = message + " A value for 'sizeof(void)' is defined only as part of a GNU C extension, which defines 'sizeof(void)' to be 1."; reportError(tok, Severity::portability, "sizeofDereferencedVoidPointer", message + "\n" + verbose, CWE682, Certainty::normal); } -void CheckSizeof::arithOperationsOnVoidPointerError(const Token* tok, const std::string &varname, const std::string &vartype) +void CheckSizeofImpl::arithOperationsOnVoidPointerError(const Token* tok, const std::string &varname, const std::string &vartype) { const std::string message = "'$symbol' is of type '" + vartype + "'. When using void pointers in calculations, the behaviour is undefined."; const std::string verbose = message + " Arithmetic operations on 'void *' is a GNU C extension, which defines the 'sizeof(void)' to be 1."; @@ -500,7 +500,7 @@ void CheckSizeof::arithOperationsOnVoidPointerError(const Token* tok, const std: void CheckSizeof::runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger) { - CheckSizeof checkSizeof(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckSizeofImpl checkSizeof(&tokenizer, &tokenizer.getSettings(), errorLogger); // Checks checkSizeof.sizeofsizeof(); @@ -515,7 +515,7 @@ void CheckSizeof::runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger void CheckSizeof::getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const { - CheckSizeof c(nullptr, settings, errorLogger); + CheckSizeofImpl c(nullptr, settings, errorLogger); c.sizeofForArrayParameterError(nullptr); c.sizeofForPointerError(nullptr, "varname"); c.divideBySizeofError(nullptr, "memset"); diff --git a/lib/checksizeof.h b/lib/checksizeof.h index 4c10ca88dac..0ec4b298de5 100644 --- a/lib/checksizeof.h +++ b/lib/checksizeof.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -41,16 +42,33 @@ class Tokenizer; class CPPCHECKLIB CheckSizeof : public Check { public: /** @brief This constructor is used when registering the CheckClass */ - CheckSizeof() : Check(myName()) {} + CheckSizeof() : Check("Sizeof") {} private: - /** @brief This constructor is used when running checks. */ - CheckSizeof(const Tokenizer* tokenizer, const Settings* settings, ErrorLogger* errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger) override; + void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; + + std::string classInfo() const override { + return "sizeof() usage checks\n" + "- sizeof for array given as function argument\n" + "- sizeof for numeric given as function argument\n" + "- using sizeof(pointer) instead of the size of pointed data\n" + "- look for 'sizeof sizeof ..'\n" + "- look for calculations inside sizeof()\n" + "- look for function calls inside sizeof()\n" + "- look for suspicious calculations with sizeof()\n" + "- using 'sizeof(void)' which is undefined\n"; + } +}; + +class CPPCHECKLIB CheckSizeofImpl : public CheckImpl { +public: + /** @brief This constructor is used when running checks. */ + CheckSizeofImpl(const Tokenizer* tokenizer, const Settings* settings, ErrorLogger* errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** @brief %Check for 'sizeof sizeof ..' */ void sizeofsizeof(); @@ -88,24 +106,6 @@ class CPPCHECKLIB CheckSizeof : public Check { void sizeofVoidError(const Token *tok); void sizeofDereferencedVoidPointerError(const Token *tok, const std::string &varname); void arithOperationsOnVoidPointerError(const Token* tok, const std::string &varname, const std::string &vartype); - - void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; - - static std::string myName() { - return "Sizeof"; - } - - std::string classInfo() const override { - return "sizeof() usage checks\n" - "- sizeof for array given as function argument\n" - "- sizeof for numeric given as function argument\n" - "- using sizeof(pointer) instead of the size of pointed data\n" - "- look for 'sizeof sizeof ..'\n" - "- look for calculations inside sizeof()\n" - "- look for function calls inside sizeof()\n" - "- look for suspicious calculations with sizeof()\n" - "- using 'sizeof(void)' which is undefined\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index c665d72757e..2980fe2d86e 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -127,7 +127,7 @@ static const Token* getContainerFromSize(const Library::Container* container, co return nullptr; } -void CheckStl::outOfBounds() +void CheckStlImpl::outOfBounds() { logChecker("CheckStl::outOfBounds"); @@ -215,7 +215,7 @@ static std::string indexValueString(const ValueFlow::Value& indexValue, const st return indexString; } -void CheckStl::outOfBoundsError(const Token *tok, const std::string &containerName, const ValueFlow::Value *containerSize, const std::string &index, const ValueFlow::Value *indexValue) +void CheckStlImpl::outOfBoundsError(const Token *tok, const std::string &containerName, const ValueFlow::Value *containerSize, const std::string &index, const ValueFlow::Value *indexValue) { // Do not warn if both the container size and index value are possible if (containerSize && indexValue && containerSize->isPossible() && indexValue->isPossible()) @@ -274,7 +274,7 @@ void CheckStl::outOfBoundsError(const Token *tok, const std::string &containerNa (containerSize && containerSize->isInconclusive()) || (indexValue && indexValue->isInconclusive()) ? Certainty::inconclusive : Certainty::normal); } -bool CheckStl::isContainerSize(const Token *containerToken, const Token *expr) const +bool CheckStlImpl::isContainerSize(const Token *containerToken, const Token *expr) const { if (!Token::simpleMatch(expr, "( )")) return false; @@ -285,7 +285,7 @@ bool CheckStl::isContainerSize(const Token *containerToken, const Token *expr) c return containerToken->valueType()->container->getYield(expr->strAt(-1)) == Library::Container::Yield::SIZE; } -bool CheckStl::isContainerSizeGE(const Token * containerToken, const Token *expr) const +bool CheckStlImpl::isContainerSizeGE(const Token * containerToken, const Token *expr) const { if (!expr) return false; @@ -314,7 +314,7 @@ bool CheckStl::isContainerSizeGE(const Token * containerToken, const Token *expr return false; } -void CheckStl::outOfBoundsIndexExpression() +void CheckStlImpl::outOfBoundsIndexExpression() { logChecker("CheckStl::outOfBoundsIndexExpression"); for (const Scope *function : mTokenizer->getSymbolDatabase()->functionScopes) { @@ -334,7 +334,7 @@ void CheckStl::outOfBoundsIndexExpression() } } -void CheckStl::outOfBoundsIndexExpressionError(const Token *tok, const Token *index) +void CheckStlImpl::outOfBoundsIndexExpressionError(const Token *tok, const Token *index) { const std::string varname = tok ? tok->str() : std::string("var"); const std::string i = index ? index->expressionString() : (varname + ".size()"); @@ -352,12 +352,12 @@ void CheckStl::outOfBoundsIndexExpressionError(const Token *tok, const Token *in // Error message for bad iterator usage.. -void CheckStl::invalidIteratorError(const Token *tok, const std::string &iteratorName) +void CheckStlImpl::invalidIteratorError(const Token *tok, const std::string &iteratorName) { reportError(tok, Severity::error, "invalidIterator1", "$symbol:"+iteratorName+"\nInvalid iterator: $symbol", CWE664, Certainty::normal); } -void CheckStl::iteratorsError(const Token* tok, const std::string& containerName1, const std::string& containerName2) +void CheckStlImpl::iteratorsError(const Token* tok, const std::string& containerName1, const std::string& containerName2) { reportError(tok, Severity::error, "iterators1", "$symbol:" + containerName1 + "\n" @@ -365,7 +365,7 @@ void CheckStl::iteratorsError(const Token* tok, const std::string& containerName "Same iterator is used with different containers '" + containerName1 + "' and '" + containerName2 + "'.", CWE664, Certainty::normal); } -void CheckStl::iteratorsError(const Token* tok, const Token* containerTok, const std::string& containerName) +void CheckStlImpl::iteratorsError(const Token* tok, const Token* containerTok, const std::string& containerName) { std::list callstack = { tok, containerTok }; reportError(callstack, @@ -379,7 +379,7 @@ void CheckStl::iteratorsError(const Token* tok, const Token* containerTok, const } // Error message used when dereferencing an iterator that has been erased.. -void CheckStl::dereferenceErasedError(const Token *erased, const Token* deref, const std::string &itername, bool inconclusive) +void CheckStlImpl::dereferenceErasedError(const Token *erased, const Token* deref, const std::string &itername, bool inconclusive) { if (erased) { std::list callstack = { deref, erased }; @@ -449,7 +449,7 @@ static bool isVector(const Token* tok) return Token::simpleMatch(decltok, "std :: vector"); } -void CheckStl::iterators() +void CheckStlImpl::iterators() { logChecker("CheckStl::iterators"); @@ -634,7 +634,7 @@ void CheckStl::iterators() } } -void CheckStl::mismatchingContainerIteratorError(const Token* containerTok, const Token* iterTok, const Token* containerTok2) +void CheckStlImpl::mismatchingContainerIteratorError(const Token* containerTok, const Token* iterTok, const Token* containerTok2) { const std::string container(containerTok ? containerTok->expressionString() : std::string("v1")); const std::string container2(containerTok2 ? containerTok2->expressionString() : std::string("v2")); @@ -648,7 +648,7 @@ void CheckStl::mismatchingContainerIteratorError(const Token* containerTok, cons } // Error message for bad iterator usage.. -void CheckStl::mismatchingContainersError(const Token* tok1, const Token* tok2) +void CheckStlImpl::mismatchingContainersError(const Token* tok1, const Token* tok2) { const std::string expr1(tok1 ? tok1->expressionString() : std::string("v1")); const std::string expr2(tok2 ? tok2->expressionString() : std::string("v2")); @@ -660,7 +660,7 @@ void CheckStl::mismatchingContainersError(const Token* tok1, const Token* tok2) Certainty::normal); } -void CheckStl::mismatchingContainerExpressionError(const Token *tok1, const Token *tok2) +void CheckStlImpl::mismatchingContainerExpressionError(const Token *tok1, const Token *tok2) { const std::string expr1(tok1 ? tok1->expressionString() : std::string("v1")); const std::string expr2(tok2 ? tok2->expressionString() : std::string("v2")); @@ -669,7 +669,7 @@ void CheckStl::mismatchingContainerExpressionError(const Token *tok1, const Toke expr1 + "' and '" + expr2 + "' are used together.", CWE664, Certainty::normal); } -void CheckStl::sameIteratorExpressionError(const Token *tok) +void CheckStlImpl::sameIteratorExpressionError(const Token *tok) { reportError(tok, Severity::style, "sameIteratorExpression", "Same iterators expression are used for algorithm.", CWE664, Certainty::normal); } @@ -754,7 +754,7 @@ static ValueFlow::Value getLifetimeIteratorValue(const Token* tok, MathLib::bigi return ValueFlow::Value{}; } -bool CheckStl::checkIteratorPair(const Token* tok1, const Token* tok2) +bool CheckStlImpl::checkIteratorPair(const Token* tok1, const Token* tok2) { if (!tok1) return false; @@ -806,7 +806,7 @@ namespace { }; } -void CheckStl::mismatchingContainers() +void CheckStlImpl::mismatchingContainers() { logChecker("CheckStl::misMatchingContainers"); @@ -866,7 +866,7 @@ void CheckStl::mismatchingContainers() } } -void CheckStl::mismatchingContainerIterator() +void CheckStlImpl::mismatchingContainerIterator() { logChecker("CheckStl::misMatchingContainerIterator"); @@ -1118,7 +1118,7 @@ static const Token* endOfExpression(const Token* tok) return endToken; } -void CheckStl::invalidContainer() +void CheckStlImpl::invalidContainer() { logChecker("CheckStl::invalidContainer"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -1231,7 +1231,7 @@ void CheckStl::invalidContainer() } } -void CheckStl::invalidContainerLoopError(const Token* tok, const Token* loopTok, ErrorPath errorPath) +void CheckStlImpl::invalidContainerLoopError(const Token* tok, const Token* loopTok, ErrorPath errorPath) { const std::string method = tok ? tok->str() : "erase"; errorPath.emplace_back(loopTok, "Iterating container here."); @@ -1246,7 +1246,7 @@ void CheckStl::invalidContainerLoopError(const Token* tok, const Token* loopTok, reportError(std::move(errorPath), Severity::error, "invalidContainerLoop", msg, CWE664, Certainty::normal); } -void CheckStl::invalidContainerError(const Token *tok, const ValueFlow::Value *val, ErrorPath errorPath) +void CheckStlImpl::invalidContainerError(const Token *tok, const ValueFlow::Value *val, ErrorPath errorPath) { const bool inconclusive = val ? val->isInconclusive() : false; if (val) @@ -1256,7 +1256,7 @@ void CheckStl::invalidContainerError(const Token *tok, const ValueFlow::Value *v reportError(std::move(errorPath), Severity::error, "invalidContainer", msg + " that may be invalid.", CWE664, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckStl::invalidContainerReferenceError(const Token* tok, const Token* contTok, ErrorPath errorPath) +void CheckStlImpl::invalidContainerReferenceError(const Token* tok, const Token* contTok, ErrorPath errorPath) { std::string name = contTok ? contTok->expressionString() : "x"; std::string msg = "Reference to " + name; @@ -1264,7 +1264,7 @@ void CheckStl::invalidContainerReferenceError(const Token* tok, const Token* con reportError(std::move(errorPath), Severity::error, "invalidContainerReference", msg + " that may be invalid.", CWE664, Certainty::normal); } -void CheckStl::stlOutOfBounds() +void CheckStlImpl::stlOutOfBounds() { logChecker("CheckStl::stlOutOfBounds"); @@ -1350,7 +1350,7 @@ void CheckStl::stlOutOfBounds() } } -void CheckStl::stlOutOfBoundsError(const Token *tok, const std::string &num, const std::string &var, bool at) +void CheckStlImpl::stlOutOfBoundsError(const Token *tok, const std::string &num, const std::string &var, bool at) { if (at) reportError(tok, Severity::error, "stlOutOfBounds", "$symbol:" + var + "\nWhen " + num + "==$symbol.size(), $symbol.at(" + num + ") is out of bounds.", CWE788, Certainty::normal); @@ -1358,7 +1358,7 @@ void CheckStl::stlOutOfBoundsError(const Token *tok, const std::string &num, con reportError(tok, Severity::error, "stlOutOfBounds", "$symbol:" + var + "\nWhen " + num + "==$symbol.size(), $symbol[" + num + "] is out of bounds.", CWE788, Certainty::normal); } -void CheckStl::negativeIndex() +void CheckStlImpl::negativeIndex() { logChecker("CheckStl::negativeIndex"); @@ -1382,7 +1382,7 @@ void CheckStl::negativeIndex() } } -void CheckStl::negativeIndexError(const Token *tok, const ValueFlow::Value &index) +void CheckStlImpl::negativeIndexError(const Token *tok, const ValueFlow::Value &index) { ErrorPath errorPath = getErrorPath(tok, &index, "Negative array index"); std::ostringstream errmsg; @@ -1396,7 +1396,7 @@ void CheckStl::negativeIndexError(const Token *tok, const ValueFlow::Value &inde reportError(std::move(errorPath), severity, "negativeContainerIndex", errmsg.str(), CWE786, certainty); } -void CheckStl::erase() +void CheckStlImpl::erase() { logChecker("CheckStl::erase"); @@ -1417,7 +1417,7 @@ void CheckStl::erase() } } -void CheckStl::eraseCheckLoopVar(const Scope &scope, const Variable *var) +void CheckStlImpl::eraseCheckLoopVar(const Scope &scope, const Variable *var) { bool inconclusiveType=false; if (!isIterator(var, inconclusiveType)) @@ -1461,7 +1461,7 @@ void CheckStl::eraseCheckLoopVar(const Scope &scope, const Variable *var) } } -void CheckStl::stlBoundaries() +void CheckStlImpl::stlBoundaries() { logChecker("CheckStl::stlBoundaries"); @@ -1486,7 +1486,7 @@ void CheckStl::stlBoundaries() } // Error message for bad boundary usage.. -void CheckStl::stlBoundariesError(const Token *tok) +void CheckStlImpl::stlBoundariesError(const Token *tok) { reportError(tok, Severity::error, "stlBoundaries", "Dangerous comparison using operator< on iterator.\n" @@ -1515,7 +1515,7 @@ static bool if_findCompare(const Token * const tokBack, bool stdStringLike) return false; } -void CheckStl::if_find() +void CheckStlImpl::if_find() { const bool printWarning = mSettings->severity.isEnabled(Severity::warning); const bool printPerformance = mSettings->severity.isEnabled(Severity::performance); @@ -1592,7 +1592,7 @@ void CheckStl::if_find() } -void CheckStl::if_findError(const Token *tok, bool str) +void CheckStlImpl::if_findError(const Token *tok, bool str) { if (str && mSettings->standards.cpp >= Standards::CPP20) reportError(tok, Severity::performance, "stlIfStrFind", @@ -1683,7 +1683,7 @@ static const Token *findInsertValue(const Token *tok, const Token *containerTok, return nullptr; } -void CheckStl::checkFindInsert() +void CheckStlImpl::checkFindInsert() { if (!mSettings->severity.isEnabled(Severity::performance)) return; @@ -1729,7 +1729,7 @@ void CheckStl::checkFindInsert() } } -void CheckStl::checkFindInsertError(const Token *tok) +void CheckStlImpl::checkFindInsertError(const Token *tok) { std::string replaceExpr; if (tok && Token::simpleMatch(tok->astParent(), "=") && tok == tok->astParent()->astOperand2() && Token::simpleMatch(tok->astParent()->astOperand1(), "[")) { @@ -1761,7 +1761,7 @@ static bool isCpp03ContainerSizeSlow(const Token *tok) return var && var->isStlType("list"); } -void CheckStl::size() +void CheckStlImpl::size() { if (!mSettings->severity.isEnabled(Severity::performance)) return; @@ -1810,7 +1810,7 @@ void CheckStl::size() } } -void CheckStl::sizeError(const Token *tok) +void CheckStlImpl::sizeError(const Token *tok) { const std::string varname = tok ? tok->str() : std::string("list"); reportError(tok, Severity::performance, "stlSize", @@ -1822,7 +1822,7 @@ void CheckStl::sizeError(const Token *tok) "guaranteed to take constant time.", CWE398, Certainty::normal); } -void CheckStl::redundantCondition() +void CheckStlImpl::redundantCondition() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("redundantIfRemove")) return; @@ -1855,7 +1855,7 @@ void CheckStl::redundantCondition() } } -void CheckStl::redundantIfRemoveError(const Token *tok) +void CheckStlImpl::redundantIfRemoveError(const Token *tok) { reportError(tok, Severity::style, "redundantIfRemove", "Redundant checking of STL container element existence before removing it.\n" @@ -1863,7 +1863,7 @@ void CheckStl::redundantIfRemoveError(const Token *tok) "It is safe to call the remove method on a non-existing element.", CWE398, Certainty::normal); } -void CheckStl::missingComparison() +void CheckStlImpl::missingComparison() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -1927,7 +1927,7 @@ void CheckStl::missingComparison() } } -void CheckStl::missingComparisonError(const Token *incrementToken1, const Token *incrementToken2) +void CheckStlImpl::missingComparisonError(const Token *incrementToken1, const Token *incrementToken2) { std::list callstack = { incrementToken1,incrementToken2 }; @@ -2023,7 +2023,7 @@ namespace { }; } -void CheckStl::string_c_str() +void CheckStlImpl::string_c_str() { const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); const bool printPerformance = mSettings->severity.isEnabled(Severity::performance); @@ -2219,25 +2219,25 @@ void CheckStl::string_c_str() } } -void CheckStl::string_c_strThrowError(const Token* tok) +void CheckStlImpl::string_c_strThrowError(const Token* tok) { reportError(tok, Severity::error, "stlcstrthrow", "Dangerous usage of c_str(). The value returned by c_str() is invalid after throwing exception.\n" "Dangerous usage of c_str(). The string is destroyed after the c_str() call so the thrown pointer is invalid."); } -void CheckStl::string_c_strError(const Token* tok) +void CheckStlImpl::string_c_strError(const Token* tok) { reportError(tok, Severity::error, "stlcstr", "Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n" "Dangerous usage of c_str(). The c_str() return value is only valid until its string is deleted.", CWE664, Certainty::normal); } -void CheckStl::string_c_strReturn(const Token* tok) +void CheckStlImpl::string_c_strReturn(const Token* tok) { reportError(tok, Severity::performance, "stlcstrReturn", "Returning the result of c_str() in a function that returns std::string is slow and redundant.\n" "The conversion from const char* as returned by c_str() to std::string creates an unnecessary string copy. Solve that by directly returning the string.", CWE704, Certainty::normal); } -void CheckStl::string_c_strParam(const Token* tok, nonneg int number, const std::string& argtype) +void CheckStlImpl::string_c_strParam(const Token* tok, nonneg int number, const std::string& argtype) { std::ostringstream oss; oss << "Passing the result of c_str() to a function that takes " << argtype << " as argument no. " << number << " is slow and redundant.\n" @@ -2245,28 +2245,28 @@ void CheckStl::string_c_strParam(const Token* tok, nonneg int number, const std: reportError(tok, Severity::performance, "stlcstrParam", oss.str(), CWE704, Certainty::normal); } -void CheckStl::string_c_strConstructor(const Token* tok, const std::string& argtype) +void CheckStlImpl::string_c_strConstructor(const Token* tok, const std::string& argtype) { std::string msg = "Constructing a " + argtype + " from the result of c_str() is slow and redundant.\n" "Constructing a " + argtype + " from const char* requires a call to strlen(). Solve that by directly passing the string."; reportError(tok, Severity::performance, "stlcstrConstructor", msg, CWE704, Certainty::normal); } -void CheckStl::string_c_strAssignment(const Token* tok, const std::string& argtype) +void CheckStlImpl::string_c_strAssignment(const Token* tok, const std::string& argtype) { std::string msg = "Assigning the result of c_str() to a " + argtype + " is slow and redundant.\n" "Assigning a const char* to a " + argtype + " requires a call to strlen(). Solve that by directly assigning the string."; reportError(tok, Severity::performance, "stlcstrAssignment", msg, CWE704, Certainty::normal); } -void CheckStl::string_c_strConcat(const Token* tok) +void CheckStlImpl::string_c_strConcat(const Token* tok) { std::string msg = "Concatenating the result of c_str() and a std::string is slow and redundant.\n" "Concatenating a const char* with a std::string requires a call to strlen(). Solve that by directly concatenating the strings."; reportError(tok, Severity::performance, "stlcstrConcat", msg, CWE704, Certainty::normal); } -void CheckStl::string_c_strStream(const Token* tok) +void CheckStlImpl::string_c_strStream(const Token* tok) { std::string msg = "Passing the result of c_str() to a stream is slow and redundant.\n" "Passing a const char* to a stream requires a call to strlen(). Solve that by directly passing the string."; @@ -2287,7 +2287,7 @@ namespace { } -void CheckStl::uselessCalls() +void CheckStlImpl::uselessCalls() { const bool printPerformance = mSettings->severity.isEnabled(Severity::performance); const bool printWarning = mSettings->severity.isEnabled(Severity::warning); @@ -2348,7 +2348,7 @@ void CheckStl::uselessCalls() } -void CheckStl::uselessCallsReturnValueError(const Token *tok, const std::string &varname, const std::string &function) +void CheckStlImpl::uselessCallsReturnValueError(const Token *tok, const std::string &varname, const std::string &function) { std::ostringstream errmsg; errmsg << "$symbol:" << varname << '\n'; @@ -2361,7 +2361,7 @@ void CheckStl::uselessCallsReturnValueError(const Token *tok, const std::string reportError(tok, Severity::warning, "uselessCallsCompare", errmsg.str(), CWE628, Certainty::normal); } -void CheckStl::uselessCallsSwapError(const Token *tok, const std::string &varname) +void CheckStlImpl::uselessCallsSwapError(const Token *tok, const std::string &varname) { reportError(tok, Severity::performance, "uselessCallsSwap", "$symbol:" + varname + "\n" @@ -2371,7 +2371,7 @@ void CheckStl::uselessCallsSwapError(const Token *tok, const std::string &varnam "code is inefficient. Is the object or the parameter wrong here?", CWE628, Certainty::normal); } -void CheckStl::uselessCallsSubstrError(const Token *tok, SubstrErrorType type) +void CheckStlImpl::uselessCallsSubstrError(const Token *tok, SubstrErrorType type) { std::string msg = "Ineffective call of function 'substr' because "; switch (type) { @@ -2391,19 +2391,19 @@ void CheckStl::uselessCallsSubstrError(const Token *tok, SubstrErrorType type) reportError(tok, Severity::performance, "uselessCallsSubstr", msg, CWE398, Certainty::normal); } -void CheckStl::uselessCallsConstructorError(const Token *tok) +void CheckStlImpl::uselessCallsConstructorError(const Token *tok) { const std::string container = tok ? tok->str() : ""; const std::string msg = "Inefficient constructor call: container '" + container + "' is assigned a partial copy of itself. Use erase() or resize() instead."; reportError(tok, Severity::performance, "uselessCallsConstructor", msg, CWE398, Certainty::normal); } -void CheckStl::uselessCallsEmptyError(const Token *tok) +void CheckStlImpl::uselessCallsEmptyError(const Token *tok) { reportError(tok, Severity::warning, "uselessCallsEmpty", "Ineffective call of function 'empty()'. Did you intend to call 'clear()' instead?", CWE398, Certainty::normal); } -void CheckStl::uselessCallsRemoveError(const Token *tok, const std::string& function) +void CheckStlImpl::uselessCallsRemoveError(const Token *tok, const std::string& function) { reportError(tok, Severity::warning, "uselessCallsRemove", "$symbol:" + function + "\n" @@ -2414,7 +2414,7 @@ void CheckStl::uselessCallsRemoveError(const Token *tok, const std::string& func // Check for iterators being dereferenced before being checked for validity. // E.g. if (*i && i != str.end()) { } -void CheckStl::checkDereferenceInvalidIterator() +void CheckStlImpl::checkDereferenceInvalidIterator() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -2478,7 +2478,7 @@ void CheckStl::checkDereferenceInvalidIterator() } -void CheckStl::checkDereferenceInvalidIterator2() +void CheckStlImpl::checkDereferenceInvalidIterator2() { const bool printInconclusive = (mSettings->certainty.isEnabled(Certainty::inconclusive)); @@ -2550,7 +2550,7 @@ void CheckStl::checkDereferenceInvalidIterator2() emptyAdvance = tok->astParent(); } } - if (!CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings) && !isInvalidIterator && !emptyAdvance) { + if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings) && !isInvalidIterator && !emptyAdvance) { if (!unknown) continue; inconclusive = true; @@ -2574,7 +2574,7 @@ void CheckStl::checkDereferenceInvalidIterator2() } } -void CheckStl::dereferenceInvalidIteratorError(const Token* tok, const ValueFlow::Value *value, bool inconclusive) +void CheckStlImpl::dereferenceInvalidIteratorError(const Token* tok, const ValueFlow::Value *value, bool inconclusive) { const std::string& varname = tok ? tok->expressionString() : "var"; const std::string errmsgcond("$symbol:" + varname + '\n' + ValueFlow::eitherTheConditionIsRedundant(value ? value->condition : nullptr) + " or there is possible dereference of an invalid iterator: $symbol."); @@ -2603,7 +2603,7 @@ void CheckStl::dereferenceInvalidIteratorError(const Token* tok, const ValueFlow } } -void CheckStl::dereferenceInvalidIteratorError(const Token* deref, const std::string &iterName) +void CheckStlImpl::dereferenceInvalidIteratorError(const Token* deref, const std::string &iterName) { reportError(deref, Severity::warning, "derefInvalidIterator", @@ -2612,7 +2612,7 @@ void CheckStl::dereferenceInvalidIteratorError(const Token* deref, const std::st "Possible dereference of an invalid iterator: $symbol. Make sure to check that the iterator is valid before dereferencing it - not after.", CWE825, Certainty::normal); } -void CheckStl::useStlAlgorithmError(const Token *tok, const std::string &algoName) +void CheckStlImpl::useStlAlgorithmError(const Token *tok, const std::string &algoName) { reportError(tok, Severity::style, "useStlAlgorithm", "Consider using " + algoName + " algorithm instead of a raw loop.", CWE398, Certainty::normal); @@ -3000,7 +3000,7 @@ namespace { }; } // namespace -void CheckStl::useStlAlgorithm() +void CheckStlImpl::useStlAlgorithm() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("useStlAlgorithm")) return; @@ -3236,7 +3236,7 @@ void CheckStl::useStlAlgorithm() } } -void CheckStl::knownEmptyContainerError(const Token *tok, const std::string& algo) +void CheckStlImpl::knownEmptyContainerError(const Token *tok, const std::string& algo) { const std::string var = tok ? tok->expressionString() : std::string("var"); @@ -3267,7 +3267,7 @@ static bool isKnownEmptyContainer(const Token* tok) }); } -void CheckStl::knownEmptyContainer() +void CheckStlImpl::knownEmptyContainer() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("knownEmptyContainer")) return; @@ -3310,7 +3310,7 @@ void CheckStl::knownEmptyContainer() } } -void CheckStl::eraseIteratorOutOfBoundsError(const Token *ftok, const Token* itertok, const ValueFlow::Value* val) +void CheckStlImpl::eraseIteratorOutOfBoundsError(const Token *ftok, const Token* itertok, const ValueFlow::Value* val) { if (!ftok || !itertok || !val) { reportError(ftok, Severity::error, "eraseIteratorOutOfBounds", @@ -3355,7 +3355,7 @@ static const ValueFlow::Value* getOOBIterValue(const Token* tok, const ValueFlow return it != tok->values().end() ? &*it : nullptr; } -void CheckStl::eraseIteratorOutOfBounds() +void CheckStlImpl::eraseIteratorOutOfBounds() { logChecker("CheckStl::eraseIteratorOutOfBounds"); for (const Scope *function : mTokenizer->getSymbolDatabase()->functionScopes) { @@ -3402,21 +3402,21 @@ static bool isLocalMutex(const Variable* var, const Scope* scope) return !var->isReference() && !var->isRValueReference() && !var->isStatic() && var->scope() == scope; } -void CheckStl::globalLockGuardError(const Token* tok) +void CheckStlImpl::globalLockGuardError(const Token* tok) { reportError(tok, Severity::warning, "globalLockGuard", "Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.", CWE833, Certainty::normal); } -void CheckStl::localMutexError(const Token* tok) +void CheckStlImpl::localMutexError(const Token* tok) { reportError(tok, Severity::warning, "localMutex", "The lock is ineffective because the mutex is locked at the same scope as the mutex itself.", CWE667, Certainty::normal); } -void CheckStl::checkMutexes() +void CheckStlImpl::checkMutexes() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -3459,7 +3459,7 @@ void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) return; } - CheckStl checkStl(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckStlImpl checkStl(&tokenizer, &tokenizer.getSettings(), errorLogger); checkStl.erase(); checkStl.if_find(); checkStl.checkFindInsert(); @@ -3492,7 +3492,7 @@ void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) void CheckStl::getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const { - CheckStl c(nullptr, settings, errorLogger); + CheckStlImpl c(nullptr, settings, errorLogger); c.outOfBoundsError(nullptr, "container", nullptr, "x", nullptr); c.invalidIteratorError(nullptr, "iterator"); c.iteratorsError(nullptr, "container1", "container2"); @@ -3524,7 +3524,7 @@ void CheckStl::getErrorMessages(ErrorLogger* errorLogger, const Settings* settin c.redundantIfRemoveError(nullptr); c.uselessCallsReturnValueError(nullptr, "str", "find"); c.uselessCallsSwapError(nullptr, "str"); - c.uselessCallsSubstrError(nullptr, SubstrErrorType::COPY); + c.uselessCallsSubstrError(nullptr, CheckStlImpl::SubstrErrorType::COPY); c.uselessCallsConstructorError(nullptr); c.uselessCallsEmptyError(nullptr); c.uselessCallsRemoveError(nullptr, "remove"); diff --git a/lib/checkstl.h b/lib/checkstl.h index 03a634f1ed1..626e39f4276 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include "errortypes.h" @@ -48,16 +49,43 @@ namespace ValueFlow class CPPCHECKLIB CheckStl : public Check { public: /** This constructor is used when registering the CheckClass */ - CheckStl() : Check(myName()) {} + CheckStl() : Check("STL usage") {} private: - /** This constructor is used when running checks. */ - CheckStl(const Tokenizer* tokenizer, const Settings* settings, ErrorLogger* errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** run checks, the token list is not simplified */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; + + std::string classInfo() const override { + return "Check for invalid usage of STL:\n" + "- out of bounds errors\n" + "- misuse of iterators when iterating through a container\n" + "- mismatching containers in calls\n" + "- same iterators in calls\n" + "- dereferencing an erased iterator\n" + "- for vectors: using iterator/pointer after push_back has been used\n" + "- optimisation: use empty() instead of size() to guarantee fast code\n" + "- suspicious condition when using find\n" + "- unnecessary searching in associative containers\n" + "- redundant condition\n" + "- common mistakes when using string::c_str()\n" + "- useless calls of string and STL functions\n" + "- dereferencing an invalid iterator\n" + "- erasing an iterator that is out of bounds\n" + "- reading from empty STL container\n" + "- iterating over an empty STL container\n" + "- consider using an STL algorithm instead of raw loop\n" + "- incorrect locking with mutex\n"; + } +}; + +class CPPCHECKLIB CheckStlImpl : public CheckImpl { +public: + /** This constructor is used when running checks. */ + CheckStlImpl(const Tokenizer* tokenizer, const Settings* settings, ErrorLogger* errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** Accessing container out of bounds using ValueFlow */ void outOfBounds(); @@ -209,34 +237,6 @@ class CPPCHECKLIB CheckStl : public Check { void globalLockGuardError(const Token *tok); void localMutexError(const Token *tok); - - void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; - - static std::string myName() { - return "STL usage"; - } - - std::string classInfo() const override { - return "Check for invalid usage of STL:\n" - "- out of bounds errors\n" - "- misuse of iterators when iterating through a container\n" - "- mismatching containers in calls\n" - "- same iterators in calls\n" - "- dereferencing an erased iterator\n" - "- for vectors: using iterator/pointer after push_back has been used\n" - "- optimisation: use empty() instead of size() to guarantee fast code\n" - "- suspicious condition when using find\n" - "- unnecessary searching in associative containers\n" - "- redundant condition\n" - "- common mistakes when using string::c_str()\n" - "- useless calls of string and STL functions\n" - "- dereferencing an invalid iterator\n" - "- erasing an iterator that is out of bounds\n" - "- reading from empty STL container\n" - "- iterating over an empty STL container\n" - "- consider using an STL algorithm instead of raw loop\n" - "- incorrect locking with mutex\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkstring.cpp b/lib/checkstring.cpp index 580597bb10d..916885e094a 100644 --- a/lib/checkstring.cpp +++ b/lib/checkstring.cpp @@ -47,7 +47,7 @@ static const CWE CWE758(758U); // Reliance on Undefined, Unspecified, or Imple //--------------------------------------------------------------------------- // Writing string literal is UB //--------------------------------------------------------------------------- -void CheckString::stringLiteralWrite() +void CheckStringImpl::stringLiteralWrite() { logChecker("CheckString::stringLiteralWrite"); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -66,7 +66,7 @@ void CheckString::stringLiteralWrite() } } -void CheckString::stringLiteralWriteError(const Token *tok, const Token *strValue) +void CheckStringImpl::stringLiteralWriteError(const Token *tok, const Token *strValue) { std::list callstack{ tok }; if (strValue) @@ -89,7 +89,7 @@ void CheckString::stringLiteralWriteError(const Token *tok, const Token *strValu // Check for string comparison involving two static strings. // if(strcmp("00FF00","00FF00")==0) // <- statement is always true //--------------------------------------------------------------------------- -void CheckString::checkAlwaysTrueOrFalseStringCompare() +void CheckStringImpl::checkAlwaysTrueOrFalseStringCompare() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -133,7 +133,7 @@ void CheckString::checkAlwaysTrueOrFalseStringCompare() } } -void CheckString::alwaysTrueFalseStringCompareError(const Token *tok, const std::string& str1, const std::string& str2) +void CheckStringImpl::alwaysTrueFalseStringCompareError(const Token *tok, const std::string& str1, const std::string& str2) { constexpr std::size_t stringLen = 10; const std::string string1 = (str1.size() < stringLen) ? str1 : (str1.substr(0, stringLen-2) + ".."); @@ -145,7 +145,7 @@ void CheckString::alwaysTrueFalseStringCompareError(const Token *tok, const std: "Therefore the comparison is unnecessary and looks suspicious.", (str1==str2)?CWE571:CWE570, Certainty::normal); } -void CheckString::alwaysTrueStringVariableCompareError(const Token *tok, const std::string& str1, const std::string& str2) +void CheckStringImpl::alwaysTrueStringVariableCompareError(const Token *tok, const std::string& str1, const std::string& str2) { reportError(tok, Severity::warning, "stringCompare", "Comparison of identical string variables.\n" @@ -158,7 +158,7 @@ void CheckString::alwaysTrueStringVariableCompareError(const Token *tok, const s // Detect "str == '\0'" where "*str == '\0'" is correct. // Comparing char* with each other instead of using strcmp() //----------------------------------------------------------------------------- -void CheckString::checkSuspiciousStringCompare() +void CheckStringImpl::checkSuspiciousStringCompare() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -197,14 +197,14 @@ void CheckString::checkSuspiciousStringCompare() } } -void CheckString::suspiciousStringCompareError(const Token* tok, const std::string& var, bool isLong) +void CheckStringImpl::suspiciousStringCompareError(const Token* tok, const std::string& var, bool isLong) { const std::string cmpFunc = isLong ? "wcscmp" : "strcmp"; reportError(tok, Severity::warning, "literalWithCharPtrCompare", "$symbol:" + var + "\nString literal compared with variable '$symbol'. Did you intend to use " + cmpFunc + "() instead?", CWE595, Certainty::normal); } -void CheckString::suspiciousStringCompareError_char(const Token* tok, const std::string& var) +void CheckStringImpl::suspiciousStringCompareError_char(const Token* tok, const std::string& var) { reportError(tok, Severity::warning, "charLiteralWithCharPtrCompare", "$symbol:" + var + "\nChar literal compared with pointer '$symbol'. Did you intend to dereference it?", CWE595, Certainty::normal); @@ -220,7 +220,7 @@ static bool isChar(const Variable* var) return (var && !var->isPointer() && !var->isArray() && (var->typeStartToken()->str() == "char" || var->typeStartToken()->str() == "wchar_t")); } -void CheckString::strPlusChar() +void CheckStringImpl::strPlusChar() { logChecker("CheckString::strPlusChar"); const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -236,7 +236,7 @@ void CheckString::strPlusChar() } } -void CheckString::strPlusCharError(const Token *tok) +void CheckStringImpl::strPlusCharError(const Token *tok) { std::string charType = "char"; if (tok && tok->astOperand2() && tok->astOperand2()->variable()) @@ -272,7 +272,7 @@ static bool isMacroUsage(const Token* tok) // Implicit casts of string literals to bool // Comparing string literal with strlen() with wrong length //--------------------------------------------------------------------------- -void CheckString::checkIncorrectStringCompare() +void CheckStringImpl::checkIncorrectStringCompare() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -321,12 +321,12 @@ void CheckString::checkIncorrectStringCompare() } } -void CheckString::incorrectStringCompareError(const Token *tok, const std::string& func, const std::string &string) +void CheckStringImpl::incorrectStringCompareError(const Token *tok, const std::string& func, const std::string &string) { reportError(tok, Severity::warning, "incorrectStringCompare", "$symbol:" + func + "\nString literal " + string + " doesn't match length argument for $symbol().", CWE570, Certainty::normal); } -void CheckString::incorrectStringBooleanError(const Token *tok, const std::string& string) +void CheckStringImpl::incorrectStringBooleanError(const Token *tok, const std::string& string) { const bool charLiteral = isCharLiteral(string); const std::string literalType = charLiteral ? "char" : "string"; @@ -341,7 +341,7 @@ void CheckString::incorrectStringBooleanError(const Token *tok, const std::strin // always true: strcmp(str,"a")==0 || strcmp(str,"b") // TODO: Library configuration for string comparison functions //--------------------------------------------------------------------------- -void CheckString::overlappingStrcmp() +void CheckStringImpl::overlappingStrcmp() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -403,7 +403,7 @@ void CheckString::overlappingStrcmp() } } -void CheckString::overlappingStrcmpError(const Token *eq0, const Token *ne0) +void CheckStringImpl::overlappingStrcmpError(const Token *eq0, const Token *ne0) { std::string eq0Expr(eq0 ? eq0->expressionString() : std::string("strcmp(x,\"abc\")")); if (eq0 && eq0->astParent()->str() == "!") @@ -420,7 +420,7 @@ void CheckString::overlappingStrcmpError(const Token *eq0, const Token *ne0) // Overlapping source and destination passed to sprintf(). // TODO: Library configuration for overlapping arguments //--------------------------------------------------------------------------- -void CheckString::sprintfOverlappingData() +void CheckStringImpl::sprintfOverlappingData() { logChecker("CheckString::sprintfOverlappingData"); @@ -457,7 +457,7 @@ void CheckString::sprintfOverlappingData() } } -void CheckString::sprintfOverlappingDataError(const Token *funcTok, const Token *tok, const std::string &varname) +void CheckStringImpl::sprintfOverlappingDataError(const Token *funcTok, const Token *tok, const std::string &varname) { const std::string func = funcTok ? funcTok->str() : "s[n]printf"; @@ -473,7 +473,7 @@ void CheckString::sprintfOverlappingDataError(const Token *funcTok, const Token void CheckString::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckString checkString(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckStringImpl checkString(&tokenizer, &tokenizer.getSettings(), errorLogger); // Checks checkString.strPlusChar(); @@ -487,7 +487,7 @@ void CheckString::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger void CheckString::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckString c(nullptr, settings, errorLogger); + CheckStringImpl c(nullptr, settings, errorLogger); c.stringLiteralWriteError(nullptr, nullptr); c.sprintfOverlappingDataError(nullptr, nullptr, "varname"); c.strPlusCharError(nullptr); diff --git a/lib/checkstring.h b/lib/checkstring.h index 76002f8ed3d..9edefc3f8b0 100644 --- a/lib/checkstring.h +++ b/lib/checkstring.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -41,16 +42,32 @@ class Tokenizer; class CPPCHECKLIB CheckString : public Check { public: /** @brief This constructor is used when registering the CheckClass */ - CheckString() : Check(myName()) {} + CheckString() : Check("String") {} private: - /** @brief This constructor is used when running checks. */ - CheckString(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Detect misusage of C-style strings:\n" + "- overlapping buffers passed to sprintf as source and destination\n" + "- incorrect length arguments for 'substr' and 'strncmp'\n" + "- suspicious condition (runtime comparison of string literals)\n" + "- suspicious condition (string/char literals as boolean)\n" + "- suspicious comparison of a string literal with a char\\* variable\n" + "- suspicious comparison of '\\0' with a char\\* variable\n" + "- overlapping strcmp() expression\n"; + } +}; + +class CPPCHECKLIB CheckStringImpl : public CheckImpl { +public: + /** @brief This constructor is used when running checks. */ + CheckStringImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** @brief undefined behaviour, writing string literal */ void stringLiteralWrite(); @@ -82,23 +99,6 @@ class CPPCHECKLIB CheckString : public Check { void suspiciousStringCompareError(const Token* tok, const std::string& var, bool isLong); void suspiciousStringCompareError_char(const Token* tok, const std::string& var); void overlappingStrcmpError(const Token* eq0, const Token *ne0); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "String"; - } - - std::string classInfo() const override { - return "Detect misusage of C-style strings:\n" - "- overlapping buffers passed to sprintf as source and destination\n" - "- incorrect length arguments for 'substr' and 'strncmp'\n" - "- suspicious condition (runtime comparison of string literals)\n" - "- suspicious condition (string/char literals as boolean)\n" - "- suspicious comparison of a string literal with a char\\* variable\n" - "- suspicious comparison of '\\0' with a char\\* variable\n" - "- overlapping strcmp() expression\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checktype.cpp b/lib/checktype.cpp index eb222fbe6f5..1679d98e80f 100644 --- a/lib/checktype.cpp +++ b/lib/checktype.cpp @@ -56,7 +56,7 @@ static const CWE CWE758(758U); // Reliance on Undefined, Unspecified, or Imple static const CWE CWE190(190U); // Integer Overflow or Wraparound -void CheckType::checkTooBigBitwiseShift() +void CheckTypeImpl::checkTooBigBitwiseShift() { // unknown sizeof(int) => can't run this checker if (mSettings->platform.type == Platform::Type::Unspecified) @@ -110,7 +110,7 @@ void CheckType::checkTooBigBitwiseShift() } } -void CheckType::tooBigBitwiseShiftError(const Token *tok, int lhsbits, const ValueFlow::Value &rhsbits) +void CheckTypeImpl::tooBigBitwiseShiftError(const Token *tok, int lhsbits, const ValueFlow::Value &rhsbits) { constexpr char id[] = "shiftTooManyBits"; @@ -129,7 +129,7 @@ void CheckType::tooBigBitwiseShiftError(const Token *tok, int lhsbits, const Val reportError(std::move(errorPath), rhsbits.errorSeverity() ? Severity::error : Severity::warning, id, errmsg.str(), CWE758, rhsbits.isInconclusive() ? Certainty::inconclusive : Certainty::normal); } -void CheckType::tooBigSignedBitwiseShiftError(const Token *tok, int lhsbits, const ValueFlow::Value &rhsbits) +void CheckTypeImpl::tooBigSignedBitwiseShiftError(const Token *tok, int lhsbits, const ValueFlow::Value &rhsbits) { constexpr char id[] = "shiftTooManyBitsSigned"; @@ -164,7 +164,7 @@ void CheckType::tooBigSignedBitwiseShiftError(const Token *tok, int lhsbits, con // Checking for integer overflow //--------------------------------------------------------------------------- -void CheckType::checkIntegerOverflow() +void CheckTypeImpl::checkIntegerOverflow() { // unknown sizeof(int) => can't run this checker if (mSettings->platform.type == Platform::Type::Unspecified || mSettings->platform.int_bit >= MathLib::bigint_bits) @@ -215,7 +215,16 @@ void CheckType::checkIntegerOverflow() } } -void CheckType::integerOverflowError(const Token *tok, const ValueFlow::Value &value, bool isOverflow) +static std::string getMessageId(const ValueFlow::Value &value, const char id[]) +{ + if (value.condition != nullptr) + return id + std::string("Cond"); + if (value.safe) + return std::string("safe") + static_cast(std::toupper(id[0])) + (id + 1); + return id; +} + +void CheckTypeImpl::integerOverflowError(const Token *tok, const ValueFlow::Value &value, bool isOverflow) { const std::string expr(tok ? tok->expressionString() : ""); const std::string type = isOverflow ? "overflow" : "underflow"; @@ -242,7 +251,7 @@ void CheckType::integerOverflowError(const Token *tok, const ValueFlow::Value &v // Checking for sign conversion when operand can be negative //--------------------------------------------------------------------------- -void CheckType::checkSignConversion() +void CheckTypeImpl::checkSignConversion() { if (!mSettings->severity.isEnabled(Severity::warning)) return; @@ -274,7 +283,7 @@ void CheckType::checkSignConversion() } } -void CheckType::signConversionError(const Token *tok, const ValueFlow::Value *negativeValue, const bool constvalue) +void CheckTypeImpl::signConversionError(const Token *tok, const ValueFlow::Value *negativeValue, const bool constvalue) { const std::string expr(tok ? tok->expressionString() : "var"); @@ -292,7 +301,7 @@ void CheckType::signConversionError(const Token *tok, const ValueFlow::Value *ne ErrorPath errorPath = getErrorPath(tok,negativeValue,"Negative value is converted to an unsigned value"); reportError(std::move(errorPath), Severity::warning, - Check::getMessageId(*negativeValue, "signConversion").c_str(), + getMessageId(*negativeValue, "signConversion").c_str(), msg.str(), CWE195, negativeValue->isInconclusive() ? Certainty::inconclusive : Certainty::normal); @@ -327,7 +336,7 @@ static bool checkTypeCombination(ValueType src, ValueType tgt, const Settings& s }); } -void CheckType::checkLongCast() +void CheckTypeImpl::checkLongCast() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("truncLongCastAssignment")) return; @@ -405,7 +414,7 @@ static void makeBaseTypeString(std::string& typeStr) typeStr.erase(typeStr.begin(), typeStr.begin() + pos + 6 + 1); } -void CheckType::longCastAssignError(const Token *tok, const ValueType* src, const ValueType* tgt) +void CheckTypeImpl::longCastAssignError(const Token *tok, const ValueType* src, const ValueType* tgt) { std::string srcStr = src ? src->str() : "int"; makeBaseTypeString(srcStr); @@ -418,7 +427,7 @@ void CheckType::longCastAssignError(const Token *tok, const ValueType* src, cons srcStr + " result is assigned to " + tgtStr + " variable. If the variable is " + tgtStr + " to avoid loss of information, then there is loss of information. To avoid loss of information you must cast a calculation operand to " + tgtStr + ", for example 'l = a * b;' => 'l = (" + tgtStr + ")a * b;'.", CWE197, Certainty::normal); } -void CheckType::longCastReturnError(const Token *tok, const ValueType* src, const ValueType* tgt) +void CheckTypeImpl::longCastReturnError(const Token *tok, const ValueType* src, const ValueType* tgt) { std::string srcStr = src ? src->str() : "int"; makeBaseTypeString(srcStr); @@ -435,7 +444,7 @@ void CheckType::longCastReturnError(const Token *tok, const ValueType* src, cons // Checking for float to integer overflow //--------------------------------------------------------------------------- -void CheckType::checkFloatToIntegerOverflow() +void CheckTypeImpl::checkFloatToIntegerOverflow() { logChecker("CheckType::checkFloatToIntegerOverflow"); @@ -475,7 +484,7 @@ void CheckType::checkFloatToIntegerOverflow() } } -void CheckType::checkFloatToIntegerOverflow(const Token *tok, const ValueType *vtint, const ValueType *vtfloat, const std::list &floatValues) +void CheckTypeImpl::checkFloatToIntegerOverflow(const Token *tok, const ValueType *vtint, const ValueType *vtfloat, const std::list &floatValues) { // Conversion of float to integer? if (!vtint || !vtint->isIntegral()) @@ -512,7 +521,7 @@ void CheckType::checkFloatToIntegerOverflow(const Token *tok, const ValueType *v } } -void CheckType::floatToIntegerOverflowError(const Token *tok, const ValueFlow::Value &value) +void CheckTypeImpl::floatToIntegerOverflowError(const Token *tok, const ValueFlow::Value &value) { std::ostringstream errmsg; errmsg << "Undefined behaviour: float (" << value.floatValue << ") to integer conversion overflow."; @@ -525,7 +534,7 @@ void CheckType::floatToIntegerOverflowError(const Token *tok, const ValueFlow::V void CheckType::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { // These are not "simplified" because casts can't be ignored - CheckType checkType(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckTypeImpl checkType(&tokenizer, &tokenizer.getSettings(), errorLogger); checkType.checkTooBigBitwiseShift(); checkType.checkIntegerOverflow(); checkType.checkSignConversion(); @@ -535,7 +544,7 @@ void CheckType::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) void CheckType::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckType c(nullptr, settings, errorLogger); + CheckTypeImpl c(nullptr, settings, errorLogger); c.tooBigBitwiseShiftError(nullptr, 32, ValueFlow::Value(64)); c.tooBigSignedBitwiseShiftError(nullptr, 31, ValueFlow::Value(31)); c.integerOverflowError(nullptr, ValueFlow::Value(1LL<<32)); diff --git a/lib/checktype.h b/lib/checktype.h index d90e11f6fd1..a65ed7ea084 100644 --- a/lib/checktype.h +++ b/lib/checktype.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -47,16 +48,31 @@ namespace ValueFlow class CPPCHECKLIB CheckType : public Check { public: /** @brief This constructor is used when registering the CheckClass */ - CheckType() : Check(myName()) {} + CheckType() : Check("Type") {} private: - /** @brief This constructor is used when running checks. */ - CheckType(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "Type checks\n" + "- bitwise shift by too many bits (only enabled when --platform is used)\n" + "- signed integer overflow (only enabled when --platform is used)\n" + "- dangerous sign conversion, when signed value can be negative\n" + "- possible loss of information when assigning int result to long variable\n" + "- possible loss of information when returning int result as long return value\n" + "- float conversion overflow\n"; + } +}; + +class CPPCHECKLIB CheckTypeImpl : public CheckImpl { +public: + /** @brief This constructor is used when running checks. */ + CheckTypeImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** @brief %Check for bitwise shift with too big right operand */ void checkTooBigBitwiseShift(); @@ -81,22 +97,6 @@ class CPPCHECKLIB CheckType : public Check { void longCastAssignError(const Token *tok, const ValueType* src = nullptr, const ValueType* tgt = nullptr); void longCastReturnError(const Token *tok, const ValueType* src = nullptr, const ValueType* tgt = nullptr); void floatToIntegerOverflowError(const Token *tok, const ValueFlow::Value &value); - - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "Type"; - } - - std::string classInfo() const override { - return "Type checks\n" - "- bitwise shift by too many bits (only enabled when --platform is used)\n" - "- signed integer overflow (only enabled when --platform is used)\n" - "- dangerous sign conversion, when signed value can be negative\n" - "- possible loss of information when assigning int result to long variable\n" - "- possible loss of information when returning int result as long return value\n" - "- float conversion overflow\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index b88debda6f8..819bfa9d85a 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -21,6 +21,7 @@ #include "checkuninitvar.h" #include "astutils.h" +#include "checkimpl.h" #include "ctu.h" #include "errorlogger.h" #include "library.h" @@ -97,7 +98,7 @@ static std::map getVariableValues(const Token* tok) { return ret; } -bool CheckUninitVar::diag(const Token* tok) +bool CheckUninitVarImpl::diag(const Token* tok) { if (!tok) return true; @@ -106,7 +107,7 @@ bool CheckUninitVar::diag(const Token* tok) return !mUninitDiags.insert(tok).second; } -void CheckUninitVar::check() +void CheckUninitVarImpl::check() { logChecker("CheckUninitVar::check"); @@ -126,7 +127,7 @@ void CheckUninitVar::check() } } -void CheckUninitVar::checkScope(const Scope* scope, const std::set &arrayTypeDefs) +void CheckUninitVarImpl::checkScope(const Scope* scope, const std::set &arrayTypeDefs) { for (const Variable &var : scope->varlist) { if ((mTokenizer->isCPP() && var.type() && !var.isPointer() && var.type()->needInitialization != Type::NeedInitialization::True) || @@ -231,7 +232,7 @@ void CheckUninitVar::checkScope(const Scope* scope, const std::set } } -void CheckUninitVar::checkStruct(const Token *tok, const Variable &structvar) +void CheckUninitVarImpl::checkStruct(const Token *tok, const Variable &structvar) { const Token *typeToken = structvar.typeStartToken(); while (Token::Match(typeToken, "%name% ::")) @@ -392,7 +393,7 @@ static bool isVariableUsed(const Token *tok, const Variable& var) return !parent2 || parent2->isConstOp() || (parent2->str() == "=" && parent2->astOperand2() == parent); } -bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar, std::map& variableValue) +bool CheckUninitVarImpl::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar, std::map& variableValue) { const bool suppressErrors(possibleInit && *possibleInit); // Assume that this is a variable declaration, rather than a fundef const bool printDebug = mSettings->debugwarnings; @@ -852,7 +853,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var return false; } -const Token* CheckUninitVar::checkExpr(const Token* tok, const Variable& var, const Alloc alloc, bool known, bool* bailout) const +const Token* CheckUninitVarImpl::checkExpr(const Token* tok, const Variable& var, const Alloc alloc, bool known, bool* bailout) const { if (!tok) return nullptr; @@ -881,7 +882,7 @@ const Token* CheckUninitVar::checkExpr(const Token* tok, const Variable& var, co return nullptr; } -bool CheckUninitVar::checkIfForWhileHead(const Token *startparentheses, const Variable& var, bool suppressErrors, bool isuninit, Alloc alloc, const std::string &membervar) +bool CheckUninitVarImpl::checkIfForWhileHead(const Token *startparentheses, const Variable& var, bool suppressErrors, bool isuninit, Alloc alloc, const std::string &membervar) { const Token * const endpar = startparentheses->link(); if (Token::Match(startparentheses, "( ! %name% %oror%") && startparentheses->tokAt(2)->getValue(0)) @@ -918,7 +919,7 @@ bool CheckUninitVar::checkIfForWhileHead(const Token *startparentheses, const Va } /** recursively check loop, return error token */ -const Token* CheckUninitVar::checkLoopBodyRecursive(const Token *start, const Variable& var, const Alloc alloc, const std::string &membervar, bool &bailout, bool &alwaysReturns) const +const Token* CheckUninitVarImpl::checkLoopBodyRecursive(const Token *start, const Variable& var, const Alloc alloc, const std::string &membervar, bool &bailout, bool &alwaysReturns) const { assert(start->str() == "{"); @@ -1086,7 +1087,7 @@ const Token* CheckUninitVar::checkLoopBodyRecursive(const Token *start, const Va return errorToken; } -bool CheckUninitVar::checkLoopBody(const Token *tok, const Variable& var, const Alloc alloc, const std::string &membervar, const bool suppressErrors) +bool CheckUninitVarImpl::checkLoopBody(const Token *tok, const Variable& var, const Alloc alloc, const std::string &membervar, const bool suppressErrors) { bool bailout = false; bool alwaysReturns = false; @@ -1103,7 +1104,7 @@ bool CheckUninitVar::checkLoopBody(const Token *tok, const Variable& var, const return bailout || alwaysReturns; } -void CheckUninitVar::checkRhs(const Token *tok, const Variable &var, Alloc alloc, nonneg int number_of_if, const std::string &membervar) +void CheckUninitVarImpl::checkRhs(const Token *tok, const Variable &var, Alloc alloc, nonneg int number_of_if, const std::string &membervar) { bool rhs = false; int indent = 0; @@ -1150,7 +1151,7 @@ static bool astIsRhs(const Token *tok) return tok && tok->astParent() && tok == tok->astParent()->astOperand2(); } -const Token* CheckUninitVar::isVariableUsage(const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect) +const Token* CheckUninitVarImpl::isVariableUsage(const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect) { const bool cpp = vartok->isCpp(); const Token *valueExpr = vartok; // non-dereferenced , no address of value as variable @@ -1352,7 +1353,7 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, const Library& return derefValue ? derefValue : valueExpr; } -const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const +const Token* CheckUninitVarImpl::isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const { return isVariableUsage(vartok, mSettings->library, pointer, alloc, indirect); } @@ -1363,7 +1364,7 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, * is passed "by reference" then it is not necessarily "used". * @return -1 => unknown 0 => not used 1 => used */ -int CheckUninitVar::isFunctionParUsage(const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect) +int CheckUninitVarImpl::isFunctionParUsage(const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect) { bool unknown = false; const Token *parent = getAstParentSkipPossibleCastAndAddressOf(vartok, &unknown); @@ -1433,12 +1434,12 @@ int CheckUninitVar::isFunctionParUsage(const Token *vartok, const Library& libra return -1; } -int CheckUninitVar::isFunctionParUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const +int CheckUninitVarImpl::isFunctionParUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const { - return CheckUninitVar::isFunctionParUsage(vartok, mSettings->library, pointer, alloc, indirect); + return isFunctionParUsage(vartok, mSettings->library, pointer, alloc, indirect); } -bool CheckUninitVar::isMemberVariableAssignment(const Token *tok, const std::string &membervar) const +bool CheckUninitVarImpl::isMemberVariableAssignment(const Token *tok, const std::string &membervar) const { if (Token::Match(tok, "%name% . %name%") && tok->strAt(2) == membervar) { if (Token::Match(tok->tokAt(3), "[=.[]")) @@ -1507,7 +1508,7 @@ bool CheckUninitVar::isMemberVariableAssignment(const Token *tok, const std::str return false; } -bool CheckUninitVar::isMemberVariableUsage(const Token *tok, bool isPointer, Alloc alloc, const std::string &membervar) const +bool CheckUninitVarImpl::isMemberVariableUsage(const Token *tok, bool isPointer, Alloc alloc, const std::string &membervar) const { if (Token::Match(tok->previous(), "[(,] %name% . %name% [,)]") && tok->strAt(2) == membervar) { @@ -1549,12 +1550,12 @@ bool CheckUninitVar::isMemberVariableUsage(const Token *tok, bool isPointer, All return false; } -void CheckUninitVar::uninitdataError(const Token *tok, const std::string &varname) +void CheckUninitVarImpl::uninitdataError(const Token *tok, const std::string &varname) { reportError(tok, Severity::error, "uninitdata", "$symbol:" + varname + "\nMemory is allocated but not initialized: $symbol", CWE_USE_OF_UNINITIALIZED_VARIABLE, Certainty::normal); } -void CheckUninitVar::uninitvarError(const Token *tok, const std::string &varname, ErrorPath errorPath) +void CheckUninitVarImpl::uninitvarError(const Token *tok, const std::string &varname, ErrorPath errorPath) { if (diag(tok)) return; @@ -1567,7 +1568,7 @@ void CheckUninitVar::uninitvarError(const Token *tok, const std::string &varname Certainty::normal); } -void CheckUninitVar::uninitvarError(const Token* tok, const ValueFlow::Value& v) +void CheckUninitVarImpl::uninitvarError(const Token* tok, const ValueFlow::Value& v) { if (!mSettings->isEnabled(&v)) return; @@ -1604,7 +1605,7 @@ void CheckUninitVar::uninitvarError(const Token* tok, const ValueFlow::Value& v) certainty); } -void CheckUninitVar::uninitStructMemberError(const Token *tok, const std::string &membername) +void CheckUninitVarImpl::uninitStructMemberError(const Token *tok, const std::string &membername) { reportError(tok, Severity::error, @@ -1612,7 +1613,7 @@ void CheckUninitVar::uninitStructMemberError(const Token *tok, const std::string "$symbol:" + membername + "\nUninitialized struct member: $symbol", CWE_USE_OF_UNINITIALIZED_VARIABLE, Certainty::normal); } -void CheckUninitVar::valueFlowUninit() +void CheckUninitVarImpl::valueFlowUninit() { logChecker("CheckUninitVar::valueFlowUninit"); @@ -1663,7 +1664,7 @@ void CheckUninitVar::valueFlowUninit() if (yield != Library::Container::Yield::AT_INDEX && yield != Library::Container::Yield::ITEM) continue; } - const bool deref = CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings); + const bool deref = CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings); uninitderef = deref && v->indirect == 0; const bool isleaf = isLeafDot(tok) || uninitderef; if (!isleaf && Token::Match(tok->astParent(), ". %name%") && @@ -1696,7 +1697,7 @@ void CheckUninitVar::valueFlowUninit() static bool isVariableUsage(const Settings &settings, const Token *vartok, MathLib::bigint *value) { (void)value; - return CheckUninitVar::isVariableUsage(vartok, settings.library, true, CheckUninitVar::Alloc::ARRAY); + return !!CheckUninitVarImpl::isVariableUsage(vartok, settings.library, true, CheckUninitVarImpl::Alloc::ARRAY); } // a Clang-built executable will crash when using the anonymous MyFileInfo later on - so put it in a unique namespace for now @@ -1752,7 +1753,7 @@ bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::li { (void)settings; - CheckUninitVar dummy(nullptr, &settings, &errorLogger); + CheckUninitVarImpl dummy(nullptr, &settings, &errorLogger); dummy. logChecker("CheckUninitVar::analyseWholeProgram"); @@ -1798,14 +1799,14 @@ bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::li void CheckUninitVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckUninitVar checkUninitVar(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckUninitVarImpl checkUninitVar(&tokenizer, &tokenizer.getSettings(), errorLogger); checkUninitVar.valueFlowUninit(); checkUninitVar.check(); } void CheckUninitVar::getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const { - CheckUninitVar c(nullptr, settings, errorLogger); + CheckUninitVarImpl c(nullptr, settings, errorLogger); ValueFlow::Value v{}; diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index b79e9c22be0..f484c13e55c 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include "mathlib.h" #include "errortypes.h" @@ -61,20 +62,36 @@ class CPPCHECKLIB CheckUninitVar : public Check { public: /** @brief This constructor is used when registering the CheckUninitVar */ - CheckUninitVar() : Check(myName()) {} + CheckUninitVar() : Check("Uninitialized variables") {} - enum Alloc : std::uint8_t { NO_ALLOC, NO_CTOR_CALL, CTOR_CALL, ARRAY }; +private: + /** @brief Run checks against the normal token list */ + void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - static const Token *isVariableUsage(const Token *vartok, const Library &library, bool pointer, Alloc alloc, int indirect = 0); - const Token *isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect = 0) const; + /** @brief Parse current TU and extract file info */ + Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; -private: + Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + + /** @brief Analyse all file infos for all TU */ + bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + + void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; + + std::string classInfo() const override { + return "Uninitialized variables\n" + "- using uninitialized local variables\n" + "- using allocated data before it has been initialized\n"; + } +}; + +class CPPCHECKLIB CheckUninitVarImpl : public CheckImpl { +public: /** @brief This constructor is used when running checks. */ - CheckUninitVar(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} + CheckUninitVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + enum Alloc : std::uint8_t { NO_ALLOC, NO_CTOR_CALL, CTOR_CALL, ARRAY }; bool diag(const Token* tok); /** Check for uninitialized variables */ @@ -92,17 +109,12 @@ class CPPCHECKLIB CheckUninitVar : public Check { bool isMemberVariableAssignment(const Token *tok, const std::string &membervar) const; bool isMemberVariableUsage(const Token *tok, bool isPointer, Alloc alloc, const std::string &membervar) const; + static const Token *isVariableUsage(const Token *vartok, const Library &library, bool pointer, Alloc alloc, int indirect = 0); + const Token *isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect = 0) const; + /** ValueFlow-based checking for uninitialized variables */ void valueFlowUninit(); - /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; - - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; - - /** @brief Analyse all file infos for all TU */ - bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - void uninitvarError(const Token* tok, const ValueFlow::Value& v); void uninitdataError(const Token *tok, const std::string &varname); void uninitvarError(const Token *tok, const std::string &varname, ErrorPath errorPath); @@ -118,18 +130,6 @@ class CPPCHECKLIB CheckUninitVar : public Check { void uninitStructMemberError(const Token *tok, const std::string &membername); std::set mUninitDiags; - - void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; - - static std::string myName() { - return "Uninitialized variables"; - } - - std::string classInfo() const override { - return "Uninitialized variables\n" - "- using uninitialized local variables\n" - "- using allocated data before it has been initialized\n"; - } }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 9531237a208..4c5f8175f66 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -699,7 +699,7 @@ static void useFunctionArgs(const Token *tok, Variables& variables) //--------------------------------------------------------------------------- // Usage of function variables //--------------------------------------------------------------------------- -void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const scope, Variables& variables) const +void CheckUnusedVarImpl::checkFunctionVariableUsage_iterateScopes(const Scope* const scope, Variables& variables) const { // Find declarations if the scope is executable.. if (scope->isExecutable()) { @@ -1173,7 +1173,7 @@ static bool isReturnedByRef(const Variable* var, const Function* func) }); } -void CheckUnusedVar::checkFunctionVariableUsage() +void CheckUnusedVarImpl::checkFunctionVariableUsage() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->checkLibrary && !mSettings->isPremiumEnabled("unusedVariable")) return; @@ -1479,7 +1479,7 @@ void CheckUnusedVar::checkFunctionVariableUsage() } } -void CheckUnusedVar::unusedVariableError(const Token *tok, const std::string &varname) +void CheckUnusedVarImpl::unusedVariableError(const Token *tok, const std::string &varname) { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) return; @@ -1487,7 +1487,7 @@ void CheckUnusedVar::unusedVariableError(const Token *tok, const std::string &va reportError(tok, Severity::style, "unusedVariable", "$symbol:" + varname + "\nUnused variable: $symbol", CWE563, Certainty::normal); } -void CheckUnusedVar::allocatedButUnusedVariableError(const Token *tok, const std::string &varname) +void CheckUnusedVarImpl::allocatedButUnusedVariableError(const Token *tok, const std::string &varname) { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) return; @@ -1495,7 +1495,7 @@ void CheckUnusedVar::allocatedButUnusedVariableError(const Token *tok, const std reportError(tok, Severity::style, "unusedAllocatedMemory", "$symbol:" + varname + "\nVariable '$symbol' is allocated memory that is never used.", CWE563, Certainty::normal); } -void CheckUnusedVar::unreadVariableError(const Token *tok, const std::string &varname, bool modified) +void CheckUnusedVarImpl::unreadVariableError(const Token *tok, const std::string &varname, bool modified) { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) return; @@ -1506,7 +1506,7 @@ void CheckUnusedVar::unreadVariableError(const Token *tok, const std::string &va reportError(tok, Severity::style, "unreadVariable", "$symbol:" + varname + "\nVariable '$symbol' is assigned a value that is never used.", CWE563, Certainty::normal); } -void CheckUnusedVar::unassignedVariableError(const Token *tok, const std::string &varname) +void CheckUnusedVarImpl::unassignedVariableError(const Token *tok, const std::string &varname) { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) return; @@ -1517,7 +1517,7 @@ void CheckUnusedVar::unassignedVariableError(const Token *tok, const std::string //--------------------------------------------------------------------------- // Check that all struct members are used //--------------------------------------------------------------------------- -void CheckUnusedVar::checkStructMemberUsage() +void CheckUnusedVarImpl::checkStructMemberUsage() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedStructMember") && !mSettings->isPremiumEnabled("unusedVariable")) return; @@ -1698,12 +1698,12 @@ void CheckUnusedVar::checkStructMemberUsage() } } -void CheckUnusedVar::unusedStructMemberError(const Token* tok, const std::string& structname, const std::string& varname, const std::string& prefix) +void CheckUnusedVarImpl::unusedStructMemberError(const Token* tok, const std::string& structname, const std::string& varname, const std::string& prefix) { reportError(tok, Severity::style, "unusedStructMember", "$symbol:" + structname + "::" + varname + '\n' + prefix + " member '$symbol' is never used.", CWE563, Certainty::normal); } -bool CheckUnusedVar::isEmptyType(const Type* type) +bool CheckUnusedVarImpl::isEmptyType(const Type* type) { // a type that has no variables and no constructor @@ -1726,7 +1726,7 @@ bool CheckUnusedVar::isEmptyType(const Type* type) void CheckUnusedVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckUnusedVar checkUnusedVar(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, &tokenizer.getSettings(), errorLogger); // Coding style checks checkUnusedVar.checkStructMemberUsage(); @@ -1735,10 +1735,11 @@ void CheckUnusedVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog void CheckUnusedVar::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckUnusedVar c(nullptr, settings, errorLogger); + CheckUnusedVarImpl c(nullptr, settings, errorLogger); c.unusedVariableError(nullptr, "varname"); c.allocatedButUnusedVariableError(nullptr, "varname"); c.unreadVariableError(nullptr, "varname", false); c.unassignedVariableError(nullptr, "varname"); c.unusedStructMemberError(nullptr, "structname", "variable"); } + diff --git a/lib/checkunusedvar.h b/lib/checkunusedvar.h index 5ab79514cf9..1d2227c15bf 100644 --- a/lib/checkunusedvar.h +++ b/lib/checkunusedvar.h @@ -22,6 +22,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -46,16 +47,32 @@ class CPPCHECKLIB CheckUnusedVar : public Check { public: /** @brief This constructor is used when registering the CheckClass */ - CheckUnusedVar() : Check(myName()) {} + CheckUnusedVar() : Check("UnusedVar") {} private: - /** @brief This constructor is used when running checks. */ - CheckUnusedVar(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} - /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + + std::string classInfo() const override { + return "UnusedVar checks\n" + + // style + "- unused variable\n" + "- allocated but unused variable\n" + "- unread variable\n" + "- unassigned variable\n" + "- unused struct member\n"; + } +}; + +class CPPCHECKLIB CheckUnusedVarImpl : public CheckImpl { +public: + /** @brief This constructor is used when running checks. */ + CheckUnusedVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + /** @brief %Check for unused function variables */ void checkFunctionVariableUsage_iterateScopes(const Scope* scope, Variables& variables) const; void checkFunctionVariableUsage(); @@ -72,25 +89,7 @@ class CPPCHECKLIB CheckUnusedVar : public Check { void unreadVariableError(const Token *tok, const std::string &varname, bool modified); void unassignedVariableError(const Token *tok, const std::string &varname); - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - - static std::string myName() { - return "UnusedVar"; - } - - std::string classInfo() const override { - return "UnusedVar checks\n" - - // style - "- unused variable\n" - "- allocated but unused variable\n" - "- unread variable\n" - "- unassigned variable\n" - "- unused struct member\n"; - } - std::map mIsEmptyTypeMap; - }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkvaarg.cpp b/lib/checkvaarg.cpp index e6efc8f5ed9..18eb246e0e7 100644 --- a/lib/checkvaarg.cpp +++ b/lib/checkvaarg.cpp @@ -39,7 +39,7 @@ static const CWE CWE664(664U); // Improper Control of a Resource Through its L static const CWE CWE688(688U); // Function Call With Incorrect Variable or Reference as Argument static const CWE CWE758(758U); // Reliance on Undefined, Unspecified, or Implementation-Defined Behavior -void CheckVaarg::va_start_argument() +void CheckVaargImpl::va_start_argument() { const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); const std::size_t functions = symbolDatabase->functionScopes.size(); @@ -73,13 +73,13 @@ void CheckVaarg::va_start_argument() } } -void CheckVaarg::wrongParameterTo_va_start_error(const Token *tok, const std::string& paramIsName, const std::string& paramShouldName) +void CheckVaargImpl::wrongParameterTo_va_start_error(const Token *tok, const std::string& paramIsName, const std::string& paramShouldName) { reportError(tok, Severity::warning, "va_start_wrongParameter", "'" + paramIsName + "' given to va_start() is not last named argument of the function. Did you intend to pass '" + paramShouldName + "'?", CWE688, Certainty::normal); } -void CheckVaarg::referenceAs_va_start_error(const Token *tok, const std::string& paramName) +void CheckVaargImpl::referenceAs_va_start_error(const Token *tok, const std::string& paramName) { reportError(tok, Severity::error, "va_start_referencePassed", "Using reference '" + paramName + "' as parameter for va_start() results in undefined behaviour.", CWE758, Certainty::normal); @@ -90,7 +90,7 @@ void CheckVaarg::referenceAs_va_start_error(const Token *tok, const std::string& // Detect va_list usage after va_end() //--------------------------------------------------------------------------- -void CheckVaarg::va_list_usage() +void CheckVaargImpl::va_list_usage() { if (mSettings->clang) return; @@ -155,19 +155,19 @@ void CheckVaarg::va_list_usage() } } -void CheckVaarg::va_end_missingError(const Token *tok, const std::string& varname) +void CheckVaargImpl::va_end_missingError(const Token *tok, const std::string& varname) { reportError(tok, Severity::error, "va_end_missing", "va_list '" + varname + "' was opened but not closed by va_end().", CWE664, Certainty::normal); } -void CheckVaarg::va_list_usedBeforeStartedError(const Token *tok, const std::string& varname) +void CheckVaargImpl::va_list_usedBeforeStartedError(const Token *tok, const std::string& varname) { reportError(tok, Severity::error, "va_list_usedBeforeStarted", "va_list '" + varname + "' used before va_start() was called.", CWE664, Certainty::normal); } -void CheckVaarg::va_start_subsequentCallsError(const Token *tok, const std::string& varname) +void CheckVaargImpl::va_start_subsequentCallsError(const Token *tok, const std::string& varname) { reportError(tok, Severity::error, "va_start_subsequentCalls", "va_start() or va_copy() called subsequently on '" + varname + "' without va_end() in between.", CWE664, Certainty::normal); @@ -175,14 +175,14 @@ void CheckVaarg::va_start_subsequentCallsError(const Token *tok, const std::stri void CheckVaarg::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckVaarg check(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckVaargImpl check(&tokenizer, &tokenizer.getSettings(), errorLogger); check.va_start_argument(); check.va_list_usage(); } void CheckVaarg::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { - CheckVaarg c(nullptr, settings, errorLogger); + CheckVaargImpl c(nullptr, settings, errorLogger); c.wrongParameterTo_va_start_error(nullptr, "arg1", "arg2"); c.referenceAs_va_start_error(nullptr, "arg1"); c.va_end_missingError(nullptr, "vl"); diff --git a/lib/checkvaarg.h b/lib/checkvaarg.h index 7af5d98d66f..e07d653456a 100644 --- a/lib/checkvaarg.h +++ b/lib/checkvaarg.h @@ -23,6 +23,7 @@ //--------------------------------------------------------------------------- #include "check.h" +#include "checkimpl.h" #include "config.h" #include @@ -41,29 +42,13 @@ class Tokenizer; class CPPCHECKLIB CheckVaarg : public Check { public: - CheckVaarg() : Check(myName()) {} - -private: - CheckVaarg(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) - : Check(myName(), tokenizer, settings, errorLogger) {} + CheckVaarg() : Check("Vaarg") {} void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void va_start_argument(); - void va_list_usage(); - - void wrongParameterTo_va_start_error(const Token *tok, const std::string& paramIsName, const std::string& paramShouldName); - void referenceAs_va_start_error(const Token *tok, const std::string& paramName); - void va_end_missingError(const Token *tok, const std::string& varname); - void va_list_usedBeforeStartedError(const Token *tok, const std::string& varname); - void va_start_subsequentCallsError(const Token *tok, const std::string& varname); - +private: void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; - static std::string myName() { - return "Vaarg"; - } - std::string classInfo() const override { return "Check for misusage of variable argument lists:\n" "- Wrong parameter passed to va_start()\n" @@ -74,6 +59,22 @@ class CPPCHECKLIB CheckVaarg : public Check { } }; +class CPPCHECKLIB CheckVaargImpl : public CheckImpl +{ +public: + CheckVaargImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + : CheckImpl(tokenizer, settings, errorLogger) {} + + void va_start_argument(); + void va_list_usage(); + + void wrongParameterTo_va_start_error(const Token *tok, const std::string& paramIsName, const std::string& paramShouldName); + void referenceAs_va_start_error(const Token *tok, const std::string& paramName); + void va_end_missingError(const Token *tok, const std::string& varname); + void va_list_usedBeforeStartedError(const Token *tok, const std::string& varname); + void va_start_subsequentCallsError(const Token *tok, const std::string& varname); +}; + /// @} //--------------------------------------------------------------------------- diff --git a/lib/cppcheck.vcxproj b/lib/cppcheck.vcxproj index 12bd4898d4a..5e5b9ae743a 100644 --- a/lib/cppcheck.vcxproj +++ b/lib/cppcheck.vcxproj @@ -32,12 +32,6 @@ - - Create - Create - Create - Create - @@ -50,6 +44,12 @@ + + Create + Create + Create + Create + @@ -124,6 +124,7 @@ + diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index a63995a9728..64a48285fdc 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -5716,7 +5716,7 @@ static void valueFlowSubFunction(const TokenList& tokenlist, // Remove uninit values if argument is passed by value if (argtok->variable() && !argtok->variable()->isPointer() && argvalues.size() == 1 && argvalues.front().isUninitValue()) { - if (CheckUninitVar::isVariableUsage(argtok, settings.library, false, CheckUninitVar::Alloc::NO_ALLOC, 0)) + if (CheckUninitVarImpl::isVariableUsage(argtok, settings.library, false, CheckUninitVarImpl::Alloc::NO_ALLOC, 0)) continue; } diff --git a/oss-fuzz/Makefile b/oss-fuzz/Makefile index c93b8694065..bf40964b338 100644 --- a/oss-fuzz/Makefile +++ b/oss-fuzz/Makefile @@ -45,7 +45,6 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/addoninfo.o \ $(libcppdir)/analyzerinfo.o \ $(libcppdir)/astutils.o \ - $(libcppdir)/check.o \ $(libcppdir)/check64bit.o \ $(libcppdir)/checkassert.o \ $(libcppdir)/checkautovariables.o \ @@ -58,6 +57,7 @@ LIBOBJ = $(libcppdir)/valueflow.o \ $(libcppdir)/checkersreport.o \ $(libcppdir)/checkexceptionsafety.o \ $(libcppdir)/checkfunctions.o \ + $(libcppdir)/checkimpl.o \ $(libcppdir)/checkinternal.o \ $(libcppdir)/checkio.o \ $(libcppdir)/checkleakautovar.o \ @@ -153,7 +153,7 @@ simplecpp.o: ../externals/simplecpp/simplecpp.cpp ../externals/simplecpp/simplec tinyxml2.o: ../externals/tinyxml2/tinyxml2.cpp ../externals/tinyxml2/tinyxml2.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -w -D_LARGEFILE_SOURCE -c -o $@ ../externals/tinyxml2/tinyxml2.cpp -$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/check.h ../lib/checkers.h ../lib/checkuninitvar.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/programmemory.h ../lib/regex.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkuninitvar.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/programmemory.h ../lib/regex.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp $(libcppdir)/tokenize.o: ../lib/tokenize.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h @@ -168,31 +168,28 @@ $(libcppdir)/addoninfo.o: ../lib/addoninfo.cpp ../externals/picojson/picojson.h $(libcppdir)/analyzerinfo.o: ../lib/analyzerinfo.cpp ../externals/tinyxml2/tinyxml2.h ../lib/analyzerinfo.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/standards.h ../lib/utils.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp -$(libcppdir)/astutils.o: ../lib/astutils.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/astutils.o: ../lib/astutils.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/astutils.cpp -$(libcppdir)/check.o: ../lib/check.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h - $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check.cpp - -$(libcppdir)/check64bit.o: ../lib/check64bit.cpp ../lib/addoninfo.h ../lib/check.h ../lib/check64bit.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/check64bit.o: ../lib/check64bit.cpp ../lib/addoninfo.h ../lib/check.h ../lib/check64bit.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check64bit.cpp -$(libcppdir)/checkassert.o: ../lib/checkassert.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkassert.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkassert.o: ../lib/checkassert.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkassert.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkassert.cpp -$(libcppdir)/checkautovariables.o: ../lib/checkautovariables.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkautovariables.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkautovariables.o: ../lib/checkautovariables.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkautovariables.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkautovariables.cpp -$(libcppdir)/checkbool.o: ../lib/checkbool.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbool.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkbool.o: ../lib/checkbool.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbool.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbool.cpp -$(libcppdir)/checkbufferoverrun.o: ../lib/checkbufferoverrun.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbufferoverrun.h ../lib/checkers.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkbufferoverrun.o: ../lib/checkbufferoverrun.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbufferoverrun.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbufferoverrun.cpp -$(libcppdir)/checkclass.o: ../lib/checkclass.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkclass.o: ../lib/checkclass.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkclass.cpp -$(libcppdir)/checkcondition.o: ../lib/checkcondition.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkcondition.h ../lib/checkers.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkcondition.o: ../lib/checkcondition.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkcondition.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkcondition.cpp $(libcppdir)/checkers.o: ../lib/checkers.cpp ../lib/checkers.h ../lib/config.h @@ -204,58 +201,61 @@ $(libcppdir)/checkersidmapping.o: ../lib/checkersidmapping.cpp ../lib/checkers.h $(libcppdir)/checkersreport.o: ../lib/checkersreport.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkersreport.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/standards.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersreport.cpp -$(libcppdir)/checkexceptionsafety.o: ../lib/checkexceptionsafety.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkexceptionsafety.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkexceptionsafety.o: ../lib/checkexceptionsafety.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkexceptionsafety.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkexceptionsafety.cpp -$(libcppdir)/checkfunctions.o: ../lib/checkfunctions.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkfunctions.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkfunctions.o: ../lib/checkfunctions.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkfunctions.cpp -$(libcppdir)/checkinternal.o: ../lib/checkinternal.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkinternal.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkimpl.o: ../lib/checkimpl.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h + $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkimpl.cpp + +$(libcppdir)/checkinternal.o: ../lib/checkinternal.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkinternal.cpp -$(libcppdir)/checkio.o: ../lib/checkio.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkio.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkio.o: ../lib/checkio.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkio.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkio.cpp -$(libcppdir)/checkleakautovar.o: ../lib/checkleakautovar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkleakautovar.o: ../lib/checkleakautovar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkleakautovar.cpp -$(libcppdir)/checkmemoryleak.o: ../lib/checkmemoryleak.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkmemoryleak.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkmemoryleak.o: ../lib/checkmemoryleak.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkmemoryleak.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkmemoryleak.cpp -$(libcppdir)/checknullpointer.o: ../lib/checknullpointer.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checknullpointer.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checknullpointer.o: ../lib/checknullpointer.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checknullpointer.cpp -$(libcppdir)/checkother.o: ../lib/checkother.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkother.o: ../lib/checkother.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkother.cpp -$(libcppdir)/checkpostfixoperator.o: ../lib/checkpostfixoperator.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkpostfixoperator.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkpostfixoperator.o: ../lib/checkpostfixoperator.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkpostfixoperator.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp -$(libcppdir)/checks.o: ../lib/checks.cpp ../lib/check.h ../lib/check64bit.h ../lib/checkassert.h ../lib/checkautovariables.h ../lib/checkbool.h ../lib/checkbufferoverrun.h ../lib/checkclass.h ../lib/checkcondition.h ../lib/checkexceptionsafety.h ../lib/checkfunctions.h ../lib/checkinternal.h ../lib/checkio.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/checkother.h ../lib/checkpostfixoperator.h ../lib/checks.h ../lib/checksizeof.h ../lib/checkstl.h ../lib/checkstring.h ../lib/checktype.h ../lib/checkuninitvar.h ../lib/checkunusedvar.h ../lib/checkvaarg.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/standards.h ../lib/vfvalue.h +$(libcppdir)/checks.o: ../lib/checks.cpp ../lib/check.h ../lib/check64bit.h ../lib/checkassert.h ../lib/checkautovariables.h ../lib/checkbool.h ../lib/checkbufferoverrun.h ../lib/checkclass.h ../lib/checkcondition.h ../lib/checkexceptionsafety.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/checkio.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/checkother.h ../lib/checkpostfixoperator.h ../lib/checks.h ../lib/checksizeof.h ../lib/checkstl.h ../lib/checkstring.h ../lib/checktype.h ../lib/checkuninitvar.h ../lib/checkunusedvar.h ../lib/checkvaarg.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/standards.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp -$(libcppdir)/checksizeof.o: ../lib/checksizeof.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checksizeof.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checksizeof.o: ../lib/checksizeof.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checksizeof.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp -$(libcppdir)/checkstl.o: ../lib/checkstl.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checknullpointer.h ../lib/checkstl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/pathanalysis.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkstl.o: ../lib/checkstl.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkstl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/pathanalysis.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstl.cpp -$(libcppdir)/checkstring.o: ../lib/checkstring.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkstring.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkstring.o: ../lib/checkstring.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkstring.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstring.cpp -$(libcppdir)/checktype.o: ../lib/checktype.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checktype.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checktype.o: ../lib/checktype.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checktype.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checktype.cpp -$(libcppdir)/checkuninitvar.o: ../lib/checkuninitvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checknullpointer.h ../lib/checkuninitvar.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkuninitvar.o: ../lib/checkuninitvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkuninitvar.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkuninitvar.cpp $(libcppdir)/checkunusedfunctions.o: ../lib/checkunusedfunctions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/astutils.h ../lib/checkers.h ../lib/checkunusedfunctions.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedfunctions.cpp -$(libcppdir)/checkunusedvar.o: ../lib/checkunusedvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkunusedvar.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkunusedvar.o: ../lib/checkunusedvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkunusedvar.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedvar.cpp -$(libcppdir)/checkvaarg.o: ../lib/checkvaarg.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkvaarg.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkvaarg.o: ../lib/checkvaarg.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkvaarg.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkvaarg.cpp $(libcppdir)/clangimport.o: ../lib/clangimport.cpp ../lib/clangimport.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h diff --git a/test/test64bit.cpp b/test/test64bit.cpp index 6f9a5fbda2f..da837fd9a96 100644 --- a/test/test64bit.cpp +++ b/test/test64bit.cpp @@ -49,8 +49,7 @@ class Test64BitPortability : public TestFixture { SimpleTokenizer tokenizer(settings, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check char variable usage.. - Check64BitPortability check64BitPortability(&tokenizer, &settings, this); + Check64BitPortabilityImpl check64BitPortability(&tokenizer, &settings, this); check64BitPortability.pointerassignment(); } diff --git a/test/testcharvar.cpp b/test/testcharvar.cpp index 624efcff539..bb98dfad48d 100644 --- a/test/testcharvar.cpp +++ b/test/testcharvar.cpp @@ -47,7 +47,7 @@ class TestCharVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check char variable usage.. - CheckOther checkOther(&tokenizer, &settings, this); + CheckOtherImpl checkOther(&tokenizer, &settings, this); checkOther.checkCharVariable(); } diff --git a/test/testclass.cpp b/test/testclass.cpp index c1b801c208b..35994e98cf4 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -270,7 +270,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); (checkClass.checkCopyCtorAndEqOperator)(); } @@ -371,7 +371,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings0, this); + CheckClassImpl checkClass(&tokenizer, &settings0, this); (checkClass.checkExplicitConstructors)(); } @@ -528,7 +528,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, &settings1, this); (checkClass.checkDuplInheritedMembers)(); } @@ -752,7 +752,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings3, this); + CheckClassImpl checkClass(&tokenizer, &settings3, this); checkClass.copyconstructors(); } @@ -1223,7 +1223,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings0, this); + CheckClassImpl checkClass(&tokenizer, &settings0, this); checkClass.operatorEqRetRefThis(); } @@ -1694,7 +1694,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, &settings1, this); checkClass.operatorEqToSelf(); } @@ -2657,7 +2657,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &s, this); + CheckClassImpl checkClass(&tokenizer, &s, this); checkClass.virtualDestructor(); } @@ -2994,7 +2994,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); checkClass.checkMemset(); } @@ -3640,7 +3640,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, &settings1, this); checkClass.thisSubtraction(); } @@ -3680,7 +3680,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); (checkClass.checkConst)(); } @@ -7863,7 +7863,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings2, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClass checkClass(&tokenizer, &settings2, this); + CheckClassImpl checkClass(&tokenizer, &settings2, this); checkClass.initializerListOrder(); } @@ -8017,7 +8017,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); checkClass.initializationListUsage(); } @@ -8241,7 +8241,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings0, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClass checkClass(&tokenizer, &settings0, this); + CheckClassImpl checkClass(&tokenizer, &settings0, this); (checkClass.checkSelfInitialization)(); } @@ -8351,7 +8351,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); checkClass.checkVirtualFunctionCallInConstructor(); } @@ -8696,7 +8696,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); (checkClass.checkOverride)(); } @@ -8908,7 +8908,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); (checkClass.checkUselessOverride)(); } @@ -9098,7 +9098,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); (checkClass.checkUnsafeClassRefMember)(); } @@ -9116,7 +9116,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, &settings1, this); (checkClass.checkThisUseAfterFree)(); } @@ -9353,7 +9353,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check.. - CheckClass checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, &settings, this); (checkClass.checkReturnByReference)(); } diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 0eb91ba8cca..8bec74529b6 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -52,7 +52,7 @@ class TestConstructors : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check class constructors.. - CheckClass checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, &settings1, this); checkClass.constructors(); } diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index 3d8f5d4d713..bd94b52af0e 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -50,7 +50,7 @@ class TestIncompleteStatement : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for incomplete statements.. - CheckOther checkOther(&tokenizer, &settings1, this); + CheckOtherImpl checkOther(&tokenizer, &settings1, this); checkOther.checkIncompleteStatement(); } diff --git a/test/testio.cpp b/test/testio.cpp index d3344f76b8d..bc6e40034f6 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -109,7 +109,7 @@ class TestIO : public TestFixture { // Check.. if (options.onlyFormatStr) { - CheckIO checkIO(&tokenizer, &settings1, this); + CheckIOImpl checkIO(&tokenizer, &settings1, this); checkIO.checkWrongPrintfScanfArguments(); return; } diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 1ed88120886..8982215d8e3 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -39,13 +39,12 @@ class TestMemleak : public TestFixture { #define functionReturnType(...) functionReturnType_(__FILE__, __LINE__, __VA_ARGS__) template - CheckMemoryLeak::AllocType functionReturnType_(const char* file, int line, const char (&code)[size]) { + CheckMemoryLeakImpl::AllocType functionReturnType_(const char* file, int line, const char (&code)[size]) { // Tokenize.. SimpleTokenizer tokenizer(settingsDefault, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - const CheckMemoryLeak c(&tokenizer, this, &settingsDefault); - + const CheckMemoryLeakImpl c(&tokenizer, &settingsDefault, this); return (c.functionReturnType)(&tokenizer.getSymbolDatabase()->scopeList.front().functionList.front()); } @@ -53,19 +52,19 @@ class TestMemleak : public TestFixture { { const char code[] = "const char *foo()\n" "{ return 0; }"; - ASSERT_EQUALS(CheckMemoryLeak::No, functionReturnType(code)); + ASSERT_EQUALS(CheckMemoryLeakImpl::No, functionReturnType(code)); } { const char code[] = "Fred *newFred()\n" "{ return new Fred; }"; - ASSERT_EQUALS(CheckMemoryLeak::New, functionReturnType(code)); + ASSERT_EQUALS(CheckMemoryLeakImpl::New, functionReturnType(code)); } { const char code[] = "char *foo()\n" "{ return new char[100]; }"; - ASSERT_EQUALS(CheckMemoryLeak::NewArray, functionReturnType(code)); + ASSERT_EQUALS(CheckMemoryLeakImpl::NewArray, functionReturnType(code)); } { @@ -74,7 +73,7 @@ class TestMemleak : public TestFixture { " char *p = new char[100];\n" " return p;\n" "}"; - ASSERT_EQUALS(CheckMemoryLeak::NewArray, functionReturnType(code)); + ASSERT_EQUALS(CheckMemoryLeakImpl::NewArray, functionReturnType(code)); } } @@ -94,8 +93,8 @@ class TestMemleak : public TestFixture { // there is no allocation const Token *tok = Token::findsimplematch(tokenizer.tokens(), "ret ="); - const CheckMemoryLeak check(&tokenizer, nullptr, &settingsDefault); - ASSERT_EQUALS(CheckMemoryLeak::No, check.getAllocationType(tok->tokAt(2), 1)); + const CheckMemoryLeakImpl check(&tokenizer, &settingsDefault, nullptr); + ASSERT_EQUALS(CheckMemoryLeakImpl::No, check.getAllocationType(tok->tokAt(2), 1)); } }; @@ -120,7 +119,7 @@ class TestMemleakInFunction : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakInFunction checkMemoryLeak(&tokenizer, &settings, this); + CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, &settings, this); checkMemoryLeak.checkReallocUsage(); } @@ -502,7 +501,7 @@ class TestMemleakInClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakInClass checkMemoryLeak(&tokenizer, &settings, this); + CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, &settings, this); (checkMemoryLeak.check)(); } @@ -1707,7 +1706,7 @@ class TestMemleakStructMember : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakStructMember checkMemoryLeakStructMember(&tokenizer, &settings, this); + CheckMemoryLeakStructMemberImpl checkMemoryLeakStructMember(&tokenizer, &settings, this); (checkMemoryLeakStructMember.check)(); } @@ -2389,7 +2388,7 @@ class TestMemleakNoVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakNoVar checkMemoryLeakNoVar(&tokenizer, &settings, this); + CheckMemoryLeakNoVarImpl checkMemoryLeakNoVar(&tokenizer, &settings, this); (checkMemoryLeakNoVar.check)(); } diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index a154bd0d9c2..3e9d4011500 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -4351,7 +4351,7 @@ class TestNullPointer : public TestFixture { Library library; ASSERT(LibraryHelper::loadxmldata(library, xmldata, sizeof(xmldata))); - const std::list null = CheckNullPointer::parseFunctionCall(*xtok, library); + const std::list null = CheckNullPointerImpl::parseFunctionCall(*xtok, library); ASSERT_EQUALS(0U, null.size()); } @@ -4369,7 +4369,7 @@ class TestNullPointer : public TestFixture { Library library; ASSERT(LibraryHelper::loadxmldata(library, xmldata, sizeof(xmldata))); - const std::list null = CheckNullPointer::parseFunctionCall(*xtok, library); + const std::list null = CheckNullPointerImpl::parseFunctionCall(*xtok, library); ASSERT_EQUALS(1U, null.size()); ASSERT_EQUALS("a", null.front()->str()); } diff --git a/test/testother.cpp b/test/testother.cpp index 9a18a067231..321657c668f 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -2055,7 +2055,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizerCpp(settings, *this); ASSERT_LOC(tokenizerCpp.tokenize(code), file, line); - CheckOther checkOtherCpp(&tokenizerCpp, &settings, this); + CheckOtherImpl checkOtherCpp(&tokenizerCpp, &settings, this); checkOtherCpp.warningOldStylePointerCast(); checkOtherCpp.warningDangerousTypeCast(); } @@ -2341,7 +2341,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizerCpp(settings, *this); ASSERT_LOC(tokenizerCpp.tokenize(code), file, line); - CheckOther checkOtherCpp(&tokenizerCpp, &settings, this); + CheckOtherImpl checkOtherCpp(&tokenizerCpp, &settings, this); checkOtherCpp.warningIntToPointerCast(); } @@ -2380,7 +2380,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckOther checkOtherCpp(&tokenizer, &settings, this); + CheckOtherImpl checkOtherCpp(&tokenizer, &settings, this); checkOtherCpp.invalidPointerCast(); } diff --git a/test/testpostfixoperator.cpp b/test/testpostfixoperator.cpp index 9e95fabc949..1d01217231a 100644 --- a/test/testpostfixoperator.cpp +++ b/test/testpostfixoperator.cpp @@ -38,8 +38,7 @@ class TestPostfixOperator : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - // Check for postfix operators.. - CheckPostfixOperator checkPostfixOperator(&tokenizer, &settings, this); + CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, &settings, this); checkPostfixOperator.postfixOperator(); } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 6fe563a57ca..6ad2047ddd7 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -127,7 +127,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVar checkuninitvar(&tokenizer, &settings1, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, &settings1, this); checkuninitvar.check(); } @@ -137,7 +137,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVar checkuninitvar(&tokenizer, &settings, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, &settings, this); checkuninitvar.check(); } @@ -3673,7 +3673,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVar checkuninitvar(&tokenizer, &settings, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, &settings, this); (checkuninitvar.valueFlowUninit)(); } diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index 5a364347163..3b419814dca 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -104,7 +104,7 @@ class TestUnusedPrivateFunction : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused private functions.. - CheckClass checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, &settings1, this); checkClass.privateFunctions(); } diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 13d288a3fdd..d0ad22b004d 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -290,7 +290,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for unused variables.. - CheckUnusedVar checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); checkUnusedVar.checkFunctionVariableUsage(); } @@ -310,7 +310,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for unused variables.. - CheckUnusedVar checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); (checkUnusedVar.checkStructMemberUsage)(); } @@ -323,7 +323,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused variables.. - CheckUnusedVar checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); (checkUnusedVar.checkStructMemberUsage)(); } @@ -336,7 +336,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused variables.. - CheckUnusedVar checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); (checkUnusedVar.checkFunctionVariableUsage)(); } diff --git a/tools/dmake/dmake.cpp b/tools/dmake/dmake.cpp index 80f3aa35b83..3d08943f5ba 100644 --- a/tools/dmake/dmake.cpp +++ b/tools/dmake/dmake.cpp @@ -495,6 +495,7 @@ int main(int argc, char **argv) } libfiles_h.emplace("analyzer.h"); libfiles_h.emplace("calculate.h"); + libfiles_h.emplace("check.h"); libfiles_h.emplace("config.h"); libfiles_h.emplace("filesettings.h"); libfiles_h.emplace("findtoken.h"); @@ -559,7 +560,7 @@ int main(int argc, char **argv) for (const std::string &libfile: libfiles_prio) { const std::string l = libfile.substr(4); - outstr += make_vcxproj_cl_entry(l, l == "check.cpp" ? Precompile : Compile); + outstr += make_vcxproj_cl_entry(l, l == "checkimpl.cpp" ? Precompile : Compile); } }, [&](std::string &outstr){ outstr += make_vcxproj_cl_entry(R"(..\externals\simplecpp\simplecpp.h)", Include); From 98ac18eeb23068afe80ef72e853aac72a29a6d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 29 May 2026 10:26:43 +0200 Subject: [PATCH 030/171] pass `Settings` by reference in checks (#8593) --- lib/check.h | 2 +- lib/check64bit.cpp | 12 +- lib/check64bit.h | 4 +- lib/checkassert.cpp | 10 +- lib/checkassert.h | 4 +- lib/checkautovariables.cpp | 52 +++--- lib/checkautovariables.h | 4 +- lib/checkbool.cpp | 32 ++-- lib/checkbool.h | 4 +- lib/checkbufferoverrun.cpp | 48 ++--- lib/checkbufferoverrun.h | 4 +- lib/checkclass.cpp | 132 +++++++------- lib/checkclass.h | 4 +- lib/checkcondition.cpp | 120 ++++++------- lib/checkcondition.h | 4 +- lib/checkexceptionsafety.cpp | 22 +-- lib/checkexceptionsafety.h | 4 +- lib/checkfunctions.cpp | 98 +++++----- lib/checkfunctions.h | 4 +- lib/checkimpl.cpp | 6 +- lib/checkimpl.h | 4 +- lib/checkinternal.cpp | 4 +- lib/checkinternal.h | 4 +- lib/checkio.cpp | 62 +++---- lib/checkio.h | 4 +- lib/checkleakautovar.cpp | 66 +++---- lib/checkleakautovar.h | 4 +- lib/checkmemoryleak.cpp | 80 ++++----- lib/checkmemoryleak.h | 18 +- lib/checknullpointer.cpp | 24 +-- lib/checknullpointer.h | 4 +- lib/checkother.cpp | 298 +++++++++++++++---------------- lib/checkother.h | 4 +- lib/checkpostfixoperator.cpp | 6 +- lib/checkpostfixoperator.h | 4 +- lib/checksizeof.cpp | 24 +-- lib/checksizeof.h | 4 +- lib/checkstl.cpp | 112 ++++++------ lib/checkstl.h | 4 +- lib/checkstring.cpp | 20 +-- lib/checkstring.h | 4 +- lib/checktype.cpp | 72 ++++---- lib/checktype.h | 4 +- lib/checkuninitvar.cpp | 34 ++-- lib/checkuninitvar.h | 4 +- lib/checkunusedvar.cpp | 40 ++--- lib/checkunusedvar.h | 4 +- lib/checkvaarg.cpp | 8 +- lib/checkvaarg.h | 4 +- lib/cppcheck.cpp | 2 +- test/test64bit.cpp | 2 +- test/testbufferoverrun.cpp | 2 +- test/testcharvar.cpp | 2 +- test/testclass.cpp | 38 ++-- test/testconstructors.cpp | 2 +- test/testincompletestatement.cpp | 2 +- test/testio.cpp | 2 +- test/testmemleak.cpp | 12 +- test/testother.cpp | 6 +- test/testpostfixoperator.cpp | 2 +- test/testuninitvar.cpp | 6 +- test/testunusedprivfunc.cpp | 2 +- test/testunusedvar.cpp | 8 +- 63 files changed, 791 insertions(+), 791 deletions(-) diff --git a/lib/check.h b/lib/check.h index 768cc889c62..019b77e148e 100644 --- a/lib/check.h +++ b/lib/check.h @@ -65,7 +65,7 @@ class CPPCHECKLIB Check { virtual void runChecks(const Tokenizer &, ErrorLogger *) = 0; /** get error messages */ - virtual void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const = 0; + virtual void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const = 0; /** class name, used to generate documentation */ const std::string& name() const { diff --git a/lib/check64bit.cpp b/lib/check64bit.cpp index e1e6f086ff3..6c45c68aaeb 100644 --- a/lib/check64bit.cpp +++ b/lib/check64bit.cpp @@ -36,12 +36,12 @@ // CWE ids used static const CWE CWE758(758U); // Reliance on Undefined, Unspecified, or Implementation-Defined Behavior -static bool is32BitIntegerReturn(const Function* func, const Settings* settings) +static bool is32BitIntegerReturn(const Function* func, const Settings& settings) { - if (settings->platform.sizeof_pointer != 8) + if (settings.platform.sizeof_pointer != 8) return false; const ValueType* vt = func->arg->valueType(); - return vt && vt->pointer == 0 && vt->isIntegral() && vt->getSizeOf(*settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer) == 4; + return vt && vt->pointer == 0 && vt->isIntegral() && vt->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer) == 4; } static bool isFunctionPointer(const Token* tok) @@ -53,7 +53,7 @@ static bool isFunctionPointer(const Token* tok) void Check64BitPortabilityImpl::pointerassignment() { - if (!mSettings->severity.isEnabled(Severity::portability)) + if (!mSettings.severity.isEnabled(Severity::portability)) return; logChecker("Check64BitPortability::pointerassignment"); // portability @@ -185,11 +185,11 @@ void Check64BitPortabilityImpl::returnIntegerError(const Token *tok) void Check64BitPortability::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - Check64BitPortabilityImpl check64BitPortability(&tokenizer, &tokenizer.getSettings(), errorLogger); + Check64BitPortabilityImpl check64BitPortability(&tokenizer, tokenizer.getSettings(), errorLogger); check64BitPortability.pointerassignment(); } -void Check64BitPortability::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void Check64BitPortability::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { Check64BitPortabilityImpl c(nullptr, settings, errorLogger); c.assignmentAddressToIntegerError(nullptr); diff --git a/lib/check64bit.h b/lib/check64bit.h index 1996d91ee23..160df94b990 100644 --- a/lib/check64bit.h +++ b/lib/check64bit.h @@ -51,7 +51,7 @@ class CPPCHECKLIB Check64BitPortability : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check if there is 64-bit portability issues:\n" @@ -63,7 +63,7 @@ class CPPCHECKLIB Check64BitPortability : public Check { class CPPCHECKLIB Check64BitPortabilityImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - Check64BitPortabilityImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + Check64BitPortabilityImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Check for pointer assignment */ diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 5242b595e67..3ae06984c7b 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -41,7 +41,7 @@ static const CWE CWE398(398U); // Indicator of Poor Code Quality void CheckAssertImpl::assertWithSideEffects() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckAssert::assertWithSideEffects"); // warning @@ -58,7 +58,7 @@ void CheckAssertImpl::assertWithSideEffects() checkVariableAssignment(tmp, tok->scope()); if (tmp->tokType() != Token::eFunction) { - if (const Library::Function* f = mSettings->library.getFunction(tmp)) { + if (const Library::Function* f = mSettings.library.getFunction(tmp)) { if (f->isconst || f->ispure) continue; if (Library::getContainerYield(tmp->next()) != Library::Container::Yield::NO_YIELD) // bailout, assume read access @@ -73,7 +73,7 @@ void CheckAssertImpl::assertWithSideEffects() f->containerYield == Library::Container::Yield::END_ITERATOR || f->containerYield == Library::Container::Yield::ITERATOR) continue; - sideEffectInAssertError(tmp, mSettings->library.getFunctionName(tmp)); + sideEffectInAssertError(tmp, mSettings.library.getFunctionName(tmp)); } continue; } @@ -180,11 +180,11 @@ bool CheckAssertImpl::inSameScope(const Token* returnTok, const Token* assignTok void CheckAssert::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckAssertImpl checkAssert(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckAssertImpl checkAssert(&tokenizer, tokenizer.getSettings(), errorLogger); checkAssert.assertWithSideEffects(); } -void CheckAssert::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckAssert::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckAssertImpl c(nullptr, settings, errorLogger); c.sideEffectInAssertError(nullptr, "function"); diff --git a/lib/checkassert.h b/lib/checkassert.h index 3fac8f5af83..6a4e1f45de2 100644 --- a/lib/checkassert.h +++ b/lib/checkassert.h @@ -48,7 +48,7 @@ class CPPCHECKLIB CheckAssert : public Check { private: /** run checks, the token list is not simplified */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Warn if there are side effects in assert statements (since this cause different behaviour in debug/release builds).\n"; @@ -57,7 +57,7 @@ class CPPCHECKLIB CheckAssert : public Check { class CPPCHECKLIB CheckAssertImpl : public CheckImpl { public: - CheckAssertImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckAssertImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} void assertWithSideEffects(); diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index 0d3cae1c2fa..48ca74253a5 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -204,9 +204,9 @@ static bool variableIsUsedInScope(const Token* start, nonneg int varId, const Sc void CheckAutoVariablesImpl::assignFunctionArg() { - const bool printStyle = mSettings->severity.isEnabled(Severity::style); - const bool printWarning = mSettings->severity.isEnabled(Severity::warning); - if (!printStyle && !printWarning && !mSettings->isPremiumEnabled("uselessAssignmentPtrArg")) + const bool printStyle = mSettings.severity.isEnabled(Severity::style); + const bool printWarning = mSettings.severity.isEnabled(Severity::warning); + if (!printStyle && !printWarning && !mSettings.isPremiumEnabled("uselessAssignmentPtrArg")) return; logChecker("CheckAutoVariables::assignFunctionArg"); // style,warning @@ -284,7 +284,7 @@ void CheckAutoVariablesImpl::autoVariables() { logChecker("CheckAutoVariables::autoVariables"); - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope * scope : symbolDatabase->functionScopes) { for (const Token *tok = scope->bodyStart; tok && tok != scope->bodyEnd; tok = tok->next()) { @@ -295,27 +295,27 @@ void CheckAutoVariablesImpl::autoVariables() } // Critical assignment const Token* rhs{}; - if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2(), *mSettings)) { + if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2(), mSettings)) { checkAutoVariableAssignment(tok->next(), false); - } else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2(), *mSettings)) { + } else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2(), mSettings)) { const Token* lhs = tok->tokAt(2); bool inconclusive = false; if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive)) checkAutoVariableAssignment(tok->next(), inconclusive); tok = tok->tokAt(4); - } else if (isMemberAssignment(tok, rhs, *mSettings)) { + } else if (isMemberAssignment(tok, rhs, mSettings)) { const Token* lhs = tok->tokAt(3); bool inconclusive = false; if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive)) checkAutoVariableAssignment(tok->next(), inconclusive); tok = rhs; } else if (Token::Match(tok, "[;{}] %var% [") && Token::simpleMatch(tok->linkAt(2), "] =") && - (isPtrArg(tok->next()) || isArrayArg(tok->next(), *mSettings)) && - isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2(), *mSettings)) { + (isPtrArg(tok->next()) || isArrayArg(tok->next(), mSettings)) && + isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2(), mSettings)) { errorAutoVariableAssignment(tok->next(), false); } // Invalid pointer deallocation - else if ((Token::Match(tok, "%name% ( %var%|%str% ) ;") && mSettings->library.getDeallocFuncInfo(tok)) || + else if ((Token::Match(tok, "%name% ( %var%|%str% ) ;") && mSettings.library.getDeallocFuncInfo(tok)) || (tok->isCpp() && Token::Match(tok, "delete [| ]| (| %var%|%str% !!["))) { tok = Token::findmatch(tok->next(), "%var%|%str%"); if (Token::simpleMatch(tok->astParent(), ".")) @@ -333,7 +333,7 @@ void CheckAutoVariablesImpl::autoVariables() } } } - } else if ((Token::Match(tok, "%name% ( & %var% ) ;") && mSettings->library.getDeallocFuncInfo(tok)) || + } else if ((Token::Match(tok, "%name% ( & %var% ) ;") && mSettings.library.getDeallocFuncInfo(tok)) || (tok->isCpp() && Token::Match(tok, "delete [| ]| (| & %var% !!["))) { tok = Token::findmatch(tok->next(), "%var%"); if (isAutoVar(tok)) @@ -564,7 +564,7 @@ static bool isAssignedToNonLocal(const Token* tok) void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const Token * end) { - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); if (!start) return; const Scope * scope = start->scope(); @@ -577,7 +577,7 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To for (const Token *tok = start; tok && tok != end; tok = tok->next()) { // Return reference from function if (returnRef && Token::simpleMatch(tok->astParent(), "return")) { - for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(tok, *mSettings, true)) { + for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(tok, mSettings, true)) { if (!printInconclusive && lt.inconclusive) continue; const Variable* var = lt.token->variable(); @@ -586,7 +586,7 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To errorReturnReference(tok, lt.errorPath, lt.inconclusive); break; } - if (isDeadTemporary(lt.token, nullptr, mSettings->library)) { + if (isDeadTemporary(lt.token, nullptr, mSettings.library)) { errorReturnTempReference(tok, lt.errorPath, lt.inconclusive); break; } @@ -597,18 +597,18 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To tok->variable()->declarationId() == tok->varId() && tok->variable()->isStatic() && !tok->variable()->isArgument()) { ErrorPath errorPath; - const Variable *var = ValueFlow::getLifetimeVariable(tok, errorPath, *mSettings); + const Variable *var = ValueFlow::getLifetimeVariable(tok, errorPath, mSettings); if (var && isInScope(var->nameToken(), tok->scope())) { errorDanglingReference(tok, var, std::move(errorPath)); continue; } // Reference to temporary } else if (tok->variable() && (tok->variable()->isReference() || tok->variable()->isRValueReference())) { - for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(getParentLifetime(tok), *mSettings)) { + for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(getParentLifetime(tok), mSettings)) { if (!printInconclusive && lt.inconclusive) continue; const Token * tokvalue = lt.token; - if (isDeadTemporary(tokvalue, tok, mSettings->library)) { + if (isDeadTemporary(tokvalue, tok, mSettings.library)) { errorDanglingTempReference(tok, lt.errorPath, lt.inconclusive); break; } @@ -622,23 +622,23 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To continue; if (!printInconclusive && val.isInconclusive()) continue; - const Token* parent = getParentLifetime(val.tokvalue, mSettings->library); + const Token* parent = getParentLifetime(val.tokvalue, mSettings.library); if (!exprs.insert(parent).second) continue; - for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(parent, *mSettings, escape || isAssignedToNonLocal(tok))) { + for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(parent, mSettings, escape || isAssignedToNonLocal(tok))) { const Token * tokvalue = lt.token; if (val.isLocalLifetimeValue()) { if (escape) { if (getPointerDepth(tok) < getPointerDepth(tokvalue)) continue; - if (!ValueFlow::isLifetimeBorrowed(tok, *mSettings)) + if (!ValueFlow::isLifetimeBorrowed(tok, mSettings)) continue; if (tokvalue->exprId() == tok->exprId() && !(tok->variable() && tok->variable()->isArray()) && !astIsContainerView(tok->astParent())) continue; if ((tokvalue->variable() && !isEscapedReference(tokvalue->variable()) && isInScope(tokvalue->variable()->nameToken(), scope)) || - isDeadTemporary(tokvalue, nullptr, mSettings->library)) { + isDeadTemporary(tokvalue, nullptr, mSettings.library)) { if (!diag(tokvalue)) errorReturnDanglingLifetime(tok, &val); break; @@ -647,7 +647,7 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To errorInvalidLifetime(tok, &val); break; } else if (!tokvalue->variable() && - isDeadTemporary(tokvalue, tok, mSettings->library)) { + isDeadTemporary(tokvalue, tok, mSettings.library)) { if (!diag(tokvalue)) errorDanglingTemporaryLifetime(tok, &val, tokvalue); break; @@ -665,7 +665,7 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To } else if (tok->variable() && tok->variable()->declarationId() == tok->varId()) { var = tok->variable(); } - if (!ValueFlow::isLifetimeBorrowed(tok, *mSettings)) + if (!ValueFlow::isLifetimeBorrowed(tok, mSettings)) continue; const Token* nextTok = nextAfterAstRightmostLeaf(tok->astTop()); if (!nextTok) @@ -677,7 +677,7 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To var->valueType() ? var->valueType()->pointer : 0, var->declarationId(), var->isGlobal(), - *mSettings)) { + mSettings)) { if (!diag(tok2)) errorDanglngLifetime(tok2, &val, var->isLocal()); break; @@ -819,13 +819,13 @@ void CheckAutoVariablesImpl::errorInvalidDeallocation(const Token *tok, const Va void CheckAutoVariables::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckAutoVariablesImpl checkAutoVariables(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckAutoVariablesImpl checkAutoVariables(&tokenizer, tokenizer.getSettings(), errorLogger); checkAutoVariables.assignFunctionArg(); checkAutoVariables.autoVariables(); checkAutoVariables.checkVarLifetime(); } -void CheckAutoVariables::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckAutoVariables::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckAutoVariablesImpl c(nullptr,settings,errorLogger); c.errorAutoVariableAssignment(nullptr, false); diff --git a/lib/checkautovariables.h b/lib/checkautovariables.h index 39e6ceb10d5..77deef00113 100644 --- a/lib/checkautovariables.h +++ b/lib/checkautovariables.h @@ -54,7 +54,7 @@ class CPPCHECKLIB CheckAutoVariables : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "A pointer to a variable is only valid as long as the variable is in scope.\n" @@ -72,7 +72,7 @@ class CPPCHECKLIB CheckAutoVariablesImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckAutoVariablesImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckAutoVariablesImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** assign function argument */ diff --git a/lib/checkbool.cpp b/lib/checkbool.cpp index e4f55f26085..a216307ad2e 100644 --- a/lib/checkbool.cpp +++ b/lib/checkbool.cpp @@ -45,7 +45,7 @@ static bool isBool(const Variable* var) //--------------------------------------------------------------------------- void CheckBoolImpl::checkIncrementBoolean() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("incrementboolean")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("incrementboolean")) return; logChecker("CheckBool::checkIncrementBoolean"); // style @@ -85,11 +85,11 @@ static bool isConvertedToBool(const Token* tok) //--------------------------------------------------------------------------- void CheckBoolImpl::checkBitwiseOnBoolean() { - if (!mSettings->isPremiumEnabled("bitwiseOnBoolean") && - !mSettings->severity.isEnabled(Severity::style) && + if (!mSettings.isPremiumEnabled("bitwiseOnBoolean") && + !mSettings.severity.isEnabled(Severity::style) && // danmar: this is inconclusive because I don't like that there are // warnings for calculations. Example: set_flag(a & b); - !mSettings->certainty.isEnabled(Certainty::inconclusive)) + !mSettings.certainty.isEnabled(Certainty::inconclusive)) return; logChecker("CheckBool::checkBitwiseOnBoolean"); // style,inconclusive @@ -116,7 +116,7 @@ void CheckBoolImpl::checkBitwiseOnBoolean() if (tok->str() == "|" && !isConvertedToBool(tok) && !(isBoolOp1 && isBoolOp2)) continue; // first operand will always be evaluated - if (!isConstExpression(tok->astOperand2(), mSettings->library)) + if (!isConstExpression(tok->astOperand2(), mSettings.library)) continue; if (tok->astOperand2()->variable() && tok->astOperand2()->variable()->nameToken() == tok->astOperand2()) continue; @@ -146,7 +146,7 @@ void CheckBoolImpl::bitwiseOnBooleanError(const Token* tok, const std::string& e void CheckBoolImpl::checkComparisonOfBoolWithInt() { - if (!mSettings->severity.isEnabled(Severity::warning) || !mTokenizer->isCPP()) + if (!mSettings.severity.isEnabled(Severity::warning) || !mTokenizer->isCPP()) return; logChecker("CheckBool::checkComparisonOfBoolWithInt"); // warning,c++ @@ -197,7 +197,7 @@ static bool tokenIsFunctionReturningBool(const Token* tok) void CheckBoolImpl::checkComparisonOfFuncReturningBool() { - if (!mSettings->severity.isEnabled(Severity::style)) + if (!mSettings.severity.isEnabled(Severity::style)) return; if (!mTokenizer->isCPP()) @@ -263,7 +263,7 @@ void CheckBoolImpl::comparisonOfTwoFuncsReturningBoolError(const Token *tok, con void CheckBoolImpl::checkComparisonOfBoolWithBool() { - if (!mSettings->severity.isEnabled(Severity::style)) + if (!mSettings.severity.isEnabled(Severity::style)) return; if (!mTokenizer->isCPP()) @@ -335,7 +335,7 @@ void CheckBoolImpl::assignBoolToPointerError(const Token *tok) //----------------------------------------------------------------------------- void CheckBoolImpl::checkComparisonOfBoolExpressionWithInt() { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("compareBoolExpressionWithInt")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("compareBoolExpressionWithInt")) return; logChecker("CheckBool::checkComparisonOfBoolExpressionWithInt"); // warning @@ -373,13 +373,13 @@ void CheckBoolImpl::checkComparisonOfBoolExpressionWithInt() if (astIsBool(numTok)) continue; - const ValueFlow::Value *minval = numTok->getValueLE(0, *mSettings); + const ValueFlow::Value *minval = numTok->getValueLE(0, mSettings); if (minval && minval->intvalue == 0 && (numInRhs ? Token::Match(tok, ">|==|!=") : Token::Match(tok, "<|==|!="))) minval = nullptr; - const ValueFlow::Value *maxval = numTok->getValueGE(1, *mSettings); + const ValueFlow::Value *maxval = numTok->getValueGE(1, mSettings); if (maxval && maxval->intvalue == 1 && (numInRhs ? Token::Match(tok, "<|==|!=") : Token::Match(tok, ">|==|!="))) @@ -460,7 +460,7 @@ void CheckBoolImpl::checkAssignBoolToFloat() { if (!mTokenizer->isCPP()) return; - if (!mSettings->severity.isEnabled(Severity::style)) + if (!mSettings.severity.isEnabled(Severity::style)) return; logChecker("CheckBool::checkAssignBoolToFloat"); // style,c++ const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -481,7 +481,7 @@ void CheckBoolImpl::assignBoolToFloatError(const Token *tok) void CheckBoolImpl::returnValueOfFunctionReturningBool() { - if (!mSettings->severity.isEnabled(Severity::style)) + if (!mSettings.severity.isEnabled(Severity::style)) return; logChecker("CheckBool::returnValueOfFunctionReturningBool"); // style @@ -500,7 +500,7 @@ void CheckBoolImpl::returnValueOfFunctionReturningBool() else if (tok->scope() && tok->scope()->isClassOrStruct()) tok = tok->scope()->bodyEnd; else if (Token::simpleMatch(tok, "return") && tok->astOperand1() && - (tok->astOperand1()->getValueGE(2, *mSettings) || tok->astOperand1()->getValueLE(-1, *mSettings)) && + (tok->astOperand1()->getValueGE(2, mSettings) || tok->astOperand1()->getValueLE(-1, mSettings)) && !(tok->astOperand1()->astOperand1() && Token::Match(tok->astOperand1(), "&|%or%"))) returnValueBoolError(tok); } @@ -514,7 +514,7 @@ void CheckBoolImpl::returnValueBoolError(const Token *tok) void CheckBool::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckBoolImpl checkBool(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckBoolImpl checkBool(&tokenizer, tokenizer.getSettings(), errorLogger); // Checks checkBool.checkComparisonOfBoolExpressionWithInt(); @@ -529,7 +529,7 @@ void CheckBool::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkBool.checkBitwiseOnBoolean(); } -void CheckBool::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckBool::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckBoolImpl c(nullptr, settings, errorLogger); c.assignBoolToPointerError(nullptr); diff --git a/lib/checkbool.h b/lib/checkbool.h index 607d9c4a4b7..2d523732682 100644 --- a/lib/checkbool.h +++ b/lib/checkbool.h @@ -48,7 +48,7 @@ class CPPCHECKLIB CheckBool : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Boolean type checks\n" @@ -67,7 +67,7 @@ class CPPCHECKLIB CheckBoolImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckBoolImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckBoolImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for comparison of function returning bool*/ diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 592e4268f58..7f0612963b9 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -323,7 +323,7 @@ void CheckBufferOverrunImpl::arrayIndex() ErrorPath errorPath; bool mightBeLarger = false; MathLib::bigint path = 0; - if (!getDimensionsEtc(tok->astOperand1(), *mSettings, dimensions, errorPath, mightBeLarger, path)) + if (!getDimensionsEtc(tok->astOperand1(), mSettings, dimensions, errorPath, mightBeLarger, path)) continue; const Variable* const var = array->variable(); @@ -331,7 +331,7 @@ void CheckBufferOverrunImpl::arrayIndex() const Token* changeTok = var->scope()->bodyStart; bool isChanged = false; while ((changeTok = findVariableChanged(changeTok->next(), var->scope()->bodyEnd, /*indirect*/ 0, var->declarationId(), - /*globalvar*/ false, *mSettings))) { + /*globalvar*/ false, mSettings))) { if (!Token::simpleMatch(changeTok->astParent(), "[")) { isChanged = true; break; @@ -353,7 +353,7 @@ void CheckBufferOverrunImpl::arrayIndex() bool neg = false; std::vector negativeIndexes; for (const Token * indexToken : indexTokens) { - const ValueFlow::Value *negativeValue = indexToken->getValueLE(-1, *mSettings); + const ValueFlow::Value *negativeValue = indexToken->getValueLE(-1, mSettings); if (negativeValue) { negativeIndexes.emplace_back(*negativeValue); neg = true; @@ -418,7 +418,7 @@ void CheckBufferOverrunImpl::arrayIndexError(const Token* tok, const Token *condition = nullptr; const ValueFlow::Value *index = nullptr; for (const ValueFlow::Value& indexValue : indexes) { - if (!indexValue.errorSeverity() && !mSettings->severity.isEnabled(Severity::warning)) + if (!indexValue.errorSeverity() && !mSettings.severity.isEnabled(Severity::warning)) return; if (indexValue.condition) condition = indexValue.condition; @@ -446,7 +446,7 @@ void CheckBufferOverrunImpl::negativeIndexError(const Token* tok, const Token *condition = nullptr; const ValueFlow::Value *negativeValue = nullptr; for (const ValueFlow::Value& indexValue : indexes) { - if (!indexValue.errorSeverity() && !mSettings->severity.isEnabled(Severity::warning)) + if (!indexValue.errorSeverity() && !mSettings.severity.isEnabled(Severity::warning)) return; if (indexValue.condition) condition = indexValue.condition; @@ -466,7 +466,7 @@ void CheckBufferOverrunImpl::negativeIndexError(const Token* tok, void CheckBufferOverrunImpl::pointerArithmetic() { - if (!mSettings->severity.isEnabled(Severity::portability) && !mSettings->isPremiumEnabled("pointerOutOfBounds")) + if (!mSettings.severity.isEnabled(Severity::portability) && !mSettings.isPremiumEnabled("pointerOutOfBounds")) return; logChecker("CheckBufferOverrun::pointerArithmetic"); // portability @@ -497,7 +497,7 @@ void CheckBufferOverrunImpl::pointerArithmetic() ErrorPath errorPath; bool mightBeLarger = false; MathLib::bigint path = 0; - if (!getDimensionsEtc(arrayToken, *mSettings, dimensions, errorPath, mightBeLarger, path)) + if (!getDimensionsEtc(arrayToken, mSettings, dimensions, errorPath, mightBeLarger, path)) continue; if (tok->str() == "+") { @@ -510,7 +510,7 @@ void CheckBufferOverrunImpl::pointerArithmetic() pointerArithmeticError(tok, indexToken, &indexValues.front()); } - if (const ValueFlow::Value *neg = indexToken->getValueLE(-1, *mSettings)) + if (const ValueFlow::Value *neg = indexToken->getValueLE(-1, mSettings)) pointerArithmeticError(tok, indexToken, neg); } else if (tok->str() == "-") { if (arrayToken->variable() && arrayToken->variable()->isArgument()) @@ -520,7 +520,7 @@ void CheckBufferOverrunImpl::pointerArithmetic() while (Token::Match(array, ".|::")) array = array->astOperand2(); if (array->variable() && array->variable()->isArray()) { - const ValueFlow::Value *v = indexToken->getValueGE(1, *mSettings); + const ValueFlow::Value *v = indexToken->getValueGE(1, mSettings); if (v) pointerArithmeticError(tok, indexToken, v); } @@ -578,9 +578,9 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok) cons v.valueType = ValueFlow::Value::ValueType::BUFFER_SIZE; if (var->isPointerArray()) - v.intvalue = dim * mSettings->platform.sizeof_pointer; + v.intvalue = dim * mSettings.platform.sizeof_pointer; else { - const size_t typeSize = bufTok->valueType()->getSizeOf(*mSettings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointee); + const size_t typeSize = bufTok->valueType()->getSizeOf(mSettings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointee); v.intvalue = dim * typeSize; } @@ -643,13 +643,13 @@ void CheckBufferOverrunImpl::bufferOverflow() for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) { if (!Token::Match(tok, "%name% (") || Token::simpleMatch(tok, ") {")) continue; - if (!mSettings->library.hasminsize(tok)) + if (!mSettings.library.hasminsize(tok)) continue; const std::vector args = getArguments(tok); for (int argnr = 0; argnr < args.size(); ++argnr) { if (!args[argnr]->valueType() || args[argnr]->valueType()->pointer == 0) continue; - const std::vector *minsizes = mSettings->library.argminsizes(tok, argnr + 1); + const std::vector *minsizes = mSettings.library.argminsizes(tok, argnr + 1); if (!minsizes || minsizes->empty()) continue; // Get buffer size.. @@ -682,7 +682,7 @@ void CheckBufferOverrunImpl::bufferOverflow() } } const bool error = std::none_of(minsizes->begin(), minsizes->end(), [&](const Library::ArgumentChecks::MinSize &minsize) { - return checkBufferSize(tok, minsize, args, bufferSize.intvalue, *mSettings, mTokenizer); + return checkBufferSize(tok, minsize, args, bufferSize.intvalue, mSettings, mTokenizer); }); if (error) bufferOverflowError(args[argnr], &bufferSize, Certainty::normal); @@ -700,7 +700,7 @@ void CheckBufferOverrunImpl::bufferOverflowError(const Token *tok, const ValueFl void CheckBufferOverrunImpl::arrayIndexThenCheck() { - if (!mSettings->severity.isEnabled(Severity::style)) + if (!mSettings.severity.isEnabled(Severity::style)) return; logChecker("CheckBufferOverrun::arrayIndexThenCheck"); // style @@ -758,7 +758,7 @@ void CheckBufferOverrunImpl::arrayIndexThenCheckError(const Token *tok, const st void CheckBufferOverrunImpl::stringNotZeroTerminated() { // this is currently 'inconclusive'. See TestBufferOverrun::terminateStrncpy3 - if (!mSettings->severity.isEnabled(Severity::warning) || !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (!mSettings.severity.isEnabled(Severity::warning) || !mSettings.certainty.isEnabled(Certainty::inconclusive)) return; logChecker("CheckBufferOverrun::stringNotZeroTerminated"); // warning,inconclusive @@ -797,7 +797,7 @@ void CheckBufferOverrunImpl::stringNotZeroTerminated() const Token *rhs = tok2->next()->astOperand2(); if (!rhs || !rhs->hasKnownIntValue() || rhs->getKnownIntValue() != 0) continue; - if (isSameExpression(false, args[0], tok2->link()->astOperand1(), *mSettings, false, false)) + if (isSameExpression(false, args[0], tok2->link()->astOperand1(), mSettings, false, false)) isZeroTerminated = true; } if (isZeroTerminated) @@ -824,7 +824,7 @@ void CheckBufferOverrunImpl::terminateStrncpyError(const Token *tok, const std:: void CheckBufferOverrunImpl::argumentSize() { // Check '%type% x[10]' arguments - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("argumentSize")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("argumentSize")) return; logChecker("CheckBufferOverrun::argumentSize"); // warning @@ -990,7 +990,7 @@ Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLEle /** @brief Analyse all file infos for all TU */ bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) { - CheckBufferOverrunImpl dummy(nullptr, &settings, &errorLogger); + CheckBufferOverrunImpl dummy(nullptr, settings, &errorLogger); dummy. logChecker("CheckBufferOverrun::analyseWholeProgram"); @@ -1096,7 +1096,7 @@ void CheckBufferOverrunImpl::objectIndex() continue; } if (obj->valueType() && var->valueType() && (obj->isCast() || (obj->isCpp() && isCPPCast(obj)) || obj->valueType()->pointer)) { // allow cast to a different type - const auto varSize = var->valueType()->getSizeOf(*mSettings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointee); + const auto varSize = var->valueType()->getSizeOf(mSettings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointee); if (varSize == 0) continue; if (obj->valueType()->type != var->valueType()->type) { @@ -1176,7 +1176,7 @@ void CheckBufferOverrunImpl::negativeArraySize() const Token* const nameToken = var->nameToken(); if (!Token::Match(nameToken, "%var% [") || !nameToken->next()->astOperand2()) continue; - const ValueFlow::Value* sz = nameToken->next()->astOperand2()->getValueLE(-1, *mSettings); + const ValueFlow::Value* sz = nameToken->next()->astOperand2()->getValueLE(-1, mSettings); // don't warn about constant negative index because that is a compiler error if (sz && isVLAIndex(nameToken->next()->astOperand2())) negativeArraySizeError(nameToken); @@ -1189,7 +1189,7 @@ void CheckBufferOverrunImpl::negativeArraySize() const Token* valOperand = tok->astOperand1()->astOperand2(); if (!valOperand) continue; - const ValueFlow::Value* sz = valOperand->getValueLE(-1, *mSettings); + const ValueFlow::Value* sz = valOperand->getValueLE(-1, mSettings); if (sz) negativeMemoryAllocationSizeError(tok, sz); } @@ -1216,7 +1216,7 @@ void CheckBufferOverrunImpl::negativeMemoryAllocationSizeError(const Token* tok, void CheckBufferOverrun::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckBufferOverrunImpl checkBufferOverrun(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckBufferOverrunImpl checkBufferOverrun(&tokenizer, tokenizer.getSettings(), errorLogger); checkBufferOverrun.arrayIndex(); checkBufferOverrun.pointerArithmetic(); checkBufferOverrun.bufferOverflow(); @@ -1227,7 +1227,7 @@ void CheckBufferOverrun::runChecks(const Tokenizer &tokenizer, ErrorLogger *erro checkBufferOverrun.negativeArraySize(); } -void CheckBufferOverrun::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckBufferOverrun::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckBufferOverrunImpl c(nullptr, settings, errorLogger); c.arrayIndexError(nullptr, std::vector(), std::vector()); diff --git a/lib/checkbufferoverrun.h b/lib/checkbufferoverrun.h index fdf47121bb8..2b43d575dec 100644 --- a/lib/checkbufferoverrun.h +++ b/lib/checkbufferoverrun.h @@ -72,7 +72,7 @@ class CPPCHECKLIB CheckBufferOverrun : public Check { /** @brief Analyse all file infos for all TU */ bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; @@ -96,7 +96,7 @@ class CPPCHECKLIB CheckBufferOverrunImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckBufferOverrunImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckBufferOverrunImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} void arrayIndex(); diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index c5b8507f301..d7eb9b43b35 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -106,7 +106,7 @@ static bool isVclTypeInit(const Type *type) } //--------------------------------------------------------------------------- -CheckClassImpl::CheckClassImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) +CheckClassImpl::CheckClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger), mSymbolDatabase(tokenizer?tokenizer->getSymbolDatabase():nullptr) {} @@ -140,7 +140,7 @@ bool CheckClassImpl::isInitialized(const Usage& usage, FunctionType funcType) co const Token* ctt = var.valueType()->containerTypeToken; if (!ctt->isStandardType() && (!ctt->type() || ctt->type()->needInitialization != Type::NeedInitialization::True) && - !mSettings->library.podtype(ctt->str())) // TODO: handle complex type expression + !mSettings.library.podtype(ctt->str())) // TODO: handle complex type expression return true; } else @@ -201,16 +201,16 @@ void CheckClassImpl::handleUnionMembers(std::vector& usageList) void CheckClassImpl::constructors() { - const bool printStyle = mSettings->severity.isEnabled(Severity::style); - const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); - if (!printStyle && !printWarnings && !mSettings->isPremiumEnabled("uninitMemberVar")) + const bool printStyle = mSettings.severity.isEnabled(Severity::style); + const bool printWarnings = mSettings.severity.isEnabled(Severity::warning); + if (!printStyle && !printWarnings && !mSettings.isPremiumEnabled("uninitMemberVar")) return; logChecker("CheckClass::checkConstructors"); // style,warning - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); for (const Scope * scope : mSymbolDatabase->classAndStructScopes) { - if (mSettings->hasLib("vcl") && isVclTypeInit(scope->definedType)) + if (mSettings.hasLib("vcl") && isVclTypeInit(scope->definedType)) continue; const bool unusedTemplate = Token::simpleMatch(scope->classDef->previous(), ">"); @@ -315,9 +315,9 @@ void CheckClassImpl::constructors() } } - if (classNameUsed && mSettings->library.getTypeCheck("operatorEqVarError", var.getTypeName()) != Library::TypeCheck::suppress) + if (classNameUsed && mSettings.library.getTypeCheck("operatorEqVarError", var.getTypeName()) != Library::TypeCheck::suppress) operatorEqVarError(func.token, scope->className, var.name(), missingCopy); - } else if (func.access != AccessControl::Private || mSettings->standards.cpp >= Standards::CPP11) { + } else if (func.access != AccessControl::Private || mSettings.standards.cpp >= Standards::CPP11) { // If constructor is not in scope then we maybe using a constructor from a different template specialization if (!precedes(scope->bodyStart, func.tokenDef)) continue; @@ -347,7 +347,7 @@ void CheckClassImpl::constructors() // Variables with default initializers bool hasAnyDefaultInit = false; bool hasAnySelfInit = false; - const bool cpp14OrLater = mSettings->standards.cpp >= Standards::CPP14; + const bool cpp14OrLater = mSettings.standards.cpp >= Standards::CPP14; for (Usage& usage : usageList) { const Variable& var = *usage.var; @@ -387,7 +387,7 @@ static bool isPermissibleConversion(const std::string& type) void CheckClassImpl::checkExplicitConstructors() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("noExplicitConstructor")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("noExplicitConstructor")) return; logChecker("CheckClass::checkExplicitConstructors"); // style @@ -405,7 +405,7 @@ void CheckClassImpl::checkExplicitConstructors() // Abstract classes can't be instantiated. But if there is C++11 // "misuse" by derived classes then these constructors must be explicit. - if (isAbstractClass && mSettings->standards.cpp >= Standards::CPP11) + if (isAbstractClass && mSettings.standards.cpp >= Standards::CPP11) continue; for (const Function &func : scope->functionList) { @@ -456,7 +456,7 @@ static bool hasNonCopyableBase(const Scope *scope, bool *unknown) void CheckClassImpl::copyconstructors() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckClass::checkCopyConstructors"); // warning @@ -471,7 +471,7 @@ void CheckClassImpl::copyconstructors() const Token* tok = func.token->linkAt(1); for (const Token* const end = func.functionScope->bodyStart; tok != end; tok = tok->next()) { if (Token::Match(tok, "%var% ( new") || - (Token::Match(tok, "%var% ( %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2)))) { + (Token::Match(tok, "%var% ( %name% (") && mSettings.library.getAllocFuncInfo(tok->tokAt(2)))) { const Variable* var = tok->variable(); if (var && var->isPointer() && var->scope() == scope) allocatedVars[tok->varId()] = tok; @@ -479,7 +479,7 @@ void CheckClassImpl::copyconstructors() } for (const Token* const end = func.functionScope->bodyEnd; tok != end; tok = tok->next()) { if (Token::Match(tok, "%var% = new") || - (Token::Match(tok, "%var% = %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2)))) { + (Token::Match(tok, "%var% = %name% (") && mSettings.library.getAllocFuncInfo(tok->tokAt(2)))) { const Variable* var = tok->variable(); if (var && var->isPointer() && var->scope() == scope && !var->isStatic()) allocatedVars[tok->varId()] = tok; @@ -490,7 +490,7 @@ void CheckClassImpl::copyconstructors() const Token* tok = func.functionScope->bodyStart; for (const Token* const end = func.functionScope->bodyEnd; tok != end; tok = tok->next()) { if (Token::Match(tok, "delete %var%") || - (Token::Match(tok, "%name% ( %var%") && mSettings->library.getDeallocFuncInfo(tok))) { + (Token::Match(tok, "%name% ( %var%") && mSettings.library.getDeallocFuncInfo(tok))) { const Token *vartok = tok->str() == "delete" ? tok->next() : tok->tokAt(2); const Variable* var = vartok->variable(); if (var && var->isPointer() && var->scope() == scope && !var->isStatic()) @@ -580,7 +580,7 @@ void CheckClassImpl::copyconstructors() } for (tok = func.functionScope->bodyStart; tok != func.functionScope->bodyEnd; tok = tok->next()) { if ((tok->isCpp() && Token::Match(tok, "%var% = new")) || - (Token::Match(tok, "%var% = %name% (") && (mSettings->library.getAllocFuncInfo(tok->tokAt(2)) || mSettings->library.getReallocFuncInfo(tok->tokAt(2))))) { + (Token::Match(tok, "%var% = %name% (") && (mSettings.library.getAllocFuncInfo(tok->tokAt(2)) || mSettings.library.getReallocFuncInfo(tok->tokAt(2))))) { allocatedVars.erase(tok->varId()); } else if (Token::Match(tok, "%var% = %name% . %name% ;") && allocatedVars.find(tok->varId()) != allocatedVars.end()) { copiedVars.insert(tok); @@ -1059,7 +1059,7 @@ void CheckClassImpl::initializeVarList(const Function &func, std::listnext(); if (tok2->str() == "&") tok2 = tok2->next(); - if (isVariableChangedByFunctionCall(tok2, tok2->strAt(-1) == "&", tok2->varId(), *mSettings, nullptr)) + if (isVariableChangedByFunctionCall(tok2, tok2->strAt(-1) == "&", tok2->varId(), mSettings, nullptr)) assignVar(usage, tok2->varId()); } } @@ -1218,7 +1218,7 @@ void CheckClassImpl::operatorEqVarError(const Token *tok, const std::string &cla void CheckClassImpl::initializationListUsage() { - if (!mSettings->severity.isEnabled(Severity::performance)) + if (!mSettings.severity.isEnabled(Severity::performance)) return; logChecker("CheckClass::initializationListUsage"); // performance @@ -1279,7 +1279,7 @@ void CheckClassImpl::initializationListUsage() allowed = false; return ChildrenToVisit::done; } - if (var2->isLocal() && isVariableChanged(var2->nameToken(), previousBeforeAstLeftmostLeaf(tok), var2->declarationId(), /*globalvar*/ false, *mSettings)) { + if (var2->isLocal() && isVariableChanged(var2->nameToken(), previousBeforeAstLeftmostLeaf(tok), var2->declarationId(), /*globalvar*/ false, mSettings)) { allowed = false; return ChildrenToVisit::done; } @@ -1364,7 +1364,7 @@ static bool checkFunctionUsage(const Function *privfunc, const Scope* scope) void CheckClassImpl::privateFunctions() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedPrivateFunction")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unusedPrivateFunction")) return; logChecker("CheckClass::privateFunctions"); // style @@ -1447,7 +1447,7 @@ static const Scope* findFunctionOf(const Scope* scope) void CheckClassImpl::checkMemset() { logChecker("CheckClass::checkMemset"); - const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); + const bool printWarnings = mSettings.severity.isEnabled(Severity::warning); for (const Scope *scope : mSymbolDatabase->functionScopes) { for (const Token *tok = scope->bodyStart; tok && tok != scope->bodyEnd; tok = tok->next()) { if (Token::Match(tok, "memset|memcpy|memmove (")) { @@ -1505,7 +1505,7 @@ void CheckClassImpl::checkMemset() type = var->typeScope(); if (!type && !var->isPointer() && !Token::simpleMatch(var->typeStartToken(), "std :: array") && - mSettings->library.detectContainerOrIterator(var->typeStartToken())) { + mSettings.library.detectContainerOrIterator(var->typeStartToken())) { memsetError(tok, tok->str(), var->getTypeName(), {}, /*isContainer*/ true); } } @@ -1525,9 +1525,9 @@ void CheckClassImpl::checkMemset() checkMemsetType(scope, tok, type, false, {}); } } else if (tok->variable() && tok->variable()->isPointer() && tok->variable()->typeScope() && Token::Match(tok, "%var% = %name% (")) { - const Library::AllocFunc* alloc = mSettings->library.getAllocFuncInfo(tok->tokAt(2)); + const Library::AllocFunc* alloc = mSettings.library.getAllocFuncInfo(tok->tokAt(2)); if (!alloc) - alloc = mSettings->library.getReallocFuncInfo(tok->tokAt(2)); + alloc = mSettings.library.getReallocFuncInfo(tok->tokAt(2)); if (!alloc || alloc->bufferSize == Library::AllocFunc::BufferSize::none) continue; std::set parsedTypes; @@ -1547,7 +1547,7 @@ void CheckClassImpl::checkMemsetType(const Scope *start, const Token *tok, const return; parsedTypes.insert(type); - const bool printPortability = mSettings->severity.isEnabled(Severity::portability); + const bool printPortability = mSettings.severity.isEnabled(Severity::portability); // recursively check all parent classes for (const Type::BaseInfo & i : type->definedType->derivedFrom) { @@ -1588,7 +1588,7 @@ void CheckClassImpl::checkMemsetType(const Scope *start, const Token *tok, const } // check for std:: type - if (var.isStlType() && typeName != "std::array" && !mSettings->library.podtype(typeName)) { + if (var.isStlType() && typeName != "std::array" && !mSettings.library.podtype(typeName)) { if (allocation) mallocOnClassError(tok, tok->str(), type->classDef, "'" + typeName + "'"); else @@ -1663,7 +1663,7 @@ void CheckClassImpl::memsetErrorFloat(const Token *tok, const std::string &type) void CheckClassImpl::operatorEqRetRefThis() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("operatorEqRetRefThis")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("operatorEqRetRefThis")) return; logChecker("CheckClass::operatorEqRetRefThis"); // style @@ -1762,7 +1762,7 @@ void CheckClassImpl::checkReturnPtrThis(const Scope *scope, const Function *func } return; } - if (mSettings->library.isScopeNoReturn(last, nullptr)) { + if (mSettings.library.isScopeNoReturn(last, nullptr)) { // Typical wrong way to prohibit default assignment operator // by always throwing an exception or calling a noreturn function operatorEqShouldBeLeftUnimplementedError(func->token); @@ -1807,7 +1807,7 @@ void CheckClassImpl::operatorEqMissingReturnStatementError(const Token *tok, boo void CheckClassImpl::operatorEqToSelf() { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("operatorEqToSelf")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("operatorEqToSelf")) return; logChecker("CheckClass::operatorEqToSelf"); // warning @@ -1867,13 +1867,13 @@ bool CheckClassImpl::hasAllocation(const Function *func, const Scope* scope, con end = func->functionScope->bodyEnd; for (const Token *tok = start; tok && (tok != end); tok = tok->next()) { if (((tok->isCpp() && Token::Match(tok, "%var% = new")) || - (Token::Match(tok, "%var% = %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2)))) && + (Token::Match(tok, "%var% = %name% (") && mSettings.library.getAllocFuncInfo(tok->tokAt(2)))) && isMemberVar(scope, tok)) return true; // check for deallocating memory const Token *var; - if (Token::Match(tok, "%name% ( %var%") && mSettings->library.getDeallocFuncInfo(tok)) + if (Token::Match(tok, "%name% ( %var%") && mSettings.library.getDeallocFuncInfo(tok)) var = tok->tokAt(2); else if (tok->isCpp() && Token::Match(tok, "delete [ ] %var%")) var = tok->tokAt(3); @@ -2006,7 +2006,7 @@ void CheckClassImpl::virtualDestructor() // * base class is deleted // unless inconclusive in which case: // * A class with any virtual functions should have a destructor that is either public and virtual or protected - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); std::list inconclusiveErrors; @@ -2029,7 +2029,7 @@ void CheckClassImpl::virtualDestructor() } // Check if destructor is empty and non-empty .. - if (mSettings->standards.cpp <= Standards::CPP03) { + if (mSettings.standards.cpp <= Standards::CPP03) { // Find the destructor const Function *destructor = scope->getDestructor(); @@ -2136,7 +2136,7 @@ void CheckClassImpl::virtualDestructor() void CheckClassImpl::virtualDestructorError(const Token *tok, const std::string &Base, const std::string &Derived, bool inconclusive) { if (inconclusive) { - if (mSettings->severity.isEnabled(Severity::warning)) + if (mSettings.severity.isEnabled(Severity::warning)) reportError(tok, Severity::warning, "virtualDestructor", "$symbol:" + Base + "\nClass '$symbol' which has virtual members does not have a virtual destructor.", CWE404, Certainty::inconclusive); } else { reportError(tok, Severity::error, "virtualDestructor", @@ -2156,7 +2156,7 @@ void CheckClassImpl::virtualDestructorError(const Token *tok, const std::string void CheckClassImpl::thisSubtraction() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckClass::thisSubtraction"); // warning @@ -2185,9 +2185,9 @@ void CheckClassImpl::thisSubtractionError(const Token *tok) void CheckClassImpl::checkConst() { - if (!mSettings->severity.isEnabled(Severity::style) && - !mSettings->isPremiumEnabled("functionConst") && - !mSettings->isPremiumEnabled("functionStatic")) + if (!mSettings.severity.isEnabled(Severity::style) && + !mSettings.isPremiumEnabled("functionConst") && + !mSettings.isPremiumEnabled("functionStatic")) return; logChecker("CheckClass::checkConst"); // style,inconclusive @@ -2248,7 +2248,7 @@ void CheckClassImpl::checkConst() const std::string& opName = func.tokenDef->str(); if (opName.compare(8, 5, "const") != 0 && (endsWith(opName,'&') || endsWith(opName,'*'))) continue; - } else if (mSettings->library.isSmartPointer(func.retDef)) { + } else if (mSettings.library.isSmartPointer(func.retDef)) { // Don't warn if a std::shared_ptr etc is returned continue; } else { @@ -2271,7 +2271,7 @@ void CheckClassImpl::checkConst() const bool suggestStatic = memberAccessed != MemberAccess::MEMBER && !func.isOperator(); if ((returnsPtrOrRef || func.isConst() || func.hasLvalRefQualifier()) && !suggestStatic) continue; - if (!suggestStatic && !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (!suggestStatic && !mSettings.certainty.isEnabled(Certainty::inconclusive)) // functionConst is inconclusive. False positives: #3322. continue; if (suggestStatic && func.isConst()) { @@ -2535,7 +2535,7 @@ bool CheckClassImpl::checkConstFunc(const Scope *scope, const Function *func, Me return true; } - if (const Library::Function* fLib = mSettings->library.getFunction(funcTok)) + if (const Library::Function* fLib = mSettings.library.getFunction(funcTok)) if (fLib->isconst || fLib->ispure) return true; @@ -2696,12 +2696,12 @@ bool CheckClassImpl::checkConstFunc(const Scope *scope, const Function *func, Me } else if (var->smartPointerType() && var->smartPointerType()->classScope && isConstMemberFunc(var->smartPointerType()->classScope, end)) { // empty body - } else if (var->isSmartPointer() && Token::simpleMatch(tok1->next(), ".") && tok1->next()->originalName().empty() && mSettings->library.isFunctionConst(end)) { + } else if (var->isSmartPointer() && Token::simpleMatch(tok1->next(), ".") && tok1->next()->originalName().empty() && mSettings.library.isFunctionConst(end)) { // empty body } else if (hasOverloadedMemberAccess(end, var->typeScope())) { // empty body } else if (!var->typeScope() || (end->function() != func && !isConstMemberFunc(var->typeScope(), end))) { - if (!mSettings->library.isFunctionConst(end)) + if (!mSettings.library.isFunctionConst(end)) return false; } } @@ -2806,15 +2806,15 @@ namespace { // avoid one-definition-rule violation void CheckClassImpl::initializerListOrder() { - if (!mSettings->isPremiumEnabled("initializerList")) { - if (!mSettings->severity.isEnabled(Severity::style)) + if (!mSettings.isPremiumEnabled("initializerList")) { + if (!mSettings.severity.isEnabled(Severity::style)) return; // This check is not inconclusive. However it only determines if the initialization // order is incorrect. It does not determine if being out of order causes // a real error. Out of order is not necessarily an error but you can never // have an error if the list is in order so this enforces defensive programming. - if (!mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (!mSettings.certainty.isEnabled(Certainty::inconclusive)) return; } @@ -2945,7 +2945,7 @@ void CheckClassImpl::selfInitializationError(const Token* tok, const std::string void CheckClassImpl::checkVirtualFunctionCallInConstructor() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckClass::checkVirtualFunctionCallInConstructor"); // warning std::map> virtualFunctionCallsMap; @@ -3012,8 +3012,8 @@ const std::list & CheckClassImpl::getVirtualFunctionCalls(const F tok->strAt(-1) == "(") { const Token * prev = tok->previous(); if (prev->previous() && - (mSettings->library.ignorefunction(tok->str()) - || mSettings->library.ignorefunction(prev->strAt(-1)))) + (mSettings.library.ignorefunction(tok->str()) + || mSettings.library.ignorefunction(prev->strAt(-1)))) continue; } @@ -3056,7 +3056,7 @@ void CheckClassImpl::virtualFunctionCallInConstructorError( const std::list & tokStack, const std::string &funcname) { - if (scopeFunction && !mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("virtualCallInConstructor")) + if (scopeFunction && !mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("virtualCallInConstructor")) return; const char * scopeFunctionTypeName = scopeFunction ? getFunctionTypeName(scopeFunction->type) : "constructor"; @@ -3116,7 +3116,7 @@ void CheckClassImpl::pureVirtualFunctionCallInConstructorError( void CheckClassImpl::checkDuplInheritedMembers() { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("duplInheritedMember")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("duplInheritedMember")) return; logChecker("CheckClass::checkDuplInheritedMembers"); // warning @@ -3254,7 +3254,7 @@ void CheckClassImpl::checkCopyCtorAndEqOperator() { // TODO: This is disabled because of #8388 // The message must be clarified. How is the behaviour different? - if ((true) || !mSettings->severity.isEnabled(Severity::warning)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) + if ((true) || !mSettings.severity.isEnabled(Severity::warning)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) return; // logChecker @@ -3314,9 +3314,9 @@ void CheckClassImpl::copyCtorAndEqOperatorError(const Token *tok, const std::str void CheckClassImpl::checkOverride() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("missingOverride")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("missingOverride")) return; - if (mSettings->standards.cpp < Standards::CPP11) + if (mSettings.standards.cpp < Standards::CPP11) return; logChecker("CheckClass::checkMissingOverride"); // style,c++03 for (const Scope * classScope : mSymbolDatabase->classAndStructScopes) { @@ -3420,7 +3420,7 @@ static bool compareTokenRanges(const Token* start1, const Token* end1, const Tok void CheckClassImpl::checkUselessOverride() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("uselessOverride")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("uselessOverride")) return; logChecker("CheckClass::checkUselessOverride"); // style @@ -3501,7 +3501,7 @@ static const Variable* getSingleReturnVar(const Scope* scope) { void CheckClassImpl::checkReturnByReference() { - if (!mSettings->severity.isEnabled(Severity::performance) && !mSettings->isPremiumEnabled("returnByReference")) + if (!mSettings.severity.isEnabled(Severity::performance) && !mSettings.isPremiumEnabled("returnByReference")) return; logChecker("CheckClass::checkReturnByReference"); // performance @@ -3516,7 +3516,7 @@ void CheckClassImpl::checkReturnByReference() continue; if (func.functionPointerUsage) continue; - if (const Library::Container* container = mSettings->library.detectContainer(func.retDef)) + if (const Library::Container* container = mSettings.library.detectContainer(func.retDef)) if (container->view) continue; if (!func.isConst() && func.hasRvalRefQualifier()) @@ -3531,8 +3531,8 @@ void CheckClassImpl::checkReturnByReference() const bool isView = isContainer && var->valueType()->container->view; bool warn = isContainer && !isView; if (!warn && !isView) { - const std::size_t size = var->valueType()->getSizeOf(*mSettings, ValueType::Accuracy::LowerBound, ValueType::SizeOf::Pointer); - if (size > 2 * mSettings->platform.sizeof_pointer) + const std::size_t size = var->valueType()->getSizeOf(mSettings, ValueType::Accuracy::LowerBound, ValueType::SizeOf::Pointer); + if (size > 2 * mSettings.platform.sizeof_pointer) warn = true; } if (warn) @@ -3551,7 +3551,7 @@ void CheckClassImpl::returnByReferenceError(const Function* func, const Variable void CheckClassImpl::checkThisUseAfterFree() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckClass::checkThisUseAfterFree"); // warning @@ -3561,7 +3561,7 @@ void CheckClassImpl::checkThisUseAfterFree() for (const Variable &var : classScope->varlist) { // Find possible "self pointer".. pointer/smartpointer member variable of "self" type. if (var.valueType() && var.valueType()->smartPointerType != classScope->definedType && var.valueType()->typeScope != classScope) { - const ValueType valueType = ValueType::parseDecl(var.typeStartToken(), *mSettings); + const ValueType valueType = ValueType::parseDecl(var.typeStartToken(), mSettings); if (valueType.smartPointerType != classScope->definedType) continue; } @@ -3651,7 +3651,7 @@ void CheckClassImpl::thisUseAfterFree(const Token *self, const Token *free, cons void CheckClassImpl::checkUnsafeClassRefMember() { - if (!mSettings->safeChecks.classes || !mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.safeChecks.classes || !mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckClass::checkUnsafeClassRefMember"); // warning,safeChecks for (const Scope * classScope : mSymbolDatabase->classAndStructScopes) { @@ -3833,7 +3833,7 @@ bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check the code for each class.\n" @@ -100,7 +100,7 @@ class CPPCHECKLIB CheckClass : public Check { class CPPCHECKLIB CheckClassImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckClassImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger); + CheckClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger); /** @brief Set of the STL types whose operator[] is not const */ static const std::set stl_containers_not_const; diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 163b05cc445..365a677b5cb 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -91,7 +91,7 @@ bool CheckConditionImpl::isAliased(const std::set &vars) const void CheckConditionImpl::assignIf() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("assignIfError")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("assignIfError")) return; logChecker("CheckCondition::assignIf"); // style @@ -204,7 +204,7 @@ bool CheckConditionImpl::assignIfParseScope(const Token * const assignTok, // is variable changed in loop? const Token *bodyStart = tok2->linkAt(1)->next(); const Token *bodyEnd = bodyStart ? bodyStart->link() : nullptr; - if (!bodyEnd || bodyEnd->str() != "}" || isVariableChanged(bodyStart, bodyEnd, varid, !islocal, *mSettings)) + if (!bodyEnd || bodyEnd->str() != "}" || isVariableChanged(bodyStart, bodyEnd, varid, !islocal, mSettings)) continue; } @@ -310,7 +310,7 @@ static bool isOperandExpanded(const Token *tok) void CheckConditionImpl::checkBadBitmaskCheck() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("badBitmaskCheck")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("badBitmaskCheck")) return; logChecker("CheckCondition::checkBadBitmaskCheck"); // style @@ -358,7 +358,7 @@ void CheckConditionImpl::badBitmaskCheckError(const Token *tok, bool isNoOp) void CheckConditionImpl::comparison() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("comparisonError")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("comparisonError")) return; logChecker("CheckCondition::comparison"); // style @@ -441,7 +441,7 @@ bool CheckConditionImpl::isOverlappingCond(const Token * const cond1, const Toke return false; // same expressions - if (isSameExpression(true, cond1, cond2, *mSettings, pure, false)) + if (isSameExpression(true, cond1, cond2, mSettings, pure, false)) return true; // bitwise overlap for example 'x&7' and 'x==1' @@ -464,7 +464,7 @@ bool CheckConditionImpl::isOverlappingCond(const Token * const cond1, const Toke if (!num2->isNumber() || MathLib::isNegative(num2->str())) return false; - if (!isSameExpression(true, expr1, expr2, *mSettings, pure, false)) + if (!isSameExpression(true, expr1, expr2, mSettings, pure, false)) return false; const MathLib::bigint value1 = MathLib::toBigNumber(num1); @@ -478,7 +478,7 @@ bool CheckConditionImpl::isOverlappingCond(const Token * const cond1, const Toke void CheckConditionImpl::duplicateCondition() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("duplicateCondition")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("duplicateCondition")) return; logChecker("CheckCondition::duplicateCondition"); // style @@ -509,8 +509,8 @@ void CheckConditionImpl::duplicateCondition() continue; ErrorPath errorPath; - if (!findExpressionChanged(cond1, scope.classDef->next(), cond2, *mSettings) && - isSameExpression(true, cond1, cond2, *mSettings, true, true, &errorPath)) + if (!findExpressionChanged(cond1, scope.classDef->next(), cond2, mSettings) && + isSameExpression(true, cond1, cond2, mSettings, true, true, &errorPath)) duplicateConditionError(cond1, cond2, std::move(errorPath)); } } @@ -529,7 +529,7 @@ void CheckConditionImpl::duplicateConditionError(const Token *tok1, const Token void CheckConditionImpl::multiCondition() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("multiCondition")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("multiCondition")) return; logChecker("CheckCondition::multiCondition"); // style @@ -559,11 +559,11 @@ void CheckConditionImpl::multiCondition() if (tok2->astOperand2()) { ErrorPath errorPath; if (isOverlappingCond(cond1, tok2->astOperand2(), true) && - !findExpressionChanged(cond1, cond1, tok2->astOperand2(), *mSettings)) + !findExpressionChanged(cond1, cond1, tok2->astOperand2(), mSettings)) overlappingElseIfConditionError(tok2->astOperand2(), cond1->linenr()); else if (isOppositeCond( - true, cond1, tok2->astOperand2(), *mSettings, true, true, &errorPath) && - !findExpressionChanged(cond1, cond1, tok2->astOperand2(), *mSettings)) + true, cond1, tok2->astOperand2(), mSettings, true, true, &errorPath) && + !findExpressionChanged(cond1, cond1, tok2->astOperand2(), mSettings)) oppositeElseIfConditionError(cond1, tok2->astOperand2(), std::move(errorPath)); } } @@ -631,9 +631,9 @@ static bool isNestedInLambda(const Scope* inner, const Scope* outer) void CheckConditionImpl::multiCondition2() { - if (!mSettings->severity.isEnabled(Severity::warning) && - !mSettings->isPremiumEnabled("identicalConditionAfterEarlyExit") && - !mSettings->isPremiumEnabled("identicalInnerCondition")) + if (!mSettings.severity.isEnabled(Severity::warning) && + !mSettings.isPremiumEnabled("identicalConditionAfterEarlyExit") && + !mSettings.isPremiumEnabled("identicalInnerCondition")) return; logChecker("CheckCondition::multiCondition2"); // warning @@ -668,7 +668,7 @@ void CheckConditionImpl::multiCondition2() [&](const Token *cond) { if (Token::Match(cond, "%name% (")) { functionCall = true; - nonConstFunctionCall = isNonConstFunctionCall(cond, mSettings->library); + nonConstFunctionCall = isNonConstFunctionCall(cond, mSettings.library); if (nonConstFunctionCall) return ChildrenToVisit::done; } @@ -725,13 +725,13 @@ void CheckConditionImpl::multiCondition2() for (; tok && tok != endToken; tok = tok->next()) { if (isNestedInLambda(tok->scope(), cond1->scope())) continue; - if (isExpressionChangedAt(cond1, tok, 0, false, *mSettings)) + if (isExpressionChangedAt(cond1, tok, 0, false, mSettings)) break; if (Token::Match(tok, "if|return")) { const Token * condStartToken = tok->str() == "if" ? tok->next() : tok; const Token * condEndToken = tok->str() == "if" ? condStartToken->link() : Token::findsimplematch(condStartToken, ";"); // Does condition modify tracked variables? - if (findExpressionChanged(cond1, condStartToken, condEndToken, *mSettings)) + if (findExpressionChanged(cond1, condStartToken, condEndToken, mSettings)) break; // Condition.. @@ -745,14 +745,14 @@ void CheckConditionImpl::multiCondition2() if (!firstCondition) return ChildrenToVisit::none; if (firstCondition->str() == "&&") { - if (!isOppositeCond(false, firstCondition, cond2, *mSettings, true, true)) + if (!isOppositeCond(false, firstCondition, cond2, mSettings, true, true)) return ChildrenToVisit::op1_and_op2; } if (!firstCondition->hasKnownIntValue()) { - if (!isReturnVar && isOppositeCond(false, firstCondition, cond2, *mSettings, true, true, &errorPath)) { + if (!isReturnVar && isOppositeCond(false, firstCondition, cond2, mSettings, true, true, &errorPath)) { if (!isAliased(vars)) oppositeInnerConditionError(firstCondition, cond2, errorPath); - } else if (!isReturnVar && isSameExpression(true, firstCondition, cond2, *mSettings, true, true, &errorPath)) { + } else if (!isReturnVar && isSameExpression(true, firstCondition, cond2, mSettings, true, true, &errorPath)) { identicalInnerConditionError(firstCondition, cond2, errorPath); } else if (!isReturnVar && isOverlappingCond(cond2, firstCondition, true)) { overlappingInnerConditionError(firstCondition, cond2, errorPath); @@ -766,7 +766,7 @@ void CheckConditionImpl::multiCondition2() return ChildrenToVisit::op1_and_op2; if ((!cond1->hasKnownIntValue() || !secondCondition->hasKnownIntValue()) && - isSameExpression(true, cond1, secondCondition, *mSettings, true, true, &errorPath)) { + isSameExpression(true, cond1, secondCondition, mSettings, true, true, &errorPath)) { if (!isAliased(vars) && !mTokenizer->hasIfdef(cond1, secondCondition)) { identicalConditionAfterEarlyExitError(cond1, secondCondition, errorPath); return ChildrenToVisit::done; @@ -777,10 +777,10 @@ void CheckConditionImpl::multiCondition2() } } if (Token::Match(tok, "%name% (") && - isVariablesChanged(tok, tok->linkAt(1), 0, varsInCond, *mSettings)) { + isVariablesChanged(tok, tok->linkAt(1), 0, varsInCond, mSettings)) { break; } - if (Token::Match(tok, "%type% (") && nonlocal && isNonConstFunctionCall(tok, mSettings->library)) // non const function call -> bailout if there are nonlocal variables + if (Token::Match(tok, "%type% (") && nonlocal && isNonConstFunctionCall(tok, mSettings.library)) // non const function call -> bailout if there are nonlocal variables break; if (Token::Match(tok, "case|break|continue|return|throw") && tok->scope() == endToken->scope()) break; @@ -806,7 +806,7 @@ void CheckConditionImpl::multiCondition2() break; } const bool changed = std::any_of(vars.cbegin(), vars.cend(), [&](int varid) { - return isVariableChanged(tok1, tok2, varid, nonlocal, *mSettings); + return isVariableChanged(tok1, tok2, varid, nonlocal, mSettings); }); if (changed) break; @@ -1158,11 +1158,11 @@ static bool isIfConstexpr(const Token* tok) { void CheckConditionImpl::checkIncorrectLogicOperator() { - const bool printStyle = mSettings->severity.isEnabled(Severity::style); - const bool printWarning = mSettings->severity.isEnabled(Severity::warning); - if (!printWarning && !printStyle && !mSettings->isPremiumEnabled("incorrectLogicOperator")) + const bool printStyle = mSettings.severity.isEnabled(Severity::style); + const bool printWarning = mSettings.severity.isEnabled(Severity::warning); + if (!printWarning && !printStyle && !mSettings.isPremiumEnabled("incorrectLogicOperator")) return; - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); logChecker("CheckCondition::checkIncorrectLogicOperator"); // style,warning @@ -1182,7 +1182,7 @@ void CheckConditionImpl::checkIncorrectLogicOperator() ((tok->str() == "||" && tok->astOperand2()->str() == "&&") || (tok->str() == "&&" && tok->astOperand2()->str() == "||"))) { const Token* tok2 = tok->astOperand2()->astOperand1(); - if (isOppositeCond(true, tok->astOperand1(), tok2, *mSettings, true, false)) { + if (isOppositeCond(true, tok->astOperand1(), tok2, mSettings, true, false)) { std::string expr1(tok->astOperand1()->expressionString()); std::string expr2(tok->astOperand2()->astOperand1()->expressionString()); std::string expr3(tok->astOperand2()->astOperand2()->expressionString()); @@ -1214,7 +1214,7 @@ void CheckConditionImpl::checkIncorrectLogicOperator() redundantConditionError(tok, msg, false); continue; } - if (isSameExpression(false, tok->astOperand1(), tok2, *mSettings, true, true)) { + if (isSameExpression(false, tok->astOperand1(), tok2, mSettings, true, true)) { std::string expr1(tok->astOperand1()->expressionString()); std::string expr2(tok->astOperand2()->astOperand1()->expressionString()); std::string expr3(tok->astOperand2()->astOperand2()->expressionString()); @@ -1279,7 +1279,7 @@ void CheckConditionImpl::checkIncorrectLogicOperator() // Opposite comparisons around || or && => always true or always false const bool isLogicalOr(tok->str() == "||"); - if (!isfloat && isOppositeCond(isLogicalOr, tok->astOperand1(), tok->astOperand2(), *mSettings, true, true, &errorPath)) { + if (!isfloat && isOppositeCond(isLogicalOr, tok->astOperand1(), tok->astOperand2(), mSettings, true, true, &errorPath)) { if (!isIfConstexpr(tok)) { const bool alwaysTrue(isLogicalOr); incorrectLogicOperatorError(tok, conditionString(tok), alwaysTrue, inconclusive, std::move(errorPath)); @@ -1290,9 +1290,9 @@ void CheckConditionImpl::checkIncorrectLogicOperator() if (!parseable) continue; - if (isSameExpression(true, comp1, comp2, *mSettings, true, true)) + if (isSameExpression(true, comp1, comp2, mSettings, true, true)) continue; // same expressions => only report that there are same expressions - if (!isSameExpression(true, expr1, expr2, *mSettings, true, true)) + if (!isSameExpression(true, expr1, expr2, mSettings, true, true)) continue; @@ -1396,7 +1396,7 @@ void CheckConditionImpl::redundantConditionError(const Token *tok, const std::st //----------------------------------------------------------------------------- void CheckConditionImpl::checkModuloAlwaysTrueFalse() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckCondition::checkModuloAlwaysTrueFalse"); // warning @@ -1452,7 +1452,7 @@ static int countPar(const Token *tok1, const Token *tok2) //--------------------------------------------------------------------------- void CheckConditionImpl::clarifyCondition() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("clarifyCondition")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("clarifyCondition")) return; logChecker("CheckCondition::clarifyCondition"); // style @@ -1516,11 +1516,11 @@ void CheckConditionImpl::clarifyConditionError(const Token *tok, bool assign, bo void CheckConditionImpl::alwaysTrueFalse() { - const bool pedantic = mSettings->isPremiumEnabled("alwaysTrue") || - mSettings->isPremiumEnabled("alwaysFalse") || - mSettings->isPremiumEnabled("knownConditionTrueFalse"); + const bool pedantic = mSettings.isPremiumEnabled("alwaysTrue") || + mSettings.isPremiumEnabled("alwaysFalse") || + mSettings.isPremiumEnabled("knownConditionTrueFalse"); - if (!pedantic && !mSettings->severity.isEnabled(Severity::style)) + if (!pedantic && !mSettings.severity.isEnabled(Severity::style)) return; logChecker("CheckCondition::alwaysTrueFalse"); // style @@ -1569,7 +1569,7 @@ void CheckConditionImpl::alwaysTrueFalse() continue; if (condition->isConstexpr()) continue; - if (!isUsedAsBool(tok, *mSettings)) + if (!isUsedAsBool(tok, mSettings)) continue; if (Token::simpleMatch(condition, "return") && Token::Match(tok, "%assign%")) continue; @@ -1598,7 +1598,7 @@ void CheckConditionImpl::alwaysTrueFalse() isSameExpression(true, tok->astOperand1(), tok->astOperand2(), - *mSettings, + mSettings, true, true)) continue; @@ -1702,7 +1702,7 @@ void CheckConditionImpl::checkInvalidTestForOverflow() // x + y < x -> y < 0 - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckCondition::checkInvalidTestForOverflow"); // warning @@ -1736,7 +1736,7 @@ void CheckConditionImpl::checkInvalidTestForOverflow() if (!isSameExpression(true, expr, lhs->astSibling(), - *mSettings, + mSettings, true, false)) continue; @@ -1792,7 +1792,7 @@ void CheckConditionImpl::invalidTestForOverflow(const Token* tok, const ValueTyp void CheckConditionImpl::checkPointerAdditionResultNotNull() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckCondition::checkPointerAdditionResultNotNull"); // warning @@ -1839,7 +1839,7 @@ void CheckConditionImpl::pointerAdditionResultNotNullError(const Token *tok, con void CheckConditionImpl::checkDuplicateConditionalAssign() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("duplicateConditionalAssign")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("duplicateConditionalAssign")) return; logChecker("CheckCondition::checkDuplicateConditionalAssign"); // style @@ -1883,10 +1883,10 @@ void CheckConditionImpl::checkDuplicateConditionalAssign() isRedundant = (isNegation && val == 0) || (!isNegation && val == 1); } else { // comparison if (!isSameExpression( - true, condTok->astOperand1(), assignTok->astOperand1(), *mSettings, true, true)) + true, condTok->astOperand1(), assignTok->astOperand1(), mSettings, true, true)) continue; if (!isSameExpression( - true, condTok->astOperand2(), assignTok->astOperand2(), *mSettings, true, true)) + true, condTok->astOperand2(), assignTok->astOperand2(), mSettings, true, true)) continue; } duplicateConditionalAssignError(condTok, assignTok, isRedundant); @@ -1918,7 +1918,7 @@ void CheckConditionImpl::duplicateConditionalAssignError(const Token *condTok, c void CheckConditionImpl::checkAssignmentInCondition() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("assignmentInCondition")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("assignmentInCondition")) return; logChecker("CheckCondition::checkAssignmentInCondition"); // style @@ -1965,10 +1965,10 @@ void CheckConditionImpl::assignmentInCondition(const Token *eq) void CheckConditionImpl::checkCompareValueOutOfTypeRange() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("compareValueOutOfTypeRangeError")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("compareValueOutOfTypeRangeError")) return; - if (mSettings->platform.type == Platform::Type::Unspecified) + if (mSettings.platform.type == Platform::Type::Unspecified) return; logChecker("CheckCondition::checkCompareValueOutOfTypeRange"); // style,platform @@ -1994,19 +1994,19 @@ void CheckConditionImpl::checkCompareValueOutOfTypeRange() bits = 1; break; case ValueType::Type::CHAR: - bits = mSettings->platform.char_bit; + bits = mSettings.platform.char_bit; break; case ValueType::Type::SHORT: - bits = mSettings->platform.short_bit; + bits = mSettings.platform.short_bit; break; case ValueType::Type::INT: - bits = mSettings->platform.int_bit; + bits = mSettings.platform.int_bit; break; case ValueType::Type::LONG: - bits = mSettings->platform.long_bit; + bits = mSettings.platform.long_bit; break; case ValueType::Type::LONGLONG: - bits = mSettings->platform.long_long_bit; + bits = mSettings.platform.long_long_bit; break; default: break; @@ -2019,7 +2019,7 @@ void CheckConditionImpl::checkCompareValueOutOfTypeRange() long long typeMaxValue; if (typeTok->valueType()->sign != ValueType::Sign::SIGNED) typeMaxValue = unsignedTypeMaxValue; - else if (bits >= mSettings->platform.int_bit && (!valueTok->valueType() || valueTok->valueType()->sign != ValueType::Sign::SIGNED)) + else if (bits >= mSettings.platform.int_bit && (!valueTok->valueType() || valueTok->valueType()->sign != ValueType::Sign::SIGNED)) typeMaxValue = unsignedTypeMaxValue; else typeMaxValue = unsignedTypeMaxValue / 2; @@ -2097,7 +2097,7 @@ void CheckConditionImpl::compareValueOutOfTypeRangeError(const Token *comparison void CheckCondition::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckConditionImpl checkCondition(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckConditionImpl checkCondition(&tokenizer, tokenizer.getSettings(), errorLogger); checkCondition.multiCondition(); checkCondition.clarifyCondition(); // not simplified because ifAssign checkCondition.multiCondition2(); @@ -2115,7 +2115,7 @@ void CheckCondition::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog checkCondition.alwaysTrueFalse(); } -void CheckCondition::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckCondition::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckConditionImpl c(nullptr, settings, errorLogger); diff --git a/lib/checkcondition.h b/lib/checkcondition.h index be06dfbbfd2..06ed12695bc 100644 --- a/lib/checkcondition.h +++ b/lib/checkcondition.h @@ -56,7 +56,7 @@ class CPPCHECKLIB CheckCondition : public Check { private: void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Match conditions with assignments and other conditions:\n" @@ -81,7 +81,7 @@ class CPPCHECKLIB CheckCondition : public Check { class CPPCHECKLIB CheckConditionImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckConditionImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckConditionImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** mismatching assignment / comparison */ diff --git a/lib/checkexceptionsafety.cpp b/lib/checkexceptionsafety.cpp index 463e47bea1c..b0c510ed80a 100644 --- a/lib/checkexceptionsafety.cpp +++ b/lib/checkexceptionsafety.cpp @@ -42,7 +42,7 @@ static const CWE CWE480(480U); // Use of Incorrect Operator void CheckExceptionSafetyImpl::destructors() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckExceptionSafety::destructors"); // warning @@ -90,12 +90,12 @@ void CheckExceptionSafetyImpl::destructorsError(const Token * const tok, const s void CheckExceptionSafetyImpl::deallocThrow() { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("exceptDeallocThrow")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("exceptDeallocThrow")) return; logChecker("CheckExceptionSafety::deallocThrow"); // warning - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); // Deallocate a global/member pointer and then throw exception @@ -165,7 +165,7 @@ void CheckExceptionSafetyImpl::deallocThrowError(const Token * const tok, const //--------------------------------------------------------------------------- void CheckExceptionSafetyImpl::checkRethrowCopy() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("exceptRethrowCopy")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("exceptRethrowCopy")) return; logChecker("CheckExceptionSafety::checkRethrowCopy"); // style @@ -209,7 +209,7 @@ void CheckExceptionSafetyImpl::rethrowCopyError(const Token * const tok, const s //--------------------------------------------------------------------------- void CheckExceptionSafetyImpl::checkCatchExceptionByValue() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("catchExceptionByValue")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("catchExceptionByValue")) return; logChecker("CheckExceptionSafety::checkCatchExceptionByValue"); // style @@ -298,7 +298,7 @@ void CheckExceptionSafetyImpl::nothrowThrows() function->isAttributeNothrow()) { // __attribute__((nothrow)) or __declspec(nothrow) functions isNoExcept = true; } - else if (mSettings->library.isentrypoint(function->name())) { + else if (mSettings.library.isentrypoint(function->name())) { isEntryPoint = true; } if (!isNoExcept && !isEntryPoint) @@ -328,8 +328,8 @@ void CheckExceptionSafetyImpl::entryPointThrowError(const Token * const tok) //-------------------------------------------------------------------------- void CheckExceptionSafetyImpl::unhandledExceptionSpecification() { - if ((!mSettings->severity.isEnabled(Severity::style) || !mSettings->certainty.isEnabled(Certainty::inconclusive)) && - !mSettings->isPremiumEnabled("unhandledExceptionSpecification")) + if ((!mSettings.severity.isEnabled(Severity::style) || !mSettings.certainty.isEnabled(Certainty::inconclusive)) && + !mSettings.isPremiumEnabled("unhandledExceptionSpecification")) return; logChecker("CheckExceptionSafety::unhandledExceptionSpecification"); // style,inconclusive @@ -338,7 +338,7 @@ void CheckExceptionSafetyImpl::unhandledExceptionSpecification() for (const Scope * scope : symbolDatabase->functionScopes) { // only check functions without exception specification - if (scope->function && !scope->function->isThrow() && !mSettings->library.isentrypoint(scope->className)) { + if (scope->function && !scope->function->isThrow() && !mSettings.library.isentrypoint(scope->className)) { for (const Token *tok = scope->function->functionScope->bodyStart->next(); tok != scope->function->functionScope->bodyEnd; tok = tok->next()) { if (tok->str() == "try") @@ -414,7 +414,7 @@ void CheckExceptionSafety::runChecks(const Tokenizer &tokenizer, ErrorLogger *er if (tokenizer.isC()) return; - CheckExceptionSafetyImpl checkExceptionSafety(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckExceptionSafetyImpl checkExceptionSafety(&tokenizer, tokenizer.getSettings(), errorLogger); checkExceptionSafety.destructors(); checkExceptionSafety.deallocThrow(); checkExceptionSafety.checkRethrowCopy(); @@ -424,7 +424,7 @@ void CheckExceptionSafety::runChecks(const Tokenizer &tokenizer, ErrorLogger *er checkExceptionSafety.rethrowNoCurrentException(); } -void CheckExceptionSafety::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckExceptionSafety::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckExceptionSafetyImpl c(nullptr, settings, errorLogger); c.destructorsError(nullptr, "Class"); diff --git a/lib/checkexceptionsafety.h b/lib/checkexceptionsafety.h index bd44a649b1e..d452dac2cf8 100644 --- a/lib/checkexceptionsafety.h +++ b/lib/checkexceptionsafety.h @@ -53,7 +53,7 @@ class CPPCHECKLIB CheckExceptionSafety : public Check { void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; /** Generate all possible errors (for --errorlist) */ - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; /** wiki formatted description of the class (for --doc) */ std::string classInfo() const override { @@ -71,7 +71,7 @@ class CPPCHECKLIB CheckExceptionSafety : public Check { class CPPCHECKLIB CheckExceptionSafetyImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckExceptionSafetyImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckExceptionSafetyImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Don't throw exceptions in destructors */ diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index 47a3828de31..db50846b262 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -54,7 +54,7 @@ static const CWE CWE688(688U); // Function Call With Incorrect Variable or Refe void CheckFunctionsImpl::checkProhibitedFunctions() { - const bool checkAlloca = mSettings->severity.isEnabled(Severity::warning) && ((mTokenizer->isC() && mSettings->standards.c >= Standards::C99) || mSettings->standards.cpp >= Standards::CPP11); + const bool checkAlloca = mSettings.severity.isEnabled(Severity::warning) && ((mTokenizer->isC() && mSettings.standards.c >= Standards::C99) || mSettings.standards.cpp >= Standards::CPP11); logChecker("CheckFunctions::checkProhibitedFunctions"); @@ -66,7 +66,7 @@ void CheckFunctionsImpl::checkProhibitedFunctions() // alloca() is special as it depends on the code being C or C++, so it is not in Library if (checkAlloca && Token::simpleMatch(tok, "alloca (") && (!tok->function() || tok->function()->nestedIn->type == ScopeType::eGlobal)) { if (tok->isC()) { - if (mSettings->standards.c > Standards::C89) + if (mSettings.standards.c > Standards::C89) reportError(tok, Severity::warning, "allocaCalled", "$symbol:alloca\n" "Obsolete function 'alloca' called. In C99 and later it is recommended to use a variable length array instead.\n" @@ -84,10 +84,10 @@ void CheckFunctionsImpl::checkProhibitedFunctions() if (tok->function() && tok->function()->hasBody()) continue; - const Library::WarnInfo* wi = mSettings->library.getWarnInfo(tok); + const Library::WarnInfo* wi = mSettings.library.getWarnInfo(tok); if (wi) { - if (mSettings->severity.isEnabled(wi->severity) && ((tok->isC() && mSettings->standards.c >= wi->standards.c) || (tok->isCpp() && mSettings->standards.cpp >= wi->standards.cpp))) { - const std::string daca = mSettings->daca ? "prohibited" : ""; + if (mSettings.severity.isEnabled(wi->severity) && ((tok->isC() && mSettings.standards.c >= wi->standards.c) || (tok->isCpp() && mSettings.standards.cpp >= wi->standards.cpp))) { + const std::string daca = mSettings.daca ? "prohibited" : ""; const std::string prefix = daca + tok->str(); functionCalledError(tok, wi->severity, prefix, wi->message); } @@ -120,24 +120,24 @@ void CheckFunctionsImpl::invalidFunctionUsage() const Token * const argtok = arguments[argnr-1]; // check ... - const ValueFlow::Value *invalidValue = argtok->getInvalidValue(functionToken,argnr,*mSettings); + const ValueFlow::Value *invalidValue = argtok->getInvalidValue(functionToken,argnr,mSettings); if (invalidValue) { - invalidFunctionArgError(argtok, functionToken->next()->astOperand1()->expressionString(), argnr, invalidValue, mSettings->library.validarg(functionToken, argnr)); + invalidFunctionArgError(argtok, functionToken->next()->astOperand1()->expressionString(), argnr, invalidValue, mSettings.library.validarg(functionToken, argnr)); } if (astIsBool(argtok)) { // check - if (mSettings->library.isboolargbad(functionToken, argnr)) + if (mSettings.library.isboolargbad(functionToken, argnr)) invalidFunctionArgBoolError(argtok, functionToken->str(), argnr); // Are the values 0 and 1 valid? - else if (!mSettings->library.isIntArgValid(functionToken, argnr, 0, *mSettings)) - invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings->library.validarg(functionToken, argnr)); - else if (!mSettings->library.isIntArgValid(functionToken, argnr, 1, *mSettings)) - invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings->library.validarg(functionToken, argnr)); + else if (!mSettings.library.isIntArgValid(functionToken, argnr, 0, mSettings)) + invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings.library.validarg(functionToken, argnr)); + else if (!mSettings.library.isIntArgValid(functionToken, argnr, 1, mSettings)) + invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings.library.validarg(functionToken, argnr)); } // check - if (mSettings->library.isargstrz(functionToken, argnr)) { + if (mSettings.library.isargstrz(functionToken, argnr)) { if (Token::Match(argtok, "& %var% !![") && argtok->next() && argtok->next()->valueType()) { const ValueType * valueType = argtok->next()->valueType(); const Variable * variable = argtok->next()->variable(); @@ -153,7 +153,7 @@ void CheckFunctionsImpl::invalidFunctionUsage() // Is non-null terminated local variable of type char (e.g. char buf[] = {'x'};) ? if (variable && variable->isLocal() && valueType && (valueType->type == ValueType::Type::CHAR || valueType->type == ValueType::Type::WCHAR_T) - && !isVariablesChanged(variable->declEndToken(), functionToken, valueType->pointer, { variable }, *mSettings)) { + && !isVariablesChanged(variable->declEndToken(), functionToken, valueType->pointer, { variable }, mSettings)) { const Token* varTok = variable->declEndToken(); MathLib::bigint count = -1; // Find out explicitly set count, e.g.: char buf[3] = {...}. Variable 'count' is set to 3 then. if (varTok && Token::simpleMatch(varTok->astOperand1(), "[")) @@ -183,7 +183,7 @@ void CheckFunctionsImpl::invalidFunctionUsage() invalidFunctionArgStrError(argtok, functionToken->str(), argnr); } } else if (count > -1 && Token::Match(varTok, "= %str%")) { - const Token* strTok = varTok->getValueTokenMinStrSize(*mSettings); + const Token* strTok = varTok->getValueTokenMinStrSize(mSettings); if (strTok) { const int strSize = Token::getStrArraySize(strTok); if (strSize > count && strTok->str().find('\0') == std::string::npos) @@ -247,9 +247,9 @@ void CheckFunctionsImpl::invalidFunctionArgStrError(const Token *tok, const std: //--------------------------------------------------------------------------- void CheckFunctionsImpl::checkIgnoredReturnValue() { - if (!mSettings->severity.isEnabled(Severity::warning) && - !mSettings->severity.isEnabled(Severity::style) && - !mSettings->isPremiumEnabled("ignoredReturnValue")) + if (!mSettings.severity.isEnabled(Severity::warning) && + !mSettings.severity.isEnabled(Severity::style) && + !mSettings.isPremiumEnabled("ignoredReturnValue")) return; logChecker("CheckFunctions::checkIgnoredReturnValue"); // style,warning @@ -282,13 +282,13 @@ void CheckFunctionsImpl::checkIgnoredReturnValue() if ((!tok->function() || !Token::Match(tok->function()->retDef, "void %name%")) && tok->next()->astOperand1()) { - const Library::UseRetValType retvalTy = mSettings->library.getUseRetValType(tok); + const Library::UseRetValType retvalTy = mSettings.library.getUseRetValType(tok); const bool warn = (tok->function() && (tok->function()->isAttributeNodiscard() || tok->function()->isAttributePure() || tok->function()->isAttributeConst())) || // avoid duplicate warnings for resource-allocating functions - (retvalTy == Library::UseRetValType::DEFAULT && mSettings->library.getAllocFuncInfo(tok) == nullptr); - if (mSettings->severity.isEnabled(Severity::warning) && warn) + (retvalTy == Library::UseRetValType::DEFAULT && mSettings.library.getAllocFuncInfo(tok) == nullptr); + if (mSettings.severity.isEnabled(Severity::warning) && warn) ignoredReturnValueError(tok, tok->next()->astOperand1()->expressionString()); - else if (mSettings->severity.isEnabled(Severity::style) && + else if (mSettings.severity.isEnabled(Severity::style) && retvalTy == Library::UseRetValType::ERROR_CODE) ignoredReturnErrorCode(tok, tok->next()->astOperand1()->expressionString()); } @@ -321,7 +321,7 @@ void CheckFunctionsImpl::checkMissingReturn() const Function *function = scope->function; if (!function || !function->hasBody()) continue; - if (function->name() == "main" && !(mTokenizer->isC() && mSettings->standards.c < Standards::C99)) + if (function->name() == "main" && !(mTokenizer->isC() && mSettings.standards.c < Standards::C99)) continue; if (function->type != FunctionType::eFunction && function->type != FunctionType::eOperatorEqual) continue; @@ -329,7 +329,7 @@ void CheckFunctionsImpl::checkMissingReturn() continue; if (Function::returnsVoid(function, true)) continue; - const Token *errorToken = checkMissingReturnScope(scope->bodyEnd, mSettings->library); + const Token *errorToken = checkMissingReturnScope(scope->bodyEnd, mSettings.library); if (errorToken) missingReturnError(errorToken); } @@ -441,10 +441,10 @@ void CheckFunctionsImpl::missingReturnError(const Token* tok) //--------------------------------------------------------------------------- void CheckFunctionsImpl::checkMathFunctions() { - const bool styleC99 = mSettings->severity.isEnabled(Severity::style) && ((mTokenizer->isC() && mSettings->standards.c != Standards::C89) || (mTokenizer->isCPP() && mSettings->standards.cpp != Standards::CPP03)); - const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); + const bool styleC99 = mSettings.severity.isEnabled(Severity::style) && ((mTokenizer->isC() && mSettings.standards.c != Standards::C89) || (mTokenizer->isCPP() && mSettings.standards.cpp != Standards::CPP03)); + const bool printWarnings = mSettings.severity.isEnabled(Severity::warning); - if (!styleC99 && !printWarnings && !mSettings->isPremiumEnabled("wrongmathcall")) + if (!styleC99 && !printWarnings && !mSettings.isPremiumEnabled("wrongmathcall")) return; logChecker("CheckFunctions::checkMathFunctions"); // style,warning,c99,c++11 @@ -528,7 +528,7 @@ void CheckFunctionsImpl::memsetZeroBytes() // //
- if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckFunctions::memsetZeroBytes"); // warning @@ -567,8 +567,8 @@ void CheckFunctionsImpl::memsetInvalid2ndParam() // //
- const bool printPortability = mSettings->severity.isEnabled(Severity::portability); - const bool printWarning = mSettings->severity.isEnabled(Severity::warning); + const bool printPortability = mSettings.severity.isEnabled(Severity::portability); + const bool printWarning = mSettings.severity.isEnabled(Severity::warning); if (!printWarning && !printPortability) return; @@ -596,8 +596,8 @@ void CheckFunctionsImpl::memsetInvalid2ndParam() if (printWarning && secondParamTok->isNumber()) { // Check if the second parameter is a literal and is out of range const MathLib::bigint value = MathLib::toBigNumber(secondParamTok); - const long long sCharMin = mSettings->platform.signedCharMin(); - const long long uCharMax = mSettings->platform.unsignedCharMax(); + const long long sCharMin = mSettings.platform.signedCharMin(); + const long long uCharMax = mSettings.platform.unsignedCharMax(); if (value < sCharMin || value > uCharMax) memsetValueOutOfRangeError(secondParamTok, secondParamTok->str()); } @@ -627,7 +627,7 @@ void CheckFunctionsImpl::memsetValueOutOfRangeError(const Token *tok, const std: void CheckFunctionsImpl::checkLibraryMatchFunctions() { - if (!mSettings->checkLibrary) + if (!mSettings.checkLibrary) return; bool insideNew = false; @@ -665,32 +665,32 @@ void CheckFunctionsImpl::checkLibraryMatchFunctions() if (Token::simpleMatch(tok->astParent(), ".")) { const Token* contTok = tok->astParent()->astOperand1(); - if (astContainerAction(contTok, mSettings->library) != Library::Container::Action::NO_ACTION) + if (astContainerAction(contTok, mSettings.library) != Library::Container::Action::NO_ACTION) continue; - if (astContainerYield(contTok, mSettings->library) != Library::Container::Yield::NO_YIELD) + if (astContainerYield(contTok, mSettings.library) != Library::Container::Yield::NO_YIELD) continue; } - if (!mSettings->library.isNotLibraryFunction(tok)) + if (!mSettings.library.isNotLibraryFunction(tok)) continue; - const std::string &functionName = mSettings->library.getFunctionName(tok); + const std::string &functionName = mSettings.library.getFunctionName(tok); if (functionName.empty()) continue; - if (mSettings->library.functions().find(functionName) != mSettings->library.functions().end()) + if (mSettings.library.functions().find(functionName) != mSettings.library.functions().end()) continue; - if (mSettings->library.podtype(tok->expressionString())) + if (mSettings.library.podtype(tok->expressionString())) continue; - if (mSettings->library.getTypeCheck("unusedvar", functionName) != Library::TypeCheck::def) + if (mSettings.library.getTypeCheck("unusedvar", functionName) != Library::TypeCheck::def) continue; const Token* start = tok; while (Token::Match(start->tokAt(-2), "%name% ::") && !start->tokAt(-2)->isKeyword()) start = start->tokAt(-2); - if (mSettings->library.detectContainerOrIterator(start)) + if (mSettings.library.detectContainerOrIterator(start)) continue; reportError(tok, @@ -705,10 +705,10 @@ void CheckFunctionsImpl::checkLibraryMatchFunctions() // details: https://en.cppreference.com/w/cpp/language/copy_elision void CheckFunctionsImpl::returnLocalStdMove() { - if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11) + if (!mTokenizer->isCPP() || mSettings.standards.cpp < Standards::CPP11) return; - if (!mSettings->severity.isEnabled(Severity::performance)) + if (!mSettings.severity.isEnabled(Severity::performance)) return; logChecker("CheckFunctions::returnLocalStdMove"); // performance,c++11 @@ -744,7 +744,7 @@ void CheckFunctionsImpl::copyElisionError(const Token *tok) void CheckFunctionsImpl::useStandardLibrary() { - if (!mSettings->severity.isEnabled(Severity::style)) + if (!mSettings.severity.isEnabled(Severity::style)) return; logChecker("CheckFunctions::useStandardLibrary"); // style @@ -780,10 +780,10 @@ void CheckFunctionsImpl::useStandardLibrary() const auto& secondOp = condToken->str(); const bool isLess = "<" == secondOp && - isConstExpression(condToken->astOperand2(), mSettings->library) && + isConstExpression(condToken->astOperand2(), mSettings.library) && condToken->astOperand1()->varId() == idxVarId; const bool isMore = ">" == secondOp && - isConstExpression(condToken->astOperand1(), mSettings->library) && + isConstExpression(condToken->astOperand1(), mSettings.library) && condToken->astOperand2()->varId() == idxVarId; if (!(isLess || isMore)) @@ -855,7 +855,7 @@ void CheckFunctionsImpl::useStandardLibraryError(const Token *tok, const std::st void CheckFunctions::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckFunctionsImpl checkFunctions(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckFunctionsImpl checkFunctions(&tokenizer, tokenizer.getSettings(), errorLogger); checkFunctions.checkIgnoredReturnValue(); checkFunctions.checkMissingReturn(); // Missing "return" in exit path @@ -872,11 +872,11 @@ void CheckFunctions::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog checkFunctions.useStandardLibrary(); } -void CheckFunctions::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckFunctions::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckFunctionsImpl c(nullptr, settings, errorLogger); - for (auto i = settings->library.functionwarn().cbegin(); i != settings->library.functionwarn().cend(); ++i) { + for (auto i = settings.library.functionwarn().cbegin(); i != settings.library.functionwarn().cend(); ++i) { c.functionCalledError(nullptr, Severity::style, i->first, i->second.message); } diff --git a/lib/checkfunctions.h b/lib/checkfunctions.h index 7ea9e2833a2..b6939ffb17f 100644 --- a/lib/checkfunctions.h +++ b/lib/checkfunctions.h @@ -54,7 +54,7 @@ class CPPCHECKLIB CheckFunctions : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check function usage:\n" @@ -73,7 +73,7 @@ class CPPCHECKLIB CheckFunctions : public Check { class CPPCHECKLIB CheckFunctionsImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckFunctionsImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckFunctionsImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Check for functions that should not be used */ diff --git a/lib/checkimpl.cpp b/lib/checkimpl.cpp index 43e56cfa360..2b28b829277 100644 --- a/lib/checkimpl.cpp +++ b/lib/checkimpl.cpp @@ -47,7 +47,7 @@ void CheckImpl::reportError(ErrorPath errorPath, Severity severity, const char i bool CheckImpl::wrongData(const Token *tok, const char *str) { - if (mSettings->daca) + if (mSettings.daca) reportError(tok, Severity::debug, "DacaWrongData", "Wrong data detected by condition " + std::string(str)); return true; } @@ -57,7 +57,7 @@ ErrorPath CheckImpl::getErrorPath(const Token* errtok, const ValueFlow::Value* v ErrorPath errorPath; if (!value) { errorPath.emplace_back(errtok, std::move(bug)); - } else if (mSettings->verbose || mSettings->outputFormat == Settings::OutputFormat::xml || !mSettings->templateLocation.empty()) { + } else if (mSettings.verbose || mSettings.outputFormat == Settings::OutputFormat::xml || !mSettings.templateLocation.empty()) { errorPath = value->errorPath; errorPath.emplace_back(errtok, std::move(bug)); } else { @@ -72,6 +72,6 @@ ErrorPath CheckImpl::getErrorPath(const Token* errtok, const ValueFlow::Value* v void CheckImpl::logChecker(const char id[]) { - if (!mSettings->buildDir.empty() || mSettings->collectLogCheckers()) + if (!mSettings.buildDir.empty() || mSettings.collectLogCheckers()) reportError(nullptr, Severity::internal, "logChecker", id); } diff --git a/lib/checkimpl.h b/lib/checkimpl.h index 35e70bbaae5..36f04a23d1f 100644 --- a/lib/checkimpl.h +++ b/lib/checkimpl.h @@ -37,7 +37,7 @@ class CPPCHECKLIB CheckImpl { protected: /** This constructor is used when running checks. */ - CheckImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : mTokenizer(tokenizer), mSettings(settings), mErrorLogger(errorLogger) {} public: @@ -46,7 +46,7 @@ class CPPCHECKLIB CheckImpl protected: const Tokenizer* const mTokenizer{}; - const Settings* const mSettings{}; + const Settings& mSettings; ErrorLogger* const mErrorLogger{}; /** report an error */ diff --git a/lib/checkinternal.cpp b/lib/checkinternal.cpp index 10af0543cec..f84203e5d0d 100644 --- a/lib/checkinternal.cpp +++ b/lib/checkinternal.cpp @@ -382,7 +382,7 @@ void CheckInternal::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogg if (!tokenizer.getSettings().checks.isEnabled(Checks::internalCheck)) return; - CheckInternalImpl checkInternal(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckInternalImpl checkInternal(&tokenizer, tokenizer.getSettings(), errorLogger); checkInternal.checkTokenMatchPatterns(); checkInternal.checkTokenSimpleMatchPatterns(); @@ -393,7 +393,7 @@ void CheckInternal::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogg checkInternal.checkRedundantTokCheck(); } -void CheckInternal::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckInternal::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckInternalImpl c(nullptr, settings, errorLogger); c.simplePatternError(nullptr, "class {", "Match"); diff --git a/lib/checkinternal.h b/lib/checkinternal.h index 2d95e3ed7e4..2b6267b4550 100644 --- a/lib/checkinternal.h +++ b/lib/checkinternal.h @@ -48,7 +48,7 @@ class CPPCHECKLIB CheckInternal : public Check { private: void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { // Don't include these checks on the WIKI where people can read what @@ -60,7 +60,7 @@ class CPPCHECKLIB CheckInternal : public Check { class CPPCHECKLIB CheckInternalImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckInternalImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckInternalImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check if a simple pattern is used inside Token::Match or Token::findmatch */ diff --git a/lib/checkio.cpp b/lib/checkio.cpp index f1cb4670c50..a62955d3017 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -121,9 +121,9 @@ namespace { void CheckIOImpl::checkFileUsage() { - const bool windows = mSettings->platform.isWindows(); - const bool printPortability = mSettings->severity.isEnabled(Severity::portability); - const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); + const bool windows = mSettings.platform.isWindows(); + const bool printPortability = mSettings.severity.isEnabled(Severity::portability); + const bool printWarnings = mSettings.severity.isEnabled(Severity::warning); std::map filepointers; @@ -166,7 +166,7 @@ void CheckIOImpl::checkFileUsage() filepointer.second.lastOperation = Filepointer::Operation::UNKNOWN_OP; } } - } else if (tok->str() == "return" || tok->str() == "continue" || tok->str() == "break" || mSettings->library.isnoreturn(tok)) { // Reset upon return, continue or break + } else if (tok->str() == "return" || tok->str() == "continue" || tok->str() == "break" || mSettings.library.isnoreturn(tok)) { // Reset upon return, continue or break for (std::pair& filepointer : filepointers) { filepointer.second.mode_indent = 0; filepointer.second.mode = OpenMode::UNKNOWN_OM; @@ -258,7 +258,7 @@ void CheckIOImpl::checkFileUsage() } // Do not trigger a warning if the loop always exits or if the file is opened again in the loop. - if (!isReturnScope(bodyEnd, mSettings->library) && Token::findmatch(bodyStart, "%var% =", bodyEnd, fileTok->varId()) == nullptr) + if (!isReturnScope(bodyEnd, mSettings.library) && Token::findmatch(bodyStart, "%var% =", bodyEnd, fileTok->varId()) == nullptr) fcloseInLoopConditionError(tok, fileTok->str()); } } @@ -267,7 +267,7 @@ void CheckIOImpl::checkFileUsage() if ((tok->str() == "ungetc" || tok->str() == "ungetwc") && fileTok) fileTok = fileTok->nextArgument(); operation = Filepointer::Operation::UNIMPORTANT; - } else if (!Token::Match(tok, "if|for|while|catch|switch") && !mSettings->library.isFunctionConst(tok->str(), true)) { + } else if (!Token::Match(tok, "if|for|while|catch|switch") && !mSettings.library.isFunctionConst(tok->str(), true)) { const Token* const end2 = tok->linkAt(1); if (scope->functionOf && scope->functionOf->isClassOrStruct() && !scope->function->isStatic() && ((tok->strAt(-1) != "::" && tok->strAt(-1) != ".") || tok->strAt(-2) == "this")) { if (!tok->function() || (tok->function()->nestedIn && tok->function()->nestedIn->isClassOrStruct())) { @@ -436,7 +436,7 @@ void CheckIOImpl::incompatibleFileOpenError(const Token *tok, const std::string //--------------------------------------------------------------------------- void CheckIOImpl::invalidScanf() { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("invalidscanf")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("invalidscanf")) return; logChecker("CheckIO::invalidScanf"); @@ -556,7 +556,7 @@ static inline bool typesMatch(const std::string& iToTest, const std::string& iTy void CheckIOImpl::checkWrongPrintfScanfArguments() { const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); - const bool isWindows = mSettings->platform.isWindows(); + const bool isWindows = mSettings.platform.isWindows(); logChecker("CheckIO::checkWrongPrintfScanfArguments"); @@ -571,10 +571,10 @@ void CheckIOImpl::checkWrongPrintfScanfArguments() bool scanf_s = false; int formatStringArgNo = -1; - if (tok->strAt(1) == "(" && mSettings->library.formatstr_function(tok)) { - formatStringArgNo = mSettings->library.formatstr_argno(tok); - scan = mSettings->library.formatstr_scan(tok); - scanf_s = mSettings->library.formatstr_secure(tok); + if (tok->strAt(1) == "(" && mSettings.library.formatstr_function(tok)) { + formatStringArgNo = mSettings.library.formatstr_argno(tok); + scan = mSettings.library.formatstr_scan(tok); + scanf_s = mSettings.library.formatstr_secure(tok); } if (formatStringArgNo >= 0) { @@ -631,8 +631,8 @@ void CheckIOImpl::checkFormatString(const Token * const tok, const bool scan, const bool scanf_s) { - const bool isWindows = mSettings->platform.isWindows(); - const bool printWarning = mSettings->severity.isEnabled(Severity::warning); + const bool isWindows = mSettings.platform.isWindows(); + const bool printWarning = mSettings.severity.isEnabled(Severity::warning); const std::string &formatString = formatStringTok->str(); // Count format string parameters.. @@ -722,9 +722,9 @@ void CheckIOImpl::checkFormatString(const Token * const tok, } // Perform type checks - ArgumentInfo argInfo(argListTok, *mSettings, mTokenizer->isCPP()); + ArgumentInfo argInfo(argListTok, mSettings, mTokenizer->isCPP()); - if ((argInfo.typeToken && !argInfo.isLibraryType(*mSettings)) || *i == ']') { + if ((argInfo.typeToken && !argInfo.isLibraryType(mSettings)) || *i == ']') { if (scan) { std::string specifier; bool done = false; @@ -1737,7 +1737,7 @@ void CheckIOImpl::wrongPrintfScanfArgumentsError(const Token* tok, nonneg int numFunction) { const Severity severity = numFormat > numFunction ? Severity::error : Severity::warning; - if (severity != Severity::error && !mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("wrongPrintfScanfArgNum")) + if (severity != Severity::error && !mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("wrongPrintfScanfArgNum")) return; std::ostringstream errmsg; @@ -1756,7 +1756,7 @@ void CheckIOImpl::wrongPrintfScanfArgumentsError(const Token* tok, void CheckIOImpl::wrongPrintfScanfPosixParameterPositionError(const Token* tok, const std::string& functionName, nonneg int index, nonneg int numFunction) { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("wrongPrintfScanfParameterPositionError")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("wrongPrintfScanfParameterPositionError")) return; std::ostringstream errmsg; errmsg << functionName << ": "; @@ -1771,7 +1771,7 @@ void CheckIOImpl::wrongPrintfScanfPosixParameterPositionError(const Token* tok, void CheckIOImpl::invalidScanfArgTypeError_s(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%" << specifier << " in format string (no. " << numFormat << ") requires a \'"; @@ -1787,7 +1787,7 @@ void CheckIOImpl::invalidScanfArgTypeError_s(const Token* tok, nonneg int numFor void CheckIOImpl::invalidScanfArgTypeError_int(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo, bool isUnsigned) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%" << specifier << " in format string (no. " << numFormat << ") requires \'"; @@ -1832,7 +1832,7 @@ void CheckIOImpl::invalidScanfArgTypeError_int(const Token* tok, nonneg int numF void CheckIOImpl::invalidScanfArgTypeError_float(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%" << specifier << " in format string (no. " << numFormat << ") requires \'"; @@ -1851,7 +1851,7 @@ void CheckIOImpl::invalidScanfArgTypeError_float(const Token* tok, nonneg int nu void CheckIOImpl::invalidPrintfArgTypeError_s(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%s in format string (no. " << numFormat << ") requires \'char *\' but the argument type is "; @@ -1862,7 +1862,7 @@ void CheckIOImpl::invalidPrintfArgTypeError_s(const Token* tok, nonneg int numFo void CheckIOImpl::invalidPrintfArgTypeError_n(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%n in format string (no. " << numFormat << ") requires \'int *\' but the argument type is "; @@ -1873,7 +1873,7 @@ void CheckIOImpl::invalidPrintfArgTypeError_n(const Token* tok, nonneg int numFo void CheckIOImpl::invalidPrintfArgTypeError_p(const Token* tok, nonneg int numFormat, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%p in format string (no. " << numFormat << ") requires an address but the argument type is "; @@ -1923,7 +1923,7 @@ static void printfFormatType(std::ostream& os, const std::string& specifier, boo void CheckIOImpl::invalidPrintfArgTypeError_uint(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%" << specifier << " in format string (no. " << numFormat << ") requires "; @@ -1937,7 +1937,7 @@ void CheckIOImpl::invalidPrintfArgTypeError_uint(const Token* tok, nonneg int nu void CheckIOImpl::invalidPrintfArgTypeError_sint(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%" << specifier << " in format string (no. " << numFormat << ") requires "; @@ -1950,7 +1950,7 @@ void CheckIOImpl::invalidPrintfArgTypeError_sint(const Token* tok, nonneg int nu void CheckIOImpl::invalidPrintfArgTypeError_float(const Token* tok, nonneg int numFormat, const std::string& specifier, const ArgumentInfo* argInfo) { const Severity severity = getSeverity(argInfo); - if (!mSettings->severity.isEnabled(severity)) + if (!mSettings.severity.isEnabled(severity)) return; std::ostringstream errmsg; errmsg << "%" << specifier << " in format string (no. " << numFormat << ") requires \'"; @@ -2019,7 +2019,7 @@ void CheckIOImpl::argumentType(std::ostream& os, const ArgumentInfo * argInfo) void CheckIOImpl::invalidLengthModifierError(const Token* tok, nonneg int numFormat, const std::string& modifier) { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("invalidLengthModifierError")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("invalidLengthModifierError")) return; std::ostringstream errmsg; errmsg << "'" << modifier << "' in format string (no. " << numFormat << ") is a length modifier and cannot be used without a conversion specifier."; @@ -2038,7 +2038,7 @@ void CheckIOImpl::invalidScanfFormatWidthError(const Token* tok, nonneg int numF std::ostringstream errmsg; if (arrlen > width) { - if (tok != nullptr && (!mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning))) + if (tok != nullptr && (!mSettings.certainty.isEnabled(Certainty::inconclusive) || !mSettings.severity.isEnabled(Severity::warning))) return; errmsg << "Width " << width << " given in format string (no. " << numFormat << ") is smaller than destination buffer" << " '" << varname << "[" << arrlen << "]'."; @@ -2052,7 +2052,7 @@ void CheckIOImpl::invalidScanfFormatWidthError(const Token* tok, nonneg int numF void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckIOImpl checkIO(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckIOImpl checkIO(&tokenizer, tokenizer.getSettings(), errorLogger); checkIO.checkWrongPrintfScanfArguments(); checkIO.checkCoutCerrMisusage(); @@ -2060,7 +2060,7 @@ void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkIO.invalidScanf(); } -void CheckIO::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckIO::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckIOImpl c(nullptr, settings, errorLogger); c.coutCerrMisusageError(nullptr, "cout"); diff --git a/lib/checkio.h b/lib/checkio.h index acad40de136..4642feac511 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -52,7 +52,7 @@ class CPPCHECKLIB CheckIO : public Check { /** @brief Run checks on the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check format string input/output operations.\n" @@ -72,7 +72,7 @@ class CPPCHECKLIB CheckIO : public Check { class CPPCHECKLIB CheckIOImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckIOImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckIOImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for missusage of std::cout */ diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 7e12872c3d4..11d1086ee5d 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -137,9 +137,9 @@ void CheckLeakAutoVarImpl::deallocReturnError(const Token *tok, const Token *dea void CheckLeakAutoVarImpl::configurationInfo(const Token* tok, const std::pair& functionUsage) { - if (mSettings->checkLibrary && functionUsage.second == VarInfo::USED && + if (mSettings.checkLibrary && functionUsage.second == VarInfo::USED && (!functionUsage.first || !functionUsage.first->function() || !functionUsage.first->function()->hasBody())) { - std::string funcStr = functionUsage.first ? mSettings->library.getFunctionName(functionUsage.first) : "f"; + std::string funcStr = functionUsage.first ? mSettings.library.getFunctionName(functionUsage.first) : "f"; if (funcStr.empty()) funcStr = "unknown::" + functionUsage.first->str(); reportError(tok, @@ -162,7 +162,7 @@ void CheckLeakAutoVarImpl::doubleFreeError(const Token *tok, const Token *prevFr void CheckLeakAutoVarImpl::check() { - if (mSettings->clang) + if (mSettings.clang) return; logChecker("CheckLeakAutoVar::check"); // notclang @@ -381,7 +381,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, ftok = ftok->tokAt(2); // bailout for variable passed to library function with out parameter - if (const Library::Function *libFunc = mSettings->library.getFunction(ftok)) { + if (const Library::Function *libFunc = mSettings.library.getFunction(ftok)) { using ArgumentChecks = Library::ArgumentChecks; using Direction = ArgumentChecks::Direction; const std::vector args = getArguments(ftok); @@ -479,7 +479,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, // allocation? const Token *const fTok = tokRightAstOperand ? tokRightAstOperand->previous() : nullptr; if (Token::Match(fTok, "%type% (")) { - const Library::AllocFunc* f = mSettings->library.getAllocFuncInfo(fTok); + const Library::AllocFunc* f = mSettings.library.getAllocFuncInfo(fTok); if (f && f->arg == -1) { VarInfo::AllocInfo& varAlloc = alloctype[varTok->varId()]; varAlloc.type = f->groupId; @@ -545,7 +545,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, tokRightAstOperand = tokRightAstOperand->astOperand2() ? tokRightAstOperand->astOperand2() : tokRightAstOperand->astOperand1(); if (tokRightAstOperand && Token::Match(tokRightAstOperand->previous(), "%type% (")) { const Token * fTok = tokRightAstOperand->previous(); - const Library::AllocFunc* f = mSettings->library.getAllocFuncInfo(fTok); + const Library::AllocFunc* f = mSettings.library.getAllocFuncInfo(fTok); if (f && f->arg == -1) { VarInfo::AllocInfo& varAlloc = alloctype[innerTok->varId()]; varAlloc.type = f->groupId; @@ -568,7 +568,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, // check for function call if (openingPar) { - const Library::AllocFunc* allocFunc = mSettings->library.getDeallocFuncInfo(innerTok); + const Library::AllocFunc* allocFunc = mSettings.library.getDeallocFuncInfo(innerTok); // innerTok is a function name const VarInfo::AllocInfo allocation(0, VarInfo::NOALLOC); functionCall(innerTok, openingPar, varInfo, allocation, allocFunc); @@ -623,7 +623,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair& info) { if (info.second.status != VarInfo::ALLOC) return false; - const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, *mSettings); + const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, mSettings); return ret && vartok && ret->varId() && ret->varId() == vartok->varId(); })) { varInfo1.clear(); @@ -755,7 +755,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, // Function call.. else if (const Token* openingPar = isFunctionCall(ftok)) { - const Library::AllocFunc* af = mSettings->library.getDeallocFuncInfo(ftok); + const Library::AllocFunc* af = mSettings.library.getDeallocFuncInfo(ftok); VarInfo::AllocInfo allocation(af ? af->groupId : 0, VarInfo::DEALLOC, ftok); if (allocation.type == 0) allocation.status = VarInfo::NOALLOC; @@ -776,8 +776,8 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, if (ftok->function() && !ftok->function()->isAttributeNoreturn() && !(ftok->function()->functionScope && mTokenizer->isScopeNoReturn(ftok->function()->functionScope->bodyEnd))) // check function scope continue; - const std::string functionName(mSettings->library.getFunctionName(ftok)); - if (!mSettings->library.isLeakIgnore(functionName) && !mSettings->library.isUse(functionName)) { + const std::string functionName(mSettings.library.getFunctionName(ftok)); + if (!mSettings.library.isLeakIgnore(functionName) && !mSettings.library.isUse(functionName)) { const VarInfo::Usage usage = Token::simpleMatch(openingPar, "( )") ? VarInfo::NORET : VarInfo::USED; // TODO: check parameters passed to function varInfo.possibleUsageAll({ ftok, usage }); } @@ -800,7 +800,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, } // Check smart pointer - else if (Token::Match(ftok, "%name% <") && mSettings->library.isSmartPointer(tok)) { + else if (Token::Match(ftok, "%name% <") && mSettings.library.isSmartPointer(tok)) { const Token * typeEndTok = ftok->linkAt(1); if (!Token::Match(typeEndTok, "> %var% {|( %var% ,|)|}")) continue; @@ -835,7 +835,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, const Token * dtok = Token::findmatch(deleterToken, "& %name%", endDeleterToken); if (dtok) { dtok = dtok->next(); - af = mSettings->library.getDeallocFuncInfo(dtok); + af = mSettings.library.getDeallocFuncInfo(dtok); } if (!dtok || !af) { const Token * tscopeStart = nullptr; @@ -865,7 +865,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, if (tscopeStart && tscopeEnd) { for (const Token *tok2 = tscopeStart; tok2 != tscopeEnd; tok2 = tok2->next()) { - af = mSettings->library.getDeallocFuncInfo(tok2); + af = mSettings.library.getDeallocFuncInfo(tok2); if (af) break; } @@ -896,7 +896,7 @@ const Token * CheckLeakAutoVarImpl::checkTokenInsideExpression(const Token * con if (var != varInfo.alloctype.end()) { bool unknown = false; if (var->second.status == VarInfo::DEALLOC && tok->valueType() && tok->valueType()->pointer && - CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings, /*checkNullArg*/ false) && !unknown) { + CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings, /*checkNullArg*/ false) && !unknown) { deallocUseError(tok, tok->str()); } else if (Token::simpleMatch(tok->tokAt(-2), "= &")) { varInfo.erase(tok->varId()); @@ -917,9 +917,9 @@ const Token * CheckLeakAutoVarImpl::checkTokenInsideExpression(const Token * con if ((rhs->str() == "." || rhs->varId() == tok->varId()) && isAssignment) { // simple assignment varInfo.erase(tok->varId()); - } else if (rhs->astParent() && rhs->str() == "(" && !mSettings->library.returnValue(rhs->astOperand1()).empty()) { + } else if (rhs->astParent() && rhs->str() == "(" && !mSettings.library.returnValue(rhs->astOperand1()).empty()) { // #9298, assignment through return value of a function - const std::string &returnValue = mSettings->library.returnValue(rhs->astOperand1()); + const std::string &returnValue = mSettings.library.returnValue(rhs->astOperand1()); if (startsWith(returnValue, "arg")) { int argn; const Token *func = getTokenArgumentFunction(tok, argn); @@ -940,12 +940,12 @@ const Token * CheckLeakAutoVarImpl::checkTokenInsideExpression(const Token * con // check for function call const Token * const openingPar = inFuncCall ? nullptr : isFunctionCall(tok); if (openingPar) { - const Library::AllocFunc* allocFunc = mSettings->library.getDeallocFuncInfo(tok); + const Library::AllocFunc* allocFunc = mSettings.library.getDeallocFuncInfo(tok); VarInfo::AllocInfo alloc(allocFunc ? allocFunc->groupId : 0, VarInfo::DEALLOC, tok); if (alloc.type == 0) alloc.status = VarInfo::NOALLOC; functionCall(tok, openingPar, varInfo, alloc, nullptr); - const std::string &returnValue = mSettings->library.returnValue(tok); + const std::string &returnValue = mSettings.library.returnValue(tok); if (startsWith(returnValue, "arg")) // the function returns one of its argument, we need to process a potential assignment return openingPar; @@ -958,7 +958,7 @@ const Token * CheckLeakAutoVarImpl::checkTokenInsideExpression(const Token * con void CheckLeakAutoVarImpl::changeAllocStatusIfRealloc(std::map &alloctype, const Token *fTok, const Token *retTok) const { - const Library::AllocFunc* f = mSettings->library.getReallocFuncInfo(fTok); + const Library::AllocFunc* f = mSettings.library.getReallocFuncInfo(fTok); if (f && f->arg == -1 && f->reallocArg > 0 && f->reallocArg <= numberOfArguments(fTok)) { const Token* argTok = getArguments(fTok).at(f->reallocArg - 1); if (alloctype.find(argTok->varId()) != alloctype.end()) { @@ -984,7 +984,7 @@ void CheckLeakAutoVarImpl::changeAllocStatus(VarInfo &varInfo, const VarInfo::Al if (var != alloctype.end()) { // bailout if function is also allocating, since the argument might be moved // to the return value, such as in fdopen - if (allocation.allocTok && mSettings->library.getAllocFuncInfo(allocation.allocTok)) { + if (allocation.allocTok && mSettings.library.getAllocFuncInfo(allocation.allocTok)) { varInfo.erase(arg->varId()); return; } @@ -1017,8 +1017,8 @@ void CheckLeakAutoVarImpl::changeAllocStatus(VarInfo &varInfo, const VarInfo::Al void CheckLeakAutoVarImpl::functionCall(const Token *tokName, const Token *tokOpeningPar, VarInfo &varInfo, const VarInfo::AllocInfo& allocation, const Library::AllocFunc* af) { // Ignore function call? - const bool isLeakIgnore = mSettings->library.isLeakIgnore(mSettings->library.getFunctionName(tokName)); - if (mSettings->library.getReallocFuncInfo(tokName)) + const bool isLeakIgnore = mSettings.library.isLeakIgnore(mSettings.library.getFunctionName(tokName)); + if (mSettings.library.getReallocFuncInfo(tokName)) return; if (tokName->next()->valueType() && tokName->next()->valueType()->container && tokName->next()->valueType()->container->stdStringLike) return; @@ -1069,10 +1069,10 @@ void CheckLeakAutoVarImpl::functionCall(const Token *tokName, const Token *tokOp // Is variable allocated? if (!isnull && (!af || af->arg == argNr)) { - const Library::AllocFunc* deallocFunc = mSettings->library.getDeallocFuncInfo(tokName); + const Library::AllocFunc* deallocFunc = mSettings.library.getDeallocFuncInfo(tokName); VarInfo::AllocInfo dealloc(deallocFunc ? deallocFunc->groupId : 0, VarInfo::DEALLOC, tokName); - if (const Library::AllocFunc* allocFunc = mSettings->library.getAllocFuncInfo(tokName)) { - if (mSettings->library.getDeallocFuncInfo(tokName)) { + if (const Library::AllocFunc* allocFunc = mSettings.library.getAllocFuncInfo(tokName)) { + if (mSettings.library.getDeallocFuncInfo(tokName)) { changeAllocStatus(varInfo, dealloc.type == 0 ? allocation : dealloc, tokName, arg); } if (allocFunc->arg == argNr && @@ -1092,7 +1092,7 @@ void CheckLeakAutoVarImpl::functionCall(const Token *tokName, const Token *tokOp } } // Check smart pointer - else if (Token::Match(arg, "%name% < %type%") && mSettings->library.isSmartPointer(argTypeStartTok)) { + else if (Token::Match(arg, "%name% < %type%") && mSettings.library.isSmartPointer(argTypeStartTok)) { const Token * typeEndTok = arg->linkAt(1); const Token * allocTok = nullptr; if (!Token::Match(typeEndTok, "> {|( %var% ,|)|}")) @@ -1117,14 +1117,14 @@ void CheckLeakAutoVarImpl::functionCall(const Token *tokName, const Token *tokOp // Check if its a pointer to a function const Token * dtok = Token::findmatch(deleterToken, "& %name%", endDeleterToken); if (dtok) { - sp_af = mSettings->library.getDeallocFuncInfo(dtok->tokAt(1)); + sp_af = mSettings.library.getDeallocFuncInfo(dtok->tokAt(1)); } else { // If the deleter is a class, check if class calls the dealloc function dtok = Token::findmatch(deleterToken, "%type%", endDeleterToken); if (dtok && dtok->type()) { const Scope * tscope = dtok->type()->classScope; for (const Token *tok2 = tscope->bodyStart; tok2 != tscope->bodyEnd; tok2 = tok2->next()) { - sp_af = mSettings->library.getDeallocFuncInfo(tok2); + sp_af = mSettings.library.getDeallocFuncInfo(tok2); if (sp_af) { allocTok = tok2; break; @@ -1209,7 +1209,7 @@ void CheckLeakAutoVarImpl::ret(const Token *tok, VarInfo &varInfo, const bool is while (tok3 && tok3->isCast() && (!tok3->valueType() || tok3->valueType()->pointer || - isSafeCast(tok3->valueType(), *mSettings))) + isSafeCast(tok3->valueType(), mSettings))) tok3 = tok3->astOperand2() ? tok3->astOperand2() : tok3->astOperand1(); if (tok3 && tok3->varId() == varid) tok2 = tok3->next(); @@ -1232,7 +1232,7 @@ void CheckLeakAutoVarImpl::ret(const Token *tok, VarInfo &varInfo, const bool is // don't warn when returning after checking return value of outparam allocation const Token* outparamFunc{}; if ((tok->scope()->type == ScopeType::eIf || tok->scope()->type== ScopeType::eElse) && - (outparamFunc = getOutparamAllocation(it->second.allocTok, *mSettings))) { + (outparamFunc = getOutparamAllocation(it->second.allocTok, mSettings))) { const Scope* scope = tok->scope(); if (scope->type == ScopeType::eElse) { scope = scope->bodyStart->tokAt(-2)->scope(); @@ -1280,11 +1280,11 @@ void CheckLeakAutoVarImpl::ret(const Token *tok, VarInfo &varInfo, const bool is void CheckLeakAutoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckLeakAutoVarImpl checkLeakAutoVar(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckLeakAutoVarImpl checkLeakAutoVar(&tokenizer, tokenizer.getSettings(), errorLogger); checkLeakAutoVar.check(); } -void CheckLeakAutoVar::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckLeakAutoVar::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckLeakAutoVarImpl c(nullptr, settings, errorLogger); c.deallocReturnError(nullptr, nullptr, "p"); diff --git a/lib/checkleakautovar.h b/lib/checkleakautovar.h index ce7e1ddbd8b..c12c03b6a09 100644 --- a/lib/checkleakautovar.h +++ b/lib/checkleakautovar.h @@ -113,7 +113,7 @@ class CPPCHECKLIB CheckLeakAutoVar : public Check { private: void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Detect when a auto variable is allocated but not deallocated or deallocated twice.\n"; @@ -123,7 +123,7 @@ class CPPCHECKLIB CheckLeakAutoVar : public Check { class CPPCHECKLIB CheckLeakAutoVarImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckLeakAutoVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckLeakAutoVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** check for leaks in all scopes */ diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index cef03b1a538..0286884ab16 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -95,7 +95,7 @@ CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getAllocationType(const Toke return New; } - if (mSettings->hasLib("posix")) { + if (mSettings.hasLib("posix")) { if (Token::Match(tok2, "open|openat|creat|mkstemp|mkostemp|socket (")) { // simple sanity check of function parameters.. // TODO: Make such check for all these functions @@ -114,11 +114,11 @@ CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getAllocationType(const Toke } // Does tok2 point on a Library allocation function? - const int alloctype = mSettings->library.getAllocId(tok2, -1); + const int alloctype = mSettings.library.getAllocId(tok2, -1); if (alloctype > 0) { - if (alloctype == mSettings->library.deallocId("free")) + if (alloctype == mSettings.library.deallocId("free")) return Malloc; - if (alloctype == mSettings->library.deallocId("fclose")) + if (alloctype == mSettings.library.deallocId("fclose")) return File; return Library::ismemory(alloctype) ? OtherMem : OtherRes; } @@ -159,7 +159,7 @@ CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getReallocationType(const To if (!Token::Match(tok2, "%name% (")) return No; - const Library::AllocFunc *f = mSettings->library.getReallocFuncInfo(tok2); + const Library::AllocFunc *f = mSettings.library.getReallocFuncInfo(tok2); if (!(f && f->reallocArg > 0 && f->reallocArg <= numberOfArguments(tok2))) return No; const auto args = getArguments(tok2); @@ -173,11 +173,11 @@ CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getReallocationType(const To if (varid > 0 && !Token::Match(arg, "%varid% [,)]", varid)) return No; - const int realloctype = mSettings->library.getReallocId(tok2, -1); + const int realloctype = mSettings.library.getReallocId(tok2, -1); if (realloctype > 0) { - if (realloctype == mSettings->library.deallocId("free")) + if (realloctype == mSettings.library.deallocId("free")) return Malloc; - if (realloctype == mSettings->library.deallocId("fclose")) + if (realloctype == mSettings.library.deallocId("fclose")) return File; return Library::ismemory(realloctype) ? OtherMem : OtherRes; } @@ -216,7 +216,7 @@ CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getDeallocationType(const To if (tok->str() == "realloc" && Token::simpleMatch(vartok->next(), ", 0 )")) return Malloc; - if (mSettings->hasLib("posix")) { + if (mSettings.hasLib("posix")) { if (tok->str() == "close") return Fd; if (tok->str() == "pclose") @@ -224,11 +224,11 @@ CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getDeallocationType(const To } // Does tok point on a Library deallocation function? - const int dealloctype = mSettings->library.getDeallocId(tok, argNr); + const int dealloctype = mSettings.library.getDeallocId(tok, argNr); if (dealloctype > 0) { - if (dealloctype == mSettings->library.deallocId("free")) + if (dealloctype == mSettings.library.deallocId("free")) return Malloc; - if (dealloctype == mSettings->library.deallocId("fclose")) + if (dealloctype == mSettings.library.deallocId("fclose")) return File; return Library::ismemory(dealloctype) ? OtherMem : OtherRes; } @@ -243,7 +243,7 @@ CheckMemoryLeakImpl::AllocType CheckMemoryLeakImpl::getDeallocationType(const To bool CheckMemoryLeakImpl::isReopenStandardStream(const Token *tok) const { if (getReallocationType(tok, 0) == File) { - const Library::AllocFunc *f = mSettings->library.getReallocFuncInfo(tok); + const Library::AllocFunc *f = mSettings.library.getReallocFuncInfo(tok); if (f && f->reallocArg > 0 && f->reallocArg <= numberOfArguments(tok)) { const Token* arg = getArguments(tok).at(f->reallocArg - 1); if (Token::Match(arg, "stdin|stdout|stderr")) @@ -255,7 +255,7 @@ bool CheckMemoryLeakImpl::isReopenStandardStream(const Token *tok) const bool CheckMemoryLeakImpl::isOpenDevNull(const Token *tok) const { - if (mSettings->hasLib("posix") && tok->str() == "open" && numberOfArguments(tok) == 2) { + if (mSettings.hasLib("posix") && tok->str() == "open" && numberOfArguments(tok) == 2) { const Token* arg = getArguments(tok).at(0); if (Token::simpleMatch(arg, "\"/dev/null\"")) return true; @@ -440,8 +440,8 @@ void CheckMemoryLeakInFunctionImpl::checkReallocUsage() const Token *const reallocTok = parTok->astOperand1(); if (!reallocTok) continue; - const Library::AllocFunc* f = mSettings->library.getReallocFuncInfo(reallocTok); - if (!(f && f->arg == -1 && mSettings->library.isnotnoreturn(reallocTok))) + const Library::AllocFunc* f = mSettings.library.getReallocFuncInfo(reallocTok); + if (!(f && f->arg == -1 && mSettings.library.isnotnoreturn(reallocTok))) continue; const AllocType allocType = getReallocationType(reallocTok, tok->varId()); @@ -467,7 +467,7 @@ void CheckMemoryLeakInFunctionImpl::checkReallocUsage() Token::findmatch(scope->bodyStart, "[{};] %varid% = *| %var%", tok, tok->varId())) continue; if (const Token* storeTok = Token::findmatch(scope->bodyStart, "[{};] %varid% = %name% (", tok, tok->varId())) - if (storeTok->tokAt(3) != reallocTok && !mSettings->library.getAllocFuncInfo(storeTok->tokAt(3))) + if (storeTok->tokAt(3) != reallocTok && !mSettings.library.getAllocFuncInfo(storeTok->tokAt(3))) continue; // Check if the argument is known to be null, which means it is not a memory leak @@ -492,11 +492,11 @@ void CheckMemoryLeakInFunctionImpl::checkReallocUsage() void CheckMemoryLeakInFunction::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, tokenizer.getSettings(), errorLogger); checkMemoryLeak.checkReallocUsage(); } -void CheckMemoryLeakInFunction::getErrorMessages(ErrorLogger *e, const Settings *settings) const +void CheckMemoryLeakInFunction::getErrorMessages(ErrorLogger *e, const Settings &settings) const { CheckMemoryLeakInFunctionImpl c(nullptr, settings, e); c.memleakError(nullptr, "varname"); @@ -629,7 +629,7 @@ void CheckMemoryLeakInClassImpl::variable(const Scope *scope, const Token *tokVa } // Function call .. possible deallocation - else if (Token::Match(tok->previous(), "[{};] %name% (") && !tok->isKeyword() && !mSettings->library.isLeakIgnore(tok->str())) { + else if (Token::Match(tok->previous(), "[{};] %name% (") && !tok->isKeyword() && !mSettings.library.isLeakIgnore(tok->str())) { return; } } @@ -645,7 +645,7 @@ void CheckMemoryLeakInClassImpl::variable(const Scope *scope, const Token *tokVa void CheckMemoryLeakInClassImpl::unsafeClassError(const Token *tok, const std::string &classname, const std::string &varname) { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unsafeClassCanLeak")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unsafeClassCanLeak")) return; reportError(tok, Severity::style, "unsafeClassCanLeak", @@ -661,7 +661,7 @@ void CheckMemoryLeakInClassImpl::checkPublicFunctions(const Scope *scope, const // Check that public functions deallocate the pointers that they allocate. // There is no checking how these functions are used and therefore it // isn't established if there is real leaks or not. - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; const int varid = classtok->varId(); @@ -696,11 +696,11 @@ void CheckMemoryLeakInClass::runChecks(const Tokenizer &tokenizer, ErrorLogger * if (!tokenizer.isCPP()) return; - CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } -void CheckMemoryLeakInClass::getErrorMessages(ErrorLogger *e, const Settings *settings) const +void CheckMemoryLeakInClass::getErrorMessages(ErrorLogger *e, const Settings &settings) const { CheckMemoryLeakInClassImpl c(nullptr, settings, e); c.publicAllocationError(nullptr, "varname"); @@ -709,7 +709,7 @@ void CheckMemoryLeakInClass::getErrorMessages(ErrorLogger *e, const Settings *se void CheckMemoryLeakStructMemberImpl::check() { - if (mSettings->clang) + if (mSettings.clang) return; logChecker("CheckMemoryLeakStructMember::check"); @@ -739,7 +739,7 @@ bool CheckMemoryLeakStructMemberImpl::isMalloc(const Variable *variable) const const Token* tok3 = tok2->tokAt(1)->astOperand2(); while (tok3 && tok3->isCast()) tok3 = tok3->astOperand2() ? tok3->astOperand2() : tok3->astOperand1(); - if ((tok3 && Token::Match(tok3->tokAt(-1), "%name% (") && mSettings->library.getAllocFuncInfo(tok3->tokAt(-1))) || + if ((tok3 && Token::Match(tok3->tokAt(-1), "%name% (") && mSettings.library.getAllocFuncInfo(tok3->tokAt(-1))) || (Token::simpleMatch(tok3, "new") && tok3->isCpp())) { alloc = true; } @@ -767,7 +767,7 @@ void CheckMemoryLeakStructMemberImpl::checkStructVariable(const Variable* const auto deallocInFunction = [this](const Token* tok, int structid) -> bool { // Calling non-function / function that doesn't deallocate? - if (tok->isKeyword() || mSettings->library.isLeakIgnore(tok->str())) + if (tok->isKeyword() || mSettings.library.isLeakIgnore(tok->str())) return false; // Check if the struct is used.. @@ -889,7 +889,7 @@ void CheckMemoryLeakStructMemberImpl::checkStructVariable(const Variable* const } // Deallocating the struct.. - else if (Token::Match(tok3, "%name% ( %varid% )", structid) && mSettings->library.getDeallocFuncInfo(tok3)) { + else if (Token::Match(tok3, "%name% ( %varid% )", structid) && mSettings.library.getDeallocFuncInfo(tok3)) { if (indentlevel2 == 0) memoryLeak(tok3, variable->name() + "." + tok2->strAt(2), allocType); break; @@ -923,7 +923,7 @@ void CheckMemoryLeakStructMemberImpl::checkStructVariable(const Variable* const --indentlevel4; if (indentlevel4 == 0) break; - } else if (Token::Match(tok4, "%name% ( %var% . %varid% )", structmemberid) && mSettings->library.getDeallocFuncInfo(tok4)) { + } else if (Token::Match(tok4, "%name% ( %var% . %varid% )", structmemberid) && mSettings.library.getDeallocFuncInfo(tok4)) { break; } } @@ -968,11 +968,11 @@ void CheckMemoryLeakStructMemberImpl::checkStructVariable(const Variable* const void CheckMemoryLeakStructMember::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckMemoryLeakStructMemberImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakStructMemberImpl checkMemoryLeak(&tokenizer, tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } -void CheckMemoryLeakStructMember::getErrorMessages(ErrorLogger * errorLogger, const Settings * settings) const +void CheckMemoryLeakStructMember::getErrorMessages(ErrorLogger * errorLogger, const Settings & settings) const { (void)errorLogger; (void)settings; @@ -1028,7 +1028,7 @@ void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scop if (Token::simpleMatch(tok->next()->astParent(), "(")) // passed to another function continue; - if (!tok->isKeyword() && !tok->function() && !mSettings->library.isLeakIgnore(functionName)) + if (!tok->isKeyword() && !tok->function() && !mSettings.library.isLeakIgnore(functionName)) continue; const std::vector args = getArguments(tok); @@ -1048,8 +1048,8 @@ void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scop if (alloc == New || alloc == NewArray) { const Token* typeTok = arg->next(); bool bail = !typeTok->isStandardType() && - !mSettings->library.detectContainerOrIterator(typeTok) && - !mSettings->library.podtype(typeTok->expressionString()); + !mSettings.library.detectContainerOrIterator(typeTok) && + !mSettings.library.podtype(typeTok->expressionString()); if (bail && typeTok->type() && typeTok->type()->classScope && typeTok->type()->classScope->numConstructors == 0 && typeTok->type()->classScope->getDestructor() == nullptr) { @@ -1064,8 +1064,8 @@ void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scop const Variable* argvar = tok->function()->getArgumentVar(argnr); if (!argvar || !argvar->valueType()) continue; - const size_t argSize = argvar->valueType()->getSizeOf(*mSettings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); - if (argSize == 0 || argSize >= mSettings->platform.sizeof_pointer) + const size_t argSize = argvar->valueType()->getSizeOf(mSettings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); + if (argSize == 0 || argSize >= mSettings.platform.sizeof_pointer) continue; } functionCallLeak(arg, arg->str(), functionName); @@ -1110,7 +1110,7 @@ void CheckMemoryLeakNoVarImpl::checkForUnusedReturnValue(const Scope *scope) bool warn = true; if (isNew) { const Token* typeTok = tok->next(); - warn = typeTok && (typeTok->isStandardType() || mSettings->library.detectContainer(typeTok)); + warn = typeTok && (typeTok->isStandardType() || mSettings.library.detectContainer(typeTok)); } if (!parent && warn) { @@ -1150,7 +1150,7 @@ void CheckMemoryLeakNoVarImpl::checkForUnsafeArgAlloc(const Scope *scope) if (!mTokenizer->isCPP()) return; - if (!mSettings->isPremiumEnabled("leakUnsafeArgAlloc") && (!mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning))) + if (!mSettings.isPremiumEnabled("leakUnsafeArgAlloc") && (!mSettings.certainty.isEnabled(Certainty::inconclusive) || !mSettings.severity.isEnabled(Severity::warning))) return; logChecker("CheckMemoryLeakNoVar::checkForUnsafeArgAlloc"); @@ -1216,11 +1216,11 @@ void CheckMemoryLeakNoVarImpl::unsafeArgAllocError(const Token *tok, const std:: void CheckMemoryLeakNoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckMemoryLeakNoVarImpl checkMemoryLeak(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckMemoryLeakNoVarImpl checkMemoryLeak(&tokenizer, tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } -void CheckMemoryLeakNoVar::getErrorMessages(ErrorLogger *e, const Settings *settings) const +void CheckMemoryLeakNoVar::getErrorMessages(ErrorLogger *e, const Settings &settings) const { CheckMemoryLeakNoVarImpl c(nullptr, settings, e); c.functionCallLeak(nullptr, "funcName", "funcName"); diff --git a/lib/checkmemoryleak.h b/lib/checkmemoryleak.h index 047cf3295ae..6c867749fa4 100644 --- a/lib/checkmemoryleak.h +++ b/lib/checkmemoryleak.h @@ -75,7 +75,7 @@ class CPPCHECKLIB CheckMemoryLeakInFunction : public Check { void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; /** Report all possible errors (for the --errorlist) */ - void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *e, const Settings &settings) const override; /** * Get class information (--doc) @@ -100,7 +100,7 @@ class CPPCHECKLIB CheckMemoryLeakInClass : public Check { private: void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *e, const Settings &settings) const override; std::string classInfo() const override { return "If the constructor allocate memory then the destructor must deallocate it.\n"; @@ -120,7 +120,7 @@ class CPPCHECKLIB CheckMemoryLeakStructMember : public Check { private: void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger * errorLogger, const Settings * settings) const override; + void getErrorMessages(ErrorLogger * errorLogger, const Settings & settings) const override; std::string classInfo() const override { return "Don't forget to deallocate struct members\n"; @@ -140,7 +140,7 @@ class CPPCHECKLIB CheckMemoryLeakNoVar : public Check { private: void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *e, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *e, const Settings &settings) const override; std::string classInfo() const override { return "Not taking the address to allocated memory\n"; @@ -175,7 +175,7 @@ class CPPCHECKLIB CheckMemoryLeakImpl : public CheckImpl { CheckMemoryLeakImpl(const CheckMemoryLeakImpl &) = delete; CheckMemoryLeakImpl& operator=(const CheckMemoryLeakImpl &) = delete; - CheckMemoryLeakImpl(const Tokenizer *t, const Settings *s, ErrorLogger *e) + CheckMemoryLeakImpl(const Tokenizer *t, const Settings &s, ErrorLogger *e) : CheckImpl(t, s, e) {} /** @brief What type of allocation are used.. the "Many" means that several types of allocation and deallocation are used */ @@ -254,7 +254,7 @@ class CPPCHECKLIB CheckMemoryLeakImpl : public CheckImpl { class CPPCHECKLIB CheckMemoryLeakInFunctionImpl : public CheckMemoryLeakImpl { public: /** @brief This constructor is used when running checks */ - CheckMemoryLeakInFunctionImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckMemoryLeakInFunctionImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} /** @@ -271,7 +271,7 @@ class CPPCHECKLIB CheckMemoryLeakInFunctionImpl : public CheckMemoryLeakImpl { class CPPCHECKLIB CheckMemoryLeakInClassImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakInClassImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckMemoryLeakInClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); @@ -292,7 +292,7 @@ class CPPCHECKLIB CheckMemoryLeakInClassImpl : private CheckMemoryLeakImpl { class CPPCHECKLIB CheckMemoryLeakStructMemberImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakStructMemberImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckMemoryLeakStructMemberImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); @@ -309,7 +309,7 @@ class CPPCHECKLIB CheckMemoryLeakStructMemberImpl : private CheckMemoryLeakImpl class CPPCHECKLIB CheckMemoryLeakNoVarImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakNoVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckMemoryLeakNoVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 2dbff296cf0..92938b4a60f 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -130,7 +130,7 @@ namespace { bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown) const { - return isPointerDeRef(tok, unknown, *mSettings); + return isPointerDeRef(tok, unknown, mSettings); } bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings, bool checkNullArg) @@ -266,7 +266,7 @@ static bool isNullablePointer(const Token* tok) void CheckNullPointerImpl::nullPointerByDeRefAndCheck() { - const bool printInconclusive = (mSettings->certainty.isEnabled(Certainty::inconclusive)); + const bool printInconclusive = (mSettings.certainty.isEnabled(Certainty::inconclusive)); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope * scope : symbolDatabase->functionScopes) { @@ -292,13 +292,13 @@ void CheckNullPointerImpl::nullPointerByDeRefAndCheck() return true; }; const Token* const start = (scope->function && scope->function->isConstructor()) ? scope->function->token : scope->bodyStart; // Check initialization list - std::vector tokens = findTokensSkipDeadAndUnevaluatedCode(mSettings->library, start, scope->bodyEnd, pred); + std::vector tokens = findTokensSkipDeadAndUnevaluatedCode(mSettings.library, start, scope->bodyEnd, pred); for (const Token *tok : tokens) { const ValueFlow::Value *value = tok->getValue(0); // Pointer dereference. bool unknown = false; - if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings)) { + if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings)) { if (unknown) nullPointerError(tok, tok->expressionString(), value, true); continue; @@ -357,7 +357,7 @@ void CheckNullPointerImpl::nullConstantDereference() if (var && !var->isPointer() && !var->isArray() && var->isStlStringType()) nullPointerError(tok); } else { // function call - const std::list var = parseFunctionCall(*tok, mSettings->library); + const std::list var = parseFunctionCall(*tok, mSettings.library); // is one of the var items a NULL pointer? for (const Token *vartok : var) { @@ -376,7 +376,7 @@ void CheckNullPointerImpl::nullConstantDereference() continue; if (argtok->getKnownIntValue() != 0) continue; - if (mSettings->library.isnullargbad(tok, argnr+1)) + if (mSettings.library.isnullargbad(tok, argnr+1)) nullPointerError(argtok); } } @@ -444,7 +444,7 @@ void CheckNullPointerImpl::nullPointerError(const Token *tok, const std::string return; } - if (!mSettings->isEnabled(value, inconclusive) && !mSettings->isPremiumEnabled("nullPointer")) + if (!mSettings.isEnabled(value, inconclusive) && !mSettings.isPremiumEnabled("nullPointer")) return; ErrorPath errorPath = getErrorPath(tok, value, "Null pointer dereference"); @@ -503,9 +503,9 @@ void CheckNullPointerImpl::arithmetic() const ValueFlow::Value* value = pointerOperand->getValue(0); if (!value) continue; - if (!mSettings->certainty.isEnabled(Certainty::inconclusive) && value->isInconclusive()) + if (!mSettings.certainty.isEnabled(Certainty::inconclusive) && value->isInconclusive()) continue; - if (value->condition && !mSettings->severity.isEnabled(Severity::warning)) + if (value->condition && !mSettings.severity.isEnabled(Severity::warning)) continue; if (value->condition) redundantConditionWarning(tok, value, value->condition, value->isInconclusive()); @@ -632,7 +632,7 @@ bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std:: { (void)settings; - CheckNullPointerImpl dummy(nullptr, &settings, &errorLogger); + CheckNullPointerImpl dummy(nullptr, settings, &errorLogger); dummy. logChecker("CheckNullPointer::analyseWholeProgram"); @@ -694,13 +694,13 @@ bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std:: void CheckNullPointer::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckNullPointerImpl checkNullPointer(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckNullPointerImpl checkNullPointer(&tokenizer, tokenizer.getSettings(), errorLogger); checkNullPointer.nullPointer(); checkNullPointer.arithmetic(); checkNullPointer.nullConstantDereference(); } -void CheckNullPointer::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckNullPointer::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckNullPointerImpl c(nullptr, settings, errorLogger); c.nullPointerError(nullptr, "pointer", nullptr, false); diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index f9f78280fea..4da9fe8abc7 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -67,7 +67,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; /** Get error messages. Used by --errorlist */ - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; /** class info in WIKI format. Used by --doc */ std::string classInfo() const override { @@ -80,7 +80,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { class CPPCHECKLIB CheckNullPointerImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckNullPointerImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckNullPointerImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 6edbef63c0e..1adcaeb9c3a 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -82,7 +82,7 @@ static const CWE CWE783(783U); // Operator Precedence Logic Error //---------------------------------------------------------------------------------- void CheckOtherImpl::checkCastIntToCharAndBack() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckOther::checkCastIntToCharAndBack"); // warning @@ -152,7 +152,7 @@ void CheckOtherImpl::checkCastIntToCharAndBackError(const Token *tok, const std: //--------------------------------------------------------------------------- void CheckOtherImpl::clarifyCalculation() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("clarifyCalculation")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("clarifyCalculation")) return; logChecker("CheckOther::clarifyCalculation"); // style @@ -223,7 +223,7 @@ void CheckOtherImpl::clarifyCalculationError(const Token *tok, const std::string //--------------------------------------------------------------------------- void CheckOtherImpl::clarifyStatement() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckOther::clarifyStatement"); // warning @@ -259,7 +259,7 @@ void CheckOtherImpl::clarifyStatementError(const Token *tok) //--------------------------------------------------------------------------- void CheckOtherImpl::checkSuspiciousSemicolon() { - if (!mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.certainty.isEnabled(Certainty::inconclusive) || !mSettings.severity.isEnabled(Severity::warning)) return; const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -335,7 +335,7 @@ void CheckOtherImpl::warningOldStylePointerCast() if (!mTokenizer->isCPP()) return; - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("cstyleCast")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("cstyleCast")) return; logChecker("CheckOther::warningOldStylePointerCast"); // style,c++ @@ -410,7 +410,7 @@ void CheckOtherImpl::warningDangerousTypeCast() // Only valid on C++ code if (!mTokenizer->isCPP()) return; - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("dangerousTypeCast")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("dangerousTypeCast")) return; logChecker("CheckOther::warningDangerousTypeCast"); // warning,c++ @@ -444,7 +444,7 @@ void CheckOtherImpl::dangerousTypeCastError(const Token *tok, bool isPtr) void CheckOtherImpl::warningIntToPointerCast() { - if (!mSettings->severity.isEnabled(Severity::portability) && !mSettings->isPremiumEnabled("cstyleCast")) + if (!mSettings.severity.isEnabled(Severity::portability) && !mSettings.isPremiumEnabled("cstyleCast")) return; logChecker("CheckOther::warningIntToPointerCast"); // portability @@ -480,7 +480,7 @@ void CheckOtherImpl::intToPointerCastError(const Token *tok, const std::string& void CheckOtherImpl::suspiciousFloatingPointCast() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("suspiciousFloatingPointCast")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("suspiciousFloatingPointCast")) return; logChecker("CheckOther::suspiciousFloatingPointCast"); // style @@ -541,12 +541,12 @@ void CheckOtherImpl::suspiciousFloatingPointCastError(const Token* tok) void CheckOtherImpl::invalidPointerCast() { - if (!mSettings->severity.isEnabled(Severity::portability)) + if (!mSettings.severity.isEnabled(Severity::portability)) return; logChecker("CheckOther::invalidPointerCast"); // portability - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope * scope : symbolDatabase->functionScopes) { for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { @@ -594,9 +594,9 @@ void CheckOtherImpl::invalidPointerCastError(const Token* tok, const std::string void CheckOtherImpl::checkRedundantAssignment() { - if (!mSettings->severity.isEnabled(Severity::style) && - !mSettings->isPremiumEnabled("redundantAssignment") && - !mSettings->isPremiumEnabled("redundantAssignInSwitch")) + if (!mSettings.severity.isEnabled(Severity::style) && + !mSettings.isPremiumEnabled("redundantAssignment") && + !mSettings.isPremiumEnabled("redundantAssignInSwitch")) return; logChecker("CheckOther::checkRedundantAssignment"); // style @@ -666,10 +666,10 @@ void CheckOtherImpl::checkRedundantAssignment() if (tok->astOperand1()->valueType()->type == ValueType::SMART_POINTER) break; } - if (inconclusive && !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (inconclusive && !mSettings.certainty.isEnabled(Certainty::inconclusive)) continue; - FwdAnalysis fwdAnalysis(*mSettings); + FwdAnalysis fwdAnalysis(mSettings); if (fwdAnalysis.hasOperand(tok->astOperand2(), tok->astOperand1())) continue; @@ -794,7 +794,7 @@ static inline bool isFunctionOrBreakPattern(const Token *tok) void CheckOtherImpl::redundantBitwiseOperationInSwitchError() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckOther::redundantBitwiseOperationInSwitch"); // warning @@ -923,7 +923,7 @@ void CheckOtherImpl::redundantBitwiseOperationInSwitchError(const Token *tok, co //--------------------------------------------------------------------------- void CheckOtherImpl::checkSuspiciousCaseInSwitch() { - if (!mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.certainty.isEnabled(Certainty::inconclusive) || !mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckOther::checkSuspiciousCaseInSwitch"); // warning,inconclusive @@ -1011,12 +1011,12 @@ void CheckOtherImpl::checkUnreachableCode() // misra-c-2023-2.1 // misra-cpp-2008-0-1-1 // autosar - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("duplicateBreak") && !mSettings->isPremiumEnabled("unreachableCode")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("duplicateBreak") && !mSettings.isPremiumEnabled("unreachableCode")) return; logChecker("CheckOther::checkUnreachableCode"); // style - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope * scope : symbolDatabase->functionScopes) { if (scope->hasInlineOrLambdaFunction(nullptr, /*onlyInline*/ true)) @@ -1043,7 +1043,7 @@ void CheckOtherImpl::checkUnreachableCode() } else if (Token::Match(tok, "goto %any% ;")) { secondBreak = tok->tokAt(3); labelName = tok->next(); - } else if (Token::Match(tok, "%name% (") && mSettings->library.isnoreturn(tok) && !Token::Match(tok->next()->astParent(), "?|:")) { + } else if (Token::Match(tok, "%name% (") && mSettings.library.isnoreturn(tok) && !Token::Match(tok->next()->astParent(), "?|:")) { if ((!tok->function() || (tok->function()->token != tok && tok->function()->tokenDef != tok)) && tok->linkAt(1)->strAt(1) != "{") secondBreak = tok->linkAt(1)->tokAt(2); if (Token::simpleMatch(secondBreak, "return")) { @@ -1136,7 +1136,7 @@ void CheckOtherImpl::duplicateBreakError(const Token *tok, bool inconclusive) void CheckOtherImpl::unreachableCodeError(const Token *tok, const Token* noreturn, bool inconclusive) { std::string msg = "Statements following "; - if (noreturn && (noreturn->function() || mSettings->library.isnoreturn(noreturn))) + if (noreturn && (noreturn->function() || mSettings.library.isnoreturn(noreturn))) msg += "noreturn function '" + noreturn->str() + "()'"; else if (noreturn && noreturn->isKeyword()) msg += "'" + noreturn->str() + "'"; @@ -1185,17 +1185,17 @@ static bool isSimpleExpr(const Token* tok, const Variable* var, const Settings& //--------------------------------------------------------------------------- void CheckOtherImpl::checkVariableScope() { - if (mSettings->clang) + if (mSettings.clang) return; - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("variableScope")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("variableScope")) return; const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); // In C it is common practice to declare local variables at the // start of functions. - if (mSettings->daca && mTokenizer->isC()) + if (mSettings.daca && mTokenizer->isC()) return; logChecker("CheckOther::checkVariableScope"); // style,notclang @@ -1244,7 +1244,7 @@ void CheckOtherImpl::checkVariableScope() bool isConstructor = false; if (Token::Match(tok, "; %varid% =", var->declarationId())) { // bailout for assignment tok = tok->tokAt(2)->astOperand2(); - if (!isSimpleExpr(tok, var, *mSettings)) + if (!isSimpleExpr(tok, var, mSettings)) continue; } else if (Token::Match(tok, "{|(")) { // bailout for constructor @@ -1253,11 +1253,11 @@ void CheckOtherImpl::checkVariableScope() bool bail = false; while (argTok) { if (Token::simpleMatch(argTok, ",")) { - if (!isSimpleExpr(argTok->astOperand2(), var, *mSettings)) { + if (!isSimpleExpr(argTok->astOperand2(), var, mSettings)) { bail = true; break; } - } else if (argTok->str() != "." && !isSimpleExpr(argTok, var, *mSettings)) { + } else if (argTok->str() != "." && !isSimpleExpr(argTok, var, mSettings)) { bail = true; break; } @@ -1422,7 +1422,7 @@ bool CheckOtherImpl::checkInnerScope(const Token *tok, const Variable* var, bool if (ftok->next()->astParent()) { // return value used? if (ftok->function() && Function::returnsPointer(ftok->function())) return false; - const std::string ret = mSettings->library.returnValueType(ftok); // assume that var is returned + const std::string ret = mSettings.library.returnValueType(ftok); // assume that var is returned if (!ret.empty() && ret.back() == '*') return false; } @@ -1437,7 +1437,7 @@ bool CheckOtherImpl::checkInnerScope(const Token *tok, const Variable* var, bool } } } - const auto yield = astContainerYield(tok, mSettings->library); + const auto yield = astContainerYield(tok, mSettings.library); if (yield == Library::Container::Yield::BUFFER || yield == Library::Container::Yield::BUFFER_NT) return false; } @@ -1476,7 +1476,7 @@ void CheckOtherImpl::variableScopeError(const Token *tok, const std::string &var void CheckOtherImpl::checkCommaSeparatedReturn() { // TODO: This is experimental for now. See #5076 - if ((true) || !mSettings->severity.isEnabled(Severity::style)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) + if ((true) || !mSettings.severity.isEnabled(Severity::style)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) return; // logChecker @@ -1540,7 +1540,7 @@ static bool isLargeContainer(const Variable* var, const Settings& settings) void CheckOtherImpl::checkPassByReference() { - if (!mSettings->severity.isEnabled(Severity::performance) || mTokenizer->isC()) + if (!mSettings.severity.isEnabled(Severity::performance) || mTokenizer->isC()) return; logChecker("CheckOther::checkPassByReference"); // performance,c++ @@ -1566,21 +1566,21 @@ void CheckOtherImpl::checkPassByReference() bool inconclusive = false; const bool isContainer = var->valueType() && var->valueType()->type == ValueType::Type::CONTAINER && var->valueType()->container && !var->valueType()->container->view; - if (isContainer && !isLargeContainer(var, *mSettings)) + if (isContainer && !isLargeContainer(var, mSettings)) continue; if (!isContainer) { if (var->type() && !var->type()->isEnumType()) { // Check if type is a struct or class. // Ensure that it is a large object. if (!var->type()->classScope) inconclusive = true; - else if (!var->valueType() || var->valueType()->getSizeOf(*mSettings, ValueType::Accuracy::LowerBound, ValueType::SizeOf::Pointer) <= 2 * mSettings->platform.sizeof_pointer) + else if (!var->valueType() || var->valueType()->getSizeOf(mSettings, ValueType::Accuracy::LowerBound, ValueType::SizeOf::Pointer) <= 2 * mSettings.platform.sizeof_pointer) continue; } else continue; } - if (inconclusive && !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (inconclusive && !mSettings.certainty.isEnabled(Certainty::inconclusive)) continue; if (var->isArray() && (!var->isStlType() || Token::simpleMatch(var->nameToken()->next(), "["))) @@ -1611,7 +1611,7 @@ void CheckOtherImpl::checkPassByReference() if (!isRangeBasedFor && (!var->scope() || var->scope()->function->isImplicitlyVirtual())) continue; - if (!isVariableChanged(var, *mSettings)) { + if (!isVariableChanged(var, mSettings)) { passedByValueError(var, inconclusive, isRangeBasedFor); } } @@ -1684,7 +1684,7 @@ static bool isCastToVoid(const Variable* var) void CheckOtherImpl::checkConstVariable() { - if ((!mSettings->severity.isEnabled(Severity::style) || mTokenizer->isC()) && !mSettings->isPremiumEnabled("constVariable")) + if ((!mSettings.severity.isEnabled(Severity::style) || mTokenizer->isC()) && !mSettings.isPremiumEnabled("constVariable")) return; logChecker("CheckOther::checkConstVariable"); // style,c++ @@ -1732,7 +1732,7 @@ void CheckOtherImpl::checkConstVariable() continue; if (isCastToVoid(var)) continue; - if (isVariableChanged(var, *mSettings)) + if (isVariableChanged(var, mSettings)) continue; const bool hasFunction = function != nullptr; if (!hasFunction) { @@ -1755,7 +1755,7 @@ void CheckOtherImpl::checkConstVariable() ValueFlow::Value ltVal = ValueFlow::getLifetimeObjValue(retTok); if (ltVal.isLifetimeValue() && ltVal.tokvalue->varId() == var->declarationId()) return true; - return ValueFlow::hasLifetimeToken(getParentLifetime(retTok), var->nameToken(), *mSettings); + return ValueFlow::hasLifetimeToken(getParentLifetime(retTok), var->nameToken(), mSettings); })) continue; } @@ -1791,7 +1791,7 @@ void CheckOtherImpl::checkConstVariable() continue; } else if (const Token* ftok = getTokenArgumentFunction(tok, argn)) { bool inconclusive{}; - if (var->valueType() && !isVariableChangedByFunctionCall(ftok, var->valueType()->pointer, var->declarationId(), *mSettings, &inconclusive) && !inconclusive) + if (var->valueType() && !isVariableChangedByFunctionCall(ftok, var->valueType()->pointer, var->declarationId(), mSettings, &inconclusive) && !inconclusive) continue; } usedInAssignment = true; @@ -1877,11 +1877,11 @@ static const Function* getEnclosingFunction(const Variable* var) void CheckOtherImpl::checkConstPointer() { - if (!mSettings->severity.isEnabled(Severity::style) && - !mSettings->isPremiumEnabled("constParameter") && - !mSettings->isPremiumEnabled("constParameterPointer") && - !mSettings->isPremiumEnabled("constParameterReference") && - !mSettings->isPremiumEnabled("constVariablePointer")) + if (!mSettings.severity.isEnabled(Severity::style) && + !mSettings.isPremiumEnabled("constParameter") && + !mSettings.isPremiumEnabled("constParameterPointer") && + !mSettings.isPremiumEnabled("constParameterReference") && + !mSettings.isPremiumEnabled("constVariablePointer")) return; logChecker("CheckOther::checkConstPointer"); // style @@ -1946,7 +1946,7 @@ void CheckOtherImpl::checkConstPointer() if (parent->astOperand2()) { if (parent->astOperand2()->function() && parent->astOperand2()->function()->isConst()) continue; - if (mSettings->library.isFunctionConst(parent->astOperand2())) + if (mSettings.library.isFunctionConst(parent->astOperand2())) continue; if (parent->astOperand2()->varId()) { if (gparent->str() == "?" && astIsLHS(parent)) @@ -1984,7 +1984,7 @@ void CheckOtherImpl::checkConstPointer() continue; else if (const Token* ftok = getTokenArgumentFunction(parent, argn)) { bool inconclusive{}; - if (!isVariableChangedByFunctionCall(ftok->next(), vt->pointer, var->declarationId(), *mSettings, &inconclusive) && !inconclusive) + if (!isVariableChangedByFunctionCall(ftok->next(), vt->pointer, var->declarationId(), mSettings, &inconclusive) && !inconclusive) continue; } } else { @@ -2009,12 +2009,12 @@ void CheckOtherImpl::checkConstPointer() const Variable* argVar = ftok->function()->getArgumentVar(argn); if (argVar && argVar->valueType() && argVar->valueType()->isConst(vt->pointer)) { bool inconclusive{}; - if (!isVariableChangedByFunctionCall(ftok, vt->pointer, var->declarationId(), *mSettings, &inconclusive) && !inconclusive) + if (!isVariableChangedByFunctionCall(ftok, vt->pointer, var->declarationId(), mSettings, &inconclusive) && !inconclusive) continue; } } } else { - const auto dir = mSettings->library.getArgDirection(ftok, argn + 1); + const auto dir = mSettings.library.getArgDirection(ftok, argn + 1); if (dir == Library::ArgumentChecks::Direction::DIR_IN) continue; } @@ -2042,7 +2042,7 @@ void CheckOtherImpl::checkConstPointer() // const int indirect = p->isArray() ? p->dimensions().size() : 1; // if (isVariableChanged(start, p->scope()->bodyEnd, indirect, p->declarationId(), false, *mSettings)) // continue; - if (!isConstPointerVariable(p, *mSettings)) + if (!isConstPointerVariable(p, mSettings)) continue; if (p->typeStartToken() && p->typeStartToken()->isSimplifiedTypedef() && !(Token::simpleMatch(p->typeEndToken(), "*") && !p->typeEndToken()->isSimplifiedTypedef())) continue; @@ -2091,8 +2091,8 @@ void CheckOtherImpl::constVariableError(const Variable *var, const Function *fun void CheckOtherImpl::checkCharVariable() { - const bool warning = mSettings->severity.isEnabled(Severity::warning); - const bool portability = mSettings->severity.isEnabled(Severity::portability); + const bool warning = mSettings.severity.isEnabled(Severity::warning); + const bool portability = mSettings.severity.isEnabled(Severity::portability); if (!warning && !portability) return; @@ -2107,24 +2107,24 @@ void CheckOtherImpl::checkCharVariable() if (!tok->variable()->isArray() && !tok->variable()->isPointer()) continue; const Token *index = tok->next()->astOperand2(); - if (warning && tok->variable()->isArray() && astIsSignedChar(index) && index->getValueGE(0x80, *mSettings)) + if (warning && tok->variable()->isArray() && astIsSignedChar(index) && index->getValueGE(0x80, mSettings)) signedCharArrayIndexError(tok); - if (portability && astIsUnknownSignChar(index) && index->getValueGE(0x80, *mSettings)) + if (portability && astIsUnknownSignChar(index) && index->getValueGE(0x80, mSettings)) unknownSignCharArrayIndexError(tok); } else if (warning && Token::Match(tok, "[&|^]") && tok->isBinaryOp()) { bool warn = false; if (astIsSignedChar(tok->astOperand1())) { - const ValueFlow::Value *v1 = tok->astOperand1()->getValueLE(-1, *mSettings); + const ValueFlow::Value *v1 = tok->astOperand1()->getValueLE(-1, mSettings); const ValueFlow::Value *v2 = tok->astOperand2()->getMaxValue(false); if (!v1) - v1 = tok->astOperand1()->getValueGE(0x80, *mSettings); + v1 = tok->astOperand1()->getValueGE(0x80, mSettings); if (v1 && !(tok->str() == "&" && v2 && v2->isKnown() && v2->intvalue >= 0 && v2->intvalue < 0x100)) warn = true; } else if (astIsSignedChar(tok->astOperand2())) { - const ValueFlow::Value *v1 = tok->astOperand2()->getValueLE(-1, *mSettings); + const ValueFlow::Value *v1 = tok->astOperand2()->getValueLE(-1, mSettings); const ValueFlow::Value *v2 = tok->astOperand1()->getMaxValue(false); if (!v1) - v1 = tok->astOperand2()->getValueGE(0x80, *mSettings); + v1 = tok->astOperand2()->getValueGE(0x80, mSettings); if (v1 && !(tok->str() == "&" && v2 && v2->isKnown() && v2->intvalue >= 0 && v2->intvalue < 0x100)) warn = true; } @@ -2350,8 +2350,8 @@ static bool isConstTop(const Token *tok) void CheckOtherImpl::checkIncompleteStatement() { - if (!mSettings->severity.isEnabled(Severity::warning) && - !mSettings->isPremiumEnabled("constStatement")) + if (!mSettings.severity.isEnabled(Severity::warning) && + !mSettings.isPremiumEnabled("constStatement")) return; logChecker("CheckOther::checkIncompleteStatement"); // warning @@ -2397,15 +2397,15 @@ void CheckOtherImpl::checkIncompleteStatement() // Skip statement expressions if (Token::simpleMatch(rtok, "; } )")) continue; - if (!isConstStatement(tok, mSettings->library, false)) + if (!isConstStatement(tok, mSettings.library, false)) continue; if (isVoidStmt(tok)) continue; if (tok->isCpp() && tok->str() == "&" && !(tok->astOperand1() && tok->astOperand1()->valueType() && tok->astOperand1()->valueType()->isIntegral())) // Possible archive continue; - const bool inconclusive = tok->isConstOp() && !mSettings->isPremiumEnabled("constStatement"); - if (mSettings->certainty.isEnabled(Certainty::inconclusive) || !inconclusive) + const bool inconclusive = tok->isConstOp() && !mSettings.isPremiumEnabled("constStatement"); + if (mSettings.certainty.isEnabled(Certainty::inconclusive) || !inconclusive) constStatementError(tok, tok->isNumber() ? "numeric" : "string", inconclusive); } } @@ -2455,7 +2455,7 @@ void CheckOtherImpl::constStatementError(const Token *tok, const std::string &ty msg = "Redundant code: Found unused function."; else if (Token::Match(tok->previous(), "%name% (")) msg = "Redundant code: Found unused '" + tok->strAt(-1) + "' expression."; - else if (mSettings->debugwarnings) { + else if (mSettings.debugwarnings) { reportError(tok, Severity::debug, "debug", "constStatementError not handled."); return; } @@ -2481,7 +2481,7 @@ void CheckOtherImpl::checkZeroDivision() // Value flow.. const ValueFlow::Value *value = tok->astOperand2()->getValue(0LL); - if (value && mSettings->isEnabled(value, false)) + if (value && mSettings.isEnabled(value, false)) zerodivError(tok, value); } } @@ -2517,7 +2517,7 @@ void CheckOtherImpl::zerodivError(const Token *tok, const ValueFlow::Value *valu void CheckOtherImpl::checkNanInArithmeticExpression() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("nanInArithmeticExpression")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("nanInArithmeticExpression")) return; logChecker("CheckOther::checkNanInArithmeticExpression"); // style for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { @@ -2547,7 +2547,7 @@ void CheckOtherImpl::checkMisusedScopedObject() if (mTokenizer->isC()) return; - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedScopedObject")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unusedScopedObject")) return; logChecker("CheckOther::checkMisusedScopedObject"); // style,c++ @@ -2574,10 +2574,10 @@ void CheckOtherImpl::checkMisusedScopedObject() }; auto isLibraryConstructor = [&](const Token* tok, const std::string& typeStr) -> bool { - const Library::TypeCheck typeCheck = mSettings->library.getTypeCheck("unusedvar", typeStr); + const Library::TypeCheck typeCheck = mSettings.library.getTypeCheck("unusedvar", typeStr); if (typeCheck == Library::TypeCheck::check || typeCheck == Library::TypeCheck::checkFiniteLifetime) return true; - return mSettings->library.detectContainerOrIterator(tok); + return mSettings.library.detectContainerOrIterator(tok); }; const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -2592,7 +2592,7 @@ void CheckOtherImpl::checkMisusedScopedObject() if (Token::simpleMatch(parTok, "<") && parTok->link()) parTok = parTok->link()->next(); if (const Token* arg = parTok->astOperand2()) { - if (!isConstStatement(arg, mSettings->library, false)) + if (!isConstStatement(arg, mSettings.library, false)) continue; if (parTok->str() == "(") { if (arg->varId() && !(arg->variable() && arg->variable()->nameToken() != arg)) @@ -2651,7 +2651,7 @@ void CheckOtherImpl::checkDuplicateBranch() // and their conditional code is a duplicate of the condition that // is always true just in case it would be false. See for instance // abiword. - if (!mSettings->severity.isEnabled(Severity::style) || !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (!mSettings.severity.isEnabled(Severity::style) || !mSettings.certainty.isEnabled(Certainty::inconclusive)) return; logChecker("CheckOther::checkDuplicateBranch"); // style,inconclusive @@ -2713,8 +2713,8 @@ void CheckOtherImpl::checkDuplicateBranch() if (branchTop1->str() != branchTop2->str()) continue; ErrorPath errorPath; - if (isSameExpression(false, branchTop1->astOperand1(), branchTop2->astOperand1(), *mSettings, true, true, &errorPath) && - isSameExpression(false, branchTop1->astOperand2(), branchTop2->astOperand2(), *mSettings, true, true, &errorPath)) + if (isSameExpression(false, branchTop1->astOperand1(), branchTop2->astOperand1(), mSettings, true, true, &errorPath) && + isSameExpression(false, branchTop1->astOperand2(), branchTop2->astOperand2(), mSettings, true, true, &errorPath)) duplicateBranchError(scope.classDef, scope.bodyEnd->next(), std::move(errorPath)); } } @@ -2744,14 +2744,14 @@ void CheckOtherImpl::checkInvalidFree() logChecker("CheckOther::checkInvalidFree"); - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope * scope : symbolDatabase->functionScopes) { for (const Token* tok = scope->bodyStart->next(); tok && tok != scope->bodyEnd; tok = tok->next()) { // Keep track of which variables were assigned addresses to newly-allocated memory if ((tok->isCpp() && Token::Match(tok, "%var% = new")) || - (Token::Match(tok, "%var% = %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2)))) { + (Token::Match(tok, "%var% = %name% (") && mSettings.library.getAllocFuncInfo(tok->tokAt(2)))) { allocation.emplace(tok->varId(), tok->strAt(2)); inconclusive.emplace(tok->varId(), false); } @@ -2779,7 +2779,7 @@ void CheckOtherImpl::checkInvalidFree() // If a variable that was previously assigned a newly-allocated memory location is // added or subtracted from when used to free the memory, report an error. - else if ((Token::Match(tok, "%name% ( %any% +|-") && mSettings->library.getDeallocFuncInfo(tok)) || + else if ((Token::Match(tok, "%name% ( %any% +|-") && mSettings.library.getDeallocFuncInfo(tok)) || Token::Match(tok, "delete [ ] ( %any% +|-") || Token::Match(tok, "delete %any% +|- %any%")) { @@ -2799,7 +2799,7 @@ void CheckOtherImpl::checkInvalidFree() // If the previously-allocated variable is passed in to another function // as a parameter, it might be modified, so we shouldn't report an error // if it is later used to free memory - else if (Token::Match(tok, "%name% (") && !mSettings->library.isFunctionConst(tok->str(), true)) { + else if (Token::Match(tok, "%name% (") && !mSettings.library.isFunctionConst(tok->str(), true)) { const Token* tok2 = Token::findmatch(tok->next(), "%var%", tok->linkAt(1)); while (tok2 != nullptr) { allocation.erase(tok->varId()); @@ -2873,14 +2873,14 @@ isStaticAssert(const Settings &settings, const Token *tok) void CheckOtherImpl::checkDuplicateExpression() { { - const bool styleEnabled = mSettings->severity.isEnabled(Severity::style); - const bool premiumEnabled = mSettings->isPremiumEnabled("oppositeExpression") || - mSettings->isPremiumEnabled("duplicateExpression") || - mSettings->isPremiumEnabled("duplicateAssignExpression") || - mSettings->isPremiumEnabled("duplicateExpressionTernary") || - mSettings->isPremiumEnabled("duplicateValueTernary") || - mSettings->isPremiumEnabled("selfAssignment") || - mSettings->isPremiumEnabled("knownConditionTrueFalse"); + const bool styleEnabled = mSettings.severity.isEnabled(Severity::style); + const bool premiumEnabled = mSettings.isPremiumEnabled("oppositeExpression") || + mSettings.isPremiumEnabled("duplicateExpression") || + mSettings.isPremiumEnabled("duplicateAssignExpression") || + mSettings.isPremiumEnabled("duplicateExpressionTernary") || + mSettings.isPremiumEnabled("duplicateValueTernary") || + mSettings.isPremiumEnabled("selfAssignment") || + mSettings.isPremiumEnabled("knownConditionTrueFalse"); if (!styleEnabled && !premiumEnabled) return; @@ -2918,8 +2918,8 @@ void CheckOtherImpl::checkDuplicateExpression() Token::Match(tok->astOperand2()->previous(), "%name% (") ) && tok->next()->tokType() != Token::eType && - isSameExpression(true, tok->next(), nextAssign->next(), *mSettings, true, false) && - isSameExpression(true, tok->astOperand2(), nextAssign->astOperand2(), *mSettings, true, false) && + isSameExpression(true, tok->next(), nextAssign->next(), mSettings, true, false) && + isSameExpression(true, tok->astOperand2(), nextAssign->astOperand2(), mSettings, true, false) && tok->astOperand2()->expressionString() == nextAssign->astOperand2()->expressionString()) { bool differentDomain = false; const Scope * varScope = var1->scope() ? var1->scope() : scope; @@ -2937,7 +2937,7 @@ void CheckOtherImpl::checkDuplicateExpression() !isSameExpression(true, tok->astOperand2(), assignTok->astOperand1(), - *mSettings, + mSettings, true, true)) continue; @@ -2946,7 +2946,7 @@ void CheckOtherImpl::checkDuplicateExpression() !isSameExpression(true, tok->astOperand2(), assignTok->astOperand2(), - *mSettings, + mSettings, true, true)) continue; @@ -2955,7 +2955,7 @@ void CheckOtherImpl::checkDuplicateExpression() } if (!differentDomain && !isUniqueExpression(tok->astOperand2())) duplicateAssignExpressionError(var1, var2, false); - else if (mSettings->certainty.isEnabled(Certainty::inconclusive)) { + else if (mSettings.certainty.isEnabled(Certainty::inconclusive)) { diag(assignTok); duplicateAssignExpressionError(var1, var2, true); } @@ -2981,14 +2981,14 @@ void CheckOtherImpl::checkDuplicateExpression() if (isSameExpression(true, tok->astOperand1(), tok->astOperand2(), - *mSettings, + mSettings, true, followVar, &errorPath)) { if (isWithoutSideEffects(tok->astOperand1())) { const Token* loopTok = isInLoopCondition(tok); if (!loopTok || - !findExpressionChanged(tok, tok, loopTok->link()->linkAt(1), *mSettings)) { + !findExpressionChanged(tok, tok, loopTok->link()->linkAt(1), mSettings)) { const bool isEnum = tok->scope()->type == ScopeType::eEnum; const bool assignment = !isEnum && tok->str() == "="; if (assignment) @@ -3000,7 +3000,7 @@ void CheckOtherImpl::checkDuplicateExpression() parent = parent->astParent(); } if (parent && parent->previous() && - (isStaticAssert(*mSettings, parent->previous()) || + (isStaticAssert(mSettings, parent->previous()) || Token::simpleMatch(parent->previous(), "assert"))) { continue; } @@ -3013,7 +3013,7 @@ void CheckOtherImpl::checkDuplicateExpression() isSameExpression(false, tok->astOperand1(), tok->astOperand2()->astOperand1(), - *mSettings, + mSettings, true, false)) { if (isWithoutSideEffects(tok->astOperand1())) { @@ -3021,7 +3021,7 @@ void CheckOtherImpl::checkDuplicateExpression() } } else if (isOppositeExpression(tok->astOperand1(), tok->astOperand2(), - *mSettings, + mSettings, false, true, &errorPath) && @@ -3033,15 +3033,15 @@ void CheckOtherImpl::checkDuplicateExpression() isSameExpression(true, tok->astOperand2(), tok->astOperand1()->astOperand2(), - *mSettings, + mSettings, true, followVar, &errorPath) && isWithoutSideEffects(tok->astOperand2())) duplicateExpressionError(tok->astOperand2(), tok->astOperand1()->astOperand2(), tok, std::move(errorPath)); - else if (tok->astOperand2() && isConstExpression(tok->astOperand1(), mSettings->library)) { + else if (tok->astOperand2() && isConstExpression(tok->astOperand1(), mSettings.library)) { auto checkDuplicate = [&](const Token* exp1, const Token* exp2, const Token* ast1) { - if (isSameExpression(true, exp1, exp2, *mSettings, true, true, &errorPath) && + if (isSameExpression(true, exp1, exp2, mSettings, true, true, &errorPath) && isWithoutSideEffects(exp1) && isWithoutSideEffects(ast1->astOperand2())) duplicateExpressionError(exp1, exp2, tok, errorPath, /*hasMultipleExpr*/ true); @@ -3056,12 +3056,12 @@ void CheckOtherImpl::checkDuplicateExpression() } } } else if (tok->astOperand1() && tok->astOperand2() && tok->str() == ":" && tok->astParent() && tok->astParent()->str() == "?") { - if (isSameExpression(true, tok->astOperand1(), tok->astOperand2(), *mSettings, false, true, &errorPath)) + if (isSameExpression(true, tok->astOperand1(), tok->astOperand2(), mSettings, false, true, &errorPath)) duplicateExpressionTernaryError(tok, std::move(errorPath)); else if (!tok->astOperand1()->values().empty() && !tok->astOperand2()->values().empty() && isEqualKnownValue(tok->astOperand1(), tok->astOperand2()) && - !isVariableChanged(tok->astParent(), /*indirect*/ 0, *mSettings) && - isConstStatement(tok->astOperand1(), mSettings->library, true) && isConstStatement(tok->astOperand2(), mSettings->library, true)) + !isVariableChanged(tok->astParent(), /*indirect*/ 0, mSettings) && + isConstStatement(tok->astOperand1(), mSettings.library, true) && isConstStatement(tok->astOperand2(), mSettings.library, true)) duplicateValueTernaryError(tok); } } @@ -3156,7 +3156,7 @@ void CheckOtherImpl::selfAssignmentError(const Token *tok, const std::string &va //----------------------------------------------------------------------------- void CheckOtherImpl::checkComparisonFunctionIsAlwaysTrueOrFalse() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalse"); // warning @@ -3201,7 +3201,7 @@ void CheckOtherImpl::checkComparisonFunctionIsAlwaysTrueOrFalseError(const Token //--------------------------------------------------------------------------- void CheckOtherImpl::checkSignOfUnsignedVariable() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unsignedLessThanZero")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unsignedLessThanZero")) return; logChecker("CheckOther::checkSignOfUnsignedVariable"); // style @@ -3385,7 +3385,7 @@ static bool checkVariableAssignment(const Token* tok, const ValueType* vtLhs, co void CheckOtherImpl::checkRedundantCopy() { - if (!mSettings->severity.isEnabled(Severity::performance) || mTokenizer->isC() || !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (!mSettings.severity.isEnabled(Severity::performance) || mTokenizer->isC() || !mSettings.certainty.isEnabled(Certainty::inconclusive)) return; logChecker("CheckOther::checkRedundantCopy"); // c++,performance,inconclusive @@ -3395,7 +3395,7 @@ void CheckOtherImpl::checkRedundantCopy() for (const Variable* var : symbolDatabase->variableList()) { if (!var || var->isReference() || var->isPointer() || (!var->type() && !var->isStlType() && !(var->valueType() && var->valueType()->container)) || // bailout if var is of standard type, if it is a pointer or non-const - (!var->isConst() && isVariableChanged(var, *mSettings))) + (!var->isConst() && isVariableChanged(var, mSettings))) continue; const Token* startTok = var->nameToken(); @@ -3415,7 +3415,7 @@ void CheckOtherImpl::checkRedundantCopy() const Token* tok = startTok->next()->astOperand2(); if (!tok) continue; - if (!checkFunctionReturnsRef(tok, *mSettings) && !checkVariableAssignment(tok, var->valueType(), *mSettings)) + if (!checkFunctionReturnsRef(tok, mSettings) && !checkVariableAssignment(tok, var->valueType(), mSettings)) continue; redundantCopyError(startTok, startTok->str()); } @@ -3443,7 +3443,7 @@ static bool isNegative(const Token *tok, const Settings &settings) void CheckOtherImpl::checkNegativeBitwiseShift() { - const bool portability = mSettings->severity.isEnabled(Severity::portability); + const bool portability = mSettings.severity.isEnabled(Severity::portability); logChecker("CheckOther::checkNegativeBitwiseShift"); @@ -3475,9 +3475,9 @@ void CheckOtherImpl::checkNegativeBitwiseShift() continue; // Get negative rhs value. preferably a value which doesn't have 'condition'. - if (portability && isNegative(tok->astOperand1(), *mSettings)) + if (portability && isNegative(tok->astOperand1(), mSettings)) negativeBitwiseShiftError(tok, 1); - else if (isNegative(tok->astOperand2(), *mSettings)) + else if (isNegative(tok->astOperand2(), mSettings)) negativeBitwiseShiftError(tok, 2); } } @@ -3499,10 +3499,10 @@ void CheckOtherImpl::negativeBitwiseShiftError(const Token *tok, int op) //--------------------------------------------------------------------------- void CheckOtherImpl::checkIncompleteArrayFill() { - if (!mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (!mSettings.certainty.isEnabled(Certainty::inconclusive)) return; - const bool printWarning = mSettings->severity.isEnabled(Severity::warning); - const bool printPortability = mSettings->severity.isEnabled(Severity::portability); + const bool printWarning = mSettings.severity.isEnabled(Severity::warning); + const bool printPortability = mSettings.severity.isEnabled(Severity::portability); if (!printPortability && !printWarning) return; @@ -3532,9 +3532,9 @@ void CheckOtherImpl::checkIncompleteArrayFill() continue; int size = mTokenizer->sizeOfType(var->typeStartToken()); if (size == 0 && var->valueType()->pointer) - size = mSettings->platform.sizeof_pointer; + size = mSettings.platform.sizeof_pointer; else if (size == 0 && var->valueType()) - size = var->valueType()->getSizeOf(*mSettings, ValueType::Accuracy::LowerBound, ValueType::SizeOf::Pointer); + size = var->valueType()->getSizeOf(mSettings, ValueType::Accuracy::LowerBound, ValueType::SizeOf::Pointer); const Token* tok3 = tok->next()->astOperand2()->astOperand1()->astOperand1(); if ((size != 1 && size != 100 && size != 0) || var->isPointer()) { if (printWarning) @@ -3568,7 +3568,7 @@ void CheckOtherImpl::incompleteArrayFillError(const Token* tok, const std::strin void CheckOtherImpl::checkVarFuncNullUB() { - if (!mSettings->severity.isEnabled(Severity::portability)) + if (!mSettings.severity.isEnabled(Severity::portability)) return; logChecker("CheckOther::checkVarFuncNullUB"); // portability @@ -3653,7 +3653,7 @@ void CheckOtherImpl::varFuncNullUBError(const Token *tok) void CheckOtherImpl::checkRedundantPointerOp() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("redundantPointerOp")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("redundantPointerOp")) return; logChecker("CheckOther::checkRedundantPointerOp"); // style @@ -3699,7 +3699,7 @@ void CheckOtherImpl::redundantPointerOpError(const Token* tok, const std::string void CheckOtherImpl::checkInterlockedDecrement() { - if (!mSettings->platform.isWindows()) { + if (!mSettings.platform.isWindows()) { return; } @@ -3745,7 +3745,7 @@ void CheckOtherImpl::raceAfterInterlockedDecrementError(const Token* tok) void CheckOtherImpl::checkUnusedLabel() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("unusedLabel")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("unusedLabel")) return; logChecker("CheckOther::checkUnusedLabel"); // style,warning @@ -3768,7 +3768,7 @@ void CheckOtherImpl::checkUnusedLabel() void CheckOtherImpl::unusedLabelError(const Token* tok, bool inSwitch, bool hasIfdef) { - if (tok && !mSettings->severity.isEnabled(inSwitch ? Severity::warning : Severity::style) && !mSettings->isPremiumEnabled("unusedLabel")) + if (tok && !mSettings.severity.isEnabled(inSwitch ? Severity::warning : Severity::style) && !mSettings.isPremiumEnabled("unusedLabel")) return; std::string id = "unusedLabel"; @@ -3900,14 +3900,14 @@ void CheckOtherImpl::checkEvaluationOrder() break; bool foundError{false}, foundUnspecified{false}, bSelfAssignmentError{false}; - if (mTokenizer->isCPP() && mSettings->standards.cpp >= Standards::CPP11) { - if (mSettings->standards.cpp >= Standards::CPP17) - foundError = checkEvaluationOrderCpp17(tok, tok2, parent, *mSettings, foundUnspecified); + if (mTokenizer->isCPP() && mSettings.standards.cpp >= Standards::CPP11) { + if (mSettings.standards.cpp >= Standards::CPP17) + foundError = checkEvaluationOrderCpp17(tok, tok2, parent, mSettings, foundUnspecified); else - foundError = checkEvaluationOrderCpp11(tok, tok2, parent, *mSettings); + foundError = checkEvaluationOrderCpp11(tok, tok2, parent, mSettings); } else - foundError = checkEvaluationOrderC(tok, tok2, parent, *mSettings, bSelfAssignmentError); + foundError = checkEvaluationOrderC(tok, tok2, parent, mSettings, bSelfAssignmentError); if (foundError) { unknownEvaluationOrder(parent, foundUnspecified); @@ -3933,12 +3933,12 @@ void CheckOtherImpl::unknownEvaluationOrder(const Token* tok, bool isUnspecified void CheckOtherImpl::checkAccessOfMovedVariable() { - if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11) + if (!mTokenizer->isCPP() || mSettings.standards.cpp < Standards::CPP11) return; - if (!mSettings->isPremiumEnabled("accessMoved") && !mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.isPremiumEnabled("accessMoved") && !mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckOther::checkAccessOfMovedVariable"); // c++11,warning - const bool reportInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool reportInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope * scope : symbolDatabase->functionScopes) { const Token * scopeStart = scope->bodyStart; @@ -3964,11 +3964,11 @@ void CheckOtherImpl::checkAccessOfMovedVariable() else inconclusive = true; } else { - const ExprUsage usage = getExprUsage(tok, 0, *mSettings); + const ExprUsage usage = getExprUsage(tok, 0, mSettings); if (usage == ExprUsage::Used) accessOfMoved = true; if (usage == ExprUsage::PassedByReference) - accessOfMoved = !isVariableChangedByFunctionCall(tok, 0, *mSettings, &inconclusive); + accessOfMoved = !isVariableChangedByFunctionCall(tok, 0, mSettings, &inconclusive); else if (usage == ExprUsage::Inconclusive) inconclusive = true; } @@ -4009,11 +4009,11 @@ void CheckOtherImpl::accessMovedError(const Token *tok, const std::string &varna void CheckOtherImpl::checkFuncArgNamesDifferent() { - const bool style = mSettings->severity.isEnabled(Severity::style); - const bool inconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); - const bool warning = mSettings->severity.isEnabled(Severity::warning); + const bool style = mSettings.severity.isEnabled(Severity::style); + const bool inconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); + const bool warning = mSettings.severity.isEnabled(Severity::warning); - if (!(warning || (style && inconclusive)) && !mSettings->isPremiumEnabled("funcArgNamesDifferent")) + if (!(warning || (style && inconclusive)) && !mSettings.isPremiumEnabled("funcArgNamesDifferent")) return; logChecker("CheckOther::checkFuncArgNamesDifferent"); // style,warning,inconclusive @@ -4155,7 +4155,7 @@ static const Token *findShadowed(const Scope *scope, const Variable& var, int li void CheckOtherImpl::checkShadowVariables() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("shadowVariable")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("shadowVariable")) return; logChecker("CheckOther::checkShadowVariables"); // style const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -4256,7 +4256,7 @@ static bool isVariableExprHidden(const Token* tok) void CheckOtherImpl::checkKnownArgument() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("knownArgument")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("knownArgument")) return; logChecker("CheckOther::checkKnownArgument"); // style const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -4291,7 +4291,7 @@ void CheckOtherImpl::checkKnownArgument() continue; if (tok->isComparisonOp() && isSameExpression( - true, tok->astOperand1(), tok->astOperand2(), *mSettings, true, true)) + true, tok->astOperand1(), tok->astOperand2(), mSettings, true, true)) continue; // ensure that there is a integer variable in expression with unknown value const Token* vartok = nullptr; @@ -4357,7 +4357,7 @@ void CheckOtherImpl::knownArgumentError(const Token *tok, const Token *ftok, con void CheckOtherImpl::checkKnownPointerToBool() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("knownPointerToBool")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("knownPointerToBool")) return; logChecker("CheckOther::checkKnownPointerToBool"); // style const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -4377,7 +4377,7 @@ void CheckOtherImpl::checkKnownPointerToBool() return parent->isExpandedMacro(); })) continue; - if (!isUsedAsBool(tok, *mSettings)) + if (!isUsedAsBool(tok, mSettings)) continue; const ValueFlow::Value& value = tok->values().front(); knownPointerToBoolError(tok, &value); @@ -4428,10 +4428,10 @@ void CheckOtherImpl::checkComparePointers() continue; if (var1->isRValueReference() || var2->isRValueReference()) continue; - if (const Token* parent2 = getParentLifetime(v2.tokvalue, mSettings->library)) + if (const Token* parent2 = getParentLifetime(v2.tokvalue, mSettings.library)) if (var1 == parent2->variable()) continue; - if (const Token* parent1 = getParentLifetime(v1.tokvalue, mSettings->library)) + if (const Token* parent1 = getParentLifetime(v1.tokvalue, mSettings.library)) if (var2 == parent1->variable()) continue; comparePointersError(tok, &v1, &v2); @@ -4461,7 +4461,7 @@ void CheckOtherImpl::comparePointersError(const Token *tok, const ValueFlow::Val void CheckOtherImpl::checkModuloOfOne() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("moduloofone")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("moduloofone")) return; logChecker("CheckOther::checkModuloOfOne"); // style @@ -4571,7 +4571,7 @@ static bool isZeroInitializer(const Token *tok) void CheckOtherImpl::checkUnionZeroInit() { - if (!mSettings->severity.isEnabled(Severity::portability)) + if (!mSettings.severity.isEnabled(Severity::portability)) return; logChecker("CheckOther::checkUnionZeroInit"); // portability @@ -4579,7 +4579,7 @@ void CheckOtherImpl::checkUnionZeroInit() const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); std::unordered_map unionsByScopeId; - const std::vector unions = parseUnions(*symbolDatabase, *mSettings); + const std::vector unions = parseUnions(*symbolDatabase, mSettings); for (const Union &u : unions) { unionsByScopeId.emplace(u.scope, u); } @@ -4718,7 +4718,7 @@ void CheckOtherImpl::checkOverlappingWrite() if (errorToken) overlappingWriteUnion(tok); } else if (Token::Match(tok, "%name% (")) { - const Library::NonOverlappingData *nonOverlappingData = mSettings->library.getNonOverlappingData(tok); + const Library::NonOverlappingData *nonOverlappingData = mSettings.library.getNonOverlappingData(tok); if (!nonOverlappingData) continue; const std::vector args = getArguments(tok); @@ -4743,7 +4743,7 @@ void CheckOtherImpl::checkOverlappingWrite() constexpr bool macro = true; constexpr bool pure = true; constexpr bool follow = true; - if (!isSameExpression(macro, ptr1, ptr2, *mSettings, pure, follow, &errorPath)) + if (!isSameExpression(macro, ptr1, ptr2, mSettings, pure, follow, &errorPath)) continue; overlappingWriteFunction(tok, tok->str()); } @@ -4755,9 +4755,9 @@ void CheckOtherImpl::checkOverlappingWrite() MathLib::bigint sizeValue = args[sizeArg-1]->getKnownIntValue(); const Token *buf1, *buf2; MathLib::bigint offset1, offset2; - if (!getBufAndOffset(ptr1, buf1, &offset1, *mSettings, isCountArg ? &sizeValue : nullptr)) + if (!getBufAndOffset(ptr1, buf1, &offset1, mSettings, isCountArg ? &sizeValue : nullptr)) continue; - if (!getBufAndOffset(ptr2, buf2, &offset2, *mSettings)) + if (!getBufAndOffset(ptr2, buf2, &offset2, mSettings)) continue; if (offset1 < offset2 && offset1 + sizeValue <= offset2) @@ -4769,7 +4769,7 @@ void CheckOtherImpl::checkOverlappingWrite() constexpr bool macro = true; constexpr bool pure = true; constexpr bool follow = true; - if (!isSameExpression(macro, buf1, buf2, *mSettings, pure, follow, &errorPath)) + if (!isSameExpression(macro, buf1, buf2, mSettings, pure, follow, &errorPath)) continue; overlappingWriteFunction(tok, tok->str()); } @@ -4789,7 +4789,7 @@ void CheckOtherImpl::overlappingWriteFunction(const Token *tok, const std::strin void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckOtherImpl checkOther(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckOtherImpl checkOther(&tokenizer, tokenizer.getSettings(), errorLogger); // Checks checkOther.warningOldStylePointerCast(); @@ -4839,7 +4839,7 @@ void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkOther.checkUnionZeroInit(); } -void CheckOther::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckOther::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckOtherImpl c(nullptr, settings, errorLogger); diff --git a/lib/checkother.h b/lib/checkother.h index 6f6460bdfde..c3c045653c8 100644 --- a/lib/checkother.h +++ b/lib/checkother.h @@ -62,7 +62,7 @@ class CPPCHECKLIB CheckOther : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Other checks\n" @@ -127,7 +127,7 @@ class CPPCHECKLIB CheckOther : public Check { class CPPCHECKLIB CheckOtherImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckOtherImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckOtherImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Is expression a comparison that checks if a nonzero (unsigned/pointer) expression is less than zero? */ diff --git a/lib/checkpostfixoperator.cpp b/lib/checkpostfixoperator.cpp index 0b02313b672..e0026e1d70c 100644 --- a/lib/checkpostfixoperator.cpp +++ b/lib/checkpostfixoperator.cpp @@ -39,7 +39,7 @@ static const CWE CWE398(398U); // Indicator of Poor Code Quality void CheckPostfixOperatorImpl::postfixOperator() { - if (!mSettings->severity.isEnabled(Severity::performance)) + if (!mSettings.severity.isEnabled(Severity::performance)) return; logChecker("CheckPostfixOperator::postfixOperator"); // performance @@ -99,11 +99,11 @@ void CheckPostfixOperator::runChecks(const Tokenizer &tokenizer, ErrorLogger *er if (tokenizer.isC()) return; - CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, tokenizer.getSettings(), errorLogger); checkPostfixOperator.postfixOperator(); } -void CheckPostfixOperator::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckPostfixOperator::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckPostfixOperatorImpl c(nullptr, settings, errorLogger); c.postfixOperatorError(nullptr); diff --git a/lib/checkpostfixoperator.h b/lib/checkpostfixoperator.h index 03ab54eed11..27d833a992e 100644 --- a/lib/checkpostfixoperator.h +++ b/lib/checkpostfixoperator.h @@ -50,7 +50,7 @@ class CPPCHECKLIB CheckPostfixOperator : public Check { private: void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Warn if using postfix operators ++ or -- rather than prefix operator\n"; } @@ -59,7 +59,7 @@ class CPPCHECKLIB CheckPostfixOperator : public Check { class CPPCHECKLIB CheckPostfixOperatorImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckPostfixOperatorImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckPostfixOperatorImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Check postfix operators */ diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index ab398dda570..694f73eeff6 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -41,7 +41,7 @@ static const CWE CWE682(682U); // Incorrect Calculation //--------------------------------------------------------------------------- void CheckSizeofImpl::checkSizeofForNumericParameter() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckSizeof::checkSizeofForNumericParameter"); // warning @@ -71,7 +71,7 @@ void CheckSizeofImpl::sizeofForNumericParameterError(const Token *tok) //--------------------------------------------------------------------------- void CheckSizeofImpl::checkSizeofForArrayParameter() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckSizeof::checkSizeofForArrayParameter"); // warning @@ -112,7 +112,7 @@ void CheckSizeofImpl::sizeofForArrayParameterError(const Token *tok) void CheckSizeofImpl::checkSizeofForPointerSize() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckSizeof::checkSizeofForPointerSize"); // warning @@ -129,7 +129,7 @@ void CheckSizeofImpl::checkSizeofForPointerSize() // Once leaving those tests, it is mandatory to have: // - variable matching the used pointer // - tokVar pointing on the argument where sizeof may be used - if (Token::Match(tok->tokAt(2), "%name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2))) { + if (Token::Match(tok->tokAt(2), "%name% (") && mSettings.library.getAllocFuncInfo(tok->tokAt(2))) { if (Token::Match(tok, "%var% =")) variable = tok; else if (tok->strAt(1) == ")" && Token::Match(tok->linkAt(1)->tokAt(-2), "%var% =")) @@ -282,7 +282,7 @@ void CheckSizeofImpl::divideBySizeofError(const Token *tok, const std::string &m //----------------------------------------------------------------------------- void CheckSizeofImpl::sizeofsizeof() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckSizeof::sizeofsizeof"); // warning @@ -308,12 +308,12 @@ void CheckSizeofImpl::sizeofsizeofError(const Token *tok) void CheckSizeofImpl::sizeofCalculation() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckSizeof::sizeofCalculation"); // warning - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { if (!Token::simpleMatch(tok, "sizeof (")) @@ -354,7 +354,7 @@ void CheckSizeofImpl::sizeofCalculationError(const Token *tok, bool inconclusive void CheckSizeofImpl::sizeofFunction() { - if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("sizeofFunctionCall")) + if (!mSettings.severity.isEnabled(Severity::warning) && !mSettings.isPremiumEnabled("sizeofFunctionCall")) return; logChecker("CheckSizeof::sizeofFunction"); // warning @@ -397,7 +397,7 @@ void CheckSizeofImpl::sizeofFunctionError(const Token *tok) //----------------------------------------------------------------------------- void CheckSizeofImpl::suspiciousSizeofCalculation() { - if (!mSettings->severity.isEnabled(Severity::warning) || !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (!mSettings.severity.isEnabled(Severity::warning) || !mSettings.certainty.isEnabled(Certainty::inconclusive)) return; logChecker("CheckSizeof::suspiciousSizeofCalculation"); // warning,inconclusive @@ -441,7 +441,7 @@ void CheckSizeofImpl::divideSizeofError(const Token *tok) void CheckSizeofImpl::sizeofVoid() { - if (!mSettings->severity.isEnabled(Severity::portability)) + if (!mSettings.severity.isEnabled(Severity::portability)) return; logChecker("CheckSizeof::sizeofVoid"); // portability @@ -500,7 +500,7 @@ void CheckSizeofImpl::arithOperationsOnVoidPointerError(const Token* tok, const void CheckSizeof::runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger) { - CheckSizeofImpl checkSizeof(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckSizeofImpl checkSizeof(&tokenizer, tokenizer.getSettings(), errorLogger); // Checks checkSizeof.sizeofsizeof(); @@ -513,7 +513,7 @@ void CheckSizeof::runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger checkSizeof.sizeofVoid(); } -void CheckSizeof::getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const +void CheckSizeof::getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const { CheckSizeofImpl c(nullptr, settings, errorLogger); c.sizeofForArrayParameterError(nullptr); diff --git a/lib/checksizeof.h b/lib/checksizeof.h index 0ec4b298de5..90d55e69506 100644 --- a/lib/checksizeof.h +++ b/lib/checksizeof.h @@ -48,7 +48,7 @@ class CPPCHECKLIB CheckSizeof : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger) override; - void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; + void getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const override; std::string classInfo() const override { return "sizeof() usage checks\n" @@ -66,7 +66,7 @@ class CPPCHECKLIB CheckSizeof : public Check { class CPPCHECKLIB CheckSizeofImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckSizeofImpl(const Tokenizer* tokenizer, const Settings* settings, ErrorLogger* errorLogger) + CheckSizeofImpl(const Tokenizer* tokenizer, const Settings& settings, ErrorLogger* errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for 'sizeof sizeof ..' */ diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 2980fe2d86e..887f7001ef2 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -150,9 +150,9 @@ void CheckStlImpl::outOfBounds() continue; if (value.isImpossible()) continue; - if (value.isInconclusive() && !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (value.isInconclusive() && !mSettings.certainty.isEnabled(Certainty::inconclusive)) continue; - if (!value.errorSeverity() && !mSettings->severity.isEnabled(Severity::warning)) + if (!value.errorSeverity() && !mSettings.severity.isEnabled(Severity::warning)) continue; if (value.intvalue == 0 && (indexTok || (containerYieldsElement(container, parent) && !containerAppendsElement(container, parent)) || @@ -165,7 +165,7 @@ void CheckStlImpl::outOfBounds() } if (indexTok) { std::vector indexValues = - ValueFlow::isOutOfBounds(value, indexTok, mSettings->severity.isEnabled(Severity::warning)); + ValueFlow::isOutOfBounds(value, indexTok, mSettings.severity.isEnabled(Severity::warning)); if (!indexValues.empty()) { outOfBoundsError( accessTok, tok->expressionString(), &value, indexTok->expressionString(), &indexValues.front()); @@ -175,7 +175,7 @@ void CheckStlImpl::outOfBounds() } if (indexTok && !indexTok->hasKnownIntValue()) { const ValueFlow::Value* value = - ValueFlow::findValue(indexTok->values(), *mSettings, [&](const ValueFlow::Value& v) { + ValueFlow::findValue(indexTok->values(), mSettings, [&](const ValueFlow::Value& v) { if (!v.isSymbolicValue()) return false; if (v.isImpossible()) @@ -280,7 +280,7 @@ bool CheckStlImpl::isContainerSize(const Token *containerToken, const Token *exp return false; if (!Token::Match(expr->astOperand1(), ". %name% (")) return false; - if (!isSameExpression(false, containerToken, expr->astOperand1()->astOperand1(), *mSettings, false, false)) + if (!isSameExpression(false, containerToken, expr->astOperand1()->astOperand1(), mSettings, false, false)) return false; return containerToken->valueType()->container->getYield(expr->strAt(-1)) == Library::Container::Yield::SIZE; } @@ -309,7 +309,7 @@ bool CheckStlImpl::isContainerSizeGE(const Token * containerToken, const Token * op = expr->astOperand1(); else return false; - return op && op->getValueGE(0, *mSettings); + return op && op->getValueGE(0, mSettings); } return false; } @@ -470,7 +470,7 @@ void CheckStlImpl::iterators() bool inconclusiveType=false; if (!isIterator(var, inconclusiveType)) continue; - if (inconclusiveType && !mSettings->certainty.isEnabled(Certainty::inconclusive)) + if (inconclusiveType && !mSettings.certainty.isEnabled(Certainty::inconclusive)) continue; const int iteratorId = var->declarationId(); @@ -772,7 +772,7 @@ bool CheckStlImpl::checkIteratorPair(const Token* tok1, const Token* tok2) (!astIsContainer(val1.tokvalue) || !astIsContainer(val2.tokvalue))) return false; } - if (isSameIteratorContainerExpression(val1.tokvalue, val2.tokvalue, *mSettings, val1.lifetimeKind)) + if (isSameIteratorContainerExpression(val1.tokvalue, val2.tokvalue, mSettings, val1.lifetimeKind)) return false; if (val1.tokvalue->expressionString() == val2.tokvalue->expressionString()) iteratorsError(tok1, val1.tokvalue, val1.tokvalue->expressionString()); @@ -792,7 +792,7 @@ bool CheckStlImpl::checkIteratorPair(const Token* tok1, const Token* tok2) const Token* iter2 = getIteratorExpression(tok2); if (!iter2) return false; - if (!isSameIteratorContainerExpression(iter1, iter2, *mSettings)) { + if (!isSameIteratorContainerExpression(iter1, iter2, mSettings)) { mismatchingContainerExpressionError(iter1, iter2); return true; } @@ -829,7 +829,7 @@ void CheckStlImpl::mismatchingContainers() // Group args together by container std::map> containers; for (int argnr = 1; argnr <= args.size(); ++argnr) { - const Library::ArgumentChecks::IteratorInfo *i = mSettings->library.getArgIteratorInfo(ftok, argnr); + const Library::ArgumentChecks::IteratorInfo *i = mSettings.library.getArgIteratorInfo(ftok, argnr); if (!i) continue; const Token * const argTok = args[argnr - 1]; @@ -846,7 +846,7 @@ void CheckStlImpl::mismatchingContainers() if (iter1.tok == iter2.tok) continue; if (iter1.info->first && iter2.info->last && - isSameExpression(false, iter1.tok, iter2.tok, *mSettings, false, false)) + isSameExpression(false, iter1.tok, iter2.tok, mSettings, false, false)) sameIteratorExpressionError(iter1.tok); if (checkIteratorPair(iter1.tok, iter2.tok)) return; @@ -910,7 +910,7 @@ void CheckStlImpl::mismatchingContainerIterator() continue; if (iterTok->str() == "*" && iterTok->astOperand1()->valueType() && iterTok->astOperand1()->valueType()->type == ValueType::ITERATOR) continue; - if (isSameIteratorContainerExpression(tok, val.tokvalue, *mSettings)) + if (isSameIteratorContainerExpression(tok, val.tokvalue, mSettings)) continue; mismatchingContainerIteratorError(tok, iterTok, val.tokvalue); } @@ -1143,7 +1143,7 @@ void CheckStlImpl::invalidContainer() const Scope* s = tok2->scope(); if (!s) continue; - if (isReturnScope(s->bodyEnd, mSettings->library)) + if (isReturnScope(s->bodyEnd, mSettings.library)) continue; invalidContainerLoopError(r.ftok, tok, r.errorPath); bail = true; @@ -1194,7 +1194,7 @@ void CheckStlImpl::invalidContainer() ErrorPath ep; bool addressOf = false; - const Variable* var = ValueFlow::getLifetimeVariable(info.tok, ep, *mSettings, &addressOf); + const Variable* var = ValueFlow::getLifetimeVariable(info.tok, ep, mSettings, &addressOf); // Check the reference is created before the change if (var && var->declarationId() == r.tok->varId() && !addressOf) { // An argument always reaches @@ -1371,10 +1371,10 @@ void CheckStlImpl::negativeIndex() const Variable * const var = tok->variable(); if (!var || tok == var->nameToken()) continue; - const Library::Container * const container = mSettings->library.detectContainer(var->typeStartToken()); + const Library::Container * const container = mSettings.library.detectContainer(var->typeStartToken()); if (!container || !container->arrayLike_indexOp) continue; - const ValueFlow::Value *index = tok->next()->astOperand2()->getValueLE(-1, *mSettings); + const ValueFlow::Value *index = tok->next()->astOperand2()->getValueLE(-1, mSettings); if (!index) continue; negativeIndexError(tok, *index); @@ -1470,7 +1470,7 @@ void CheckStlImpl::stlBoundaries() if (!var || !var->scope() || !var->scope()->isExecutable()) continue; - const Library::Container* container = mSettings->library.detectIterator(var->typeStartToken()); + const Library::Container* container = mSettings.library.detectIterator(var->typeStartToken()); if (!container || container->opLessAllowed) continue; @@ -1517,8 +1517,8 @@ static bool if_findCompare(const Token * const tokBack, bool stdStringLike) void CheckStlImpl::if_find() { - const bool printWarning = mSettings->severity.isEnabled(Severity::warning); - const bool printPerformance = mSettings->severity.isEnabled(Severity::performance); + const bool printWarning = mSettings.severity.isEnabled(Severity::warning); + const bool printPerformance = mSettings.severity.isEnabled(Severity::performance); if (!printWarning && !printPerformance) return; @@ -1542,7 +1542,7 @@ void CheckStlImpl::if_find() tok = tok->linkAt(1); else if (tok->variable() && Token::Match(tok, "%var% . %name% (")) { - container = mSettings->library.detectContainer(tok->variable()->typeStartToken()); + container = mSettings.library.detectContainer(tok->variable()->typeStartToken()); funcTok = tok->tokAt(2); } @@ -1556,16 +1556,16 @@ void CheckStlImpl::if_find() funcTok = tok2->astParent()->next(); if (tok->variable()->isArrayOrPointer()) - container = mSettings->library.detectContainer(tok->variable()->typeStartToken()); + container = mSettings.library.detectContainer(tok->variable()->typeStartToken()); else { // Container of container - find the inner container - container = mSettings->library.detectContainer(tok->variable()->typeStartToken()); // outer container + container = mSettings.library.detectContainer(tok->variable()->typeStartToken()); // outer container tok2 = Token::findsimplematch(tok->variable()->typeStartToken(), "<", tok->variable()->typeEndToken()); if (container && container->type_templateArgNo >= 0 && tok2) { tok2 = tok2->next(); for (int j = 0; j < container->type_templateArgNo; j++) tok2 = tok2->nextTemplateArgument(); - container = mSettings->library.detectContainer(tok2); // inner container + container = mSettings.library.detectContainer(tok2); // inner container } else container = nullptr; } @@ -1594,7 +1594,7 @@ void CheckStlImpl::if_find() void CheckStlImpl::if_findError(const Token *tok, bool str) { - if (str && mSettings->standards.cpp >= Standards::CPP20) + if (str && mSettings.standards.cpp >= Standards::CPP20) reportError(tok, Severity::performance, "stlIfStrFind", "Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n" "Either inefficient or wrong usage of string::find(). string::starts_with() will be faster if " @@ -1685,7 +1685,7 @@ static const Token *findInsertValue(const Token *tok, const Token *containerTok, void CheckStlImpl::checkFindInsert() { - if (!mSettings->severity.isEnabled(Severity::performance)) + if (!mSettings.severity.isEnabled(Severity::performance)) return; logChecker("CheckStl::checkFindInsert"); // performance @@ -1706,20 +1706,20 @@ void CheckStlImpl::checkFindInsert() if (!containerTok) continue; // In < C++17 we only warn for small simple types - if (mSettings->standards.cpp < Standards::CPP17 && !(keyTok && keyTok->valueType() && (keyTok->valueType()->isIntegral() || keyTok->valueType()->pointer > 0))) + if (mSettings.standards.cpp < Standards::CPP17 && !(keyTok && keyTok->valueType() && (keyTok->valueType()->isIntegral() || keyTok->valueType()->pointer > 0))) continue; const Token *thenTok = tok->linkAt(1)->next(); - const Token *valueTok = findInsertValue(thenTok, containerTok, keyTok, *mSettings); + const Token *valueTok = findInsertValue(thenTok, containerTok, keyTok, mSettings); if (!valueTok) continue; if (Token::simpleMatch(thenTok->link(), "} else {")) { const Token *valueTok2 = - findInsertValue(thenTok->link()->tokAt(2), containerTok, keyTok, *mSettings); + findInsertValue(thenTok->link()->tokAt(2), containerTok, keyTok, mSettings); if (!valueTok2) continue; - if (isSameExpression(true, valueTok, valueTok2, *mSettings, true, true)) { + if (isSameExpression(true, valueTok, valueTok2, mSettings, true, true)) { checkFindInsertError(valueTok); } } else { @@ -1733,10 +1733,10 @@ void CheckStlImpl::checkFindInsertError(const Token *tok) { std::string replaceExpr; if (tok && Token::simpleMatch(tok->astParent(), "=") && tok == tok->astParent()->astOperand2() && Token::simpleMatch(tok->astParent()->astOperand1(), "[")) { - if (mSettings->standards.cpp < Standards::CPP11) + if (mSettings.standards.cpp < Standards::CPP11) // We will recommend using emplace/try_emplace instead return; - const std::string f = (mSettings->standards.cpp < Standards::CPP17) ? "emplace" : "try_emplace"; + const std::string f = (mSettings.standards.cpp < Standards::CPP17) ? "emplace" : "try_emplace"; replaceExpr = " Instead of '" + tok->astParent()->expressionString() + "' consider using '" + tok->astParent()->astOperand1()->astOperand1()->expressionString() + "." + f + "(" + @@ -1763,10 +1763,10 @@ static bool isCpp03ContainerSizeSlow(const Token *tok) void CheckStlImpl::size() { - if (!mSettings->severity.isEnabled(Severity::performance)) + if (!mSettings.severity.isEnabled(Severity::performance)) return; - if (mSettings->standards.cpp >= Standards::CPP11) + if (mSettings.standards.cpp >= Standards::CPP11) return; logChecker("CheckStl::size"); // performance,c++03 @@ -1824,7 +1824,7 @@ void CheckStlImpl::sizeError(const Token *tok) void CheckStlImpl::redundantCondition() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("redundantIfRemove")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("redundantIfRemove")) return; logChecker("CheckStl::redundantCondition"); // style @@ -1865,7 +1865,7 @@ void CheckStlImpl::redundantIfRemoveError(const Token *tok) void CheckStlImpl::missingComparison() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckStl::missingComparison"); // warning @@ -2025,8 +2025,8 @@ namespace { void CheckStlImpl::string_c_str() { - const bool printInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive); - const bool printPerformance = mSettings->severity.isEnabled(Severity::performance); + const bool printInconclusive = mSettings.certainty.isEnabled(Certainty::inconclusive); + const bool printPerformance = mSettings.severity.isEnabled(Severity::performance); const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); @@ -2289,8 +2289,8 @@ namespace { void CheckStlImpl::uselessCalls() { - const bool printPerformance = mSettings->severity.isEnabled(Severity::performance); - const bool printWarning = mSettings->severity.isEnabled(Severity::warning); + const bool printPerformance = mSettings.severity.isEnabled(Severity::performance); + const bool printWarning = mSettings.severity.isEnabled(Severity::warning); if (!printPerformance && !printWarning) return; @@ -2416,7 +2416,7 @@ void CheckStlImpl::uselessCallsRemoveError(const Token *tok, const std::string& // E.g. if (*i && i != str.end()) { } void CheckStlImpl::checkDereferenceInvalidIterator() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckStl::checkDereferenceInvalidIterator"); // warning @@ -2480,7 +2480,7 @@ void CheckStlImpl::checkDereferenceInvalidIterator() void CheckStlImpl::checkDereferenceInvalidIterator2() { - const bool printInconclusive = (mSettings->certainty.isEnabled(Certainty::inconclusive)); + const bool printInconclusive = (mSettings.certainty.isEnabled(Certainty::inconclusive)); logChecker("CheckStl::checkDereferenceInvalidIterator2"); @@ -2550,7 +2550,7 @@ void CheckStlImpl::checkDereferenceInvalidIterator2() emptyAdvance = tok->astParent(); } } - if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings) && !isInvalidIterator && !emptyAdvance) { + if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings) && !isInvalidIterator && !emptyAdvance) { if (!unknown) continue; inconclusive = true; @@ -2583,7 +2583,7 @@ void CheckStlImpl::dereferenceInvalidIteratorError(const Token* tok, const Value reportError(tok, Severity::warning, "derefInvalidIteratorRedundantCheck", errmsgcond, CWE825, Certainty::normal); return; } - if (!mSettings->isEnabled(value, inconclusive)) + if (!mSettings.isEnabled(value, inconclusive)) return; ErrorPath errorPath = getErrorPath(tok, value, "Dereference of an invalid iterator"); @@ -3002,7 +3002,7 @@ namespace { void CheckStlImpl::useStlAlgorithm() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("useStlAlgorithm")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("useStlAlgorithm")) return; logChecker("CheckStl::useStlAlgorithm"); // style @@ -3018,7 +3018,7 @@ void CheckStlImpl::useStlAlgorithm() if (!Token::simpleMatch(tok, "{") || !Token::simpleMatch(tok->previous(), ")")) return false; const Token* condTok = tok->linkAt(-1)->astOperand2(); - if (isConstExpression(condTok, mSettings->library)) { + if (isConstExpression(condTok, mSettings.library)) { if (condTok->str() == "<") type = ConditionOpType::MIN; else if (condTok->str() == ">") @@ -3044,7 +3044,7 @@ void CheckStlImpl::useStlAlgorithm() continue; if (!Token::simpleMatch(tok->linkAt(1), ") {")) continue; - LoopAnalyzer a{tok, mSettings}; + LoopAnalyzer a{tok, &mSettings}; std::string algoName = a.findAlgo(); if (!algoName.empty()) { useStlAlgorithmError(tok, algoName); @@ -3082,7 +3082,7 @@ void CheckStlImpl::useStlAlgorithm() // Check for single assignment bool useLoopVarInAssign{}, hasBreak{}; - const Token *assignTok = singleAssignInScope(bodyTok, loopVar->varId(), useLoopVarInAssign, hasBreak, loopType, *mSettings); + const Token *assignTok = singleAssignInScope(bodyTok, loopVar->varId(), useLoopVarInAssign, hasBreak, loopType, mSettings); if (assignTok) { if (!checkAssignee(assignTok->astOperand1())) continue; @@ -3114,7 +3114,7 @@ void CheckStlImpl::useStlAlgorithm() } // Check for container calls bool useLoopVarInMemCall; - const Token *memberAccessTok = singleMemberCallInScope(bodyTok, loopVar->varId(), useLoopVarInMemCall, *mSettings); + const Token *memberAccessTok = singleMemberCallInScope(bodyTok, loopVar->varId(), useLoopVarInMemCall, mSettings); if (memberAccessTok && loopType == LoopType::RANGE) { const Token *memberCallTok = memberAccessTok->astOperand2(); const int contVarId = memberAccessTok->astOperand1()->varId(); @@ -3147,10 +3147,10 @@ void CheckStlImpl::useStlAlgorithm() } // Check for conditionals - const Token *condBodyTok = singleConditionalInScope(bodyTok, loopVar->varId(), loopType, *mSettings); + const Token *condBodyTok = singleConditionalInScope(bodyTok, loopVar->varId(), loopType, mSettings); if (condBodyTok) { // Check for single assign - assignTok = singleAssignInScope(condBodyTok, loopVar->varId(), useLoopVarInAssign, hasBreak, loopType, *mSettings); + assignTok = singleAssignInScope(condBodyTok, loopVar->varId(), useLoopVarInAssign, hasBreak, loopType, mSettings); if (assignTok) { if (!checkAssignee(assignTok->astOperand1())) continue; @@ -3191,7 +3191,7 @@ void CheckStlImpl::useStlAlgorithm() } // Check for container call - memberAccessTok = singleMemberCallInScope(condBodyTok, loopVar->varId(), useLoopVarInMemCall, *mSettings); + memberAccessTok = singleMemberCallInScope(condBodyTok, loopVar->varId(), useLoopVarInMemCall, mSettings); if (memberAccessTok) { const Token *memberCallTok = memberAccessTok->astOperand2(); const int contVarId = memberAccessTok->astOperand1()->varId(); @@ -3269,7 +3269,7 @@ static bool isKnownEmptyContainer(const Token* tok) void CheckStlImpl::knownEmptyContainer() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("knownEmptyContainer")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("knownEmptyContainer")) return; logChecker("CheckStl::knownEmptyContainer"); // style for (const Scope *function : mTokenizer->getSymbolDatabase()->functionScopes) { @@ -3295,7 +3295,7 @@ void CheckStlImpl::knownEmptyContainer() continue; for (int argnr = 1; argnr <= args.size(); ++argnr) { - const Library::ArgumentChecks::IteratorInfo *i = mSettings->library.getArgIteratorInfo(tok, argnr); + const Library::ArgumentChecks::IteratorInfo *i = mSettings.library.getArgIteratorInfo(tok, argnr); if (!i) continue; const Token * const argTok = args[argnr - 1]; @@ -3418,7 +3418,7 @@ void CheckStlImpl::localMutexError(const Token* tok) void CheckStlImpl::checkMutexes() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckStl::checkMutexes"); // warning for (const Scope *function : mTokenizer->getSymbolDatabase()->functionScopes) { @@ -3459,7 +3459,7 @@ void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) return; } - CheckStlImpl checkStl(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckStlImpl checkStl(&tokenizer, tokenizer.getSettings(), errorLogger); checkStl.erase(); checkStl.if_find(); checkStl.checkFindInsert(); @@ -3490,7 +3490,7 @@ void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkStl.size(); } -void CheckStl::getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const +void CheckStl::getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const { CheckStlImpl c(nullptr, settings, errorLogger); c.outOfBoundsError(nullptr, "container", nullptr, "x", nullptr); diff --git a/lib/checkstl.h b/lib/checkstl.h index 626e39f4276..e23d6b54fb4 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -55,7 +55,7 @@ class CPPCHECKLIB CheckStl : public Check { /** run checks, the token list is not simplified */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; + void getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const override; std::string classInfo() const override { return "Check for invalid usage of STL:\n" @@ -83,7 +83,7 @@ class CPPCHECKLIB CheckStl : public Check { class CPPCHECKLIB CheckStlImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckStlImpl(const Tokenizer* tokenizer, const Settings* settings, ErrorLogger* errorLogger) + CheckStlImpl(const Tokenizer* tokenizer, const Settings& settings, ErrorLogger* errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Accessing container out of bounds using ValueFlow */ diff --git a/lib/checkstring.cpp b/lib/checkstring.cpp index 916885e094a..db4a3eca113 100644 --- a/lib/checkstring.cpp +++ b/lib/checkstring.cpp @@ -55,7 +55,7 @@ void CheckStringImpl::stringLiteralWrite() for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { if (!tok->variable() || !tok->variable()->isPointer()) continue; - const Token *str = tok->getValueTokenMinStrSize(*mSettings); + const Token *str = tok->getValueTokenMinStrSize(mSettings); if (!str) continue; if (Token::Match(tok, "%var% [") && Token::simpleMatch(tok->linkAt(1), "] =")) @@ -91,7 +91,7 @@ void CheckStringImpl::stringLiteralWriteError(const Token *tok, const Token *str //--------------------------------------------------------------------------- void CheckStringImpl::checkAlwaysTrueOrFalseStringCompare() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckString::checkAlwaysTrueOrFalseStringCompare"); // warning @@ -160,7 +160,7 @@ void CheckStringImpl::alwaysTrueStringVariableCompareError(const Token *tok, con //----------------------------------------------------------------------------- void CheckStringImpl::checkSuspiciousStringCompare() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckString::checkSuspiciousStringCompare"); // warning @@ -274,7 +274,7 @@ static bool isMacroUsage(const Token* tok) //--------------------------------------------------------------------------- void CheckStringImpl::checkIncorrectStringCompare() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckString::checkIncorrectStringCompare"); // warning @@ -314,7 +314,7 @@ void CheckStringImpl::checkIncorrectStringCompare() } } else if (Token::Match(tok, "%str%|%char%") && !Token::Match(tok->next(), "%name%") && - isUsedAsBool(tok, *mSettings) && + isUsedAsBool(tok, mSettings) && !isMacroUsage(tok)) incorrectStringBooleanError(tok, tok->str()); } @@ -343,7 +343,7 @@ void CheckStringImpl::incorrectStringBooleanError(const Token *tok, const std::s //--------------------------------------------------------------------------- void CheckStringImpl::overlappingStrcmp() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckString::overlappingStrcmp"); // warning @@ -395,7 +395,7 @@ void CheckStringImpl::overlappingStrcmp() if (args1[1]->isLiteral() && args2[1]->isLiteral() && args1[1]->str() != args2[1]->str() && - isSameExpression(true, args1[0], args2[0], *mSettings, true, false)) + isSameExpression(true, args1[0], args2[0], mSettings, true, false)) overlappingStrcmpError(eq0, ne0); } } @@ -446,7 +446,7 @@ void CheckStringImpl::sprintfOverlappingData() const bool same = isSameExpression(false, dest, arg, - *mSettings, + mSettings, true, false); if (same) { @@ -473,7 +473,7 @@ void CheckStringImpl::sprintfOverlappingDataError(const Token *funcTok, const To void CheckString::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckStringImpl checkString(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckStringImpl checkString(&tokenizer, tokenizer.getSettings(), errorLogger); // Checks checkString.strPlusChar(); @@ -485,7 +485,7 @@ void CheckString::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger checkString.checkAlwaysTrueOrFalseStringCompare(); } -void CheckString::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckString::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckStringImpl c(nullptr, settings, errorLogger); c.stringLiteralWriteError(nullptr, nullptr); diff --git a/lib/checkstring.h b/lib/checkstring.h index 9edefc3f8b0..054c4208a18 100644 --- a/lib/checkstring.h +++ b/lib/checkstring.h @@ -48,7 +48,7 @@ class CPPCHECKLIB CheckString : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Detect misusage of C-style strings:\n" @@ -65,7 +65,7 @@ class CPPCHECKLIB CheckString : public Check { class CPPCHECKLIB CheckStringImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckStringImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckStringImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief undefined behaviour, writing string literal */ diff --git a/lib/checktype.cpp b/lib/checktype.cpp index 1679d98e80f..262cb37a612 100644 --- a/lib/checktype.cpp +++ b/lib/checktype.cpp @@ -59,7 +59,7 @@ static const CWE CWE190(190U); // Integer Overflow or Wraparound void CheckTypeImpl::checkTooBigBitwiseShift() { // unknown sizeof(int) => can't run this checker - if (mSettings->platform.type == Platform::Type::Unspecified) + if (mSettings.platform.type == Platform::Type::Unspecified) return; logChecker("CheckType::checkTooBigBitwiseShift"); // platform @@ -90,21 +90,21 @@ void CheckTypeImpl::checkTooBigBitwiseShift() (lhstype->type == ValueType::Type::WCHAR_T) || (lhstype->type == ValueType::Type::BOOL) || (lhstype->type == ValueType::Type::INT)) - lhsbits = mSettings->platform.int_bit; + lhsbits = mSettings.platform.int_bit; else if (lhstype->type == ValueType::Type::LONG) - lhsbits = mSettings->platform.long_bit; + lhsbits = mSettings.platform.long_bit; else if (lhstype->type == ValueType::Type::LONGLONG) - lhsbits = mSettings->platform.long_long_bit; + lhsbits = mSettings.platform.long_long_bit; else continue; // Get biggest rhs value. preferably a value which doesn't have 'condition'. - const ValueFlow::Value * value = tok->astOperand2()->getValueGE(lhsbits, *mSettings); - if (value && mSettings->isEnabled(value, false)) + const ValueFlow::Value * value = tok->astOperand2()->getValueGE(lhsbits, mSettings); + if (value && mSettings.isEnabled(value, false)) tooBigBitwiseShiftError(tok, lhsbits, *value); else if (lhstype->sign == ValueType::Sign::SIGNED) { - value = tok->astOperand2()->getValueGE(lhsbits-1, *mSettings); - if (value && mSettings->isEnabled(value, false)) + value = tok->astOperand2()->getValueGE(lhsbits-1, mSettings); + if (value && mSettings.isEnabled(value, false)) tooBigSignedBitwiseShiftError(tok, lhsbits, *value); } } @@ -133,7 +133,7 @@ void CheckTypeImpl::tooBigSignedBitwiseShiftError(const Token *tok, int lhsbits, { constexpr char id[] = "shiftTooManyBitsSigned"; - const bool cpp14 = ((tok && tok->isCpp()) || (mTokenizer && mTokenizer->isCPP())) && (mSettings->standards.cpp >= Standards::CPP14); + const bool cpp14 = ((tok && tok->isCpp()) || (mTokenizer && mTokenizer->isCPP())) && (mSettings.standards.cpp >= Standards::CPP14); std::string behaviour = "undefined"; if (cpp14) @@ -148,7 +148,7 @@ void CheckTypeImpl::tooBigSignedBitwiseShiftError(const Token *tok, int lhsbits, if (cpp14) severity = Severity::portability; - if ((severity == Severity::portability) && !mSettings->severity.isEnabled(Severity::portability)) + if ((severity == Severity::portability) && !mSettings.severity.isEnabled(Severity::portability)) return; ErrorPath errorPath = getErrorPath(tok, &rhsbits, "Shift"); @@ -167,7 +167,7 @@ void CheckTypeImpl::tooBigSignedBitwiseShiftError(const Token *tok, int lhsbits, void CheckTypeImpl::checkIntegerOverflow() { // unknown sizeof(int) => can't run this checker - if (mSettings->platform.type == Platform::Type::Unspecified || mSettings->platform.int_bit >= MathLib::bigint_bits) + if (mSettings.platform.type == Platform::Type::Unspecified || mSettings.platform.int_bit >= MathLib::bigint_bits) return; logChecker("CheckType::checkIntegerOverflow"); // platform @@ -183,11 +183,11 @@ void CheckTypeImpl::checkIntegerOverflow() unsigned int bits; if (vt->type == ValueType::Type::INT) - bits = mSettings->platform.int_bit; + bits = mSettings.platform.int_bit; else if (vt->type == ValueType::Type::LONG) - bits = mSettings->platform.long_bit; + bits = mSettings.platform.long_bit; else if (vt->type == ValueType::Type::LONGLONG) - bits = mSettings->platform.long_long_bit; + bits = mSettings.platform.long_long_bit; else continue; @@ -199,12 +199,12 @@ void CheckTypeImpl::checkIntegerOverflow() // is there a overflow result value bool isOverflow = true; - const ValueFlow::Value *value = tok->getValueGE(maxvalue + 1, *mSettings); + const ValueFlow::Value *value = tok->getValueGE(maxvalue + 1, mSettings); if (!value) { - value = tok->getValueLE(-maxvalue - 2, *mSettings); + value = tok->getValueLE(-maxvalue - 2, mSettings); isOverflow = false; } - if (!value || !mSettings->isEnabled(value,false)) + if (!value || !mSettings.isEnabled(value,false)) continue; // For left shift, it's common practice to shift into the sign bit @@ -253,7 +253,7 @@ void CheckTypeImpl::integerOverflowError(const Token *tok, const ValueFlow::Valu void CheckTypeImpl::checkSignConversion() { - if (!mSettings->severity.isEnabled(Severity::warning)) + if (!mSettings.severity.isEnabled(Severity::warning)) return; logChecker("CheckType::checkSignConversion"); // warning @@ -272,7 +272,7 @@ void CheckTypeImpl::checkSignConversion() if (!tok1) continue; const ValueFlow::Value* negativeValue = - ValueFlow::findValue(tok1->values(), *mSettings, [&](const ValueFlow::Value& v) { + ValueFlow::findValue(tok1->values(), mSettings, [&](const ValueFlow::Value& v) { return !v.isImpossible() && v.isIntValue() && (v.intvalue <= -1 || v.wideintvalue <= -1); }); if (!negativeValue) @@ -338,7 +338,7 @@ static bool checkTypeCombination(ValueType src, ValueType tgt, const Settings& s void CheckTypeImpl::checkLongCast() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("truncLongCastAssignment")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("truncLongCastAssignment")) return; logChecker("CheckType::checkLongCast"); // style @@ -349,7 +349,7 @@ void CheckTypeImpl::checkLongCast() continue; if (const ValueFlow::Value* v = tok->astOperand2()->getKnownValue(ValueFlow::Value::ValueType::INT)) { - if (mSettings->platform.isIntValue(v->intvalue)) + if (mSettings.platform.isIntValue(v->intvalue)) continue; } @@ -358,7 +358,7 @@ void CheckTypeImpl::checkLongCast() if (!lhstype || !rhstype) continue; - if (!checkTypeCombination(*rhstype, *lhstype, *mSettings)) + if (!checkTypeCombination(*rhstype, *lhstype, mSettings)) continue; // assign int result to long/longlong const nonpointer? @@ -385,12 +385,12 @@ void CheckTypeImpl::checkLongCast() if (tok->str() == "return") { if (Token::Match(tok->astOperand1(), "<<|*")) { const ValueType *type = tok->astOperand1()->valueType(); - if (type && checkTypeCombination(*type, *retVt, *mSettings) && + if (type && checkTypeCombination(*type, *retVt, mSettings) && type->pointer == 0U && type->originalTypeName.empty()) { if (!tok->astOperand1()->hasKnownIntValue()) { ret = tok; - } else if (!mSettings->platform.isIntValue(tok->astOperand1()->getKnownIntValue())) + } else if (!mSettings.platform.isIntValue(tok->astOperand1()->getKnownIntValue())) ret = tok; } } @@ -476,7 +476,7 @@ void CheckTypeImpl::checkFloatToIntegerOverflow() while (scope && scope->type != ScopeType::eLambda && scope->type != ScopeType::eFunction) scope = scope->nestedIn; if (scope && scope->type == ScopeType::eFunction && scope->function && scope->function->retDef) { - const ValueType &valueType = ValueType::parseDecl(scope->function->retDef, *mSettings); + const ValueType &valueType = ValueType::parseDecl(scope->function->retDef, mSettings); vtfloat = tok->astOperand1()->valueType(); checkFloatToIntegerOverflow(tok, &valueType, vtfloat, tok->astOperand1()->values()); } @@ -495,24 +495,24 @@ void CheckTypeImpl::checkFloatToIntegerOverflow(const Token *tok, const ValueTyp for (const ValueFlow::Value &f : floatValues) { if (f.valueType != ValueFlow::Value::ValueType::FLOAT) continue; - if (!mSettings->isEnabled(&f, false)) + if (!mSettings.isEnabled(&f, false)) continue; - if (f.floatValue >= std::exp2(mSettings->platform.long_long_bit)) + if (f.floatValue >= std::exp2(mSettings.platform.long_long_bit)) floatToIntegerOverflowError(tok, f); - else if ((-f.floatValue) > std::exp2(mSettings->platform.long_long_bit - 1)) + else if ((-f.floatValue) > std::exp2(mSettings.platform.long_long_bit - 1)) floatToIntegerOverflowError(tok, f); - else if (mSettings->platform.type != Platform::Type::Unspecified) { + else if (mSettings.platform.type != Platform::Type::Unspecified) { int bits = 0; if (vtint->type == ValueType::Type::CHAR) - bits = mSettings->platform.char_bit; + bits = mSettings.platform.char_bit; else if (vtint->type == ValueType::Type::SHORT) - bits = mSettings->platform.short_bit; + bits = mSettings.platform.short_bit; else if (vtint->type == ValueType::Type::INT) - bits = mSettings->platform.int_bit; + bits = mSettings.platform.int_bit; else if (vtint->type == ValueType::Type::LONG) - bits = mSettings->platform.long_bit; + bits = mSettings.platform.long_bit; else if (vtint->type == ValueType::Type::LONGLONG) - bits = mSettings->platform.long_long_bit; + bits = mSettings.platform.long_long_bit; else continue; if (bits < MathLib::bigint_bits && f.floatValue >= (1ULL << bits)) @@ -534,7 +534,7 @@ void CheckTypeImpl::floatToIntegerOverflowError(const Token *tok, const ValueFlo void CheckType::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { // These are not "simplified" because casts can't be ignored - CheckTypeImpl checkType(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckTypeImpl checkType(&tokenizer, tokenizer.getSettings(), errorLogger); checkType.checkTooBigBitwiseShift(); checkType.checkIntegerOverflow(); checkType.checkSignConversion(); @@ -542,7 +542,7 @@ void CheckType::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkType.checkFloatToIntegerOverflow(); } -void CheckType::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckType::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckTypeImpl c(nullptr, settings, errorLogger); c.tooBigBitwiseShiftError(nullptr, 32, ValueFlow::Value(64)); diff --git a/lib/checktype.h b/lib/checktype.h index a65ed7ea084..0030e3622be 100644 --- a/lib/checktype.h +++ b/lib/checktype.h @@ -54,7 +54,7 @@ class CPPCHECKLIB CheckType : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Type checks\n" @@ -70,7 +70,7 @@ class CPPCHECKLIB CheckType : public Check { class CPPCHECKLIB CheckTypeImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckTypeImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckTypeImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for bitwise shift with too big right operand */ diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 819bfa9d85a..bdfc07a8d47 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -212,10 +212,10 @@ void CheckUninitVarImpl::checkScope(const Scope* scope, const std::setbodyStart; tok != scope->bodyEnd; tok = tok->next()) { if (!Token::Match(tok, "[;{}] %varid% =", arg.declarationId())) continue; - const Token *allocFuncCallToken = findAllocFuncCallToken(tok->tokAt(2)->astOperand2(), mSettings->library); + const Token *allocFuncCallToken = findAllocFuncCallToken(tok->tokAt(2)->astOperand2(), mSettings.library); if (!allocFuncCallToken) continue; - const Library::AllocFunc *allocFunc = mSettings->library.getAllocFuncInfo(allocFuncCallToken); + const Library::AllocFunc *allocFunc = mSettings.library.getAllocFuncInfo(allocFuncCallToken); if (!allocFunc || allocFunc->initData) continue; @@ -396,7 +396,7 @@ static bool isVariableUsed(const Token *tok, const Variable& var) bool CheckUninitVarImpl::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar, std::map& variableValue) { const bool suppressErrors(possibleInit && *possibleInit); // Assume that this is a variable declaration, rather than a fundef - const bool printDebug = mSettings->debugwarnings; + const bool printDebug = mSettings.debugwarnings; if (possibleInit) *possibleInit = false; @@ -763,7 +763,7 @@ bool CheckUninitVarImpl::checkScopeForVariable(const Token *tok, const Variable& while (rhs && rhs->isCast()) rhs = rhs->astOperand2() ? rhs->astOperand2() : rhs->astOperand1(); if (rhs && Token::Match(rhs->previous(), "%name% (")) { - const Library::AllocFunc *allocFunc = mSettings->library.getAllocFuncInfo(rhs->astOperand1()); + const Library::AllocFunc *allocFunc = mSettings.library.getAllocFuncInfo(rhs->astOperand1()); if (allocFunc && !allocFunc->initData) { *alloc = NO_CTOR_CALL; continue; @@ -1355,7 +1355,7 @@ const Token* CheckUninitVarImpl::isVariableUsage(const Token *vartok, const Libr const Token* CheckUninitVarImpl::isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const { - return isVariableUsage(vartok, mSettings->library, pointer, alloc, indirect); + return isVariableUsage(vartok, mSettings.library, pointer, alloc, indirect); } /*** @@ -1436,7 +1436,7 @@ int CheckUninitVarImpl::isFunctionParUsage(const Token *vartok, const Library& l int CheckUninitVarImpl::isFunctionParUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const { - return isFunctionParUsage(vartok, mSettings->library, pointer, alloc, indirect); + return isFunctionParUsage(vartok, mSettings.library, pointer, alloc, indirect); } bool CheckUninitVarImpl::isMemberVariableAssignment(const Token *tok, const std::string &membervar) const @@ -1483,9 +1483,9 @@ bool CheckUninitVarImpl::isMemberVariableAssignment(const Token *tok, const std: // check how function handle uninitialized data arguments.. const Function *function = ftok->function(); - if (!function && mSettings) { + if (!function) { // Function definition not seen, check if direction is specified in the library configuration - const Library::ArgumentChecks::Direction argDirection = mSettings->library.getArgDirection(ftok, 1 + argumentNumber); + const Library::ArgumentChecks::Direction argDirection = mSettings.library.getArgDirection(ftok, 1 + argumentNumber); if (argDirection == Library::ArgumentChecks::Direction::DIR_IN) return false; if (argDirection == Library::ArgumentChecks::Direction::DIR_OUT) @@ -1570,7 +1570,7 @@ void CheckUninitVarImpl::uninitvarError(const Token *tok, const std::string &var void CheckUninitVarImpl::uninitvarError(const Token* tok, const ValueFlow::Value& v) { - if (!mSettings->isEnabled(&v)) + if (!mSettings.isEnabled(&v)) return; if (diag(tok)) return; @@ -1660,28 +1660,28 @@ void CheckUninitVarImpl::valueFlowUninit() if (isarray && tok->variable()->isMember()) continue; // Todo: this is a bailout if (isarray && tok->variable()->isStlType() && Token::simpleMatch(tok->astParent(), ".")) { - const auto yield = astContainerYield(tok, mSettings->library); + const auto yield = astContainerYield(tok, mSettings.library); if (yield != Library::Container::Yield::AT_INDEX && yield != Library::Container::Yield::ITEM) continue; } - const bool deref = CheckNullPointerImpl::isPointerDeRef(tok, unknown, *mSettings); + const bool deref = CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings); uninitderef = deref && v->indirect == 0; const bool isleaf = isLeafDot(tok) || uninitderef; if (!isleaf && Token::Match(tok->astParent(), ". %name%") && (tok->astParent()->next()->variable() || tok->astParent()->next()->isEnumerator())) continue; } - const ExprUsage usage = getExprUsage(tok, v->indirect, *mSettings); + const ExprUsage usage = getExprUsage(tok, v->indirect, mSettings); if (usage == ExprUsage::NotUsed || usage == ExprUsage::Inconclusive) continue; if (!v->subexpressions.empty() && usage == ExprUsage::PassedByReference) continue; if (usage != ExprUsage::Used) { if (!(Token::Match(tok->astParent(), ". %name% (|[") && uninitderef) && - isVariableChanged(tok, v->indirect, *mSettings)) + isVariableChanged(tok, v->indirect, mSettings)) continue; bool inconclusive = false; - if (isVariableChangedByFunctionCall(tok, v->indirect, *mSettings, &inconclusive) || inconclusive) + if (isVariableChangedByFunctionCall(tok, v->indirect, mSettings, &inconclusive) || inconclusive) continue; } uninitvarError(tok, *v); @@ -1753,7 +1753,7 @@ bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::li { (void)settings; - CheckUninitVarImpl dummy(nullptr, &settings, &errorLogger); + CheckUninitVarImpl dummy(nullptr, settings, &errorLogger); dummy. logChecker("CheckUninitVar::analyseWholeProgram"); @@ -1799,12 +1799,12 @@ bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::li void CheckUninitVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckUninitVarImpl checkUninitVar(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckUninitVarImpl checkUninitVar(&tokenizer, tokenizer.getSettings(), errorLogger); checkUninitVar.valueFlowUninit(); checkUninitVar.check(); } -void CheckUninitVar::getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const +void CheckUninitVar::getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const { CheckUninitVarImpl c(nullptr, settings, errorLogger); diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index f484c13e55c..e7af8f85e50 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -76,7 +76,7 @@ class CPPCHECKLIB CheckUninitVar : public Check { /** @brief Analyse all file infos for all TU */ bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override; + void getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const override; std::string classInfo() const override { return "Uninitialized variables\n" @@ -88,7 +88,7 @@ class CPPCHECKLIB CheckUninitVar : public Check { class CPPCHECKLIB CheckUninitVarImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckUninitVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckUninitVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} enum Alloc : std::uint8_t { NO_ALLOC, NO_CTOR_CALL, CTOR_CALL, ARRAY }; diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 4c5f8175f66..b5b863badc5 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -726,8 +726,8 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage_iterateScopes(const Scope* c i->typeEndToken()->isStandardType() || i->isStlType() || mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(i->type()) || - mSettings->library.detectContainer(i->typeStartToken()) || - mSettings->library.getTypeCheck("unusedvar", i->typeStartToken()->str()) == Library::TypeCheck::check) + mSettings.library.detectContainer(i->typeStartToken()) || + mSettings.library.getTypeCheck("unusedvar", i->typeStartToken()->str()) == Library::TypeCheck::check) type = Variables::standard; if (type == Variables::none || isPartOfClassStructUnion(i->typeStartToken())) @@ -852,7 +852,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage_iterateScopes(const Scope* c } } // Freeing memory (not considered "using" the pointer if it was also allocated in this function) - if ((Token::Match(tok, "%name% ( %var% )") && mSettings->library.getDeallocFuncInfo(tok)) || + if ((Token::Match(tok, "%name% ( %var% )") && mSettings.library.getDeallocFuncInfo(tok)) || (tok->isCpp() && (Token::Match(tok, "delete %var% ;") || Token::Match(tok, "delete [ ] %var% ;")))) { nonneg int varid = 0; if (tok->str() != "delete") { @@ -958,10 +958,10 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage_iterateScopes(const Scope* c // Consider allocating memory separately because allocating/freeing alone does not constitute using the variable else if (var && var->mType == Variables::pointer && Token::Match(start, "%name% =") && - findAllocFuncCallToken(start->next()->astOperand2(), mSettings->library)) { + findAllocFuncCallToken(start->next()->astOperand2(), mSettings.library)) { - const Token *allocFuncCallToken = findAllocFuncCallToken(start->next()->astOperand2(), mSettings->library); - const Library::AllocFunc *allocFunc = mSettings->library.getAllocFuncInfo(allocFuncCallToken); + const Token *allocFuncCallToken = findAllocFuncCallToken(start->next()->astOperand2(), mSettings.library); + const Library::AllocFunc *allocFunc = mSettings.library.getAllocFuncInfo(allocFuncCallToken); bool allocateMemory = !allocFunc || Library::ismemory(allocFunc->groupId); @@ -1043,7 +1043,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage_iterateScopes(const Scope* c // Consider allocating memory separately because allocating/freeing alone does not constitute using the variable if (var->mType == Variables::pointer && ((tok->isCpp() && Token::simpleMatch(skipBrackets(tok->next()), "= new")) || - (Token::Match(skipBrackets(tok->next()), "= %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2))))) { + (Token::Match(skipBrackets(tok->next()), "= %name% (") && mSettings.library.getAllocFuncInfo(tok->tokAt(2))))) { variables.allocateMemory(varid, tok); } else if (var->mType == Variables::pointer || var->mType == Variables::reference) { variables.read(varid, tok); @@ -1175,7 +1175,7 @@ static bool isReturnedByRef(const Variable* var, const Function* func) void CheckUnusedVarImpl::checkFunctionVariableUsage() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->checkLibrary && !mSettings->isPremiumEnabled("unusedVariable")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.checkLibrary && !mSettings.isPremiumEnabled("unusedVariable")) return; logChecker("CheckUnusedVar::checkFunctionVariableUsage"); // style @@ -1184,7 +1184,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage() const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); auto reportLibraryCfgError = [this](const Token* tok, const std::string& typeName) { - if (mSettings->checkLibrary) { + if (mSettings.checkLibrary) { reportError(tok, Severity::information, "checkLibraryCheckType", @@ -1331,7 +1331,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage() std::string typeName = op1Var->getTypeName(); if (startsWith(typeName, "::")) typeName.erase(typeName.begin(), typeName.begin() + 2); - switch (mSettings->library.getTypeCheck("unusedvar", typeName)) { + switch (mSettings.library.getTypeCheck("unusedvar", typeName)) { case Library::TypeCheck::def: bailoutTypeName = std::move(typeName); break; @@ -1370,7 +1370,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage() continue; } - FwdAnalysis fwdAnalysis(*mSettings); + FwdAnalysis fwdAnalysis(mSettings); const Token* scopeEnd = ValueFlow::getEndOfExprScope(expr, scope, /*smallest*/ false); if (fwdAnalysis.unusedValue(expr, start, scopeEnd)) { if (!bailoutTypeName.empty()) { @@ -1378,7 +1378,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage() reportLibraryCfgError(tok, bailoutTypeName); continue; } - if (isTrivialInit && findExpressionChanged(expr, start, scopeEnd, *mSettings)) + if (isTrivialInit && findExpressionChanged(expr, start, scopeEnd, mSettings)) continue; // warn @@ -1460,7 +1460,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage() if (mTokenizer->isCPP() && var->isClass() && (!var->valueType() || var->valueType()->type == ValueType::Type::UNKNOWN_TYPE)) { const std::string typeName = var->getTypeName(); - switch (mSettings->library.getTypeCheck("unusedvar", typeName)) { + switch (mSettings.library.getTypeCheck("unusedvar", typeName)) { case Library::TypeCheck::def: reportLibraryCfgError(vnt, typeName); break; @@ -1481,7 +1481,7 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage() void CheckUnusedVarImpl::unusedVariableError(const Token *tok, const std::string &varname) { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unusedVariable")) return; reportError(tok, Severity::style, "unusedVariable", "$symbol:" + varname + "\nUnused variable: $symbol", CWE563, Certainty::normal); @@ -1489,7 +1489,7 @@ void CheckUnusedVarImpl::unusedVariableError(const Token *tok, const std::string void CheckUnusedVarImpl::allocatedButUnusedVariableError(const Token *tok, const std::string &varname) { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unusedVariable")) return; reportError(tok, Severity::style, "unusedAllocatedMemory", "$symbol:" + varname + "\nVariable '$symbol' is allocated memory that is never used.", CWE563, Certainty::normal); @@ -1497,7 +1497,7 @@ void CheckUnusedVarImpl::allocatedButUnusedVariableError(const Token *tok, const void CheckUnusedVarImpl::unreadVariableError(const Token *tok, const std::string &varname, bool modified) { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unusedVariable")) return; if (modified) @@ -1508,7 +1508,7 @@ void CheckUnusedVarImpl::unreadVariableError(const Token *tok, const std::string void CheckUnusedVarImpl::unassignedVariableError(const Token *tok, const std::string &varname) { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedVariable")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unusedVariable")) return; reportError(tok, Severity::style, "unassignedVariable", "$symbol:" + varname + "\nVariable '$symbol' is not assigned a value.", CWE665, Certainty::normal); @@ -1519,7 +1519,7 @@ void CheckUnusedVarImpl::unassignedVariableError(const Token *tok, const std::st //--------------------------------------------------------------------------- void CheckUnusedVarImpl::checkStructMemberUsage() { - if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unusedStructMember") && !mSettings->isPremiumEnabled("unusedVariable")) + if (!mSettings.severity.isEnabled(Severity::style) && !mSettings.isPremiumEnabled("unusedStructMember") && !mSettings.isPremiumEnabled("unusedVariable")) return; logChecker("CheckUnusedVar::checkStructMemberUsage"); // style @@ -1726,14 +1726,14 @@ bool CheckUnusedVarImpl::isEmptyType(const Type* type) void CheckUnusedVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckUnusedVarImpl checkUnusedVar(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, tokenizer.getSettings(), errorLogger); // Coding style checks checkUnusedVar.checkStructMemberUsage(); checkUnusedVar.checkFunctionVariableUsage(); } -void CheckUnusedVar::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckUnusedVar::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckUnusedVarImpl c(nullptr, settings, errorLogger); c.unusedVariableError(nullptr, "varname"); diff --git a/lib/checkunusedvar.h b/lib/checkunusedvar.h index 1d2227c15bf..49ef59bee92 100644 --- a/lib/checkunusedvar.h +++ b/lib/checkunusedvar.h @@ -53,7 +53,7 @@ class CPPCHECKLIB CheckUnusedVar : public Check { /** @brief Run checks against the normal token list */ void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "UnusedVar checks\n" @@ -70,7 +70,7 @@ class CPPCHECKLIB CheckUnusedVar : public Check { class CPPCHECKLIB CheckUnusedVarImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckUnusedVarImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckUnusedVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for unused function variables */ diff --git a/lib/checkvaarg.cpp b/lib/checkvaarg.cpp index 18eb246e0e7..42cd6852788 100644 --- a/lib/checkvaarg.cpp +++ b/lib/checkvaarg.cpp @@ -43,7 +43,7 @@ void CheckVaargImpl::va_start_argument() { const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); const std::size_t functions = symbolDatabase->functionScopes.size(); - const bool printWarnings = mSettings->severity.isEnabled(Severity::warning); + const bool printWarnings = mSettings.severity.isEnabled(Severity::warning); logChecker("CheckVaarg::va_start_argument"); @@ -92,7 +92,7 @@ void CheckVaargImpl::referenceAs_va_start_error(const Token *tok, const std::str void CheckVaargImpl::va_list_usage() { - if (mSettings->clang) + if (mSettings.clang) return; logChecker("CheckVaarg::va_list_usage"); // notclang @@ -175,12 +175,12 @@ void CheckVaargImpl::va_start_subsequentCallsError(const Token *tok, const std:: void CheckVaarg::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) { - CheckVaargImpl check(&tokenizer, &tokenizer.getSettings(), errorLogger); + CheckVaargImpl check(&tokenizer, tokenizer.getSettings(), errorLogger); check.va_start_argument(); check.va_list_usage(); } -void CheckVaarg::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const +void CheckVaarg::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const { CheckVaargImpl c(nullptr, settings, errorLogger); c.wrongParameterTo_va_start_error(nullptr, "arg1", "arg2"); diff --git a/lib/checkvaarg.h b/lib/checkvaarg.h index e07d653456a..4be92045427 100644 --- a/lib/checkvaarg.h +++ b/lib/checkvaarg.h @@ -47,7 +47,7 @@ class CPPCHECKLIB CheckVaarg : public Check { void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; private: - void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override; + void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check for misusage of variable argument lists:\n" @@ -62,7 +62,7 @@ class CPPCHECKLIB CheckVaarg : public Check { class CPPCHECKLIB CheckVaargImpl : public CheckImpl { public: - CheckVaargImpl(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) + CheckVaargImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} void va_start_argument(); diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index f39e64a938f..471a1a8ff1e 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1714,7 +1714,7 @@ void CppCheck::getErrorMessages(ErrorLogger &errorlogger) // call all "getErrorMessages" in all registered Check classes for (const Check * const c : CheckInstances::get()) - c->getErrorMessages(&errorlogger, &s); + c->getErrorMessages(&errorlogger, s); CheckUnusedFunctions::getErrorMessages(errorlogger); Preprocessor::getErrorMessages(errorlogger, s); diff --git a/test/test64bit.cpp b/test/test64bit.cpp index da837fd9a96..8439b5aa787 100644 --- a/test/test64bit.cpp +++ b/test/test64bit.cpp @@ -49,7 +49,7 @@ class Test64BitPortability : public TestFixture { SimpleTokenizer tokenizer(settings, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - Check64BitPortabilityImpl check64BitPortability(&tokenizer, &settings, this); + Check64BitPortabilityImpl check64BitPortability(&tokenizer, settings, this); check64BitPortability.pointerassignment(); } diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 5d545606387..29d8fa13d17 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -5171,7 +5171,7 @@ class TestBufferOverrun : public TestFixture { // Ticket #2292: segmentation fault when using --errorlist CheckBufferOverrun check; const Check& c = getCheck(check); - c.getErrorMessages(this, nullptr); + c.getErrorMessages(this, settingsDefault); // we are not interested in the output - just consume it ignore_errout(); } diff --git a/test/testcharvar.cpp b/test/testcharvar.cpp index bb98dfad48d..ecbf6bf4dc1 100644 --- a/test/testcharvar.cpp +++ b/test/testcharvar.cpp @@ -47,7 +47,7 @@ class TestCharVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check char variable usage.. - CheckOtherImpl checkOther(&tokenizer, &settings, this); + CheckOtherImpl checkOther(&tokenizer, settings, this); checkOther.checkCharVariable(); } diff --git a/test/testclass.cpp b/test/testclass.cpp index 35994e98cf4..8fba8d4a340 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -270,7 +270,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); (checkClass.checkCopyCtorAndEqOperator)(); } @@ -371,7 +371,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings0, this); + CheckClassImpl checkClass(&tokenizer, settings0, this); (checkClass.checkExplicitConstructors)(); } @@ -528,7 +528,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, this); (checkClass.checkDuplInheritedMembers)(); } @@ -752,7 +752,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings3, this); + CheckClassImpl checkClass(&tokenizer, settings3, this); checkClass.copyconstructors(); } @@ -1223,7 +1223,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings0, this); + CheckClassImpl checkClass(&tokenizer, settings0, this); checkClass.operatorEqRetRefThis(); } @@ -1694,7 +1694,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, this); checkClass.operatorEqToSelf(); } @@ -2657,7 +2657,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &s, this); + CheckClassImpl checkClass(&tokenizer, s, this); checkClass.virtualDestructor(); } @@ -2994,7 +2994,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); checkClass.checkMemset(); } @@ -3640,7 +3640,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, this); checkClass.thisSubtraction(); } @@ -3680,7 +3680,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); (checkClass.checkConst)(); } @@ -7863,7 +7863,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings2, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, &settings2, this); + CheckClassImpl checkClass(&tokenizer, settings2, this); checkClass.initializerListOrder(); } @@ -8017,7 +8017,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); checkClass.initializationListUsage(); } @@ -8241,7 +8241,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings0, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, &settings0, this); + CheckClassImpl checkClass(&tokenizer, settings0, this); (checkClass.checkSelfInitialization)(); } @@ -8351,7 +8351,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); checkClass.checkVirtualFunctionCallInConstructor(); } @@ -8696,7 +8696,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); (checkClass.checkOverride)(); } @@ -8908,7 +8908,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); (checkClass.checkUselessOverride)(); } @@ -9098,7 +9098,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); (checkClass.checkUnsafeClassRefMember)(); } @@ -9116,7 +9116,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, this); (checkClass.checkThisUseAfterFree)(); } @@ -9353,7 +9353,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, &settings, this); + CheckClassImpl checkClass(&tokenizer, settings, this); (checkClass.checkReturnByReference)(); } diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 8bec74529b6..155c921de80 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -52,7 +52,7 @@ class TestConstructors : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check class constructors.. - CheckClassImpl checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, this); checkClass.constructors(); } diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index bd94b52af0e..23c6f667797 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -50,7 +50,7 @@ class TestIncompleteStatement : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for incomplete statements.. - CheckOtherImpl checkOther(&tokenizer, &settings1, this); + CheckOtherImpl checkOther(&tokenizer, settings1, this); checkOther.checkIncompleteStatement(); } diff --git a/test/testio.cpp b/test/testio.cpp index bc6e40034f6..6d9b55ddda9 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -109,7 +109,7 @@ class TestIO : public TestFixture { // Check.. if (options.onlyFormatStr) { - CheckIOImpl checkIO(&tokenizer, &settings1, this); + CheckIOImpl checkIO(&tokenizer, settings1, this); checkIO.checkWrongPrintfScanfArguments(); return; } diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 8982215d8e3..8ac0b2484ad 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -44,7 +44,7 @@ class TestMemleak : public TestFixture { SimpleTokenizer tokenizer(settingsDefault, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - const CheckMemoryLeakImpl c(&tokenizer, &settingsDefault, this); + const CheckMemoryLeakImpl c(&tokenizer, settingsDefault, this); return (c.functionReturnType)(&tokenizer.getSymbolDatabase()->scopeList.front().functionList.front()); } @@ -93,7 +93,7 @@ class TestMemleak : public TestFixture { // there is no allocation const Token *tok = Token::findsimplematch(tokenizer.tokens(), "ret ="); - const CheckMemoryLeakImpl check(&tokenizer, &settingsDefault, nullptr); + const CheckMemoryLeakImpl check(&tokenizer, settingsDefault, nullptr); ASSERT_EQUALS(CheckMemoryLeakImpl::No, check.getAllocationType(tok->tokAt(2), 1)); } }; @@ -119,7 +119,7 @@ class TestMemleakInFunction : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, &settings, this); + CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, settings, this); checkMemoryLeak.checkReallocUsage(); } @@ -501,7 +501,7 @@ class TestMemleakInClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, &settings, this); + CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, settings, this); (checkMemoryLeak.check)(); } @@ -1706,7 +1706,7 @@ class TestMemleakStructMember : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakStructMemberImpl checkMemoryLeakStructMember(&tokenizer, &settings, this); + CheckMemoryLeakStructMemberImpl checkMemoryLeakStructMember(&tokenizer, settings, this); (checkMemoryLeakStructMember.check)(); } @@ -2388,7 +2388,7 @@ class TestMemleakNoVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakNoVarImpl checkMemoryLeakNoVar(&tokenizer, &settings, this); + CheckMemoryLeakNoVarImpl checkMemoryLeakNoVar(&tokenizer, settings, this); (checkMemoryLeakNoVar.check)(); } diff --git a/test/testother.cpp b/test/testother.cpp index 321657c668f..2394cfefe7c 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -2055,7 +2055,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizerCpp(settings, *this); ASSERT_LOC(tokenizerCpp.tokenize(code), file, line); - CheckOtherImpl checkOtherCpp(&tokenizerCpp, &settings, this); + CheckOtherImpl checkOtherCpp(&tokenizerCpp, settings, this); checkOtherCpp.warningOldStylePointerCast(); checkOtherCpp.warningDangerousTypeCast(); } @@ -2341,7 +2341,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizerCpp(settings, *this); ASSERT_LOC(tokenizerCpp.tokenize(code), file, line); - CheckOtherImpl checkOtherCpp(&tokenizerCpp, &settings, this); + CheckOtherImpl checkOtherCpp(&tokenizerCpp, settings, this); checkOtherCpp.warningIntToPointerCast(); } @@ -2380,7 +2380,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckOtherImpl checkOtherCpp(&tokenizer, &settings, this); + CheckOtherImpl checkOtherCpp(&tokenizer, settings, this); checkOtherCpp.invalidPointerCast(); } diff --git a/test/testpostfixoperator.cpp b/test/testpostfixoperator.cpp index 1d01217231a..73c864f10bc 100644 --- a/test/testpostfixoperator.cpp +++ b/test/testpostfixoperator.cpp @@ -38,7 +38,7 @@ class TestPostfixOperator : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, &settings, this); + CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, settings, this); checkPostfixOperator.postfixOperator(); } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 6ad2047ddd7..0d71efbc897 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -127,7 +127,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVarImpl checkuninitvar(&tokenizer, &settings1, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, settings1, this); checkuninitvar.check(); } @@ -137,7 +137,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVarImpl checkuninitvar(&tokenizer, &settings, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, settings, this); checkuninitvar.check(); } @@ -3673,7 +3673,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVarImpl checkuninitvar(&tokenizer, &settings, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, settings, this); (checkuninitvar.valueFlowUninit)(); } diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index 3b419814dca..60916133f8c 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -104,7 +104,7 @@ class TestUnusedPrivateFunction : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused private functions.. - CheckClassImpl checkClass(&tokenizer, &settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, this); checkClass.privateFunctions(); } diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index d0ad22b004d..6419ee78c08 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -290,7 +290,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); checkUnusedVar.checkFunctionVariableUsage(); } @@ -310,7 +310,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); (checkUnusedVar.checkStructMemberUsage)(); } @@ -323,7 +323,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); (checkUnusedVar.checkStructMemberUsage)(); } @@ -336,7 +336,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, &settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); (checkUnusedVar.checkFunctionVariableUsage)(); } From d152dd696dab022390d5617d4879db62471d11cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 29 May 2026 10:29:08 +0200 Subject: [PATCH 031/171] added test for #13690 (#8584) --- .../fuzz-crash/crash-6d019f821f348d758d8d88bd7de692af6f9b07f4 | 1 + 1 file changed, 1 insertion(+) create mode 100644 test/cli/fuzz-crash/crash-6d019f821f348d758d8d88bd7de692af6f9b07f4 diff --git a/test/cli/fuzz-crash/crash-6d019f821f348d758d8d88bd7de692af6f9b07f4 b/test/cli/fuzz-crash/crash-6d019f821f348d758d8d88bd7de692af6f9b07f4 new file mode 100644 index 00000000000..cd0cc97f0fb --- /dev/null +++ b/test/cli/fuzz-crash/crash-6d019f821f348d758d8d88bd7de692af6f9b07f4 @@ -0,0 +1 @@ +#error\ \ No newline at end of file From e0ee4f2c91feb23d17ac18a7fa1d7014227bab19 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 29 May 2026 10:30:50 +0200 Subject: [PATCH 032/171] Fix #11775 cppcheckError with array typedef (#8581) --- lib/tokenize.cpp | 7 +++++++ test/testsimplifytypedef.cpp | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 6f9cf90a852..6305e0f021a 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2295,6 +2295,13 @@ void Tokenizer::simplifyTypedefCpp() tok2 = tok2->tokAt(2); else tok2 = tok2->tokAt(3); + while (tok2->link()) { + tok2 = tok2->link()->next(); + if (Token::simpleMatch(tok2, ";")) { + tok2 = tok2->previous(); + break; + } + } if (!tok2) syntaxError(nullptr); diff --git a/test/testsimplifytypedef.cpp b/test/testsimplifytypedef.cpp index 342cda59dc8..022412139f1 100644 --- a/test/testsimplifytypedef.cpp +++ b/test/testsimplifytypedef.cpp @@ -231,6 +231,7 @@ class TestSimplifyTypedef : public TestFixture { TEST_CASE(simplifyTypedef158); TEST_CASE(simplifyTypedef159); TEST_CASE(simplifyTypedef160); + TEST_CASE(simplifyTypedef161); TEST_CASE(simplifyTypedefFunction1); TEST_CASE(simplifyTypedefFunction2); // ticket #1685 @@ -3842,6 +3843,22 @@ class TestSimplifyTypedef : public TestFixture { ASSERT_EQUALS(exp2, simplifyTypedefC(code2)); } + void simplifyTypedef161() { + const char code[] = "namespace N {\n" // #11775 + " typedef int A[3];\n" + " p = new A*[n];\n" + "}\n"; + const char cur[] = "namespace N { p = new int ( * [ n ] ) [ 3 ] ; }"; + const char exp[] = "namespace N { p = new ( int ( * [ n ] ) [ 3 ] ) ; }"; + TODO_ASSERT_EQUALS(exp, cur, tok(code)); + + const char code2[] = "typedef int A[3];\n" + "p = new A*[n];\n"; + const char cur2[] = "p = new int ( * ) [ n ] [ 3 ] ;"; + const char exp2[] = "p = new ( int ( * [ n ] ) [ 3 ] ) ;"; + TODO_ASSERT_EQUALS(exp2, cur2, tok(code2)); + } + void simplifyTypedefFunction1() { { const char code[] = "typedef void (*my_func)();\n" From 7f1eba2e1ececd83a8415641be83353a9438a704 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 29 May 2026 10:32:46 +0200 Subject: [PATCH 033/171] Fix #11184 FN leakNoVarFunctionCall with assignment (#8567) --- lib/checkmemoryleak.cpp | 12 ++++++++---- test/testmemleak.cpp | 11 +++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 0286884ab16..d396d20c7a2 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -1016,10 +1016,8 @@ void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scop const Token* tok2 = tok->next()->astParent(); while (tok2 && (tok2->isCast() || Token::Match(tok2, "?|:"))) tok2 = tok2->astParent(); - if (Token::Match(tok2, "%assign%")) // TODO: check if function returns allocated resource - continue; - if (Token::simpleMatch(tok->astTop(), "return")) - continue; + const bool hasAssign = Token::Match(tok2, "%assign%"); + const bool hasReturn = Token::simpleMatch(tok->astTop(), "return"); const std::string& functionName = tok->str(); if ((tok->isCpp() && functionName == "delete") || @@ -1031,6 +1029,12 @@ void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scop if (!tok->isKeyword() && !tok->function() && !mSettings.library.isLeakIgnore(functionName)) continue; + if ((hasAssign || hasReturn) && !tok->function()) { + const std::string& ret = mSettings->library.returnValueType(tok); + if (ret.empty() || endsWith(ret, "*")) + continue; + } + const std::vector args = getArguments(tok); int argnr = -1; for (const Token* arg : args) { diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 8ac0b2484ad..6e3d28010a1 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -2602,6 +2602,17 @@ class TestMemleakNoVar : public TestFixture { " a.g(new int);\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("int f() {\n" // #11184 + " return strlen(new char[4]{});\n" + "}\n" + "int g() {\n" + " int i = strlen(new char[4]{});\n" + " return i;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:19]: (error) Allocation with new, strlen doesn't release it. [leakNoVarFunctionCall]\n" + "[test.cpp:5:20]: (error) Allocation with new, strlen doesn't release it. [leakNoVarFunctionCall]\n", + errout_str()); } void missingAssignment() { From fe41d367067c6ab195e1564bafccf31029b657a6 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 29 May 2026 12:29:35 +0200 Subject: [PATCH 034/171] Fix build: checkmemoryleak.cpp (#8596) --- lib/checkmemoryleak.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index d396d20c7a2..d02bb607b33 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -1030,7 +1030,7 @@ void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scop continue; if ((hasAssign || hasReturn) && !tok->function()) { - const std::string& ret = mSettings->library.returnValueType(tok); + const std::string& ret = mSettings.library.returnValueType(tok); if (ret.empty() || endsWith(ret, "*")) continue; } From 15a41911a87d1ab244179bf9186bb9c3d3586bf9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 29 May 2026 12:31:39 +0200 Subject: [PATCH 035/171] Fix #14785/14786 FN unusedStructMember (scoped standard type, smart pointer) (#8576) Co-authored-by: chrchr-github --- lib/checkunusedvar.cpp | 3 ++- test/testunusedvar.cpp | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index b5b863badc5..dd30f65db58 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1641,7 +1641,8 @@ void CheckUnusedVarImpl::checkStructMemberUsage() for (const Variable &var : scope.varlist) { // only warn for variables without side effects - if (!var.typeStartToken()->isStandardType() && !var.isPointer() && !astIsContainer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type())) + if (!(var.valueType() && var.valueType()->type >= ValueType::VOID) && !var.isPointer() && !astIsContainer(var.nameToken()) && + !astIsSmartPointer(var.nameToken()) && !mTokenizer->getSymbolDatabase()->isRecordTypeWithoutSideEffects(var.type())) continue; if (isInherited && !var.isPrivate()) continue; diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 6419ee78c08..ae44305ef6a 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -79,6 +79,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(structmember31); // #14130 TEST_CASE(structmember32); // #14483 TEST_CASE(structmember33); + TEST_CASE(structmember34); TEST_CASE(structmember_macro); TEST_CASE(structmember_template_argument); // #13887 - do not report that member used in template argument is unused TEST_CASE(classmember); @@ -2088,6 +2089,18 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("[test.cpp:2:23]: (style) struct member 'S::mp' is never used. [unusedStructMember]\n", errout_str()); } + void structmember34() { + checkStructMemberUsage("struct S {\n" // #14785 + " std::int32_t i;\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:2:16]: (style) struct member 'S::i' is never used. [unusedStructMember]\n", errout_str()); + + checkStructMemberUsage("struct S {\n" // #14786 + " std::unique_ptr p;\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:2:24]: (style) struct member 'S::p' is never used. [unusedStructMember]\n", errout_str()); + } + void structmember_macro() { checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n" "S(unused);\n"); From f034ad3663e509465486b946cc71704337c38ae4 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 29 May 2026 12:40:10 +0200 Subject: [PATCH 036/171] Fix #14762 FN knownConditionTrueFalse (default constructed container) (#8575) Co-authored-by: chrchr-github --- lib/vf_settokenvalue.cpp | 4 ++-- test/testvalueflow.cpp | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/vf_settokenvalue.cpp b/lib/vf_settokenvalue.cpp index c5fe519b720..fe94225083b 100644 --- a/lib/vf_settokenvalue.cpp +++ b/lib/vf_settokenvalue.cpp @@ -291,9 +291,9 @@ namespace ValueFlow combineValueProperties(value1, value2, result); - if (Token::simpleMatch(parent, "==") && result.intvalue) + if (Token::simpleMatch(parent, "==") && result.intvalue && !(value1.intvalue == 0 && value2.intvalue == 0)) continue; - if (Token::simpleMatch(parent, "!=") && !result.intvalue) + if (Token::simpleMatch(parent, "!=") && !result.intvalue && !(value1.intvalue == 0 && value2.intvalue == 0)) continue; setTokenValue(parent, std::move(result), settings); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 1f4879b7cca..65f198dcbab 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -9249,6 +9249,19 @@ class TestValueFlow : public TestFixture { "}\n"; ASSERT_EQUALS(false, testValueOfX(code, 5U, 1)); ASSERT_EQUALS(false, testValueOfX(code, 5U, 0)); + + code = "bool f() {\n" + " std::string s1, s2;\n" + " bool x = (s1 == s2);\n" + " return x;\n" + "}\n" + "bool g() {\n" + " std::string s1, s2;\n" + " bool x = (s1 != s2);\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXKnown(code, 4U, 1)); + ASSERT_EQUALS(true, testValueOfXKnown(code, 9U, 0)); } void valueFlowBailoutIncompleteVar() { From 97b642f1f04589319882c0fc2e29c42f7464113e Mon Sep 17 00:00:00 2001 From: Wija <50847546+wjakobsson@users.noreply.github.com> Date: Fri, 29 May 2026 16:26:07 +0200 Subject: [PATCH 037/171] Release 2.21: Update copyright year (#8594) --- cli/filelister.cpp | 2 +- gui/cppchecklibrarydata.h | 2 +- gui/helpdialog.cpp | 2 +- gui/librarydialog.h | 2 +- gui/main.cpp | 2 +- gui/projectfiledialog.h | 2 +- gui/statsdialog.cpp | 2 +- gui/test/projectfile/testprojectfile.cpp | 2 +- gui/test/projectfile/testprojectfile.h | 2 +- lib/check.h | 2 +- lib/check64bit.h | 2 +- lib/checkassert.cpp | 2 +- lib/checkassert.h | 2 +- lib/checkautovariables.h | 2 +- lib/checkbool.cpp | 2 +- lib/checkbool.h | 2 +- lib/checkbufferoverrun.h | 2 +- lib/checkcondition.h | 2 +- lib/checkexceptionsafety.h | 2 +- lib/checkfunctions.h | 2 +- lib/checkinternal.cpp | 2 +- lib/checkinternal.h | 2 +- lib/checkio.h | 2 +- lib/checkleakautovar.h | 2 +- lib/checkmemoryleak.h | 2 +- lib/checknullpointer.h | 2 +- lib/checkother.h | 2 +- lib/checkpostfixoperator.cpp | 2 +- lib/checkpostfixoperator.h | 2 +- lib/checksizeof.h | 2 +- lib/checkstl.cpp | 2 +- lib/checkstl.h | 2 +- lib/checkstring.cpp | 2 +- lib/checkstring.h | 2 +- lib/checktype.h | 2 +- lib/checkuninitvar.h | 2 +- lib/checkunusedfunctions.h | 2 +- lib/checkunusedvar.h | 2 +- lib/checkvaarg.cpp | 2 +- lib/checkvaarg.h | 2 +- lib/mathlib.h | 2 +- lib/path.cpp | 2 +- lib/path.h | 2 +- lib/preprocessor.h | 2 +- lib/programmemory.cpp | 2 +- lib/programmemory.h | 2 +- lib/regex.cpp | 2 +- lib/regex.h | 2 +- lib/valueptr.h | 2 +- lib/vf_common.h | 2 +- test/options.cpp | 2 +- test/options.h | 2 +- test/test64bit.cpp | 2 +- test/testassert.cpp | 2 +- test/testastutils.cpp | 2 +- test/testbool.cpp | 2 +- test/testcharvar.cpp | 2 +- test/testcheck.cpp | 2 +- test/testcheckersreport.cpp | 2 +- test/testconstructors.cpp | 2 +- test/testerrorlogger.cpp | 2 +- test/testincompletestatement.cpp | 2 +- test/testinternal.cpp | 2 +- test/testio.cpp | 2 +- test/testoptions.cpp | 2 +- test/testpostfixoperator.cpp | 2 +- test/testregex.cpp | 2 +- test/testsimplifytokens.cpp | 2 +- test/testsizeof.cpp | 2 +- test/teststring.cpp | 2 +- test/testunusedfunctions.cpp | 2 +- test/testunusedprivfunc.cpp | 2 +- test/testvaarg.cpp | 2 +- tools/dmake/dmake.cpp | 2 +- tools/triage/mainwindow.cpp | 2 +- tools/triage/mainwindow.h | 2 +- 76 files changed, 76 insertions(+), 76 deletions(-) diff --git a/cli/filelister.cpp b/cli/filelister.cpp index 65a77ea6306..9b95689679c 100644 --- a/cli/filelister.cpp +++ b/cli/filelister.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/cppchecklibrarydata.h b/gui/cppchecklibrarydata.h index ddccf3b6534..71d8382ef34 100644 --- a/gui/cppchecklibrarydata.h +++ b/gui/cppchecklibrarydata.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/helpdialog.cpp b/gui/helpdialog.cpp index 0768318531c..78ac1e0e635 100644 --- a/gui/helpdialog.cpp +++ b/gui/helpdialog.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2024 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/librarydialog.h b/gui/librarydialog.h index 6737da638c8..c8e522b10d4 100644 --- a/gui/librarydialog.h +++ b/gui/librarydialog.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2024 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/main.cpp b/gui/main.cpp index efdb2a33c72..c855b2529f6 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/projectfiledialog.h b/gui/projectfiledialog.h index af21685b675..a93d12dc2e2 100644 --- a/gui/projectfiledialog.h +++ b/gui/projectfiledialog.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/statsdialog.cpp b/gui/statsdialog.cpp index d3e15d87ad5..bf46abcb2d4 100644 --- a/gui/statsdialog.cpp +++ b/gui/statsdialog.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/test/projectfile/testprojectfile.cpp b/gui/test/projectfile/testprojectfile.cpp index dbc4cb51659..1eb43f7d72f 100644 --- a/gui/test/projectfile/testprojectfile.cpp +++ b/gui/test/projectfile/testprojectfile.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2021 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/gui/test/projectfile/testprojectfile.h b/gui/test/projectfile/testprojectfile.h index 18f38d0eb39..ceda2ff6b96 100644 --- a/gui/test/projectfile/testprojectfile.h +++ b/gui/test/projectfile/testprojectfile.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2021 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/check.h b/lib/check.h index 019b77e148e..7deab9e52e7 100644 --- a/lib/check.h +++ b/lib/check.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/check64bit.h b/lib/check64bit.h index 160df94b990..bafb5646aaa 100644 --- a/lib/check64bit.h +++ b/lib/check64bit.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 3ae06984c7b..8240304d83f 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkassert.h b/lib/checkassert.h index 6a4e1f45de2..f6190bb8d25 100644 --- a/lib/checkassert.h +++ b/lib/checkassert.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkautovariables.h b/lib/checkautovariables.h index 77deef00113..4bdbfc4c730 100644 --- a/lib/checkautovariables.h +++ b/lib/checkautovariables.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkbool.cpp b/lib/checkbool.cpp index a216307ad2e..0d7516a9418 100644 --- a/lib/checkbool.cpp +++ b/lib/checkbool.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkbool.h b/lib/checkbool.h index 2d523732682..5eafc4d692d 100644 --- a/lib/checkbool.h +++ b/lib/checkbool.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkbufferoverrun.h b/lib/checkbufferoverrun.h index 2b43d575dec..b71f4520d48 100644 --- a/lib/checkbufferoverrun.h +++ b/lib/checkbufferoverrun.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkcondition.h b/lib/checkcondition.h index 06ed12695bc..56d2c6f25e0 100644 --- a/lib/checkcondition.h +++ b/lib/checkcondition.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkexceptionsafety.h b/lib/checkexceptionsafety.h index d452dac2cf8..7de91ba812c 100644 --- a/lib/checkexceptionsafety.h +++ b/lib/checkexceptionsafety.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkfunctions.h b/lib/checkfunctions.h index b6939ffb17f..42281774482 100644 --- a/lib/checkfunctions.h +++ b/lib/checkfunctions.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkinternal.cpp b/lib/checkinternal.cpp index f84203e5d0d..727df306e63 100644 --- a/lib/checkinternal.cpp +++ b/lib/checkinternal.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkinternal.h b/lib/checkinternal.h index 2b6267b4550..c1e5addc4da 100644 --- a/lib/checkinternal.h +++ b/lib/checkinternal.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkio.h b/lib/checkio.h index 4642feac511..e881e22cbf3 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkleakautovar.h b/lib/checkleakautovar.h index c12c03b6a09..5d4fa07ec06 100644 --- a/lib/checkleakautovar.h +++ b/lib/checkleakautovar.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkmemoryleak.h b/lib/checkmemoryleak.h index 6c867749fa4..4fa69742277 100644 --- a/lib/checkmemoryleak.h +++ b/lib/checkmemoryleak.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index 4da9fe8abc7..8e35fd7565a 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkother.h b/lib/checkother.h index c3c045653c8..97291b53769 100644 --- a/lib/checkother.h +++ b/lib/checkother.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkpostfixoperator.cpp b/lib/checkpostfixoperator.cpp index e0026e1d70c..0d72b8e3860 100644 --- a/lib/checkpostfixoperator.cpp +++ b/lib/checkpostfixoperator.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkpostfixoperator.h b/lib/checkpostfixoperator.h index 27d833a992e..de51a34fe42 100644 --- a/lib/checkpostfixoperator.h +++ b/lib/checkpostfixoperator.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checksizeof.h b/lib/checksizeof.h index 90d55e69506..6fa7908eb92 100644 --- a/lib/checksizeof.h +++ b/lib/checksizeof.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 887f7001ef2..08ac141610a 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkstl.h b/lib/checkstl.h index e23d6b54fb4..b67632fbfed 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkstring.cpp b/lib/checkstring.cpp index db4a3eca113..00fa80998c1 100644 --- a/lib/checkstring.cpp +++ b/lib/checkstring.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkstring.h b/lib/checkstring.h index 054c4208a18..2c19d64332c 100644 --- a/lib/checkstring.h +++ b/lib/checkstring.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checktype.h b/lib/checktype.h index 0030e3622be..8ebfb0fb5b2 100644 --- a/lib/checktype.h +++ b/lib/checktype.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index e7af8f85e50..f558fe84709 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkunusedfunctions.h b/lib/checkunusedfunctions.h index 20e1788cf64..5c5b369c194 100644 --- a/lib/checkunusedfunctions.h +++ b/lib/checkunusedfunctions.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkunusedvar.h b/lib/checkunusedvar.h index 49ef59bee92..cddc36bb7e3 100644 --- a/lib/checkunusedvar.h +++ b/lib/checkunusedvar.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkvaarg.cpp b/lib/checkvaarg.cpp index 42cd6852788..60a27b897b5 100644 --- a/lib/checkvaarg.cpp +++ b/lib/checkvaarg.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/checkvaarg.h b/lib/checkvaarg.h index 4be92045427..6d50bd94d0d 100644 --- a/lib/checkvaarg.h +++ b/lib/checkvaarg.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/mathlib.h b/lib/mathlib.h index 9b6b304501c..84338b5ce70 100644 --- a/lib/mathlib.h +++ b/lib/mathlib.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/path.cpp b/lib/path.cpp index caa45898f99..c4758dfeae9 100644 --- a/lib/path.cpp +++ b/lib/path.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/path.h b/lib/path.h index 22bfcf667f3..863e74580f8 100644 --- a/lib/path.h +++ b/lib/path.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/preprocessor.h b/lib/preprocessor.h index 9daabbf6ca8..ba4d55a1e60 100644 --- a/lib/preprocessor.h +++ b/lib/preprocessor.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 92952152ca5..e1f40de277e 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/programmemory.h b/lib/programmemory.h index 21350d86d36..ec24c0df59f 100644 --- a/lib/programmemory.h +++ b/lib/programmemory.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/regex.cpp b/lib/regex.cpp index 0c8b0c9f188..df92982204a 100644 --- a/lib/regex.cpp +++ b/lib/regex.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/regex.h b/lib/regex.h index afe92d92d40..9717ff6f05d 100644 --- a/lib/regex.h +++ b/lib/regex.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/valueptr.h b/lib/valueptr.h index 270b5f58fc6..b6f02ef1186 100644 --- a/lib/valueptr.h +++ b/lib/valueptr.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/vf_common.h b/lib/vf_common.h index 64e394b2979..9859955cbfe 100644 --- a/lib/vf_common.h +++ b/lib/vf_common.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/options.cpp b/test/options.cpp index 54527b26ecd..757b6cdff86 100644 --- a/test/options.cpp +++ b/test/options.cpp @@ -1,5 +1,5 @@ // Cppcheck - A tool for static C/C++ code analysis -// Copyright (C) 2007-2025 Cppcheck team. +// Copyright (C) 2007-2026 Cppcheck team. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/test/options.h b/test/options.h index b327721351c..0bd83cef78b 100644 --- a/test/options.h +++ b/test/options.h @@ -1,5 +1,5 @@ // Cppcheck - A tool for static C/C++ code analysis -// Copyright (C) 2007-2024 Cppcheck team. +// Copyright (C) 2007-2026 Cppcheck team. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/test/test64bit.cpp b/test/test64bit.cpp index 8439b5aa787..ca2654b12f1 100644 --- a/test/test64bit.cpp +++ b/test/test64bit.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testassert.cpp b/test/testassert.cpp index e14825e46b2..651897af057 100644 --- a/test/testassert.cpp +++ b/test/testassert.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testastutils.cpp b/test/testastutils.cpp index eb9559ed39d..904ea92b466 100644 --- a/test/testastutils.cpp +++ b/test/testastutils.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testbool.cpp b/test/testbool.cpp index ccf4d7860c4..6156e089aee 100644 --- a/test/testbool.cpp +++ b/test/testbool.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testcharvar.cpp b/test/testcharvar.cpp index ecbf6bf4dc1..347557bd051 100644 --- a/test/testcharvar.cpp +++ b/test/testcharvar.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testcheck.cpp b/test/testcheck.cpp index 3ae2cad3d8f..254519da2eb 100644 --- a/test/testcheck.cpp +++ b/test/testcheck.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testcheckersreport.cpp b/test/testcheckersreport.cpp index eafe7b8848f..39a6f2a9997 100644 --- a/test/testcheckersreport.cpp +++ b/test/testcheckersreport.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 155c921de80..b4f17cd25b8 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testerrorlogger.cpp b/test/testerrorlogger.cpp index 23b3233995c..014ac3a0a8f 100644 --- a/test/testerrorlogger.cpp +++ b/test/testerrorlogger.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index 23c6f667797..be0b3e7ad3d 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testinternal.cpp b/test/testinternal.cpp index 10431adcd38..b724c860fae 100644 --- a/test/testinternal.cpp +++ b/test/testinternal.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testio.cpp b/test/testio.cpp index 6d9b55ddda9..c622bc5936d 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testoptions.cpp b/test/testoptions.cpp index 0dec04927e4..af164fb43cc 100644 --- a/test/testoptions.cpp +++ b/test/testoptions.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testpostfixoperator.cpp b/test/testpostfixoperator.cpp index 73c864f10bc..07b7c03ca00 100644 --- a/test/testpostfixoperator.cpp +++ b/test/testpostfixoperator.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testregex.cpp b/test/testregex.cpp index 4b6b2781cc8..85ab8007478 100644 --- a/test/testregex.cpp +++ b/test/testregex.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 88d1a4b2725..6077438a9cf 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index fca8cb7ed7a..ee9416a65bc 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/teststring.cpp b/test/teststring.cpp index e0e401256e2..7f28f58c80a 100644 --- a/test/teststring.cpp +++ b/test/teststring.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testunusedfunctions.cpp b/test/testunusedfunctions.cpp index b3b8a298650..3e78b119012 100644 --- a/test/testunusedfunctions.cpp +++ b/test/testunusedfunctions.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index 60916133f8c..06c41bbb9c2 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/testvaarg.cpp b/test/testvaarg.cpp index 33fb6c11389..3f44b687ff3 100644 --- a/test/testvaarg.cpp +++ b/test/testvaarg.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2025 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/tools/dmake/dmake.cpp b/tools/dmake/dmake.cpp index 3d08943f5ba..d2147efa8c6 100644 --- a/tools/dmake/dmake.cpp +++ b/tools/dmake/dmake.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2023 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/tools/triage/mainwindow.cpp b/tools/triage/mainwindow.cpp index e8a15f87f3b..18b6bb09533 100644 --- a/tools/triage/mainwindow.cpp +++ b/tools/triage/mainwindow.cpp @@ -1,6 +1,6 @@ /* * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2021 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/tools/triage/mainwindow.h b/tools/triage/mainwindow.h index 38afcaf9553..263d9953e60 100644 --- a/tools/triage/mainwindow.h +++ b/tools/triage/mainwindow.h @@ -1,6 +1,6 @@ /* -*- C++ -*- * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2021 Cppcheck team. + * Copyright (C) 2007-2026 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From bc2b84dd40d779bd0ab6fe62d32a3bf74dcc9883 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 29 May 2026 17:18:27 +0200 Subject: [PATCH 038/171] F'up to #14654: Fix Boost test macro definitions (#8590) CI failure is unrelated. --- cfg/boost.cfg | 8 ++++---- test/cfg/boost.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/cfg/boost.cfg b/cfg/boost.cfg index 722c4c83cd7..b09d9ccd9e5 100644 --- a/cfg/boost.cfg +++ b/cfg/boost.cfg @@ -83,12 +83,12 @@ - + - + - - + + diff --git a/test/cfg/boost.cpp b/test/cfg/boost.cpp index 7e724a8b472..2cc4b288cce 100644 --- a/test/cfg/boost.cpp +++ b/test/cfg/boost.cpp @@ -22,6 +22,8 @@ #include // IWYU pragma: keep #include #include // IWYU pragma: keep +#include +#include #include #include @@ -199,3 +201,46 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(my_tuple_test, T, test_types_w_tuples) } BOOST_AUTO_TEST_SUITE_END() + +// https://www.boost.org/doc/libs/latest/libs/test/doc/html/boost_test/tests_organization/test_cases/test_case_generation/datasets.html +namespace bdata = boost::unit_test::data; + +// Dataset generating a Fibonacci sequence +struct fibonacci_dataset { + // the type of the samples is deduced + // cppcheck-suppress unusedStructMember // FP #14795, used in template is_dataset + static const int arity = 1; + + struct iterator { + int operator*() const { return b; } + void operator++() { + a = a + b; + std::swap(a, b); + } + private: + int a = 1; + int b = 1; // b is the output + }; + + // size is infinite + bdata::size_t size() const { return bdata::BOOST_TEST_DS_INFINITE_SIZE; } + + // iterator + static iterator begin() { return iterator(); } +}; + +namespace boost { namespace unit_test { namespace data { namespace monomorphic { + // registering fibonacci_dataset as a proper dataset + template <> + struct is_dataset : boost::mpl::true_ {}; +}}}} + +// Creating a test-driven dataset, the zip is for checking +BOOST_DATA_TEST_CASE( + test1, + fibonacci_dataset() ^ bdata::make( { 1, 2, 3, 5, 8, 13, 21, 35, 56 } ), + fib_sample, exp) +{ + // cppcheck-suppress valueFlowBailoutIncompleteVar // TODO: fib_sample declared in test case + BOOST_TEST(fib_sample == exp); +} From 8c14fc78e5dd9f0696b1facde4bd867dddd951a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Sun, 31 May 2026 09:56:45 +0200 Subject: [PATCH 039/171] cleaned up includes based on `include-what-you-use` (#8579) --- .github/workflows/selfcheck.yml | 2 +- Makefile | 4 ++-- cli/cmdlineparser.cpp | 3 ++- cli/processexecutor.cpp | 3 ++- cli/singleexecutor.cpp | 1 - cli/threadexecutor.cpp | 1 - gui/mainwindow.cpp | 3 --- gui/projectfiledialog.cpp | 1 - gui/test/resultstree/testresultstree.cpp | 1 - lib/checks.cpp | 2 ++ lib/cppcheck.h | 2 ++ lib/importproject.cpp | 1 + lib/settings.cpp | 1 + lib/settings.h | 10 +++++++--- lib/suppressions.cpp | 1 + lib/utils.h | 1 + lib/vf_common.cpp | 1 + test/testsuppressions.cpp | 1 + 18 files changed, 24 insertions(+), 15 deletions(-) diff --git a/.github/workflows/selfcheck.yml b/.github/workflows/selfcheck.yml index cfd1107e92d..dcdf8bfbdd3 100644 --- a/.github/workflows/selfcheck.yml +++ b/.github/workflows/selfcheck.yml @@ -121,7 +121,7 @@ jobs: - name: Self check (unusedFunction / no test / no gui) run: | - supprs="--suppress=unusedFunction:lib/errorlogger.h:197 --suppress=unusedFunction:lib/importproject.cpp:1665 --suppress=unusedFunction:lib/importproject.cpp:1689" + supprs="--suppress=unusedFunction:lib/errorlogger.h:197 --suppress=unusedFunction:lib/importproject.cpp:1666 --suppress=unusedFunction:lib/importproject.cpp:1690" ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib -D__CPPCHECK__ -D__GNUC__ --enable=unusedFunction,information --exception-handling -rp=. --project=cmake.output.notest_nogui/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr $supprs env: DISABLE_VALUEFLOW: 1 diff --git a/Makefile b/Makefile index 684e79179cf..dd739e8e6de 100644 --- a/Makefile +++ b/Makefile @@ -723,13 +723,13 @@ cli/sehwrapper.o: cli/sehwrapper.cpp cli/sehwrapper.h lib/config.h lib/utils.h cli/signalhandler.o: cli/signalhandler.cpp cli/signalhandler.h cli/stacktrace.h lib/config.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/signalhandler.cpp -cli/singleexecutor.o: cli/singleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h +cli/singleexecutor.o: cli/singleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/singleexecutor.cpp cli/stacktrace.o: cli/stacktrace.cpp cli/stacktrace.h lib/config.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/stacktrace.cpp -cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h +cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/threadexecutor.cpp test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 27cfe08d871..5f735c4ec56 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -50,7 +50,6 @@ #include #include #include -#include #include #include #include @@ -61,6 +60,8 @@ // xml is used for rules #include "xml.h" + +#include #endif static bool addFilesToList(const std::string& fileList, std::vector& pathNames) diff --git a/cli/processexecutor.cpp b/cli/processexecutor.cpp index e77a75ba39e..959d16d37ec 100644 --- a/cli/processexecutor.cpp +++ b/cli/processexecutor.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -44,9 +45,9 @@ #include #include #include +#include #include #include -#include #include #include #include diff --git a/cli/singleexecutor.cpp b/cli/singleexecutor.cpp index d710a4d4c57..e25fc804490 100644 --- a/cli/singleexecutor.cpp +++ b/cli/singleexecutor.cpp @@ -21,7 +21,6 @@ #include "cppcheck.h" #include "filesettings.h" #include "settings.h" -#include "timer.h" #include #include diff --git a/cli/threadexecutor.cpp b/cli/threadexecutor.cpp index b8581d7e772..5d723366574 100644 --- a/cli/threadexecutor.cpp +++ b/cli/threadexecutor.cpp @@ -26,7 +26,6 @@ #include "filesettings.h" #include "settings.h" #include "suppressions.h" -#include "timer.h" #include #include diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index ce1b3ef1508..15f3e8e0665 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -23,7 +23,6 @@ #include "aboutdialog.h" #include "analyzerinfo.h" #include "checkers.h" -#include "checkstatistics.h" #include "checkthread.h" #include "common.h" #include "cppcheck.h" @@ -60,7 +59,6 @@ #include #include -#include #include #include #include @@ -101,7 +99,6 @@ #include #include #include -#include #include #include #include diff --git a/gui/projectfiledialog.cpp b/gui/projectfiledialog.cpp index 4e75696484b..e156f3dfe3b 100644 --- a/gui/projectfiledialog.cpp +++ b/gui/projectfiledialog.cpp @@ -23,7 +23,6 @@ #include "importproject.h" #include "library.h" #include "newsuppressiondialog.h" -#include "path.h" #include "platform.h" #include "platforms.h" #include "projectfile.h" diff --git a/gui/test/resultstree/testresultstree.cpp b/gui/test/resultstree/testresultstree.cpp index afda38e0075..921abd69ff0 100644 --- a/gui/test/resultstree/testresultstree.cpp +++ b/gui/test/resultstree/testresultstree.cpp @@ -22,7 +22,6 @@ // headers that declare mocked functions/variables #include "applicationlist.h" -#include "common.h" #include "filesettings.h" #include "projectfile.h" #include "threadhandler.h" diff --git a/lib/checks.cpp b/lib/checks.cpp index 169832c2745..ef4b9fef3da 100644 --- a/lib/checks.cpp +++ b/lib/checks.cpp @@ -42,6 +42,8 @@ #include "checkunusedvar.h" #include "checkvaarg.h" +#include + class CheckInstancesImpl { private: diff --git a/lib/cppcheck.h b/lib/cppcheck.h index 94f2b721037..d72e65ebb34 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -31,7 +31,9 @@ #include #include +#ifdef HAVE_RULES class TokenList; +#endif struct FileSettings; class CheckUnusedFunctions; class Tokenizer; diff --git a/lib/importproject.cpp b/lib/importproject.cpp index ac19db922ed..96e8b98f2e8 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include diff --git a/lib/settings.cpp b/lib/settings.cpp index 080946e07bc..0df9907b3ab 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -17,6 +17,7 @@ */ #include "config.h" +#include "errortypes.h" #include "settings.h" #include "path.h" #include "summaries.h" diff --git a/lib/settings.h b/lib/settings.h index 6c12c509701..25dee019739 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -23,7 +23,6 @@ #include "addoninfo.h" #include "config.h" -#include "errortypes.h" #include "library.h" #include "platform.h" #include "standards.h" @@ -40,22 +39,27 @@ #include #include -#include "regex.h" - #if defined(USE_WINDOWS_SEH) || defined(USE_UNIX_SIGNAL_HANDLING) #include #endif #ifdef HAVE_RULES +#include "errortypes.h" +#include "regex.h" + #include class Regex; +#else +enum class Severity : std::uint8_t; #endif struct Suppressions; namespace ValueFlow { class Value; } +enum class Certainty : std::uint8_t; +enum class Checks : std::uint8_t; /// @addtogroup Core /// @{ diff --git a/lib/suppressions.cpp b/lib/suppressions.cpp index 70b689e2cdb..fe483e347fe 100644 --- a/lib/suppressions.cpp +++ b/lib/suppressions.cpp @@ -31,6 +31,7 @@ #include #include // std::isdigit, std::isalnum, etc #include +#include #include // std::bind, std::placeholders #include #include diff --git a/lib/utils.h b/lib/utils.h index 3f9c4ab949f..410bd7c6040 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -25,6 +25,7 @@ #include #include +#include #include #include #include diff --git a/lib/vf_common.cpp b/lib/vf_common.cpp index 282e0b9fddb..56f928bcbd8 100644 --- a/lib/vf_common.cpp +++ b/lib/vf_common.cpp @@ -19,6 +19,7 @@ #include "vf_common.h" #include "astutils.h" +#include "library.h" #include "mathlib.h" #include "path.h" #include "platform.h" diff --git a/test/testsuppressions.cpp b/test/testsuppressions.cpp index 49d46149c90..90c64eb809e 100644 --- a/test/testsuppressions.cpp +++ b/test/testsuppressions.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include From 59a6654120b2953976fe2be5a0f6bf2e1cf6ae5b Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Mon, 1 Jun 2026 17:27:24 +0200 Subject: [PATCH 040/171] AUTHORS: Add Alvin Che-Chia Chang, Andreas Wilhelm, Piotr Idzik, William Jakobsson [skip ci] (#8608) Co-authored-by: William Jakobsson --- AUTHORS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index 04cff0891a9..874ff59748b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -22,6 +22,7 @@ Alexey Eryomenko Alexey Zhikhartsev Alfi Maulana Ali Can Demiralp +Alvin Che-Chia Chang Allen Winter Alon Alexander Alon Liberman @@ -33,6 +34,7 @@ Andreas Lutsch Andreas Pokorny Andreas Rƶnnquist Andreas Vollenweider +Andreas Wilhelm Andrei Karas Andrew C Aitchison Andrew C. Martin @@ -328,6 +330,7 @@ Philip Chimento Philipp Kloke Pierre Schweitzer Pieter Duchi +Piotr Idzik Pino Toscano Pranav Khanna Radek Jarecki @@ -435,6 +438,7 @@ Vladimir Petrigo Wang Haoyu Wang Yang WenChung Chiu +William Jakobsson Wolfgang Stƶggl x29a XhmikosR From fd039589fc55d2412dca34ca2735f1d530993c0f Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Tue, 2 Jun 2026 09:25:19 +0200 Subject: [PATCH 041/171] 2.21 updated gui translations (#8597) --- gui/cppcheck_de.ts | 784 ++++++++++++++++++++-------------------- gui/cppcheck_es.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_fi.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_fr.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_it.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_ja.ts | 774 ++++++++++++++++++++-------------------- gui/cppcheck_ka.ts | 782 ++++++++++++++++++++-------------------- gui/cppcheck_ko.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_nl.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_ru.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_sr.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_sv.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_zh_CN.ts | 811 ++++++++++++++++++++---------------------- gui/cppcheck_zh_TW.ts | 802 ++++++++++++++++++++--------------------- 14 files changed, 5334 insertions(+), 5918 deletions(-) diff --git a/gui/cppcheck_de.ts b/gui/cppcheck_de.ts index c0d68ed6d8a..3f9d9ed53d7 100644 --- a/gui/cppcheck_de.ts +++ b/gui/cppcheck_de.ts @@ -120,65 +120,52 @@ Parameter: -l(line) (file) ComplianceReportDialog - Compliance Report - Compliance-Report + Compliance-Report - Project name - Projektname + Projektname - Project version - Projekt-Version + Projekt-Version - Coding Standard - Programmierstandards + Programmierstandards - Misra C - Misra C + Misra C - Cert C - Cert C + Cert C - Cert C++ - Cert C++ + Cert C++ - List of files with md5 checksums - Datei-Listen mit MD5-Prüfsummen + Datei-Listen mit MD5-Prüfsummen - Compliance report - Compliance-Report + Compliance-Report - HTML files (*.html) - HTML-Dateien (*.html) + HTML-Dateien (*.html) - - Save compliance report - Compliance-Report speichern + Compliance-Report speichern - Failed to import '%1' (%2), can not show files in compliance report - Import von '%1' (%2) fehlgeschlagen, Compliance-Report kann nicht angezeigt werden + Import von '%1' (%2) fehlgeschlagen, Compliance-Report kann nicht angezeigt werden @@ -218,12 +205,12 @@ Parameter: -l(line) (file) Index - + Helpfile '%1' was not found Hilfedatei '%1' nicht gefunden - + Cppcheck Cppcheck @@ -496,25 +483,25 @@ Parameter: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + Standard Standard @@ -524,246 +511,246 @@ Parameter: -l(line) (file) &Datei - + &View &Ansicht - + &Toolbars &Symbolleisten - + A&nalyze A&nalysieren - + C++ standard C++-Standard - + &C standard &C-Standard - + &Edit &Bearbeiten - + &License... &Lizenz... - + A&uthors... &Autoren... - + &About... Ü&ber... - + &Files... &Dateien... - - + + Analyze files Analysiere Dateien - + Ctrl+F Strg+F - + &Directory... &Verzeichnis... - - + + Analyze directory Analysiere Verzeichnis - + Ctrl+D Strg+D - + Ctrl+R Strg+R - + &Stop &Stoppen - - + + Stop analysis Analyse abbrechen - + Esc Esc - + &Save results to file... &Ergebnisse in Datei speichern... - + Ctrl+S Strg+S - + &Quit &Beenden - + &Clear results Ergebnisse &lƶschen - + &Preferences &Einstellungen - - - + + + Show errors Zeige Fehler - - - + + + Show warnings Zeige Warnungen - - + + Show performance warnings Zeige Performance-Warnungen - + Show &hidden Zeige &versteckte - - + + Information Information - + Show information messages Zeige Informationsmeldungen - + Show portability warnings Zeige PortabilitƤtswarnungen - + Show Cppcheck results Zeige Cppcheck-Ergebnisse - + Clang Clang - + Show Clang results Zeige Clang-Ergebnisse - + &Filter &Filter - + Filter results Gefilterte Ergebnisse - + Windows 32-bit ANSI Windows 32-bit, ANSI - + Windows 32-bit Unicode Windows 32-bit, Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... Drucken... - + Print the Current Report Aktuellen Bericht ausdrucken - + Print Pre&view... Druckvorschau - + Open a Print Preview Dialog for the Current Results Druckvorschaudialog für aktuelle Ergebnisse ƶffnen - + Open library editor Bibliothekseditor ƶffnen - + &Check all Alle &auswƤhlen @@ -778,335 +765,335 @@ Parameter: -l(line) (file) Verstecken - - + + Report - + Filter Filter - + &Reanalyze modified files VerƤnderte Dateien neu analysieren - + Reanal&yze all files Alle Dateien erneut anal&ysieren - + Ctrl+Q - + Style war&nings Stilwar&nungen - + E&rrors F&ehler - + &Uncheck all Alle a&bwƤhlen - + Collapse &all Alle &reduzieren - + &Expand all Alle &erweitern - + &Standard &Standard - + Standard items StandardeintrƤge - + Toolbar Symbolleiste - + &Categories &Kategorien - + Error categories Fehler-Kategorien - + &Open XML... Ɩffne &XML... - + Open P&roject File... Pr&ojektdatei ƶffnen... - + Ctrl+Shift+O - + Sh&ow Scratchpad... &Zeige Schmierzettel... - + &New Project File... &Neue Projektdatei... - + Ctrl+Shift+N - + &Log View &Loganzeige - + Log View Loganzeige - + C&lose Project File Projektdatei &schließen - + &Edit Project File... Projektdatei &bearbeiten... - + &Statistics &Statistik - + &Warnings &Warnungen - + Per&formance warnings Per&formance-Warnungen - + &Information &Information - + &Portability &PortabilitƤt - + P&latforms P&lattformen - + C++&11 C++&11 - + C&99 C&99 - + &Posix Posix - + C&11 C&11 - + &C89 &C89 - + &C++03 &C++03 - + &Library Editor... &Bibliothekseditor - + &Auto-detect language Sprache &automatisch erkennen - + &Enforce C++ C++ &erzwingen - + E&nforce C C e&rzwingen - + C++14 C++14 - + Reanalyze and check library Neu analysieren und Bibliothek prüfen - + Check configuration (defines, includes) Prüfe Konfiguration (Definitionen, Includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal - + Misra C Misra C - + Misra C++ 2008 - + Cert C Cert C - + Cert C++ Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents &Inhalte - + Categories Kategorien - - + + Show style warnings Zeige Stilwarnungen - + Open the help contents Ɩffnet die Hilfe-Inhalte - + F1 F1 - + &Help &Hilfe - - + + Quick Filter: Schnellfilter: - + Select configuration Konfiguration wƤhlen - + Found project file: %1 Do you want to load this project file instead? @@ -1115,102 +1102,102 @@ Do you want to load this project file instead? Mƶchten Sie stattdessen diese ƶffnen? - + File not found Datei nicht gefunden - + Bad XML Fehlerhaftes XML - + Missing attribute Fehlendes Attribut - + Bad attribute value Falscher Attributwert - + Duplicate platform type Plattformtyp doppelt - + Platform type redefined Plattformtyp neu definiert - + Duplicate define - + Failed to load the selected library '%1'. %2 Laden der ausgewƤhlten Bibliothek '%1' schlug fehl. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Lizenz - + Authors Autoren - + Save the report file Speichert die Berichtdatei - - + + XML files (*.xml) XML-Dateien (*.xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -1219,38 +1206,32 @@ This is probably because the settings were changed between the Cppcheck versions Dies wurde vermutlich durch einen Wechsel der Cppcheck-Version hervorgerufen. Bitte prüfen (und korrigieren) Sie die Einstellungen, andernfalls kƶnnte die Editor-Anwendung nicht korrekt starten. - + You must close the project file before selecting new files or directories! Sie müssen die Projektdatei schließen, bevor Sie neue Dateien oder Verzeichnisse auswƤhlen! - + The library '%1' contains unknown elements: %2 Die Bibliothek '%1' enthƤlt unbekannte Elemente: %2 - + Unsupported format Nicht unterstütztes Format - + Unknown element Unbekanntes Element - - Unknown element - Unknown issue - Unbekannter Fehler - - - - - - + + + + Error Fehler @@ -1259,80 +1240,80 @@ Dies wurde vermutlich durch einen Wechsel der Cppcheck-Version hervorgerufen. Bi Laden von %1 fehlgeschlagen. Ihre Cppcheck-Installation ist defekt. Sie kƶnnen --data-dir=<Verzeichnis> als Kommandozeilenparameter verwenden, um anzugeben, wo die Datei sich befindet. Bitte beachten Sie, dass --data-dir in Installationsroutinen genutzt werden soll, und die GUI bei dessen Nutzung nicht startet, sondern die Einstellungen konfiguriert. - + Open the report file Berichtdatei ƶffnen - + Text files (*.txt) Textdateien (*.txt) - + CSV files (*.csv) CSV-Dateien (*.csv) - + Project files (*.cppcheck);;All files(*.*) Projektdateien (*.cppcheck);;Alle Dateien(*.*) - + Select Project File Projektdatei auswƤhlen - - - - + + + + Project: Projekt: - + No suitable files found to analyze! Keine passenden Dateien für Analyse gefunden! - + C/C++ Source C/C++-Quellcode - + Compile database Compilerdatenbank - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++-Builder 6 - + Select files to analyze Dateien für Analyse auswƤhlen - + Select directory to analyze Verzeichnis für Analyse auswƤhlen - + Select the configuration that will be analyzed Zu analysierende Konfiguration auswƤhlen - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1341,7 +1322,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1352,7 +1333,7 @@ Eine neue XML-Datei zu ƶffnen wird die aktuellen Ergebnisse lƶschen Mƶchten sie fortfahren? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1361,109 +1342,104 @@ Do you want to stop the analysis and exit Cppcheck? Wollen sie die Analyse abbrechen und Cppcheck beenden? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML-Dateien (*.xml);;Textdateien (*.txt);;CSV-Dateien (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? Erstellungsverzeichnis '%1' existiert nicht. Erstellen? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1472,22 +1448,22 @@ Analysis is stopped. Import von '%1' fehlgeschlagen; Analyse wurde abgebrochen. - + Project files (*.cppcheck) Projektdateien (*.cppcheck) - + Select Project Filename Projektnamen auswƤhlen - + No project file loaded Keine Projektdatei geladen - + The project file %1 @@ -1504,12 +1480,12 @@ Do you want to remove the file from the recently used projects -list? Mƶchten Sie die Datei von der Liste der zuletzt benutzten Projekte entfernen? - + Install - + New version available: %1. %2 @@ -1639,7 +1615,7 @@ Options: Definitionen müssen mit einem Semikolon getrennt werden. Beispiel: DEF1;DEF2=5;DEF3=int - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. Hinweis: Legen Sie eigene .cfg-Dateien in den Ordner der Projektdatei. Dann sollten sie oben sichtbar werden. @@ -1648,17 +1624,17 @@ Options: MISRA C 2012 - + MISRA rule texts MISRA-Regeltexte - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> <html><head/><body><p>Text aus Anhang A &quot;Summary of guidelines&quot; aus der MISRA-C-2012-PDF in eine Textdatei einfügen.</p></body></html> - + ... ... @@ -1669,8 +1645,7 @@ Options: - - + Browse... Durchsuchen... @@ -1698,15 +1673,15 @@ Options: - + Edit Bearbeiten - - + + Remove Entfernen @@ -1736,271 +1711,281 @@ Options: Ab - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Platform Plattform - - + + Analysis Analyse - + This is a workfolder that Cppcheck will use for various purposes. - + Clang (experimental) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) Prüfe Code in ungenutzten Templates (normalerweise AN, theoretisch kƶnnen Warnungen in ungenutzten Templates gefahrlos ignoriert werden) - + Max CTU depth Maximale CTU-Tiefe - + Max recursion in template instantiation - - Premium License - - - - + Warning options Warnoptionen - + Root path: Wurzelverzeichnis: - + Filepaths in warnings will be relative to this path - + Warning tags (separated by semicolon) Warnungs-Tags (Semikolon-getrennt) - + Enable inline suppressions Inline-Fehlerunterdrückung aktivieren - + 2025 - + Misra C++ - + 2008 - + Cert C Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools Externe Werkzeuge - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) Cppcheck-Arbeitsverzeichnis (VollstƤndige Programmanalyse, inkrementelle Analyse, Statistiken, etc.) - + Types and Functions - + Libraries Bibliotheken - + Parser - + Cppcheck (built in) - + Check that each class has a safe public interface - + Limit analysis - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Suppressions Fehlerunterdrückungen - + Add Hinzufügen - - + + Addons Add-Ons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 Y2038 - + Thread safety Threadsicherheit - + Coding standards Programmierstandards - + Misra C Misra C - + 2012 - - + + 2023 - + Cert C++ Cert C++ - + Bug hunting (Premium) - + Clang analyzer Clang-Analyzer - + Clang-tidy Clang-Tidy @@ -2013,82 +1998,93 @@ Options: ProjectFileDialog - + Project file: %1 Projektdatei: %1 - + Select Cppcheck build dir WƤhle Cppcheck-Erstellungsverzeichnis - + Select include directory WƤhle Include-Verzeichnisse - + Select a directory to check WƤhle zu prüfendes Verzeichnis - + Note: Open source Cppcheck does not fully implement Misra C 2012 Hinweis: Open-Source Cppcheck implementiert Misra C 2012 nicht vollstƤndig - + Clang-tidy (not found) Clang-tidy (nicht gefunden) - + Visual Studio Visual Studio - + Compile database Compilerdatenbank - + Borland C++ Builder 6 Borland C++-Builder 6 - + Import Project Projekt importieren - + + C/C++ header + + + + + Include file + + + + Select directory to ignore WƤhle zu ignorierendes Verzeichnis - + Source files Quelltext-Dateien - + + All files Alle Dateien - + Exclude file Datei ausschließen - + Select MISRA rule texts file WƤhle MISRA-Regeltext-Datei - + MISRA rule texts file (%1) MISRA-Regeltext-Datei (%1) @@ -2121,7 +2117,7 @@ Options: - + (Not found) (nicht gefunden) @@ -2523,102 +2519,102 @@ Bitte überprüfen Sie ob der Pfad und die Parameter der Anwendung richtig einge ResultsView - + Print Report Bericht drucken - + No errors found, nothing to print. Keine Funde, nichts zu drucken. - + %p% (%1 of %2 files checked) %p% (%1 von %2 Dateien geprüft) - - + + Cppcheck Cppcheck - + No errors found. Keine Fehler gefunden. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Es wurden Fehler gefunden, aber sie sind so konfiguriert, ausgeblendet zu werden. Legen Sie unter dem Menü Ansicht fest, welche Arten von Fehlern angezeigt werden sollen. - - + + Failed to read the report. Lesen des Berichts fehlgeschlagen. - + XML format version 1 is no longer supported. XML-Format-Version 1 wird nicht lƤnger unterstützt. - + First included by Zuerst inkludiert von - + Id Id - + Clear Log Protokoll leeren - + Copy this Log entry Diesen Protokolleintrag kopieren - + Copy complete Log Gesamtes Protokoll kopieren - + Analysis was stopped Analyse wurde gestoppt - + There was a critical error with id '%1' Kritischer Fehler mit ID '%1' aufgetreten - + when checking %1 beim Prüfen von %1 - + when checking a file beim Prüfen einer Datei - + Analysis was aborted. Analyse abgebrochen. - - + + Failed to save the report. Der Bericht konnte nicht speichern werden. @@ -2923,14 +2919,14 @@ Legen Sie unter dem Menü Ansicht fest, welche Arten von Fehlern angezeigt werde - - + + Statistics Statistik - + Project Projekt @@ -2961,7 +2957,7 @@ Legen Sie unter dem Menü Ansicht fest, welche Arten von Fehlern angezeigt werde - + Previous Scan Vorherige Prüfung @@ -3041,103 +3037,103 @@ Legen Sie unter dem Menü Ansicht fest, welche Arten von Fehlern angezeigt werde PDF-Export - + 1 day 1 Tag - + %1 days %1 Tage - + 1 hour 1 Stunde - + %1 hours %1 Stunden - + 1 minute 1 Minute - + %1 minutes %1 Minuten - + 1 second 1 Sekunde - + %1 seconds %1 Sekunden - + 0.%1 seconds 0,%1 Sekunden - + and und - + Export PDF Exportiere PDF - + Project Settings Projekteinstellungen - + Paths Pfade - + Include paths Include-Pfade - + Defines Definitionen - + Undefines Un-Definitionen - + Path selected GewƤhlte Pfade - + Number of files scanned Anzahl geprüfter Dateien - + Scan duration Prüfungsdauer - - + + Errors Fehler @@ -3152,32 +3148,32 @@ Legen Sie unter dem Menü Ansicht fest, welche Arten von Fehlern angezeigt werde Kein Cppcheck-Analyseverzeichnis - - + + Warnings Warnungen - - + + Style warnings Stilwarnungen - - + + Portability warnings PortabilitƤtswarnungen - - + + Performance warnings Performance-Warnungen - - + + Information messages Informationsmeldungen diff --git a/gui/cppcheck_es.ts b/gui/cppcheck_es.ts index 927a56e05e5..32485d556f3 100644 --- a/gui/cppcheck_es.ts +++ b/gui/cppcheck_es.ts @@ -105,70 +105,6 @@ Parameters: -l(line) (file) Ā”Debes especificar el nombre, la ruta y opcionalmente los parĆ”metros para la aplicación! - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -206,12 +142,12 @@ Parameters: -l(line) (file) - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -476,20 +412,20 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck @@ -499,248 +435,248 @@ Parameters: -l(line) (file) &Archivo - + &View &Ver - + &Toolbars &Herramientas - + &Help &Ayuda - + C++ standard C++ estĆ”ndar - + &C standard C standard C estĆ”ndar - + &Edit &Editar - + Standard EstĆ”ndar - + Categories CategorĆ­as - + &License... &Licencia... - + A&uthors... A&utores... - + &About... &Acerca de... - + &Files... &Ficheros... - - + + Analyze files Check files Comprobar archivos - + Ctrl+F Ctrl+F - + &Directory... &Carpeta... - - + + Analyze directory Check directory Comprobar carpeta - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop &Detener - - + + Stop analysis Stop checking Detener comprobación - + Esc Esc - + &Save results to file... &Guardar los resultados en el fichero... - + Ctrl+S Ctrl+S - + &Quit &Salir - + &Clear results &Limpiar resultados - + &Preferences &Preferencias - - + + Show style warnings Mostrar advertencias de estilo - - - + + + Show errors Mostrar errores - - + + Information Información - + Show information messages Mostrar mensajes de información - + Show portability warnings Mostrar advertencias de portabilidad - + Show Cppcheck results - + Clang - + Show Clang results - + &Filter &Filtro - + Filter results Resultados del filtro - + Windows 32-bit ANSI Windows 32-bit ANSI - + Windows 32-bit Unicode Windows 32-bit Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... Im&primir... - + Print the Current Report Imprimir el informe actual - + Print Pre&view... Pre&visualización de impresión... - + Open a Print Preview Dialog for the Current Results Abre el diĆ”logo de previsualización de impresión para el informe actual - + Open library editor Abrir el editor de bibliotecas - + &Check all &Seleccionar todo @@ -755,449 +691,449 @@ Parameters: -l(line) (file) Ocultar - - + + Report - + A&nalyze - + Filter Filtro - + &Reanalyze modified files &Recheck modified files - + Reanal&yze all files - + Ctrl+Q - + Style war&nings - + E&rrors - + &Uncheck all &Deseleccionar todo - + Collapse &all Contraer &todo - + &Expand all &Expandir todo - + &Standard &EstĆ”ndar - + Standard items Elementos estĆ”ndar - + &Contents &Contenidos - + Open the help contents Abrir la ayuda de contenidos - + F1 F1 - + Toolbar Barra de herramientas - + &Categories &CategorĆ­as - + Error categories CategorĆ­as de error - + &Open XML... &Abrir XML... - + Open P&roject File... Abrir P&royecto... - + Ctrl+Shift+O - + Sh&ow Scratchpad... - + &New Project File... &Nuevo Proyecto... - + Ctrl+Shift+N - + &Log View &Visor del log - + Log View Visor del log - + C&lose Project File C&errar Proyecto - + &Edit Project File... &Editar Proyecto... - + &Statistics &EstadĆ­sticas - + &Warnings - + Per&formance warnings - + &Information - + &Portability - + P&latforms - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... - + &Auto-detect language - + &Enforce C++ - + E&nforce C - + C++14 C++14 - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - - - + + + Show warnings Mostrar advertencias - - + + Show performance warnings Mostrar advertencias de rendimiento - + Show &hidden Mostrar &ocultos - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. - + You must close the project file before selecting new files or directories! Ā”Tienes que cerrar el proyecto antes de seleccionar nuevos ficheros o carpetas! - + Select configuration - + File not found Archivo no encontrado - + Bad XML XML malformado - + Missing attribute Falta el atributo - + Bad attribute value - + Unsupported format Formato no soportado - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - - + + XML files (*.xml) Archivos XML (*.xml) - + Open the report file Abrir informe - + License Licencia - + Authors Autores - + Save the report file Guardar informe - - + + Quick Filter: Filtro rĆ”pido: - + Found project file: %1 Do you want to load this project file instead? @@ -1206,118 +1142,112 @@ Do you want to load this project file instead? ĀæQuiere cargar este fichero de proyecto en su lugar? - + The library '%1' contains unknown elements: %2 La biblioteca '%1' contiene elementos deconocidos: %2 - + Duplicate platform type - + Platform type redefined - - Unknown element - - - - + Unknown element - Unknown issue - - - - + + + + Error Error - + Text files (*.txt) Ficheros de texto (*.txt) - + CSV files (*.csv) Ficheros CVS (*.cvs) - + Project files (*.cppcheck);;All files(*.*) Ficheros de proyecto (*.cppcheck;;Todos los ficheros (*.*) - + Select Project File Selecciona el archivo de proyecto - - - - + + + + Project: Proyecto: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1325,81 +1255,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename Selecciona el nombre del proyecto - + No project file loaded No hay ningĆŗn proyecto cargado - + The project file %1 @@ -1416,67 +1341,67 @@ Do you want to remove the file from the recently used projects -list? ĀæQuiere eliminar el fichero de la lista de proyectos recientes? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1607,58 +1532,58 @@ Options: - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. Nota: Ponga sus propios archivos .cfg en la misma carpeta que el proyecto. DeberĆ­a verlos arriba. - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Misra C - + 2012 - - + + 2023 - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + ... @@ -1669,8 +1594,7 @@ Options: - - + Browse... @@ -1698,15 +1622,15 @@ Options: - + Edit Editar - - + + Remove Eliminar @@ -1726,124 +1650,134 @@ Options: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions - - + + Analysis - + This is a workfolder that Cppcheck will use for various purposes. - + Parser - + Cppcheck (built in) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + Check that each class has a safe public interface - + Limit analysis - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth - - Premium License - - - - + Enable inline suppressions Habilitar supresiones inline - + 2025 - + Misra C++ - + 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools @@ -1858,113 +1792,113 @@ Options: Bajar - + Platform - + Clang (experimental) - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Max recursion in template instantiation - + Warning options - + Root path: - + Filepaths in warnings will be relative to this path - + Warning tags (separated by semicolon) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) - + Libraries - + Suppressions Supresiones - + Add AƱadir - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards - + Cert C++ - + Bug hunting (Premium) - + Clang analyzer - + Clang-tidy @@ -1977,82 +1911,93 @@ Options: ProjectFileDialog - + Project file: %1 Archivo de proyecto: %1 - + Select Cppcheck build dir - + Select include directory Selecciona una carpeta para incluir - + Select a directory to check Selecciona la carpeta a comprobar - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) - + Visual Studio - + Compile database - + Borland C++ Builder 6 - + Import Project - + + C/C++ header + + + + + Include file + + + + Select directory to ignore Selecciona la carpeta a ignorar - + Source files - + + All files - + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) @@ -2085,7 +2030,7 @@ Options: - + (Not found) @@ -2517,102 +2462,102 @@ Por favor comprueba que la ruta a la aplicación y los parĆ”metros son correctos - - + + Failed to save the report. Error al guardar el informe. - + Print Report Imprimir informe - + No errors found, nothing to print. No se encontraron errores, nada que imprimir. - + %p% (%1 of %2 files checked) %p% (%1 of %2 archivos comprobados) - - + + Cppcheck Cppcheck - + No errors found. No se han encontrado errores. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Se han encontrado errores, pero estĆ”n configurados para que no se muestren. Para cambiar el tipo de comportamiento, abra el menĆŗ Ver. - - + + Failed to read the report. Error al leer el informe. - + XML format version 1 is no longer supported. - + First included by - + Id Id - + Clear Log - + Copy this Log entry - + Copy complete Log - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. @@ -2897,14 +2842,14 @@ Para cambiar el tipo de comportamiento, abra el menĆŗ Ver. - - + + Statistics EstadĆ­sticas - + Project Proyecto @@ -2935,7 +2880,7 @@ Para cambiar el tipo de comportamiento, abra el menĆŗ Ver. - + Previous Scan AnĆ”lisis anterior @@ -3015,103 +2960,103 @@ Para cambiar el tipo de comportamiento, abra el menĆŗ Ver. - + 1 day 1 dĆ­a - + %1 days %1 dĆ­as - + 1 hour 1 hora - + %1 hours %1 horas - + 1 minute 1 minuto - + %1 minutes %1 minutos - + 1 second 1 segundo - + %1 seconds %1 segundos - + 0.%1 seconds 0.%1 segundos - + and y - + Export PDF - + Project Settings Preferencias del proyecto - + Paths Rutas - + Include paths Incluye las rutas - + Defines Definiciones - + Undefines - + Path selected Ruta seleccionada - + Number of files scanned NĆŗmero de archivos analizados - + Scan duration Duración del anĆ”lisis - - + + Errors Errores @@ -3126,32 +3071,32 @@ Para cambiar el tipo de comportamiento, abra el menĆŗ Ver. - - + + Warnings Advertencias - - + + Style warnings Advertencias de estilo - - + + Portability warnings Advertencias de portabilidad - - + + Performance warnings Advertencias de rendimiento - - + + Information messages Mensajes de información diff --git a/gui/cppcheck_fi.ts b/gui/cppcheck_fi.ts index f6c959aa099..5a41a1cb41d 100644 --- a/gui/cppcheck_fi.ts +++ b/gui/cppcheck_fi.ts @@ -106,70 +106,6 @@ Parameters: -l(line) (file) - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -209,12 +145,12 @@ Parameters: -l(line) (file) - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -479,30 +415,30 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + A&nalyze - + Standard Vakio @@ -512,245 +448,245 @@ Parameters: -l(line) (file) &Tiedosto - + &View &NƤytƤ - + &Toolbars - + C++ standard - + &C standard C standard - + &Edit &Muokkaa - + &License... &Lisenssi... - + A&uthors... &TekijƤt... - + &About... &Tietoa ohjelmasta Cppcheck... - + &Files... &Tiedostot... - - + + Analyze files Check files - + Ctrl+F Ctrl+F - + &Directory... &Hakemisto... - - + + Analyze directory Check directory - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop &PysƤytƤ - - + + Stop analysis Stop checking - + Esc Esc - + &Save results to file... &Tallenna tulokset tiedostoon... - + Ctrl+S Ctrl+S - + &Quit &Lopeta - + &Clear results &TyhjennƤ tulokset - + &Preferences &Asetukset - - - + + + Show errors - - - + + + Show warnings - - + + Show performance warnings - + Show &hidden - - + + Information - + Show information messages - + Show portability warnings - + Show Cppcheck results - + Clang - + Show Clang results - + &Filter - + Filter results - + Windows 32-bit ANSI - + Windows 32-bit Unicode - + Unix 32-bit - + Unix 64-bit - + Windows 64-bit - + &Print... - + Print the Current Report - + Print Pre&view... - + Open a Print Preview Dialog for the Current Results - + Open library editor - + &Check all &Valitse kaikki @@ -765,559 +701,553 @@ Parameters: -l(line) (file) - - + + Report - + Filter - + &Reanalyze modified files &Recheck modified files - + Reanal&yze all files - + Ctrl+Q - + Style war&nings - + E&rrors - + &Uncheck all &Poista kaikista valinta - + Collapse &all &PienennƤ kaikki - + &Expand all &Laajenna kaikki - + &Standard - + Standard items - + Toolbar - + &Categories - + Error categories - + &Open XML... - + Open P&roject File... - + Ctrl+Shift+O - + Sh&ow Scratchpad... - + &New Project File... - + Ctrl+Shift+N - + &Log View - + Log View - + C&lose Project File - + &Edit Project File... - + &Statistics - + &Warnings - + Per&formance warnings - + &Information - + &Portability - + P&latforms - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... - + &Auto-detect language - + &Enforce C++ - + E&nforce C - + C++14 - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 - + C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents - + Categories - - + + Show style warnings - + Open the help contents - + F1 - + &Help &Ohje - - + + Quick Filter: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Lisenssi - + Authors TekijƤt - + Save the report file Tallenna raportti - - + + XML files (*.xml) XML-tiedostot (*xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. - + You must close the project file before selecting new files or directories! - + The library '%1' contains unknown elements: %2 - + Unsupported format - + Duplicate platform type - + Platform type redefined - - Unknown element - - - - + Unknown element - Unknown issue - - - - + + + + Error - + Open the report file - + Text files (*.txt) Tekstitiedostot (*.txt) - + CSV files (*.csv) - + Project files (*.cppcheck);;All files(*.*) - + Select Project File - - - - + + + + Project: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1325,81 +1255,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename - + No project file loaded - + The project file %1 @@ -1410,67 +1335,67 @@ Do you want to remove the file from the recently used projects -list? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1601,22 +1526,22 @@ Options: - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + ... @@ -1627,8 +1552,7 @@ Options: - - + Browse... @@ -1656,15 +1580,15 @@ Options: - + Edit - - + + Remove @@ -1694,271 +1618,281 @@ Options: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Platform - - + + Analysis - + This is a workfolder that Cppcheck will use for various purposes. - + Clang (experimental) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth - + Max recursion in template instantiation - - Premium License - - - - + Warning options - + Root path: - + Filepaths in warnings will be relative to this path - + Warning tags (separated by semicolon) - + Enable inline suppressions - + 2025 - + Misra C++ - + 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) - + Types and Functions - + Libraries - + Parser - + Cppcheck (built in) - + Check that each class has a safe public interface - + Limit analysis - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Suppressions - + Add - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards - + Misra C - + 2012 - - + + 2023 - + Cert C++ - + Bug hunting (Premium) - + Clang analyzer - + Clang-tidy @@ -1971,82 +1905,93 @@ Options: ProjectFileDialog - + Project file: %1 - + Select Cppcheck build dir - + Select include directory - + Select a directory to check - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) - + Visual Studio - + Compile database - + Borland C++ Builder 6 - + Import Project - + + C/C++ header + + + + + Include file + + + + Select directory to ignore - + Source files - + + All files - + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) @@ -2081,7 +2026,7 @@ Options: - + (Not found) @@ -2477,102 +2422,102 @@ Tarkista ettƤ ohjelman polku ja parametrit ovat oikeat. ResultsView - + Print Report - + No errors found, nothing to print. - + %p% (%1 of %2 files checked) - - + + Cppcheck Cppcheck - + No errors found. VirheitƤ ei lƶytynyt. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. VirheitƤ lƶytyi, mutta asetuksissa kyseiset virheet on mƤƤritelty piilotettavaksi. MƤƤrittƤƤksesi minkƤ tyyppisiƤ virheitƤ nƤytetƤƤn, avaa nƤkymƤ valikko. - - + + Failed to read the report. - + XML format version 1 is no longer supported. - + First included by - + Id - + Clear Log - + Copy this Log entry - + Copy complete Log - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - - + + Failed to save the report. Raportin tallentaminen epƤonnistui. @@ -2870,14 +2815,14 @@ MƤƤrittƤƤksesi minkƤ tyyppisiƤ virheitƤ nƤytetƤƤn, avaa nƤkymƤ valik - - + + Statistics - + Project @@ -2908,7 +2853,7 @@ MƤƤrittƤƤksesi minkƤ tyyppisiƤ virheitƤ nƤytetƤƤn, avaa nƤkymƤ valik - + Previous Scan @@ -2988,103 +2933,103 @@ MƤƤrittƤƤksesi minkƤ tyyppisiƤ virheitƤ nƤytetƤƤn, avaa nƤkymƤ valik - + 1 day - + %1 days - + 1 hour - + %1 hours - + 1 minute - + %1 minutes - + 1 second - + %1 seconds - + 0.%1 seconds - + and - + Export PDF - + Project Settings - + Paths - + Include paths - + Defines - + Undefines - + Path selected - + Number of files scanned - + Scan duration - - + + Errors @@ -3099,32 +3044,32 @@ MƤƤrittƤƤksesi minkƤ tyyppisiƤ virheitƤ nƤytetƤƤn, avaa nƤkymƤ valik - - + + Warnings - - + + Style warnings - - + + Portability warnings - - + + Performance warnings - - + + Information messages diff --git a/gui/cppcheck_fr.ts b/gui/cppcheck_fr.ts index 82e0ea2bf74..828dffa7ad2 100644 --- a/gui/cppcheck_fr.ts +++ b/gui/cppcheck_fr.ts @@ -116,70 +116,6 @@ ParamĆØtres : -l(ligne) (fichier) Vous devez spĆ©cifier un nom, un chemin, et eventuellement des paramĆØtres en option Ć  l'application ! - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -217,12 +153,12 @@ ParamĆØtres : -l(ligne) (fichier) - + Helpfile '%1' was not found - + Cppcheck @@ -485,20 +421,20 @@ ParamĆØtres : -l(ligne) (fichier) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck @@ -518,526 +454,521 @@ ParamĆØtres : -l(ligne) (fichier) &Fichier - + &View &Affichage - - + + Report - + &Help &Aide - + &Edit &Ɖdition - + Standard Standard - + &License... &Licence... - + A&uthors... A&uteurs... - + &About... ƀ &Propos... - + &Files... &Fichiers... - + Ctrl+F - + &Directory... &RĆ©pertoires... - + Ctrl+D - + Ctrl+R - + &Stop &ArrĆŖter - + Esc - + &Save results to file... &Sauvegarder les rĆ©sultats dans un fichier... - + Ctrl+S - + &Quit &Quitter - + &Clear results &Effacer les rĆ©sultats - + &Preferences &PrĆ©fĆ©rences - + &Check all &Tout cocher - + &Uncheck all &Tout dĆ©cocher - + Collapse &all &Tout rĆ©duire - + &Expand all &Tout dĆ©rouler - + &Contents &Contenus - + Open the help contents Ouvir l'aide - + F1 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + License Licence - + Authors Auteurs - + Save the report file Sauvegarder le rapport - - + + XML files (*.xml) Fichiers XML (*.xml) - + About - + Text files (*.txt) Fichiers Texte (*.txt) - + CSV files (*.csv) Fichiers CSV (*.csv) - + &Toolbars &Boite Ć  outils - + Categories CatĆ©gories - - + + Show style warnings Afficher les avertissements de style - - - + + + Show errors Afficher les erreurs - + &Standard - + Standard items - + Toolbar - + &Categories - + Error categories - + &Open XML... &Ouvrir un fichier XML... - + Open P&roject File... Ouvrir un P&rojet... - + &New Project File... &Nouveau Projet... - + &Log View &Journal - + Log View Journal - + C&lose Project File F&ermer le projet - + &Edit Project File... &Editer le projet - + &Statistics Statistiques - - - + + + Show warnings Afficher les avertissements - - + + Show performance warnings Afficher les avertissements de performance - + Show &hidden - - + + Information Information - + Show information messages Afficher les messages d'information - + Show portability warnings Afficher les problĆØmes de portabilitĆ© - + You must close the project file before selecting new files or directories! Vous devez d'abord fermer le projet avant de choisir des fichiers/rĆ©pertoires - + Open the report file Ouvrir le rapport - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Project files (*.cppcheck);;All files(*.*) - + Select Project File - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Select Project Filename - + No project file loaded - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. - + &Filter &Filtre - + Filter results - - + + Quick Filter: Filtre rapide : - + Found project file: %1 Do you want to load this project file instead? - - - - + + + + Project: Projet : - + The project file %1 @@ -1048,32 +979,32 @@ Do you want to remove the file from the recently used projects -list? - + Filter Filtre - + Windows 32-bit ANSI - + Windows 32-bit Unicode - + Unix 32-bit - + Unix 64-bit - + Windows 64-bit @@ -1083,105 +1014,99 @@ Do you want to remove the file from the recently used projects -list? - + C++ standard - - - - + + + + Error Erreur - + File not found Fichier introuvable - + Bad XML Mauvais fichier XML - + Missing attribute Attribut manquant - + Bad attribute value Mauvaise valeur d'attribut - + Failed to load the selected library '%1'. %2 Echec lors du chargement de la bibliothĆØque '%1'. %2 - + Unsupported format Format non supportĆ© - + The library '%1' contains unknown elements: %2 La bibliothĆØque '%1' contient des Ć©lĆ©ments inconnus: %2 - + Duplicate platform type - + Platform type redefined - + &Print... &Imprimer... - + Print the Current Report Imprimer le rapport - + Print Pre&view... Apercu d'impression... - + Open a Print Preview Dialog for the Current Results - + Open library editor - - Unknown element - - - - + Unknown element - Unknown issue - + Select configuration @@ -1204,296 +1129,296 @@ Options: - + Build dir '%1' does not exist, create it? - - + + Analyze files - - + + Analyze directory - + &Reanalyze modified files - - + + Stop analysis - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + No suitable files found to analyze! - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Duplicate define - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + A&nalyze - + &C standard - + Reanal&yze all files - + Ctrl+Q - + Style war&nings - + E&rrors - + Ctrl+Shift+O - + Sh&ow Scratchpad... - + Ctrl+Shift+N - + &Warnings - + Per&formance warnings - + &Information - + &Portability - + Show Cppcheck results - + Clang - + Show Clang results - + P&latforms - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... - + &Auto-detect language - + &Enforce C++ - + E&nforce C - + C++14 - + Project files (*.cppcheck) - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 - + C++20 - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1593,15 +1518,15 @@ Do you want to proceed? - + Edit Editer - - + + Remove Supprimer @@ -1616,22 +1541,22 @@ Do you want to proceed? Descendre - + Suppressions Suppressions - + Add Ajouter - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. - + ... @@ -1656,17 +1581,17 @@ Do you want to proceed? - + Root path: - + Warning tags (separated by semicolon) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) @@ -1676,95 +1601,109 @@ Do you want to proceed? - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions - + Libraries - + Parser - + Cppcheck (built in) - + Check that each class has a safe public interface - + Limit analysis - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Bug hunting - + Clang analyzer - + Clang-tidy - - + Browse... @@ -1774,153 +1713,148 @@ Do you want to proceed? - + Platform - + This is a workfolder that Cppcheck will use for various purposes. - + Clang (experimental) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Max recursion in template instantiation - - Premium License - - - - + Warning options - + Filepaths in warnings will be relative to this path - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Enable inline suppressions - + Misra C - + 2012 - - + + 2023 - + 2025 - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + Misra C++ - + 2008 - + Cert C++ - + Safety profiles (defined in C++ core guidelines) - + Bug hunting (Premium) - + External tools @@ -1940,19 +1874,19 @@ Do you want to proceed? - - + + Analysis - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth @@ -1960,82 +1894,93 @@ Do you want to proceed? ProjectFileDialog - + Project file: %1 Fichier projet : %1 - + Select include directory Selectionner un rĆ©pertoire Ć  inclure - + Select directory to ignore Selectionner un rĆ©pertoire Ć  ignorer - + Select a directory to check Selectionner un rĆ©pertoire Ć  vĆ©rifier - + Select Cppcheck build dir - + Import Project - + Clang-tidy (not found) - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Source files - + + All files - + + C/C++ header + + + + + Include file + + + + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) - + Visual Studio - + Compile database - + Borland C++ Builder 6 @@ -2068,7 +2013,7 @@ Do you want to proceed? - + (Not found) @@ -2483,87 +2428,87 @@ Please select the default editor application in preferences/Applications.RĆ©sultats - - + + Cppcheck - + No errors found. Pas d'erreurs trouvĆ©es. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Des erreurs ont Ć©tĆ© trouvĆ©es mais sont configurĆ©es pour rester cachĆ©es. Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage. - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - - + + Failed to save the report. Erreur lors de la sauvegarde du rapport. - - + + Failed to read the report. Erreur lors de la lecture du rapport - + %p% (%1 of %2 files checked) %p% (%1 fichiers sur %2 vĆ©rifiĆ©s) - + Id Id - + Print Report Imprimer le rapport - + No errors found, nothing to print. Aucune erreur trouvĆ©e. Il n'y a rien Ć  imprimer - + First included by - + XML format version 1 is no longer supported. @@ -2583,17 +2528,17 @@ Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage. - + Clear Log - + Copy this Log entry - + Copy complete Log @@ -2870,14 +2815,14 @@ Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage. - - + + Statistics Statistiques - + Project Projet @@ -2903,7 +2848,7 @@ Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage. - + Previous Scan Analyse prĆ©cĆ©dente @@ -2968,123 +2913,123 @@ Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage.Copier vers le presse-papier - + 1 day - + %1 days - + 1 hour - + %1 hours - + 1 minute - + %1 minutes - + 1 second - + %1 seconds - + 0.%1 seconds - + and - + Project Settings - + Paths Chemins - + Include paths - + Defines - + Path selected - + Number of files scanned - + Scan duration - - + + Errors Erreurs - - + + Warnings Avertissements - - + + Style warnings Avertissement de style - - + + Portability warnings - - + + Performance warnings Avertissements de performance - - + + Information messages @@ -3094,7 +3039,7 @@ Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage. - + Export PDF @@ -3124,7 +3069,7 @@ Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage. - + Undefines diff --git a/gui/cppcheck_it.ts b/gui/cppcheck_it.ts index 1c8829bb198..46ec9cb51d8 100644 --- a/gui/cppcheck_it.ts +++ b/gui/cppcheck_it.ts @@ -117,70 +117,6 @@ Parametri: -l(line) (file) Devi specificare un nome, un percorso ed, opzionalmente, i parametri per l'applicazione! - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -218,12 +154,12 @@ Parametri: -l(line) (file) - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -488,30 +424,30 @@ Parametri: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + A&nalyze - + Standard Standard @@ -521,245 +457,245 @@ Parametri: -l(line) (file) &File - + &View &Visualizza - + &Toolbars &Barre degli strumenti - + C++ standard - + &C standard C standard - + &Edit &Modifica - + &License... &Licenza... - + A&uthors... A&utori... - + &About... I&nformazioni su... - + &Files... &File... - - + + Analyze files Check files Scansiona i file - + Ctrl+F Ctrl+F - + &Directory... &Cartella... - - + + Analyze directory Check directory Scansiona la cartella - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop &Ferma - - + + Stop analysis Stop checking Ferma la scansione - + Esc Esc - + &Save results to file... &Salva i risultati nel file... - + Ctrl+S Ctrl+S - + &Quit &Esci - + &Clear results &Cancella i risultati - + &Preferences &Preferenze - - - + + + Show errors Mostra gli errori - - - + + + Show warnings Mostra gli avvisi - - + + Show performance warnings Mostra gli avvisi sulle prestazioni - + Show &hidden Mostra &i nascosti - - + + Information Informazione - + Show information messages Mostra messaggi di informazione - + Show portability warnings Mostra gli avvisi sulla portabilitĆ  - + Show Cppcheck results - + Clang - + Show Clang results - + &Filter &Filtro - + Filter results Filtra i risultati - + Windows 32-bit ANSI Windows 32-bit, ANSI - + Windows 32-bit Unicode Windows 32-bit, Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... - + Print the Current Report - + Print Pre&view... - + Open a Print Preview Dialog for the Current Results - + Open library editor - + &Check all &Seleziona tutto @@ -774,336 +710,336 @@ Parametri: -l(line) (file) Nascondi - - + + Report - + Filter Filtro - + &Reanalyze modified files &Recheck modified files - + Reanal&yze all files - + Ctrl+Q - + Style war&nings - + E&rrors - + &Uncheck all &Deseleziona tutto - + Collapse &all Riduci &tutto - + &Expand all &Espandi tutto - + &Standard &Standard - + Standard items Oggetti standard - + Toolbar Barra degli strumenti - + &Categories &Categorie - + Error categories Categorie di errore - + &Open XML... &Apri XML... - + Open P&roject File... Apri file di p&rogetto... - + Ctrl+Shift+O - + Sh&ow Scratchpad... - + &New Project File... &Nuovo file di progetto... - + Ctrl+Shift+N - + &Log View &Visualizza il rapporto - + Log View Visualizza il rapporto - + C&lose Project File C&hiudi il file di progetto - + &Edit Project File... &Modifica il file di progetto... - + &Statistics &Statistiche - + &Warnings - + Per&formance warnings - + &Information - + &Portability - + P&latforms - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... - + &Auto-detect language - + &Enforce C++ - + E&nforce C - + C++14 C++14 - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents &Contenuti - + Categories Categorie - - + + Show style warnings Mostra gli avvisi sullo stile - + Open the help contents Apri i contenuti di aiuto - + F1 F1 - + &Help &Aiuto - - + + Quick Filter: Rapido filtro: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? @@ -1112,96 +1048,96 @@ Do you want to load this project file instead? Vuoi piuttosto caricare questo file di progetto? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Unsupported format - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Licenza - + Authors Autori - + Save the report file Salva il file di rapporto - - + + XML files (*.xml) File XML (*.xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -1210,127 +1146,121 @@ This is probably because the settings were changed between the Cppcheck versions Probabilmente ciò ĆØ avvenuto perchĆ© le impostazioni sono state modificate tra le versioni di Cppcheck. Per favore controlla (e sistema) le impostazioni delle applicazioni editor, altrimenti il programma editor può non partire correttamente. - + You must close the project file before selecting new files or directories! Devi chiudere il file di progetto prima di selezionare nuovi file o cartelle! - + The library '%1' contains unknown elements: %2 - + Duplicate platform type - + Platform type redefined - - Unknown element - - - - + Unknown element - Unknown issue - - - - + + + + Error - + Open the report file Apri il file di rapporto - + Text files (*.txt) File di testo (*.txt) - + CSV files (*.csv) Files CSV (*.csv) - + Project files (*.cppcheck);;All files(*.*) Files di progetto (*.cppcheck);;Tutti i files(*.*) - + Select Project File Seleziona il file di progetto - - - - + + + + Project: Progetto: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1338,81 +1268,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename Seleziona il nome del file di progetto - + No project file loaded Nessun file di progetto caricato - + The project file %1 @@ -1429,67 +1354,67 @@ Do you want to remove the file from the recently used projects -list? Vuoi rimuovere il file dalla lista dei progetti recentemente usati? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1620,58 +1545,58 @@ Options: - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Misra C - + 2012 - - + + 2023 - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + ... @@ -1682,8 +1607,7 @@ Options: - - + Browse... @@ -1711,15 +1635,15 @@ Options: - + Edit Modifica - - + + Remove Rimuovi @@ -1739,124 +1663,134 @@ Options: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions - - + + Analysis - + This is a workfolder that Cppcheck will use for various purposes. - + Parser - + Cppcheck (built in) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + Check that each class has a safe public interface - + Limit analysis - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth - - Premium License - - - - + Enable inline suppressions Abilita le soppressioni - + 2025 - + Misra C++ - + 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools @@ -1871,113 +1805,113 @@ Options: Giù - + Platform - + Clang (experimental) - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Max recursion in template instantiation - + Warning options - + Root path: - + Filepaths in warnings will be relative to this path - + Warning tags (separated by semicolon) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) - + Libraries - + Suppressions - + Add - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards - + Cert C++ - + Bug hunting (Premium) - + Clang analyzer - + Clang-tidy @@ -1990,82 +1924,93 @@ Options: ProjectFileDialog - + Project file: %1 File di progetto: %1 - + Select Cppcheck build dir - + Select include directory Seleziona la cartella da includere - + Select a directory to check Seleziona una cartella da scansionare - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) - + Visual Studio - + Compile database - + Borland C++ Builder 6 - + Import Project - + + C/C++ header + + + + + Include file + + + + Select directory to ignore Seleziona la cartella da ignorare - + Source files - + + All files - + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) @@ -2098,7 +2043,7 @@ Options: - + (Not found) @@ -2509,102 +2454,102 @@ Per favore verifica che il percorso dell'applicazione e i parametri siano c ResultsView - + Print Report - + No errors found, nothing to print. - + %p% (%1 of %2 files checked) %p% (%1 su %2 file scansionati) - - + + Cppcheck Cppcheck - + No errors found. Nessun errore trovato. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Sono stati trovati errori, ma sono stati configurati per essere nascosti. Per vedere il tipo di errori che sono mostrati, apri il menu Visualizza. - - + + Failed to read the report. Apertura del report fallito. - + XML format version 1 is no longer supported. - + First included by - + Id Id - + Clear Log - + Copy this Log entry - + Copy complete Log - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - - + + Failed to save the report. Salvataggio del report fallito. @@ -2909,14 +2854,14 @@ Per vedere il tipo di errori che sono mostrati, apri il menu Visualizza. - - + + Statistics Statistiche - + Project Progetto @@ -2947,7 +2892,7 @@ Per vedere il tipo di errori che sono mostrati, apri il menu Visualizza. - + Previous Scan Precedente Scansione @@ -3027,103 +2972,103 @@ Per vedere il tipo di errori che sono mostrati, apri il menu Visualizza. - + 1 day 1 giorno - + %1 days %1 giorni - + 1 hour 1 ora - + %1 hours %1 ore - + 1 minute 1 minuto - + %1 minutes %1 minuti - + 1 second 1 secondo - + %1 seconds %1 secondi - + 0.%1 seconds 0,%1 secondi - + and e - + Export PDF - + Project Settings Impostazioni progetto - + Paths Percorsi - + Include paths Percorsi di inclusione - + Defines Definizioni - + Undefines - + Path selected Selezionato percorso - + Number of files scanned Numero di file scansionati - + Scan duration Durata della scansione - - + + Errors Errori @@ -3138,32 +3083,32 @@ Per vedere il tipo di errori che sono mostrati, apri il menu Visualizza. - - + + Warnings Avvisi - - + + Style warnings Stilwarnungen - - + + Portability warnings Avvisi sulla portabilitĆ  - - + + Performance warnings Avvisi sulle performance - - + + Information messages Messaggi di informazione diff --git a/gui/cppcheck_ja.ts b/gui/cppcheck_ja.ts index 3e486f416dd..b3252ec769d 100644 --- a/gui/cppcheck_ja.ts +++ b/gui/cppcheck_ja.ts @@ -119,65 +119,52 @@ Parameters: -l(line) (file) ComplianceReportDialog - Compliance Report - ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆ + ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆ - Project name - ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆå + ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆå - Project version - ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒćƒ¼ć‚øćƒ§ćƒ³ + ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒćƒ¼ć‚øćƒ§ćƒ³ - Coding Standard - ć‚³ćƒ¼ćƒ‡ć‚£ćƒ³ć‚°ęØ™ęŗ– + ć‚³ćƒ¼ćƒ‡ć‚£ćƒ³ć‚°ęØ™ęŗ– - Misra C - MISRA C + MISRA C - Cert C - CERT C + CERT C - Cert C++ - Cert C++ + Cert C++ - List of files with md5 checksums - md5ćƒć‚§ćƒƒć‚Æć‚µćƒ ć¤ććƒ•ć‚”ć‚¤ćƒ«ćƒŖć‚¹ćƒˆ + md5ćƒć‚§ćƒƒć‚Æć‚µćƒ ć¤ććƒ•ć‚”ć‚¤ćƒ«ćƒŖć‚¹ćƒˆ - Compliance report - ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆ + ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆ - HTML files (*.html) - HTMLćƒ•ć‚”ć‚¤ćƒ«(*.html) + HTMLćƒ•ć‚”ć‚¤ćƒ«(*.html) - - Save compliance report - ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆć®äæå­˜ + ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆć®äæå­˜ - Failed to import '%1' (%2), can not show files in compliance report - '%1' (%2)ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸć€‚ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆć«č”Øē¤ŗć§ćć¾ć›ć‚“ + '%1' (%2)ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸć€‚ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆć«č”Øē¤ŗć§ćć¾ć›ć‚“ Failed to import '%1', can not show files in compliance report @@ -221,12 +208,12 @@ Parameters: -l(line) (file) ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ - + Helpfile '%1' was not found ćƒ˜ćƒ«ćƒ—ćƒ•ć‚”ć‚¤ćƒ« '%1' ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ - + Cppcheck Cppcheck @@ -502,20 +489,20 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck @@ -525,281 +512,281 @@ Parameters: -l(line) (file) ćƒ•ć‚”ć‚¤ćƒ«(&F) - + &View 蔨示(&V) - + &Toolbars ćƒ„ćƒ¼ćƒ«ćƒćƒ¼(&T) - + &Help ćƒ˜ćƒ«ćƒ—(&H) - + C++ standard C++標準 - + &C standard C standard &C標準 - + &Edit 編集(&E) - + Standard čØ€čŖžč¦ę ¼ - + Categories ć‚«ćƒ†ć‚“ćƒŖ - + &License... ćƒ©ć‚¤ć‚»ćƒ³ć‚¹(&L)... - + A&uthors... ä½œč€…(&u)... - + &About... Cppcheck恫恤恄恦(&A)... - + &Files... ćƒ•ć‚”ć‚¤ćƒ«éøęŠž(&F)... - - + + Analyze files Check files ćƒ•ć‚”ć‚¤ćƒ«ć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ - + Ctrl+F Ctrl+F - + &Directory... ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖéøęŠž(&D)... - - + + Analyze directory Check directory ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop 停止(&S) - - + + Stop analysis Stop checking ćƒć‚§ćƒƒć‚Æć‚’åœę­¢ć™ć‚‹ - + Esc Esc - + &Save results to file... ēµęžœć‚’ćƒ•ć‚”ć‚¤ćƒ«ć«äæå­˜(&S)... - + Ctrl+S Ctrl+S - + &Quit 終了(&Q) - + &Clear results ēµęžœć‚’ć‚ÆćƒŖć‚¢(&C) - + &Preferences 設定(&P) - - + + Show style warnings ć‚¹ć‚æć‚¤ćƒ«č­¦å‘Šć‚’č”Øē¤ŗ - - - + + + Show errors ć‚Øćƒ©ćƒ¼ć‚’č”Øē¤ŗ - - + + Information ęƒ…å ± - + Show information messages ęƒ…å ±ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚’č”Øē¤ŗ - + Show portability warnings ē§»ę¤åÆčƒ½ę€§ć®å•é”Œć‚’č”Øē¤ŗ - + Show Cppcheck results Cppcheckēµęžœć‚’č”Øē¤ŗć™ć‚‹ - + Clang Clang - + Show Clang results Clangć®ēµęžœć‚’č”Øē¤ŗ - + &Filter ćƒ•ć‚£ćƒ«ć‚æćƒ¼(&F) - + Filter results ćƒ•ć‚£ćƒ«ć‚æēµęžœ - + Windows 32-bit ANSI Windows 32-bit ANSIć‚Øćƒ³ć‚³ćƒ¼ćƒ‰ - + Windows 32-bit Unicode Windows 32-bit Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... 印刷(&P)... - + Print the Current Report ē¾åœØć®ćƒ¬ćƒćƒ¼ćƒˆć‚’å°åˆ· - + Print Pre&view... å°åˆ·ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼(&v)... - + Open a Print Preview Dialog for the Current Results ē¾åœØć®ćƒ¬ćƒćƒ¼ćƒˆć‚’ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼č”Øē¤ŗ - + Open library editor ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć‚Øćƒ‡ć‚£ć‚æć‚’é–‹ć - + C&lose Project File ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć‚’é–‰ć˜ć‚‹(&l) - + &Edit Project File... ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć®ē·Øé›†(&E)... - + &Statistics ēµ±čØˆęƒ…å ±(&S) - - - + + + Show warnings č­¦å‘Šć‚’č”Øē¤ŗ - - + + Show performance warnings ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹č­¦å‘Šć‚’č”Øē¤ŗ - + Show &hidden éžč”Øē¤ŗć‚’č”Øē¤ŗ(&h) - + &Check all ć™ć¹ć¦ć®ć‚Øćƒ©ćƒ¼ć‚’č”Øē¤ŗ(&C) @@ -814,299 +801,299 @@ Parameters: -l(line) (file) éžč”Øē¤ŗ - - + + Report ćƒ¬ćƒćƒ¼ćƒˆ - + A&nalyze ćƒć‚§ćƒƒć‚Æ(&n) - + Filter ćƒ•ć‚£ćƒ«ć‚æćƒ¼ - + &Reanalyze modified files &Recheck modified files å¤‰ę›“ć‚ć‚Šćƒ•ć‚”ć‚¤ćƒ«ć‚’å†č§£ęž(&R) - + Reanal&yze all files å…Øćƒ•ć‚”ć‚¤ćƒ«å†č§£ęž(&y) - + Ctrl+Q Ctrl+Q - + Style war&nings ć‚¹ć‚æć‚¤ćƒ«č­¦å‘Š(&n) - + E&rrors ć‚Øćƒ©ćƒ¼(&r) - + &Uncheck all ć™ć¹ć¦ć®ć‚Øćƒ©ćƒ¼ć‚’éžč”Øē¤ŗ(&U) - + Collapse &all ćƒ„ćƒŖćƒ¼ć‚’ęŠ˜ć‚Šē•³ć‚€(&a) - + &Expand all ćƒ„ćƒŖćƒ¼ć‚’å±•é–‹(&E) - + &Standard čØ€čŖžč¦ę ¼(&S) - + Standard items 標準項目 - + &Contents ć‚³ćƒ³ćƒ†ćƒ³ćƒ„(&C) - + Open the help contents ćƒ˜ćƒ«ćƒ—ćƒ•ć‚”ć‚¤ćƒ«ć‚’é–‹ć - + F1 F1 - + Toolbar ćƒ„ćƒ¼ćƒ«ćƒćƒ¼ - + &Categories ć‚«ćƒ†ć‚“ćƒŖ(&C) - + Error categories ć‚Øćƒ©ćƒ¼ć‚«ćƒ†ć‚“ćƒŖ - + &Open XML... XML悒開恏(&O)... - + Open P&roject File... ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć‚’é–‹ć(&R)... - + Ctrl+Shift+O Ctrl+Shift+O - + Sh&ow Scratchpad... ć‚¹ć‚Æćƒ©ćƒƒćƒćƒ‘ćƒƒćƒ‰ć‚’č”Øē¤ŗ(&o)... - + &New Project File... ę–°č¦ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆ(&N)... - + Ctrl+Shift+N Ctrl+Shift+N - + &Log View ćƒ­ć‚°ć‚’č”Øē¤ŗ(&L) - + Log View ćƒ­ć‚°č”Øē¤ŗ - + &Warnings č­¦å‘Š(&W) - + Per&formance warnings ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹č­¦å‘Š(&f) - + &Information ęƒ…å ±(&I) - + &Portability ē§»ę¤åÆčƒ½ę€§(&P) - + P&latforms ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ (&l) - + C++&11 C++11(&1) - + C&99 C99(&9) - + &Posix Posix(&P) - + C&11 C11(&1) - + &C89 C89(&C) - + &C++03 C++03(&C) - + &Library Editor... ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć‚Øćƒ‡ć‚£ć‚æ(&L)... - + &Auto-detect language č‡Ŗå‹•čØ€čŖžę¤œå‡ŗ(&A) - + &Enforce C++ C++ 強制(&E) - + E&nforce C C 強制(&n) - + C++14 C++14 - + Reanalyze and check library ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć‚’å†ćƒć‚§ćƒƒć‚Æć™ć‚‹ - + Check configuration (defines, includes) ćƒć‚§ćƒƒć‚Æć®čØ­å®š(defineć€ć‚¤ćƒ³ć‚Æćƒ«ćƒ¼ćƒ‰) - + C++17 C++17 - + C++20 C++20 - + Compliance report... ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆ... - + Normal ćƒŽćƒ¼ćƒžćƒ« - + Misra C MISRA C - + Misra C++ 2008 MISRA C++ 2008 - + Cert C CERT C - + Cert C++ Cert C++ - + Misra C++ 2023 MISRA C++ 2023 - + Autosar AUTOSAR - + EULA... EULA... - + Thread Details ć‚¹ćƒ¬ćƒƒćƒ‰č©³ē“° - + Show thread details ć‚¹ćƒ¬ćƒƒćƒ‰č©³ē“°ć‚’č”Øē¤ŗ - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -1115,23 +1102,23 @@ This is probably because the settings were changed between the Cppcheck versions Cppcheckć®å¤ć„ćƒćƒ¼ć‚øćƒ§ćƒ³ć®čØ­å®šć«ćÆäŗ’ę›ę€§ćŒć‚ć‚Šć¾ć›ć‚“ć€‚ć‚Øćƒ‡ć‚£ć‚æć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®čØ­å®šć‚’ē¢ŗčŖć—ć¦äæ®ę­£ć—ć¦ćć ć•ć„ć€ćć†ć—ćŖć„ćØę­£ć—ćčµ·å‹•ć§ććŖć„ć‹ć‚‚ć—ć‚Œć¾ć›ć‚“ć€‚ - + You must close the project file before selecting new files or directories! ę–°ć—ć„ćƒ•ć‚”ć‚¤ćƒ«ļ¼ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ć«ćÆē¾åœØć®ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć‚’é–‰ć˜ć¦ćć ć•ć„! - - + + Quick Filter: ć‚Æć‚¤ćƒƒć‚Æćƒ•ć‚£ćƒ«ć‚æļ¼š - + Select configuration ć‚³ćƒ³ćƒ•ć‚£ć‚°ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®éøęŠž - + Found project file: %1 Do you want to load this project file instead? @@ -1140,64 +1127,64 @@ Do you want to load this project file instead? ē¾åœØć®ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć®ä»£ć‚ć‚Šć«ć“ć®ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć‚’čŖ­ćæč¾¼ć‚“ć§ć‚‚ć‹ć¾ć„ć¾ć›ć‚“ć‹ļ¼Ÿ - + The library '%1' contains unknown elements: %2 ć“ć®ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖ '%1' ć«ćÆę¬”ć®äøę˜ŽćŖč¦ē“ ćŒå«ć¾ć‚Œć¦ć„ć¾ć™ć€‚ %2 - + File not found ćƒ•ć‚”ć‚¤ćƒ«ćŒć‚ć‚Šć¾ć›ć‚“ - + Bad XML äøę­£ćŖXML - + Missing attribute å±žę€§ćŒć‚ć‚Šć¾ć›ć‚“ - + Bad attribute value äøę­£ćŖå±žę€§ćŒć‚ć‚Šć¾ć™ - + Unsupported format ć‚µćƒćƒ¼ćƒˆć•ć‚Œć¦ć„ćŖć„ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ - + Duplicate platform type ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ć®ēØ®é”žćŒé‡č¤‡ć—ć¦ć„ć¾ć™ - + Platform type redefined ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ć®ēØ®é”žćŒå†å®šē¾©ć•ć‚Œć¾ć—ćŸ - + Unknown element äøę˜ŽćŖč¦ē“  - + Failed to load the selected library '%1'. %2 éøęŠžć—ćŸćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć®čŖ­ćæč¾¼ćæć«å¤±ę•—ć—ć¾ć—ćŸ '%1' %2 - - - - + + + + Error ć‚Øćƒ©ćƒ¼ @@ -1210,73 +1197,72 @@ Do you want to load this project file instead? %1 - %2 の読み込みに失敗 - - + + XML files (*.xml) XML ćƒ•ć‚”ć‚¤ćƒ« (*.xml) - + Open the report file ćƒ¬ćƒćƒ¼ćƒˆć‚’é–‹ć - + License ćƒ©ć‚¤ć‚»ćƒ³ć‚¹ - + Authors ä½œč€… - + Save the report file ćƒ¬ćƒćƒ¼ćƒˆć‚’äæå­˜ - + Text files (*.txt) ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.txt) - + CSV files (*.csv) CSVå½¢å¼ćƒ•ć‚”ć‚¤ćƒ« (*.csv) - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆć‚’ć™ćć«ē”Ÿęˆć§ćć¾ć›ć‚“ć€‚č§£ęžćŒå®Œäŗ†ć—ęˆåŠŸć—ć¦ć„ćŖć‘ć‚Œć°ćŖć‚Šć¾ć›ć‚“ć€‚ć‚³ćƒ¼ćƒ‰ć‚’å†č§£ęžć—ć¦ć€č‡“å‘½ēš„ćŖć‚Øćƒ©ćƒ¼ćŒćŖć„ć“ćØć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚ + ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆć‚’ć™ćć«ē”Ÿęˆć§ćć¾ć›ć‚“ć€‚č§£ęžćŒå®Œäŗ†ć—ęˆåŠŸć—ć¦ć„ćŖć‘ć‚Œć°ćŖć‚Šć¾ć›ć‚“ć€‚ć‚³ćƒ¼ćƒ‰ć‚’å†č§£ęžć—ć¦ć€č‡“å‘½ēš„ćŖć‚Øćƒ©ćƒ¼ćŒćŖć„ć“ćØć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚ - + Project files (*.cppcheck);;All files(*.*) ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.cppcheck);;ć™ć¹ć¦ć®ćƒ•ć‚”ć‚¤ćƒ«(*.*) - + Select Project File ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć‚’éøęŠž - + Failed to open file ćƒ•ć‚”ć‚¤ćƒ«ć‚’é–‹ćć®ć«å¤±ę•—ć—ć¾ć—ćŸ - + Unknown project file format ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć®å½¢å¼ćŒäøę˜Žć§ć™ - + Failed to import project file ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸ - + Failed to import '%1': %2 Analysis is stopped. @@ -1285,70 +1271,70 @@ Analysis is stopped. č§£ęžć‚’åœę­¢ć—ć¾ć—ćŸć€‚ - + Failed to import '%1' (%2), analysis is stopped '%1' (%2) ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸć€‚č§£ęžćÆåœę­¢ - + Install ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ« - + New version available: %1. %2 ę–°ć—ć„ćƒćƒ¼ć‚øćƒ§ćƒ³ćŒåˆ©ē”ØåÆčƒ½ć§ć™ć€‚: %1. %2 - - - - + + + + Project: ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆ: - + No suitable files found to analyze! ćƒć‚§ćƒƒć‚ÆåÆ¾č±”ć®ćƒ•ć‚”ć‚¤ćƒ«ćŒćæć¤ć‹ć‚Šć¾ć›ć‚“! - + C/C++ Source C/C++ć®ć‚½ćƒ¼ć‚¹ć‚³ćƒ¼ćƒ‰ - + Compile database ć‚³ćƒ³ćƒ‘ć‚¤ćƒ«ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze ćƒć‚§ćƒƒć‚ÆåÆ¾č±”ć®ćƒ•ć‚”ć‚¤ćƒ«ć‚’éøęŠž - + Select directory to analyze ćƒć‚§ćƒƒć‚Æć™ć‚‹ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’éøęŠžć—ć¦ćć ć•ć„ - + Select the configuration that will be analyzed ćƒć‚§ćƒƒć‚Æć®čØ­å®šć‚’éøęŠž - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1357,37 +1343,37 @@ Do you want to proceed analysis without using any of these project files? - + Duplicate define é‡č¤‡ć—ćŸå®šē¾© - + File not found: '%1' ćƒ•ć‚”ć‚¤ćƒ«ćŒć‚ć‚Šć¾ć›ć‚“: '%1' - + Failed to load/setup addon %1: %2 ć‚¢ćƒ‰ć‚Ŗćƒ³ć®čŖ­ćæč¾¼ćæć¾ćŸćÆčØ­å®šć«å¤±ę•— %1 - %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. %1ć®ćƒ­ćƒ¼ćƒ‰ć«å¤±ę•—ć—ć¾ć—ćŸć€‚ć‚ćŖćŸć® Cppcheck ćÆę­£ć—ćć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚ć‚ćŖćŸćÆ --data-dir=<directory> ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć‚’ä½æć£ć¦ć“ć®ćƒ•ć‚”ć‚¤ćƒ«ć®å “ę‰€ć‚’ęŒ‡å®šć§ćć¾ć™ć€‚ćŸć ć—ć€ć“ć® --data-dir ćÆć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć«ć‚ˆć£ć¦ä½æē”Øć•ć‚Œć¦ć„ćŖć‘ć‚Œć°ćŖć‚Šć¾ć›ć‚“ć€‚ć¾ćŸGUIē‰ˆćÆć“ć‚Œć‚’ä½æē”Øć—ć¾ć›ć‚“ć€‚ć•ć‚‰ć«ć€å…Øć¦ć®čØ­å®šćÆčŖæę•“ęøˆćæć§ćŖć‘ć‚Œć°ćŖć‚Šć¾ć›ć‚“ć€‚ - + Failed to load %1 - %2 Analysis is aborted. 読み込みに失敗 %1 - %2 - - + + %1 Analysis is aborted. @@ -1396,7 +1382,7 @@ Analysis is aborted. č§£ęžćÆäø­ę­¢ć—ćŸć€‚ - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1406,7 +1392,7 @@ Do you want to proceed? ꖰ恗恏XMLćƒ•ć‚”ć‚¤ćƒ«ć‚’é–‹ććØē¾åœØć®ēµęžœćŒå‰Šé™¤ć•ć‚Œć¾ć™ć€‚å®Ÿč”Œć—ć¾ć™ć‹ļ¼Ÿ - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1415,77 +1401,77 @@ Do you want to stop the analysis and exit Cppcheck? ćƒć‚§ćƒƒć‚Æć‚’äø­ę–­ć—ć¦ć€Cppcheckを終了しますか? - + About CppCheck恫恤恄恦 - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML ćƒ•ć‚”ć‚¤ćƒ« (*.xml);;ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.txt);;CSVćƒ•ć‚”ć‚¤ćƒ« (*.csv) - + Build dir '%1' does not exist, create it? ćƒ“ćƒ«ćƒ‰ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖ'%1'ćŒć‚ć‚Šć¾ć›ć‚“ć€‚ä½œęˆć—ć¾ć™ć‹? - + To check the project using addons, you need a build directory. ć‚¢ćƒ‰ć‚Ŗćƒ³ć‚’ä½æē”Øć—ć¦ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ćŸć‚ć«ćÆć€ćƒ“ćƒ«ćƒ‰ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖćŒåæ…č¦ć§ć™ć€‚ - + Show Mandatory åæ…é ˆć‚’č”Øē¤ŗ - + Show Required 要求を蔨示 - + Show Advisory ęŽØå„Øć‚’č”Øē¤ŗ - + Show Document ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’č”Øē¤ŗ - + Show L1 L1を蔨示 - + Show L2 L2を蔨示 - + Show L3 L3を蔨示 - + Show style ć‚¹ć‚æć‚¤ćƒ«ć‚’č”Øē¤ŗ - + Show portability ē§»ę¤åÆčƒ½ę€§ć‚’č”Øē¤ŗ - + Show performance ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć‚’č”Øē¤ŗ - + Show information ęƒ…å ±ć‚’č”Øē¤ŗ @@ -1494,22 +1480,22 @@ Do you want to stop the analysis and exit Cppcheck? '%1'ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸć€‚(ćƒć‚§ćƒƒć‚Æäø­ę–­) - + Project files (*.cppcheck) ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.cppcheck) - + Select Project Filename ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«åć‚’éøęŠž - + No project file loaded ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ćŒčŖ­ćæč¾¼ć¾ć‚Œć¦ć„ć¾ć›ć‚“ - + The project file %1 @@ -1658,7 +1644,7 @@ Options: 定義(Define)ćÆć‚»ćƒŸć‚³ćƒ­ćƒ³';'ć§åŒŗåˆ‡ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚ 例: DEF1;DEF2=5;DEF3=int - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. ć‚«ć‚¹ć‚æćƒžć‚¤ć‚ŗć—ćŸ cfgćƒ•ć‚”ć‚¤ćƒ«ć‚’åŒć˜ćƒ•ć‚©ćƒ«ćƒ€ć«ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ćØć—ć¦äæå­˜ć—ć¦ćć ć•ć„ć€‚ć“ć“ć«č”Øē¤ŗć§ćć‚‹ć‚ˆć†ć«ćŖć‚Šć¾ć™ć€‚ @@ -1667,17 +1653,17 @@ Options: MISRA C 2012 - + MISRA rule texts MISRA ćƒ«ćƒ¼ćƒ«ćƒ†ć‚­ć‚¹ćƒˆ - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> <html><head/><body><p>MISRA C 2012 pdf恮Appendix A &quot;Summary of guidelines&quot; ć‹ć‚‰ćƒ†ć‚­ć‚¹ćƒˆć‚’ć‚³ćƒ”ćƒ¼ćƒšćƒ¼ć‚¹ćƒˆć—ć¦ćć ć•ć„ć€‚</p></body></html> - + ... ... @@ -1688,8 +1674,7 @@ Options: - - + Browse... å‚ē…§... @@ -1717,15 +1702,15 @@ Options: - + Edit 編集 - - + + Remove å–ć‚Šé™¤ć @@ -1745,155 +1730,169 @@ Options: ć‚¤ćƒ³ć‚Æćƒ«ćƒ¼ćƒ‰ćƒ‘ć‚¹: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions åž‹ćØé–¢ę•° - - + + Analysis ćƒć‚§ćƒƒć‚Æ - + This is a workfolder that Cppcheck will use for various purposes. CppcheckćŒć•ć¾ć–ć¾ćŖē›®ēš„ć§ä½æē”Øć™ć‚‹ćƒÆćƒ¼ć‚Æćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć€‚ - + Parser ćƒ‘ćƒ¼ć‚µćƒ¼ - + Cppcheck (built in) Cppcheckćƒ“ćƒ«ćƒˆć‚¤ćƒ³ - + Check level ćƒć‚§ćƒƒć‚Æćƒ¬ćƒ™ćƒ« - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. #R é™å®šēš„ -- é–‹ē™ŗč€…ćŒē›“ęŽ„ēš„ć«ēµęžœć‚’å¾—ć‚‹ćŸć‚ć®č§£ęžć‚’ę„å‘³ć—ć¾ć™ć€‚č§£ęžćÆé™å®šēš„ć§é«˜é€Ÿć§ć™ćŒć‚ˆć‚Šå°‘ćŖć„ēµęžœć«ćŖć‚Šć¾ć™ć€‚ - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. #N é€šåøø -- CIć§ć®é€šåøøć®č§£ęžć‚’ę„å‘³ć—ć¾ć™ć€‚č§£ęžćŒåˆē†ēš„ćŖę™‚é–“å†…ć«å®Œäŗ†ć™ć¹ćć§ć™ć€‚ - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). #E å¾¹åŗ•ēš„ -- ćƒŠć‚¤ćƒˆćƒŖćƒ¼ćƒ“ćƒ«ćƒ‰ē­‰ć‚’ę„å‘³ć—ć¾ć™ć€‚č§£ęžę™‚é–“ćÆć‚ˆć‚Šé•·ććŖć‚‹ć“ćØćŒć‚ć‚Šć¾ć™ (ć‚³ćƒ³ćƒ‘ć‚¤ćƒ«ć®10å€ä»„äøŠę™‚é–“ćŒć‹ć‹ć£ć¦ć‚‚ć‚ˆć„)怂 - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) ćƒ˜ćƒƒćƒ€ćƒ•ć‚”ć‚¤ćƒ«ć®ć‚³ćƒ¼ćƒ‰ć‚‚ćƒć‚§ćƒƒć‚Æ (é€šåøøćÆONć«ć—ć¦ćć ć•ć„ć€åˆ¶é™ć™ć‚‹ćØćć®ćæOFF) - Premium License - ćƒ—ćƒ¬ćƒŸć‚¢ćƒ ćƒ©ć‚¤ć‚»ćƒ³ć‚¹ + ćƒ—ćƒ¬ćƒŸć‚¢ćƒ ćƒ©ć‚¤ć‚»ćƒ³ć‚¹ - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. ć‚æć‚°ćŒčæ½åŠ ć•ć‚ŒćŸå “åˆć€č­¦å‘ŠäøŠć§å³ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćć‚Œć‚‰ć®ć‚æć‚°ć®äø­ć®äø€ć¤ć‚’čØ­å®šć§ćć¾ć™ć€‚č­¦å‘Šć‚’åˆ†é”žć§ćć¾ć™ć€‚ - + Exclude source files é™¤å¤–ć™ć‚‹ć‚½ćƒ¼ć‚¹ćƒ•ć‚”ć‚¤ćƒ« - + Exclude folder... ćƒ•ć‚©ćƒ«ćƒ€ć§é™¤å¤–... - + Exclude file... ćƒ•ć‚”ć‚¤ćƒ«ć§é™¤å¤–... - + Check that each class has a safe public interface ć‚Æćƒ©ć‚¹ćŒå®‰å…Øć§å…¬é–‹ć•ć‚ŒćŸć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹ć‚’ć‚‚ć£ć¦ć„ć‚‹ć‹ē¢ŗčŖ - + Limit analysis č§£ęžć®åˆ¶é™ - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) ęœŖä½æē”Øćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć®ć‚³ćƒ¼ćƒ‰ć‚‚ćƒć‚§ćƒƒć‚Æ (č§£ęžć«ę™‚é–“ćŒć‹ć‹ć‚Šć€ć¾ćŸę­£ē¢ŗę€§ćÆä½Žć„) - + Max CTU depth CTUć®ęœ€å¤§ę·±ć• - + Enable inline suppressions inlineęŠ‘åˆ¶ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ - + Misra C MISRA C - + 2012 2012 - - + + 2023 2023 - + 2025 2025 - + Misra C++ MISRA C++ - + 2008 2008 - + Cert C++ Cert C++ - + Safety profiles (defined in C++ core guidelines) å®‰å…Øę€§ćƒ—ćƒ­ćƒ•ć‚”ć‚¤ćƒ«(C++ć‚³ć‚¢ć‚¬ć‚¤ćƒ‰ćƒ©ć‚¤ćƒ³ć§å®šē¾©) - + Bug hunting (Premium) ćƒć‚°ćƒćƒ³ćƒ†ć‚£ćƒ³ć‚°(ćƒ—ćƒ¬ćƒŸć‚¢ćƒ ) - + External tools å¤–éƒØćƒ„ćƒ¼ćƒ« @@ -1908,88 +1907,88 @@ Options: äø‹ - + Platform ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ  - + Clang (experimental) Clang (å®ŸéØ“ēš„) - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. åÆčƒ½ćŖé™ć‚Šć‚Æćƒ©ć‚¹ćŒęŸ”č»Ÿć§ć‚ć‚Šå …ē‰¢ć§ć‚ć‚‹ć“ćØć‚’ęœ›ć‚€å “åˆć€å…¬é–‹ć•ć‚ŒćŸć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹ćŒéžåøøć«å …ē‰¢ć§ć™ć€‚CppcheckćÆå¼•ę•°ćŒć‚ć‚‰ć‚†ć‚‹å€¤ć‚’ćØć‚Šć†ć‚‹ćØä»®å®šć—ć¾ć™ć€‚ - + Max recursion in template instantiation ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹åŒ–ć®ęœ€å¤§å†åø°å›žę•° - + Warning options č­¦å‘Šć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ - + Root path: ćƒ«ćƒ¼ćƒˆćƒ‘ć‚¹: - + Filepaths in warnings will be relative to this path č­¦å‘Šäø­ć®ćƒ•ć‚”ć‚¤ćƒ«ćƒ‘ć‚¹ćÆć“ć®ćƒ‘ć‚¹ć‹ć‚‰ć®ē›øåÆ¾ćƒ‘ć‚¹ć«ćŖć‚Šć¾ć™ - + Warning tags (separated by semicolon) č­¦å‘Šć‚æć‚°(ć‚»ćƒŸć‚³ćƒ­ćƒ³åŒŗåˆ‡ć‚Š) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) Cppcheck ćƒ“ćƒ«ćƒ‰ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖ (å…Øćƒ—ćƒ­ć‚°ćƒ©ćƒ ćƒć‚§ćƒƒć‚Æ, å·®åˆ†ćƒć‚§ćƒƒć‚Æ, ēµ±čØˆē­‰) - + Libraries ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖ - + Suppressions ęŒ‡ę‘˜ć®ęŠ‘åˆ¶ - + Add 追加 - - + + Addons ć‚¢ćƒ‰ć‚Ŗćƒ³ - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. ę³Øę„: ć‚¢ćƒ‰ć‚Ŗćƒ³ć«ćÆ<a href="https://www.python.org/">Python</a>ćŒåæ…č¦ć§ć™ć€‚ - + Y2038 Y2038 - + Thread safety ć‚¹ćƒ¬ćƒƒćƒ‰ć‚»ćƒ¼ćƒ• - + Coding standards ć‚³ćƒ¼ćƒ‡ć‚£ćƒ³ć‚°ęØ™ęŗ– @@ -1998,12 +1997,12 @@ Options: MISRA C 2012 - + Cert C CERT C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) CERT-INT35-C: intåž‹ć®ē²¾åŗ¦ (ć‚‚ć—ć‚µć‚¤ć‚ŗćŒē²¾åŗ¦ćØäø€č‡“ć™ć‚‹å “åˆē©ŗć®ć¾ć¾ć«ć—ć¦ćć ć•ć„) @@ -2012,22 +2011,22 @@ Options: MISRA C++ 2008 - + Autosar AUTOSAR - + Bug hunting ćƒć‚°ćƒćƒ³ćƒˆ - + Clang analyzer Clang Analyzer - + Clang-tidy Clang-tidy @@ -2040,82 +2039,93 @@ Options: ProjectFileDialog - + Project file: %1 ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«:%1 - + Select Cppcheck build dir Cppcheckćƒ“ćƒ«ćƒ‰ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖ - + Select include directory includećƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’éøęŠž - + Select a directory to check ćƒć‚§ćƒƒć‚Æć™ć‚‹ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’éøęŠžć—ć¦ćć ć•ć„ - + Note: Open source Cppcheck does not fully implement Misra C 2012 ę³Øę„: ć‚Ŗćƒ¼ćƒ—ćƒ³ć‚½ćƒ¼ć‚¹ć®CppcheckはMisra C 2012ć‚’å®Œå…Øć«ć‚µćƒćƒ¼ćƒˆć—ć¦ć„ć¾ć›ć‚“ć€‚ - + Clang-tidy (not found) Clang-tidy (ćæć¤ć‹ć‚Šć¾ć›ć‚“) - + Visual Studio Visual Studio - + Compile database ć‚³ćƒ³ćƒ‘ć‚¤ćƒ«ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ - + Borland C++ Builder 6 Borland C++ Builder 6 - + Import Project ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆ - + + C/C++ header + + + + + Include file + + + + Select directory to ignore é™¤å¤–ć™ć‚‹ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’éøęŠžć—ć¦ćć ć•ć„ - + Source files ć‚½ćƒ¼ć‚¹ćƒ•ć‚”ć‚¤ćƒ« - + + All files å…Øćƒ•ć‚”ć‚¤ćƒ« - + Exclude file é™¤å¤–ćƒ•ć‚”ć‚¤ćƒ« - + Select MISRA rule texts file MISRAćƒ«ćƒ¼ćƒ«ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚”ć‚¤ćƒ«ć‚’éøęŠž - + MISRA rule texts file (%1) MISRAćƒ«ćƒ¼ćƒ«ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚”ć‚¤ćƒ« (%1) @@ -2156,7 +2166,7 @@ Options: 蔌 %1: åæ…é ˆć®å±žę€§ '%2' が '%3'にない - + (Not found) (č¦‹ć¤ć‹ć‚Šć¾ć›ć‚“) @@ -2600,61 +2610,61 @@ Please check the application path and parameters are correct. č­¦å‘Šć®č©³ē“° - - + + Failed to save the report. ćƒ¬ćƒćƒ¼ćƒˆć®äæå­˜ć«å¤±ę•—ć—ć¾ć—ćŸć€‚ - + Print Report ćƒ¬ćƒćƒ¼ćƒˆć®å°åˆ· - + No errors found, nothing to print. ęŒ‡ę‘˜ćŒćŖć„ćŸć‚ć€å°åˆ·ć™ć‚‹ć‚‚ć®ćŒć‚ć‚Šć¾ć›ć‚“ć€‚ - + %p% (%1 of %2 files checked) %p% (%1 / %2 :ćƒ•ć‚”ć‚¤ćƒ«ę•°) - - + + Cppcheck Cppcheck - + No errors found. č­¦å‘Š/ć‚Øćƒ©ćƒ¼ćÆč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ć§ć—ćŸć€‚ - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. č­¦å‘Š/ć‚Øćƒ©ćƒ¼ćŒč¦‹ć¤ć‹ć‚Šć¾ć—ćŸćŒć€éžč”Øē¤ŗčØ­å®šć«ćŖć£ć¦ć„ć¾ć™ć€‚ - - + + Failed to read the report. ćƒ¬ćƒćƒ¼ćƒˆć®čŖ­ćæč¾¼ćæć«å¤±ę•—. - + XML format version 1 is no longer supported. XML ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆćƒćƒ¼ć‚øćƒ§ćƒ³ 1 ćÆć‚‚ć†ć‚µćƒćƒ¼ćƒˆć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚ - + First included by ćÆę¬”ć®ć‚‚ć®ćŒęœ€åˆć«ć‚¤ćƒ³ć‚Æćƒ«ćƒ¼ćƒ‰ć—ć¾ć—ćŸ - + Id ID @@ -2663,42 +2673,42 @@ To toggle what kind of errors are shown, open view menu. ćƒć‚°ćƒćƒ³ćƒˆć®č§£ęžćÆäøå®Œå…Øć§ć™ - + Clear Log ćƒ­ć‚°ć®ę¶ˆåŽ» - + Copy this Log entry ć“ć®ćƒ­ć‚°é …ē›®ć‚’ć‚³ćƒ”ćƒ¼ - + Copy complete Log ćƒ­ć‚°å…Øä½“ć‚’ć‚³ćƒ”ćƒ¼ - + Analysis was stopped č§£ęžćÆåœę­¢ć—ć—ćŸ - + There was a critical error with id '%1' id '%1'ć®č‡“å‘½ēš„ćŖć‚Øćƒ©ćƒ¼ćŒć‚ć‚Šć¾ć™ - + when checking %1 %1 ć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ćØć - + when checking a file ćƒ•ć‚”ć‚¤ćƒ«ć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ćØć - + Analysis was aborted. č§£ęžćÆäø­ę­¢ć—ćŸć€‚ @@ -2984,14 +2994,14 @@ To toggle what kind of errors are shown, open view menu. - - + + Statistics ēµ±čØˆęƒ…å ± - + Project ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆ @@ -3022,7 +3032,7 @@ To toggle what kind of errors are shown, open view menu. - + Previous Scan å‰å›žć®č§£ęž @@ -3102,103 +3112,103 @@ To toggle what kind of errors are shown, open view menu. PDF ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆ - + 1 day 一旄 - + %1 days %1ę—„ - + 1 hour 一時間 - + %1 hours %1Ꙃ間 - + 1 minute äø€åˆ† - + %1 minutes %1分 - + 1 second 一秒 - + %1 seconds %1ē§’ - + 0.%1 seconds 0.%1ē§’ - + and と - + Export PDF PDF ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆ - + Project Settings ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć®čØ­å®š - + Paths ćƒ‘ć‚¹ - + Include paths ć‚¤ćƒ³ć‚Æćƒ«ćƒ¼ćƒ‰ćƒ‘ć‚¹ - + Defines 定義(define) - + Undefines å®šē¾©å–ć‚Šę¶ˆć—(Undef) - + Path selected éøęŠžć•ć‚ŒćŸćƒ‘ć‚¹ - + Number of files scanned ć‚¹ć‚­ćƒ£ćƒ³ć—ćŸćƒ•ć‚”ć‚¤ćƒ«ć®ę•° - + Scan duration ć‚¹ć‚­ćƒ£ćƒ³ęœŸé–“ - - + + Errors ć‚Øćƒ©ćƒ¼ @@ -3213,32 +3223,32 @@ To toggle what kind of errors are shown, open view menu. cppcheckćƒ“ćƒ«ćƒ‰ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖćŒć‚ć‚Šć¾ć›ć‚“ - - + + Warnings č­¦å‘Š - - + + Style warnings ć‚¹ć‚æć‚¤ćƒ«č­¦å‘Š - - + + Portability warnings ē§»ę¤åÆčƒ½ę€§č­¦å‘Š - - + + Performance warnings ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹č­¦å‘Š - - + + Information messages ęƒ…å ±ćƒ”ćƒƒć‚»ćƒ¼ć‚ø diff --git a/gui/cppcheck_ka.ts b/gui/cppcheck_ka.ts index ecc47d7d090..f6d571ab3f5 100644 --- a/gui/cppcheck_ka.ts +++ b/gui/cppcheck_ka.ts @@ -109,65 +109,52 @@ Parameters: -l(line) (file) ComplianceReportDialog - Compliance Report - įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜ + įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜ - Project name - įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ”įƒįƒ®įƒ”įƒšįƒ˜ + įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ”įƒįƒ®įƒ”įƒšįƒ˜ - Project version - įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ•įƒ”įƒ įƒ”įƒ˜įƒ + įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ•įƒ”įƒ įƒ”įƒ˜įƒ - Coding Standard - įƒ™įƒįƒ“įƒ˜įƒ įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ˜ + įƒ™įƒįƒ“įƒ˜įƒ įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ˜ - Misra C - Misra C + Misra C - Cert C - Cert C + Cert C - Cert C++ - Cert C++ + Cert C++ - List of files with md5 checksums - MD5 įƒ”įƒįƒ™įƒįƒœįƒ¢įƒ įƒįƒšįƒ įƒÆįƒįƒ›įƒ”įƒ‘įƒ˜įƒ” įƒ›įƒ„įƒįƒœįƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” ეია + MD5 įƒ”įƒįƒ™įƒįƒœįƒ¢įƒ įƒįƒšįƒ įƒÆįƒįƒ›įƒ”įƒ‘įƒ˜įƒ” įƒ›įƒ„įƒįƒœįƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” ეია - Compliance report - įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜ + įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜ - HTML files (*.html) - HTML įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.html) + HTML įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.html) - - Save compliance report - įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒØįƒ”įƒœįƒįƒ®įƒ•įƒ + įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒØįƒ”įƒœįƒįƒ®įƒ•įƒ - Failed to import '%1' (%2), can not show files in compliance report - '%1'-იე (%2) įƒØįƒ”įƒ›įƒįƒ¢įƒįƒœįƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ. įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒØįƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ” įƒ•įƒ”įƒ  įƒ•įƒįƒ©įƒ•įƒ”įƒœįƒ”įƒ‘ + '%1'-იე (%2) įƒØįƒ”įƒ›įƒįƒ¢įƒįƒœįƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ. įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒØįƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ” įƒ•įƒ”įƒ  įƒ•įƒįƒ©įƒ•įƒ”įƒœįƒ”įƒ‘ @@ -209,12 +196,12 @@ Parameters: -l(line) (file) įƒ˜įƒœįƒ“įƒ”įƒ„įƒ”įƒ˜ - + Helpfile '%1' was not found įƒ“įƒįƒ®įƒ›įƒįƒ įƒ”įƒ‘įƒ˜įƒ” ფაილი '%1' įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ” - + Cppcheck Cppcheck @@ -478,30 +465,30 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + A&nalyze ა&įƒœįƒįƒšįƒ˜įƒ–įƒ˜ - + Standard įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ£įƒšįƒ˜ @@ -511,245 +498,245 @@ Parameters: -l(line) (file) &ფაილი - + &View &įƒ®įƒ”įƒ“įƒ˜ - + &Toolbars &įƒ®įƒ”įƒšįƒ”įƒįƒ¬įƒ§įƒįƒ—įƒ įƒ–įƒįƒšįƒ”įƒ‘įƒ˜ - + C++ standard C++-იე įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ˜ - + &C standard C standard &C-იე įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ˜ - + &Edit &įƒ©įƒįƒ”įƒ¬įƒįƒ įƒ”įƒ‘įƒ - + &License... &įƒšįƒ˜įƒŖįƒ”įƒœįƒ–įƒ˜įƒ... - + A&uthors... &įƒįƒ•įƒ¢įƒįƒ įƒ”įƒ‘įƒ˜... - + &About... &įƒØįƒ”įƒ”įƒįƒ®įƒ”įƒ‘... - + &Files... ფაილ&įƒ”įƒ‘įƒ˜... - - + + Analyze files Check files įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ - + Ctrl+F Ctrl+F - + &Directory... &įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ”.... - - + + Analyze directory Check directory įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ˜įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop &įƒ’įƒįƒ©įƒ”įƒ įƒ”įƒ‘įƒ - - + + Stop analysis Stop checking įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ” įƒ’įƒįƒ©įƒ”įƒ įƒ”įƒ‘įƒ - + Esc Esc - + &Save results to file... įƒØįƒ”įƒ“įƒ”įƒ’įƒ”įƒ‘įƒ˜&ე įƒØįƒ”įƒœįƒįƒ®įƒ•įƒ ფაილში.... - + Ctrl+S Ctrl+S - + &Quit įƒ’įƒįƒ›įƒįƒ”įƒ•įƒšįƒ - + &Clear results įƒØįƒ”įƒ“įƒ”įƒ’įƒ”įƒ‘įƒ˜įƒ” &įƒ’įƒįƒ”įƒ£įƒ¤įƒ—įƒįƒ•įƒ”įƒ‘įƒ - + &Preferences &įƒ’įƒįƒ›įƒįƒ įƒ—įƒ•įƒ - - - + + + Show errors įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - - - + + + Show warnings įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - - + + Show performance warnings įƒ¬įƒįƒ įƒ›įƒįƒ“įƒįƒ‘įƒ˜įƒ” įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + Show &hidden įƒ“įƒįƒ›įƒįƒšįƒ£įƒšįƒ˜įƒ” &įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - - + + Information įƒ˜įƒœįƒ¤įƒįƒ įƒ›įƒįƒŖįƒ˜įƒ - + Show information messages įƒ˜įƒœįƒ¤įƒįƒ įƒ›įƒįƒŖįƒ˜įƒ˜įƒ” įƒØįƒ”įƒ¢įƒ§įƒįƒ‘įƒ˜įƒœįƒ”įƒ‘įƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + Show portability warnings įƒ’įƒįƒ“įƒįƒ¢įƒįƒœįƒįƒ“įƒįƒ‘įƒ˜įƒ” įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + Show Cppcheck results Cppcheck-იე įƒØįƒ”įƒ“įƒ”įƒ’įƒ”įƒ‘įƒ˜ įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + Clang Clang - + Show Clang results Clang-იე įƒØįƒ”įƒ“įƒ”įƒ’įƒ”įƒ‘įƒ˜ įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + &Filter &ფილტრი - + Filter results įƒØįƒ”įƒ“įƒ”įƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ’įƒįƒ¤įƒ˜įƒšįƒ¢įƒ•įƒ įƒ - + Windows 32-bit ANSI Windows 32-bit ANSI - + Windows 32-bit Unicode Windows 32-bit Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... &įƒ‘įƒ”įƒ­įƒ“įƒ•įƒā€¦ - + Print the Current Report įƒ›įƒ˜įƒ›įƒ“įƒ˜įƒœįƒįƒ įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒ“įƒįƒ‘įƒ”įƒ­įƒ“įƒ•įƒ - + Print Pre&view... įƒ”įƒįƒ‘įƒ”įƒ­įƒ“įƒ˜įƒ” &įƒ’įƒįƒ“įƒįƒ®įƒ”įƒ“įƒ•įƒ... - + Open a Print Preview Dialog for the Current Results įƒ›įƒ˜įƒ›įƒ“įƒ˜įƒœįƒįƒ įƒ” įƒØįƒ”įƒ“įƒ”įƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ“įƒįƒ‘įƒ”įƒ­įƒ“įƒ•įƒ˜įƒ” įƒ›įƒ˜įƒœįƒ˜įƒįƒ¢įƒ£įƒ įƒ˜įƒ” įƒ“įƒ˜įƒįƒšįƒįƒ’įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + Open library editor įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ˜įƒ” įƒ įƒ”įƒ“įƒįƒ„įƒ¢įƒįƒ įƒ˜įƒ” įƒ’įƒįƒ®įƒ”įƒœįƒ - + &Check all &įƒ§įƒ•įƒ”įƒšįƒįƒ” įƒ©įƒįƒ įƒ—įƒ•įƒ @@ -764,336 +751,336 @@ Parameters: -l(line) (file) įƒ“įƒįƒ›įƒįƒšįƒ•įƒ - - + + Report - + Filter ფილტრი - + &Reanalyze modified files &Recheck modified files įƒ§įƒ•įƒ”įƒšįƒ įƒØįƒ”įƒŖįƒ•įƒšįƒ˜įƒšįƒ˜ ფაილიე įƒ—įƒįƒ•įƒ˜įƒ“įƒįƒœ ანალი&įƒ–įƒ˜ - + Reanal&yze all files &įƒ§įƒ•įƒ”įƒšįƒ ფაილიე įƒ—įƒįƒ•įƒ˜įƒ“įƒįƒœ įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ - + Ctrl+Q Ctrl+Q - + Style war&nings ე&ტილიე įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜ - + E&rrors &įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜ - + &Uncheck all įƒ§įƒ•įƒ”įƒšįƒįƒ” įƒ©įƒįƒ›įƒįƒ§&რა - + Collapse &all įƒ§įƒ•įƒ”įƒšįƒįƒ” įƒ©įƒįƒ™įƒ”įƒŖįƒ•&ა - + &Expand all &įƒ§įƒ•įƒ”įƒšįƒįƒ” įƒįƒ›įƒįƒ™įƒ”įƒŖįƒ•įƒ - + &Standard &įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ£įƒšįƒ˜ - + Standard items įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ£įƒšįƒ˜ įƒ”įƒšįƒ”įƒ›įƒ”įƒœįƒ¢įƒ”įƒ‘įƒ˜ - + Toolbar įƒ®įƒ”įƒšįƒ”įƒįƒ¬įƒ§įƒįƒ—įƒ įƒ–įƒįƒšįƒ˜ - + &Categories &įƒ™įƒįƒ¢įƒ”įƒ’įƒįƒ įƒ˜įƒ”įƒ‘įƒ˜ - + Error categories įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ˜įƒ” įƒ™įƒįƒ¢įƒ”įƒ’įƒįƒ įƒ˜įƒ”įƒ‘įƒ˜ - + &Open XML... &XML-იე įƒ’įƒįƒ®įƒ”įƒœįƒ... - + Open P&roject File... įƒž&įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒ’įƒįƒ®įƒ”įƒœįƒ... - + Ctrl+Shift+O Ctrl+Shift+O - + Sh&ow Scratchpad... įƒ‘įƒš&įƒįƒ™įƒœįƒįƒ¢įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ... - + &New Project File... &ახალი įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი... - + Ctrl+Shift+N Ctrl+Shift+N - + &Log View ჟურნა&ლიე įƒ®įƒ”įƒ“įƒ˜ - + Log View ჟურნალიე įƒ®įƒ”įƒ“įƒ˜ - + C&lose Project File įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაი&ლიე įƒ“įƒįƒ®įƒ£įƒ įƒ•įƒ - + &Edit Project File... įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒ©įƒįƒ”įƒ¬įƒįƒ &įƒ”įƒ‘įƒ... - + &Statistics &įƒ”įƒ¢įƒįƒ¢įƒ˜įƒ”įƒ¢įƒ˜įƒ™įƒ - + &Warnings &įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜ - + Per&formance warnings įƒ¬įƒįƒ įƒ›įƒįƒ¢įƒ”įƒ‘įƒ˜įƒ” įƒ’įƒ&įƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜ - + &Information &įƒ˜įƒœįƒ¤įƒįƒ įƒ›įƒįƒŖįƒ˜įƒ - + &Portability &įƒ’įƒįƒ“įƒįƒ¢įƒįƒœįƒįƒ“įƒįƒ‘įƒ - + P&latforms įƒž&įƒšįƒįƒ¢įƒ¤įƒįƒ įƒ›įƒ”įƒ‘įƒ˜ - + C++&11 C++&11 - + C&99 C&99 - + &Posix &Posix - + C&11 C&11 - + &C89 &C89 - + &C++03 &C++03 - + &Library Editor... įƒ‘įƒ˜įƒ‘&įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ˜įƒ” įƒ įƒ”įƒ“įƒįƒ„įƒ¢įƒįƒ įƒ˜... - + &Auto-detect language įƒ”įƒœįƒ˜įƒ” &įƒįƒ•įƒ¢įƒįƒ“įƒįƒ“įƒ’įƒ”įƒœįƒ - + &Enforce C++ ძ&įƒįƒšįƒ˜įƒ— C++ - + E&nforce C ძა&įƒšįƒ˜įƒ— C - + C++14 C++14 - + Reanalyze and check library įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ˜įƒ” įƒ—įƒįƒ•įƒ˜įƒ“įƒįƒœ įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ“įƒ įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ - + Check configuration (defines, includes) įƒ™įƒįƒœįƒ¤įƒ˜įƒ’įƒ£įƒ įƒįƒŖįƒ˜įƒ˜įƒ” įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ (defines, includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜... - + Normal įƒœįƒįƒ įƒ›įƒįƒšįƒ£įƒ įƒ˜ - + Misra C Misra C - + Misra C++ 2008 - + Cert C Cert C - + Cert C++ Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents &įƒØįƒ”įƒ›įƒŖįƒ•įƒ”įƒšįƒįƒ‘įƒ - + Categories įƒ™įƒįƒ¢įƒ”įƒ’įƒįƒ įƒ˜įƒ”įƒ‘įƒ˜ - - + + Show style warnings ეტილიე įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + Open the help contents įƒ“įƒįƒ®įƒ›įƒįƒ įƒ”įƒ‘įƒ˜įƒ” įƒØįƒ”įƒ›įƒŖįƒ•įƒ”įƒšįƒįƒ‘įƒ˜įƒ” įƒ’įƒįƒ®įƒ”įƒœįƒ - + F1 F1 - + &Help &įƒ“įƒįƒ®įƒ›įƒįƒ įƒ”įƒ‘įƒ - - + + Quick Filter: ეწრაფი ფილტრი: - + Select configuration įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ™įƒįƒœįƒ¤įƒ˜įƒ’įƒ£įƒ įƒįƒŖįƒ˜įƒ - + Found project file: %1 Do you want to load this project file instead? @@ -1102,61 +1089,61 @@ Do you want to load this project file instead? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ—, įƒ”įƒįƒ›įƒįƒ’įƒ˜įƒ”įƒ įƒįƒ“, įƒ”įƒ” įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒįƒ—? - + File not found ფაილი įƒœįƒįƒžįƒįƒ•įƒœįƒ˜ არაა - + Bad XML įƒįƒ įƒįƒ”įƒ¬įƒįƒ įƒ˜ XML - + Missing attribute įƒįƒ™įƒšįƒ˜įƒ įƒįƒ¢įƒ įƒ˜įƒ‘įƒ£įƒ¢įƒ˜ - + Bad attribute value įƒįƒ įƒįƒ”įƒ¬įƒįƒ įƒ˜ įƒįƒ¢įƒ įƒ˜įƒ‘įƒ£įƒ¢įƒ˜įƒ” įƒ›įƒœįƒ˜įƒØįƒ•įƒœįƒ”įƒšįƒįƒ‘įƒ - + Unsupported format įƒ›įƒ®įƒįƒ įƒ“įƒįƒ£įƒ­įƒ”įƒ įƒ”įƒšįƒ˜ įƒ¤įƒįƒ įƒ›įƒįƒ¢įƒ˜ - + Duplicate define įƒ’įƒįƒ›įƒ”įƒįƒ įƒ”įƒ‘įƒ£įƒšįƒ˜ įƒįƒ¦įƒ¬įƒ”įƒ įƒ - + Failed to load the selected library '%1'. %2 įƒ©įƒįƒ•įƒįƒ įƒ“įƒ įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒ•įƒ įƒ›įƒįƒœįƒ˜įƒØįƒœįƒ£įƒšįƒ˜ įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” '%1'. %2 - + File not found: '%1' ფაილი įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ”: '%1' - + Failed to load/setup addon %1: %2 įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒ˜įƒ” (%1) įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒ•įƒ/įƒ›įƒįƒ įƒ’įƒ”įƒ‘įƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. @@ -1165,8 +1152,8 @@ Analysis is aborted. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ“įƒ. - - + + %1 Analysis is aborted. @@ -1175,149 +1162,143 @@ Analysis is aborted. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ•įƒ”įƒ¢įƒ˜įƒšįƒ˜įƒ. - + License įƒšįƒ˜įƒŖįƒ”įƒœįƒ–įƒ˜įƒ - + Authors įƒįƒ•įƒ¢įƒįƒ įƒ”įƒ‘įƒ˜ - + Save the report file įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” ფაილში įƒ©įƒįƒ¬įƒ”įƒ įƒ - - + + XML files (*.xml) XML įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. - + You must close the project file before selecting new files or directories! ახალი įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” ან įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ”įƒ”įƒ‘įƒ˜įƒ” įƒįƒ įƒ©įƒ”įƒ•įƒįƒ›įƒ“įƒ” įƒžįƒ įƒįƒ įƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი įƒ£įƒœįƒ“įƒ įƒ“įƒįƒ®įƒ£įƒ įƒįƒ—! - + The library '%1' contains unknown elements: %2 įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ '%1' įƒ£įƒŖįƒœįƒįƒ‘ įƒ”įƒšįƒ”įƒ›įƒ”įƒœįƒ¢įƒ”įƒ‘įƒ” įƒØįƒ”įƒ˜įƒŖįƒįƒ•įƒ”: %2 - + Duplicate platform type įƒ’įƒįƒ›įƒ”įƒįƒ įƒ”įƒ‘įƒ£įƒšįƒ˜ įƒžįƒšįƒįƒ¢įƒ¤įƒįƒ įƒ›įƒ˜įƒ” įƒ¢įƒ˜įƒžįƒ˜ - + Platform type redefined įƒžįƒšįƒįƒ¢įƒ¤įƒįƒ įƒ›įƒ˜įƒ” įƒ¢įƒ˜įƒžįƒ˜ įƒ—įƒįƒ•įƒ“įƒįƒœ įƒįƒ¦įƒ˜įƒ¬įƒ”įƒ įƒ - + Unknown element įƒ£įƒŖįƒœįƒįƒ‘įƒ˜ įƒ”įƒšįƒ”įƒ›įƒ”įƒœįƒ¢įƒ˜ - - Unknown element - Unknown issue - įƒ£įƒŖįƒœįƒįƒ‘įƒ˜ įƒžįƒ įƒįƒ‘įƒšįƒ”įƒ›įƒ - - - - - - + + + + Error įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ - + Open the report file įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” ფაილიე įƒ’įƒįƒ®įƒ”įƒœįƒ - + Text files (*.txt) įƒ¢įƒ”įƒ„įƒ”įƒ¢įƒ£įƒ įƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.txt) - + CSV files (*.csv) CSV įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.csv) - + Project files (*.cppcheck);;All files(*.*) įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.cppcheck);;įƒ§įƒ•įƒ”įƒšįƒ ფაილი(*.*) - + Select Project File įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი - - - - + + + + Project: įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜: - + No suitable files found to analyze! įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒįƒ—įƒ•įƒ˜įƒ” įƒØįƒ”įƒ”įƒįƒ¤įƒ”įƒ įƒ˜įƒ”įƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ įƒįƒ¦įƒ›įƒįƒ©įƒ”įƒœįƒ˜įƒšįƒ˜ არაა! - + C/C++ Source C/C++ ეაწყიეი įƒ™įƒįƒ“įƒ˜ - + Compile database įƒ›įƒįƒœįƒįƒŖįƒ”įƒ›įƒ—įƒ įƒ‘įƒįƒ–įƒ˜įƒ” įƒ™įƒįƒ›įƒžįƒ˜įƒšįƒįƒŖįƒ˜įƒ - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze įƒįƒ˜įƒ įƒ©įƒ”įƒ— įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” - + Select directory to analyze įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” - + Select the configuration that will be analyzed įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ™įƒįƒœįƒ¤įƒ˜įƒ’įƒ£įƒ įƒįƒŖįƒ˜įƒ įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1326,7 +1307,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1337,7 +1318,7 @@ Do you want to proceed? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ—, įƒ’įƒįƒįƒ’įƒ įƒ«įƒ”įƒšįƒįƒ—? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1346,47 +1327,46 @@ Do you want to stop the analysis and exit Cppcheck? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ—, įƒ’įƒįƒįƒ©įƒ”įƒ įƒįƒ— įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ“įƒ įƒ’įƒįƒ®įƒ•įƒ˜įƒ“įƒ”įƒ— Cppcheck-įƒ“įƒįƒœ? - + About įƒØįƒ”įƒ”įƒįƒ®įƒ”įƒ‘ - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.xml);;įƒ¢įƒ”įƒ„įƒ”įƒ¢įƒ£įƒ įƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.txt);;CSV įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.csv) - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒ’įƒ”įƒœįƒ”įƒ įƒįƒŖįƒ˜įƒ ახლა įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ, įƒ įƒįƒ“įƒ’įƒįƒœ įƒÆįƒ”įƒ  įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ¬įƒįƒ įƒ›įƒįƒ¢įƒ”įƒ‘įƒ˜įƒ— įƒ£įƒœįƒ“įƒ įƒ“įƒįƒ”įƒ įƒ£įƒšįƒ“įƒ”įƒ”. įƒ”įƒŖįƒįƒ“įƒ”įƒ—, įƒ™įƒįƒ“įƒ˜įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ—įƒįƒ•įƒ˜įƒ“įƒįƒœ įƒ’įƒįƒ£įƒØįƒ•įƒįƒ— įƒ“įƒ įƒ“įƒįƒ įƒ¬įƒ›įƒ£įƒœįƒ“įƒ”įƒ—, įƒ įƒįƒ› įƒ™įƒ įƒ˜įƒ¢įƒ˜įƒ™įƒ£įƒšįƒ˜ įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜ არ įƒįƒ įƒ”įƒ”įƒ‘įƒįƒ‘įƒ”. + įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒ’įƒ”įƒœįƒ”įƒ įƒįƒŖįƒ˜įƒ ახლა įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ, įƒ įƒįƒ“įƒ’įƒįƒœ įƒÆįƒ”įƒ  įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ¬įƒįƒ įƒ›įƒįƒ¢įƒ”įƒ‘įƒ˜įƒ— įƒ£įƒœįƒ“įƒ įƒ“įƒįƒ”įƒ įƒ£įƒšįƒ“įƒ”įƒ”. įƒ”įƒŖįƒįƒ“įƒ”įƒ—, įƒ™įƒįƒ“įƒ˜įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ—įƒįƒ•įƒ˜įƒ“įƒįƒœ įƒ’įƒįƒ£įƒØįƒ•įƒįƒ— įƒ“įƒ įƒ“įƒįƒ įƒ¬įƒ›įƒ£įƒœįƒ“įƒ”įƒ—, įƒ įƒįƒ› įƒ™įƒ įƒ˜įƒ¢įƒ˜įƒ™įƒ£įƒšįƒ˜ įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜ არ įƒįƒ įƒ”įƒ”įƒ‘įƒįƒ‘įƒ”. - + Build dir '%1' does not exist, create it? įƒįƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” (%1) არ įƒįƒ įƒ”įƒ”įƒ‘įƒįƒ‘įƒ”. įƒØįƒ”įƒ•įƒ„įƒ›įƒœįƒ? - + To check the project using addons, you need a build directory. įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒ”įƒ‘įƒ˜įƒ— įƒØįƒ”įƒ”įƒįƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒšįƒįƒ“ įƒįƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” įƒ’įƒ­įƒ˜įƒ įƒ“įƒ”įƒ‘įƒįƒ—. - + Failed to open file ფაილიე įƒ’įƒįƒ®įƒ”įƒœįƒ˜įƒ” įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ - + Unknown project file format įƒ£įƒŖįƒœįƒįƒ‘įƒ˜ įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒ¤įƒįƒ įƒ›įƒįƒ¢įƒ˜ - + Failed to import project file įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒØįƒ”įƒ›įƒįƒ¢įƒįƒœįƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ - + Failed to import '%1': %2 Analysis is stopped. @@ -1395,27 +1375,27 @@ Analysis is stopped. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ“įƒ. - + Failed to import '%1' (%2), analysis is stopped '%1'-იე (%2) įƒØįƒ”įƒ›įƒįƒ¢įƒįƒœįƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ“įƒ - + Project files (*.cppcheck) įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.cppcheck) - + Select Project Filename įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒ”įƒįƒ®įƒ”įƒšįƒ˜ - + No project file loaded įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒ£įƒšįƒ˜ არაა - + The project file %1 @@ -1432,67 +1412,67 @@ Do you want to remove the file from the recently used projects -list? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ— įƒ¬įƒįƒØįƒįƒšįƒįƒ— įƒ”įƒ” ფაილი ახლახან įƒ’įƒįƒ›įƒįƒ§įƒ”įƒœįƒ”įƒ‘įƒ£įƒšįƒ˜ įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒ˜įƒ˜įƒ“įƒįƒœ? - + Install įƒ“įƒįƒ§įƒ”įƒœįƒ”įƒ‘įƒ - + New version available: %1. %2 įƒ®įƒ”įƒšįƒ›įƒ˜įƒ”įƒįƒ¬įƒ•įƒ“įƒįƒ›įƒ˜įƒ ახალი įƒ•įƒ”įƒ įƒ”įƒ˜įƒ: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1636,67 +1616,67 @@ Options: įƒįƒ¦įƒ¬įƒ”įƒ įƒ”įƒ‘įƒ˜ įƒ¬įƒ”įƒ įƒ¢įƒ˜įƒšįƒ›įƒ«įƒ˜įƒ›įƒ˜įƒ— įƒ£įƒœįƒ“įƒ įƒ˜įƒ§įƒįƒ” įƒ’įƒįƒ›įƒįƒ§įƒįƒ¤įƒ˜įƒšįƒ˜. įƒ›įƒįƒ’: DEF1;DEF2=5;DEF3=int - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. įƒØįƒ”įƒœįƒ˜įƒØįƒ•įƒœįƒ: įƒ©įƒįƒ“įƒ”įƒ— įƒ—įƒ„įƒ•įƒ”įƒœįƒ˜ .cfg įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ įƒ˜įƒ’įƒ˜įƒ•įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ”įƒØįƒ˜, įƒ”įƒįƒ“įƒįƒŖ įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილია. įƒ›įƒįƒ— įƒ–įƒ”įƒ›įƒįƒ— įƒ“įƒįƒ˜įƒœįƒįƒ®įƒįƒ•įƒ—. - + Clang (experimental) Clang (įƒ”įƒ„įƒ”įƒžįƒ”įƒ įƒ˜įƒ›įƒ”įƒœįƒ¢įƒ£įƒšįƒ˜) - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) įƒ—įƒįƒ•įƒ”įƒįƒ įƒ—įƒ˜įƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒØįƒ˜ įƒįƒ įƒ”įƒ”įƒ‘įƒ£įƒšįƒ˜ įƒ™įƒįƒ“įƒ˜įƒ” įƒØįƒ”įƒ¬įƒ›įƒ”įƒ‘įƒ (įƒœįƒįƒ’įƒ£įƒšįƒ˜įƒ”įƒ®įƒ›įƒ”įƒ•įƒįƒ“, įƒ”įƒ” įƒ©įƒįƒ įƒ—įƒ£įƒšįƒ˜įƒ. įƒ—įƒ£ įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ— įƒØįƒ”įƒ–įƒ¦įƒ£įƒ“įƒ£įƒšįƒ˜ ეწრაფი įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜, įƒ›įƒįƒØįƒ˜įƒœ įƒ’įƒįƒ›įƒįƒ įƒ—įƒ”įƒ— įƒ”įƒ”) - + Max recursion in template instantiation - + Filepaths in warnings will be relative to this path ფაილიე įƒ‘įƒ˜įƒšįƒ˜įƒ™įƒ”įƒ‘įƒ˜ įƒįƒ› įƒ‘įƒ˜įƒšįƒ˜įƒ™įƒ˜įƒ” įƒ¤įƒįƒ įƒ“įƒįƒ‘įƒ˜įƒ—įƒ˜ įƒ˜įƒ„įƒœįƒ”įƒ‘įƒ - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. įƒ—įƒ£ įƒ­įƒ“įƒ”įƒ”įƒ‘įƒ˜ įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒ£įƒšįƒ˜įƒ, įƒØįƒ”įƒ’įƒ˜įƒ«įƒšįƒ˜įƒįƒ—, įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ–įƒ” įƒ›įƒįƒ įƒÆįƒ•įƒ”įƒœįƒ įƒ¦įƒ˜įƒšįƒįƒ™įƒ˜įƒ— įƒ“įƒįƒįƒ¬įƒ™įƒįƒžįƒ£įƒœįƒįƒ— įƒ“įƒ įƒ“įƒįƒįƒ§įƒ”įƒœįƒįƒ— įƒ”įƒ įƒ—-įƒ”įƒ įƒ—įƒ˜ įƒ­įƒ“įƒ”. įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜įƒ” įƒ™įƒįƒ¢įƒ”įƒ’įƒįƒ įƒ˜įƒ”įƒ‘įƒįƒ“ įƒ“įƒįƒšįƒįƒ’įƒ”įƒ‘įƒ įƒ®įƒ”įƒšįƒ˜įƒ— įƒØįƒ”įƒ’įƒ˜įƒ«įƒšįƒ˜įƒįƒ—. - + Exclude source files įƒ™įƒįƒ“įƒ˜įƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒįƒ›įƒįƒ¦įƒ”įƒ‘įƒ - + Exclude folder... įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ˜įƒ” įƒįƒ›įƒįƒ¦įƒ”įƒ‘įƒ... - + Exclude file... ფაილიე įƒįƒ›įƒįƒ¦įƒ”įƒ‘įƒ... - + MISRA rule texts MISRA-იე įƒ¬įƒ”įƒ”įƒ˜įƒ” įƒ¢įƒ”įƒ„įƒ”įƒ¢įƒ”įƒ‘įƒ˜ - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + ... ... @@ -1707,8 +1687,7 @@ Options: - - + Browse... ნუეხა... @@ -1736,15 +1715,15 @@ Options: - + Edit įƒ©įƒįƒ”įƒ¬įƒįƒ įƒ”įƒ‘įƒ - - + + Remove წაშლა @@ -1764,124 +1743,134 @@ Options: įƒ©įƒįƒ”įƒ›įƒ˜įƒ” įƒ‘įƒ˜įƒšįƒ˜įƒ™įƒ”įƒ‘įƒ˜: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions įƒ¢įƒ˜įƒžįƒ”įƒ‘įƒ˜ įƒ“įƒ įƒ¤įƒ£įƒœįƒ„įƒŖįƒ˜įƒ”įƒ‘įƒ˜ - - + + Analysis įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ - + This is a workfolder that Cppcheck will use for various purposes. įƒ”įƒ” įƒ”įƒįƒ›įƒ£įƒØįƒįƒ įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ”įƒ, įƒ įƒįƒ›įƒ”įƒšįƒ”įƒįƒŖ Cppcheck įƒ”įƒ®įƒ•įƒįƒ“įƒįƒ”įƒ®įƒ•įƒ įƒ›įƒ˜įƒ–įƒœįƒ”įƒ‘įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” įƒ’įƒįƒ›įƒįƒ˜įƒ§įƒ”įƒœįƒ”įƒ‘įƒ”. - + Parser įƒįƒœįƒįƒšįƒ˜įƒ–įƒįƒ¢įƒįƒ įƒ˜ - + Cppcheck (built in) Cppcheck (įƒ©įƒįƒØįƒ”įƒœįƒ”įƒ‘įƒ£įƒšįƒ˜) - + Check level įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ˜įƒ” įƒ“įƒįƒœįƒ” - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. įƒœįƒįƒ įƒ›įƒįƒšįƒ£įƒ įƒ˜ -- įƒœįƒ˜įƒØįƒœįƒįƒ•įƒ” įƒœįƒįƒ įƒ›įƒįƒšįƒ£įƒ  įƒįƒœįƒįƒšįƒ˜įƒ–įƒ” CI-ში. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ›įƒ˜įƒ”įƒįƒ¦įƒ”įƒ‘ įƒ“įƒ įƒįƒØįƒ˜ įƒ“įƒįƒ”įƒ įƒ£įƒšįƒ“įƒ”įƒ‘įƒ. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). įƒįƒ›įƒįƒ›įƒ¬įƒ£įƒ įƒįƒ•įƒ˜ -- įƒ’įƒįƒœįƒ™įƒ£įƒ—įƒ•įƒœįƒ˜įƒšįƒ˜įƒ įƒ¦įƒįƒ›įƒ˜įƒ” įƒįƒ’įƒ”įƒ‘įƒ”įƒ‘įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” įƒ“įƒ ა.შ. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ” įƒ“įƒ įƒ, įƒØįƒ”įƒ˜įƒ«įƒšįƒ”įƒ‘įƒ, įƒ£įƒ¤įƒ įƒ įƒ›įƒ”įƒ¢įƒ˜įƒŖ įƒ˜įƒ§įƒįƒ” (įƒ™įƒįƒ›įƒžįƒ˜įƒšįƒįƒŖįƒ˜įƒįƒ–įƒ” 10x įƒ›įƒ”įƒ¢įƒ˜ įƒ“įƒ įƒ įƒ©įƒ•įƒ”įƒ£įƒšįƒ”įƒ‘įƒ įƒ˜įƒ•įƒ˜ įƒįƒ›įƒ‘įƒįƒ•įƒ˜įƒ). - + Check that each class has a safe public interface įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ, įƒįƒ„įƒ•įƒ” įƒ—įƒ£ არა įƒ§įƒ•įƒ”įƒšįƒ įƒ™įƒšįƒįƒ”įƒ” įƒ£įƒ”įƒįƒ¤įƒ įƒ—įƒ®įƒ įƒ”įƒįƒÆįƒįƒ įƒ įƒ˜įƒœįƒ¢įƒ”įƒ įƒ¤įƒ”įƒ˜įƒ”įƒ˜ - + Limit analysis įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ” įƒØįƒ”įƒ–įƒ¦įƒ£įƒ“įƒ•įƒ - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth CTU-იე įƒ›įƒįƒ„įƒ”įƒ˜įƒ›įƒįƒšįƒ£įƒ įƒ˜ įƒ”įƒ˜įƒ¦įƒ įƒ›įƒ” - - Premium License - - - - + Enable inline suppressions įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜įƒ” įƒ®įƒįƒ–įƒØįƒ˜įƒ•įƒ” įƒ©įƒįƒ®įƒØįƒįƒ‘įƒ˜įƒ” įƒ©įƒįƒ įƒ—įƒ•įƒ - + 2025 2025 - + Misra C++ Misra C++ - + 2008 2008 - + Cert C Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) CERT-INT35-C: įƒ›įƒ—įƒ”įƒšįƒ˜ įƒ įƒ˜įƒŖįƒ®įƒ•įƒ˜įƒ” įƒ”įƒ˜įƒ–įƒ£įƒ”įƒ¢įƒ” (įƒ—įƒ£ įƒ–įƒįƒ›įƒ įƒ”įƒ˜įƒ–įƒ£įƒ”įƒ¢įƒ”įƒ” įƒ”įƒ›įƒ—įƒ®įƒ•įƒ”įƒ•įƒ, įƒØįƒ”įƒ’įƒ˜įƒ«įƒšįƒ˜įƒįƒ—, įƒŖįƒįƒ įƒ˜įƒ”įƒšįƒ˜ įƒ“įƒįƒ¢įƒįƒ•įƒįƒ—) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ–įƒ” įƒœįƒįƒ“įƒ˜įƒ įƒįƒ‘įƒ - + External tools įƒ’įƒįƒ įƒ” įƒ®įƒ”įƒšįƒ”įƒįƒ¬įƒ§įƒįƒ”įƒ‘įƒ˜ @@ -1896,104 +1885,104 @@ Options: įƒ„įƒ•įƒ”įƒ›įƒįƒ— - + Platform įƒžįƒšįƒįƒ¢įƒ¤įƒįƒ įƒ›įƒ - + Warning options įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒ›įƒįƒ įƒ’įƒ”įƒ‘įƒ - + Root path: Root įƒ‘įƒ˜įƒšįƒ˜įƒ™įƒ˜: - + Warning tags (separated by semicolon) įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒ­įƒ“įƒ”įƒ”įƒ‘įƒ˜ (įƒ¬įƒ”įƒ įƒ¢įƒ˜įƒšįƒ›įƒ«įƒ˜įƒ›įƒ˜įƒ— įƒ’įƒįƒ›įƒįƒ§įƒįƒ¤įƒ˜įƒšįƒ˜) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) Cppcheck-იე įƒįƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” (įƒ›įƒ—įƒ”įƒšįƒ˜ įƒžįƒ įƒįƒ’įƒ įƒįƒ›įƒ˜įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜, įƒ˜įƒœįƒ™įƒ įƒ”įƒ›įƒ”įƒœįƒ¢įƒ£įƒšįƒ˜ įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜, įƒ”įƒ¢įƒįƒ¢įƒ˜įƒ”įƒ¢įƒ˜įƒ™įƒ įƒ“įƒ ა.შ.) - + Libraries įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ”įƒ‘įƒ˜ - + Suppressions įƒ©įƒįƒ®įƒØįƒįƒ‘įƒ”įƒ‘įƒ˜ - + Add įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒ - - + + Addons įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒ”įƒ‘įƒ˜ - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. įƒØįƒ”įƒœįƒ˜įƒØįƒ•įƒœįƒ: įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒįƒ” įƒ“įƒįƒ§įƒ”įƒœįƒ”įƒ‘įƒ£įƒšįƒ˜ <a href="https://www.python.org/">Python</a> įƒ”įƒ­įƒ˜įƒ įƒ“įƒ”įƒ‘įƒ. - + Y2038 Y2038 - + Thread safety įƒœįƒįƒ™įƒįƒ“įƒ”įƒ‘įƒ˜įƒ” įƒ£įƒ”įƒįƒ¤įƒ įƒ—įƒ®įƒįƒ”įƒ‘įƒ - + Coding standards įƒ™įƒįƒ“įƒ˜įƒ įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒ¢įƒįƒœįƒ“įƒįƒ įƒ¢įƒ”įƒ‘įƒ˜ - + Misra C Misra C - + 2012 2012 - - + + 2023 2023 - + Cert C++ Cert C++ - + Bug hunting (Premium) įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ–įƒ” įƒœįƒįƒ“įƒ˜įƒ įƒįƒ‘įƒ (ფაეიანი) - + Clang analyzer Clang-იე įƒįƒœįƒįƒšįƒ˜įƒ–įƒįƒ¢įƒįƒ įƒ˜ - + Clang-tidy Clang-tidy @@ -2006,82 +1995,93 @@ Options: ProjectFileDialog - + Project file: %1 įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი: %1 - + Select Cppcheck build dir įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— Cppcheck-იე įƒįƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” - + Select include directory įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ©įƒįƒ”įƒįƒ”įƒ›įƒ”įƒšįƒ˜ įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” - + Select a directory to check įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒØįƒ”įƒ”įƒįƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ”įƒšįƒ˜ įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) Clang-tidy (įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ”) - + Visual Studio Visual Studio - + Compile database įƒ›įƒįƒœįƒįƒŖįƒ”įƒ›įƒ—įƒ įƒ‘įƒįƒ–įƒ˜įƒ” įƒ™įƒįƒ›įƒžįƒ˜įƒšįƒįƒŖįƒ˜įƒ - + Borland C++ Builder 6 Borland C++ Builder 6 - + Import Project įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒØįƒ”įƒ›įƒįƒ¢įƒįƒœįƒ - + + C/C++ header + + + + + Include file + + + + Select directory to ignore įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ’įƒįƒ›įƒįƒ”įƒįƒ¢įƒįƒ•įƒ”įƒ‘įƒ”įƒšįƒ˜ įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” - + Source files įƒ™įƒįƒ“įƒ˜įƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ - + + All files įƒ§įƒ•įƒ”įƒšįƒ ფაილი - + Exclude file ფაილიე įƒįƒ›įƒįƒ¦įƒ”įƒ‘įƒ - + Select MISRA rule texts file įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— MISRA-იე įƒ¬įƒ”įƒ”įƒ”įƒ‘įƒ˜įƒ” įƒ¢įƒ”įƒ„įƒ”įƒ¢įƒ˜įƒ” ფაილი - + MISRA rule texts file (%1) MISRA-იე įƒ¬įƒ”įƒ”įƒ˜įƒ” įƒ¢įƒ”įƒ„įƒ”įƒ¢įƒ”įƒ‘įƒ˜įƒ” ფაილი (%1) @@ -2116,7 +2116,7 @@ Options: įƒ®įƒįƒ–įƒ˜ %1: įƒįƒ£įƒŖįƒ˜įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜ įƒįƒ¢įƒ įƒ˜įƒ‘įƒ£įƒ¢įƒ˜ '%2' '%3'-ში įƒįƒ¦įƒ›įƒįƒ©įƒ”įƒœįƒ˜įƒšįƒ˜ არაა - + (Not found) (įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ”) @@ -2540,56 +2540,56 @@ Please check the application path and parameters are correct. ResultsView - + Print Report įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒ“įƒįƒ‘įƒ”įƒ­įƒ“įƒ•įƒ - + No errors found, nothing to print. įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜ įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ”. įƒ“įƒįƒ”įƒįƒ‘įƒ”įƒ­įƒ“įƒ˜ įƒįƒ įƒįƒ¤įƒ”įƒ įƒ˜įƒ. - + %p% (%1 of %2 files checked) %p% (įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ£įƒšįƒ˜įƒ %1 ფაილი %2-įƒ“įƒįƒœ) - - + + Cppcheck Cppcheck - + No errors found. įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜įƒ” įƒ’įƒįƒ įƒ”įƒØįƒ”. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. įƒįƒ¦įƒ›įƒįƒ©įƒ”įƒœįƒ˜įƒšįƒ˜įƒ įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜, įƒ›įƒįƒ’įƒ įƒįƒ› įƒ›įƒ˜įƒ—įƒ˜įƒ—įƒ”įƒ‘įƒ£įƒšįƒ˜įƒ, įƒ įƒįƒ› იეინი įƒ“įƒįƒ˜įƒ›įƒįƒšįƒįƒ”. įƒ˜įƒ›įƒ˜įƒ”įƒįƒ—įƒ•įƒ˜įƒ”, įƒ įƒįƒ› įƒ’įƒįƒ“įƒįƒ įƒ—įƒįƒ—, რა ეახიე įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜įƒ įƒœįƒįƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ˜, įƒ’įƒįƒ®įƒ”įƒ”įƒœįƒ˜įƒ— įƒ›įƒ”įƒœįƒ˜įƒ£ 'įƒ®įƒ”įƒ“įƒ˜'. - - + + Failed to read the report. įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒ¬įƒįƒ™įƒ˜įƒ—įƒ®įƒ•įƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ. - + XML format version 1 is no longer supported. XML-იე įƒ¤įƒįƒ įƒ›įƒįƒ¢įƒ˜įƒ” įƒžįƒ˜įƒ įƒ•įƒ”įƒšįƒ˜ įƒ•įƒ”įƒ įƒ”įƒ˜įƒ įƒ›įƒ®įƒįƒ įƒ“įƒįƒ­įƒ”įƒ įƒ˜įƒšįƒ˜ აღარაა. - + First included by įƒžįƒ˜įƒ įƒ•įƒ”įƒšįƒįƒ“ įƒ©įƒįƒ”įƒ›įƒ£įƒšįƒ˜įƒ ფაილში - + Id Id @@ -2598,48 +2598,48 @@ To toggle what kind of errors are shown, open view menu. įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ–įƒ” įƒœįƒįƒ“įƒ˜įƒ įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ“įƒįƒ£įƒ”įƒ įƒ£įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ - + Clear Log ჟურნალიე įƒ’įƒįƒ”įƒ£įƒ¤įƒ—įƒįƒ•įƒ”įƒ‘įƒ - + Copy this Log entry įƒįƒ› ჟურნალიე įƒ©įƒįƒœįƒįƒ¬įƒ”įƒ įƒ˜įƒ” įƒ™įƒįƒžįƒ˜įƒ įƒ”įƒ‘įƒ - + Copy complete Log ერული ჟურნალიე įƒ™įƒįƒžįƒ˜įƒ įƒ”įƒ‘įƒ - + Analysis was stopped įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ’įƒįƒ£įƒ„įƒ›įƒ”įƒ‘įƒ£įƒšįƒ˜įƒ - + There was a critical error with id '%1' įƒįƒ¦įƒ›įƒįƒ©įƒ”įƒœįƒ˜įƒšįƒ˜įƒ įƒ™įƒ įƒ˜įƒ¢įƒ˜įƒ™įƒ£įƒšįƒ˜ įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ id-įƒ˜įƒ— '%1' - + when checking %1 %1-იე įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ˜įƒ”įƒįƒ” - + when checking a file ფაილიე įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ˜įƒ”įƒįƒ” - + Analysis was aborted. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ•įƒ”įƒ¢įƒ˜įƒšįƒ˜įƒ. - - + + Failed to save the report. įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒØįƒ”įƒœįƒįƒ®įƒ•įƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ. @@ -2945,14 +2945,14 @@ To toggle what kind of errors are shown, open view menu. - - + + Statistics įƒ”įƒ¢įƒįƒ¢įƒ˜įƒ”įƒ¢įƒ˜įƒ™įƒ - + Project įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜ @@ -2983,7 +2983,7 @@ To toggle what kind of errors are shown, open view menu. - + Previous Scan წინა įƒ”įƒ™įƒįƒœįƒ˜įƒ įƒ”įƒ‘įƒ @@ -3063,103 +3063,103 @@ To toggle what kind of errors are shown, open view menu. PDF-įƒįƒ“ įƒ’įƒįƒ¢įƒįƒœįƒ - + 1 day 1 įƒ“įƒ¦įƒ” - + %1 days %1 įƒ“įƒ¦įƒ” - + 1 hour %1 įƒ”įƒįƒįƒ—įƒ˜ - + %1 hours %1 įƒ”įƒįƒįƒ—įƒ˜ - + 1 minute %1 įƒ¬įƒ£įƒ—įƒ˜ - + %1 minutes %1 įƒ¬įƒ— - + 1 second 1 įƒ¬įƒįƒ›įƒ˜ - + %1 seconds %1 įƒ¬įƒįƒ›įƒ˜ - + 0.%1 seconds 0.%1 įƒ¬įƒįƒ›įƒ˜ - + and įƒ“įƒ - + Export PDF PDF-ში įƒ’įƒįƒ¢įƒįƒœįƒ - + Project Settings įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒžįƒįƒ įƒįƒ›įƒ”įƒ¢įƒ įƒ”įƒ‘įƒ˜ - + Paths įƒ‘įƒ˜įƒšįƒ˜įƒ™įƒ”įƒ‘įƒ˜ - + Include paths įƒ©įƒįƒ”įƒ›įƒ˜įƒ” įƒ‘įƒ˜įƒšįƒ˜įƒ™įƒ”įƒ‘įƒ˜ - + Defines įƒįƒ¦įƒ¬įƒ”įƒ įƒ”įƒ‘įƒ˜ - + Undefines წაშლილი įƒ›įƒįƒ™įƒ įƒįƒįƒ¦įƒ¬įƒ”įƒ įƒ”įƒ‘įƒ˜ - + Path selected įƒįƒ įƒ©įƒ”įƒ£įƒšįƒ˜ įƒ‘įƒ˜įƒšįƒ˜įƒ™įƒ˜ - + Number of files scanned įƒ“įƒįƒ”įƒ™įƒįƒœįƒ”įƒ įƒ”įƒ‘įƒ£įƒšįƒ˜įƒ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒ įƒįƒįƒ“įƒ”įƒœįƒįƒ‘įƒ - + Scan duration įƒ”įƒ™įƒįƒœįƒ˜įƒ įƒ”įƒ‘įƒ˜įƒ” įƒ®įƒįƒœįƒ’įƒ įƒ«įƒšįƒ˜įƒ•įƒįƒ‘įƒ - - + + Errors įƒØįƒ”įƒ“įƒįƒ›įƒ”įƒ‘įƒ˜ @@ -3174,32 +3174,32 @@ To toggle what kind of errors are shown, open view menu. Cppcheck-იე įƒįƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ˜įƒ” įƒ’įƒįƒ įƒ”įƒØįƒ” - - + + Warnings įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜ - - + + Style warnings ეტილიე įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜ - - + + Portability warnings įƒ’įƒįƒ“įƒįƒ¢įƒįƒœįƒįƒ“įƒįƒ‘įƒ˜įƒ” įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜ - - + + Performance warnings įƒ¬įƒįƒ įƒ›įƒįƒ“įƒįƒ‘įƒ˜įƒ” įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ”įƒ‘įƒ˜ - - + + Information messages įƒ”įƒįƒ˜įƒœįƒ¤įƒįƒ įƒ›įƒįƒŖįƒ˜įƒ įƒØįƒ”įƒ¢įƒ§įƒįƒ‘įƒ˜įƒœįƒ”įƒ‘įƒ”įƒ‘įƒ˜ diff --git a/gui/cppcheck_ko.ts b/gui/cppcheck_ko.ts index da6bac85bb7..18720477f08 100644 --- a/gui/cppcheck_ko.ts +++ b/gui/cppcheck_ko.ts @@ -116,70 +116,6 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -217,12 +153,12 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -485,20 +421,20 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck @@ -518,366 +454,366 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: ķŒŒģ¼(&F) - + &View 볓기(&V) - + &Toolbars ė„źµ¬ė°”(&T) - - + + Report - + &Help ė„ģ›€ė§(&H) - + &Edit ķŽøģ§‘(&E) - + Standard ķ‘œģ¤€ ė„źµ¬ - + Categories ė¶„ė„˜ ė„źµ¬ - + Filter ķ•„ķ„° ė„źµ¬ - + &License... ģ €ģž‘ź¶Œ(&L)... - + A&uthors... ģ œģž‘ģž(&u)... - + &About... 정볓(&A)... - + &Files... ķŒŒģ¼(&F)... - + Ctrl+F Ctrl+F - + &Directory... 디렉토리(&D)... - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop 중지(&S) - + Esc Esc - + &Save results to file... 결과넼 ķŒŒģ¼ģ— ģ €ģž„(&S)... - + Ctrl+S Ctrl+S - + &Quit ģ¢…ė£Œ(&Q) - + &Clear results ź²°ź³¼ ģ§€ģš°źø°(&C) - + &Preferences 설정(&P) - - + + Show style warnings ģŠ¤ķƒ€ģ¼ 경고 ķ‘œģ‹œ - - - + + + Show errors ģ• ėŸ¬ ķ‘œģ‹œ - + &Check all 전첓 ģ„ ķƒ(&C) - + &Uncheck all 전첓 ķ•“ģ œ(&U) - + Collapse &all 전첓 ģ ‘źø°(&A) - + &Expand all 전첓 ķŽ¼ģ¹˜źø°(&E) - + &Standard ķ‘œģ¤€ ė„źµ¬(&S) - + Standard items ķ‘œģ¤€ ģ•„ģ“ķ…œ - + &Contents ė‚“ģš©(&C) - + Open the help contents ė„ģ›€ė§ģ„ ģ—½ė‹ˆė‹¤ - + F1 F1 - + Toolbar ė„źµ¬ė°” - + &Categories ė¶„ė„˜ ė„źµ¬(&C) - + Error categories ģ—ėŸ¬ ģ¢…ė„˜ - + &Open XML... XML ģ—“źø°(&O)... - + Open P&roject File... ķ”„ė”œģ ķŠø ķŒŒģ¼ ģ—“źø°(&R)... - + &New Project File... 새 ķ”„ė”œģ ķŠø ķŒŒģ¼(&N)... - + &Log View 딜그 볓기(&L) - + Log View 딜그 볓기 - + C&lose Project File ķ”„ė”œģ ķŠø ķŒŒģ¼ ė‹«źø°(&L) - + &Edit Project File... ķ”„ė”œģ ķŠø ķŒŒģ¼ ķŽøģ§‘(&E)... - + &Statistics 통계 볓기(&S) - - - + + + Show warnings 경고 ķ‘œģ‹œ - - + + Show performance warnings ģ„±ėŠ„ 경고 ķ‘œģ‹œ - + Show &hidden 숨기기 볓기(&H) - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - - + + Information 정볓 - + Show information messages 정볓 ķ‘œģ‹œ - + Show portability warnings ģ“ģ‹ģ„± 경고 ķ‘œģ‹œ - + &Filter ķ•„ķ„° ė„źµ¬(&F) - + Filter results 필터링 ź²°ź³¼ - + Windows 32-bit ANSI Windows 32-bit ANSI - + Windows 32-bit Unicode Windows 32-bit Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - - + + Quick Filter: 빠넸 ķ•„ķ„°: - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -886,12 +822,12 @@ This is probably because the settings were changed between the Cppcheck versions Cppcheck 버전간 설정 방법 ģ°Øģ“ė•Œė¬øģø 것으딜 ė³“ģž…ė‹ˆė‹¤. ķŽøģ§‘źø° ģ„¤ģ •ģ„ 검사(ė° ģˆ˜ģ •)ķ•“ģ£¼ģ„øģš”, 그렇지 ģ•Šģœ¼ė©“ ķŽøģ§‘źø°ź°€ ģ œėŒ€ė”œ ģ‹œģž‘ķ•˜ģ§€ ģ•ŠģŠµė‹ˆė‹¤. - + You must close the project file before selecting new files or directories! 새딜욓 ķŒŒģ¼ģ“ė‚˜ 디렉토리넼 ģ„ ķƒķ•˜źø° 전에 ķ”„ė”œģ ķŠø ķŒŒģ¼ģ„ ė‹«ģœ¼ģ„øģš”! - + Found project file: %1 Do you want to load this project file instead? @@ -900,215 +836,210 @@ Do you want to load this project file instead? ģ“ ķ”„ė”œģ ķŠø ķŒŒģ¼ģ„ ė¶ˆėŸ¬ģ˜¤ź² ģŠµė‹ˆź¹Œ? - - + + XML files (*.xml) XML ķŒŒģ¼ (*.xml) - + Open the report file ė³“ź³ ģ„œ ķŒŒģ¼ ģ—“źø° - + License ģ €ģž‘ź¶Œ - + Authors ģ œģž‘ģž - + Save the report file ė³“ź³ ģ„œ ķŒŒģ¼ ģ €ģž„ - + Text files (*.txt) ķ…ģŠ¤ķŠø ķŒŒģ¼ (*.txt) - + CSV files (*.csv) CSV ķŒŒģ¼ (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Project files (*.cppcheck);;All files(*.*) ķ”„ė”œģ ķŠø ķŒŒģ¼ (*.cppcheck);;ėŖØė“  ķŒŒģ¼(*.*) - + Select Project File ķ”„ė”œģ ķŠø ķŒŒģ¼ ģ„ ķƒ - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information - - - - + + + + Project: ķ”„ė”œģ ķŠø: - + Duplicate define - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + About - + To check the project using addons, you need a build directory. - + Select Project Filename ķ”„ė”œģ ķŠø ķŒŒģ¼ģ“ė¦„ ģ„ ķƒ - + No project file loaded ķ”„ė”œģ ķŠø ķŒŒģ¼ 불러오기 ģ‹¤ķŒØ - + The project file %1 @@ -1130,103 +1061,97 @@ Do you want to remove the file from the recently used projects -list? - + C++ standard - - - - + + + + Error - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Failed to load the selected library '%1'. %2 - + Unsupported format - + The library '%1' contains unknown elements: %2 - + Duplicate platform type - + Platform type redefined - + &Print... - + Print the Current Report - + Print Pre&view... - + Open a Print Preview Dialog for the Current Results - + Open library editor - - Unknown element - - - - + Unknown element - Unknown issue - + Select configuration @@ -1249,259 +1174,259 @@ Options: - + Build dir '%1' does not exist, create it? - - + + Analyze files - - + + Analyze directory - + &Reanalyze modified files - - + + Stop analysis - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + No suitable files found to analyze! - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + A&nalyze - + &C standard - + Reanal&yze all files - + Ctrl+Q - + Style war&nings - + E&rrors - + Ctrl+Shift+O - + Sh&ow Scratchpad... - + Ctrl+Shift+N - + &Warnings - + Per&formance warnings - + &Information - + &Portability - + Show Cppcheck results - + Clang - + Show Clang results - + P&latforms - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... - + &Auto-detect language - + &Enforce C++ - + E&nforce C - + C++14 C++14 - + Project files (*.cppcheck) - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 C++17 - + C++20 C++20 - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1601,15 +1526,15 @@ Do you want to proceed? - + Edit ķŽøģ§‘ - - + + Remove 제거 @@ -1624,22 +1549,22 @@ Do you want to proceed? ģ•„ėž˜ė”œ - + Suppressions - + Add - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. - + ... @@ -1664,17 +1589,17 @@ Do you want to proceed? - + Root path: - + Warning tags (separated by semicolon) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) @@ -1684,95 +1609,109 @@ Do you want to proceed? - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions - + Libraries - + Parser - + Cppcheck (built in) - + Check that each class has a safe public interface - + Limit analysis - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Bug hunting - + Clang analyzer - + Clang-tidy - - + Browse... @@ -1782,153 +1721,148 @@ Do you want to proceed? - + Platform - + This is a workfolder that Cppcheck will use for various purposes. - + Clang (experimental) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Max recursion in template instantiation - - Premium License - - - - + Warning options - + Filepaths in warnings will be relative to this path - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Enable inline suppressions Inline suppression ģ‚¬ģš© - + Misra C - + 2012 - - + + 2023 - + 2025 - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + Misra C++ - + 2008 - + Cert C++ - + Safety profiles (defined in C++ core guidelines) - + Bug hunting (Premium) - + External tools @@ -1948,19 +1882,19 @@ Do you want to proceed? - - + + Analysis - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth @@ -1968,82 +1902,93 @@ Do you want to proceed? ProjectFileDialog - + Project file: %1 ķ”„ė”œģ ķŠø ķŒŒģ¼: %1 - + Select include directory Include 디렉토리 ģ„ ķƒ - + Select a directory to check 검사할 디렉토리 ģ„ ķƒ - + Select directory to ignore ė¬“ģ‹œķ•  디렉토리 ģ„ ķƒ - + Select Cppcheck build dir - + Import Project - + Clang-tidy (not found) - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Source files - + + All files - + + C/C++ header + + + + + Include file + + + + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) - + Visual Studio - + Compile database - + Borland C++ Builder 6 @@ -2076,7 +2021,7 @@ Do you want to proceed? - + (Not found) @@ -2487,87 +2432,87 @@ Please check the application path and parameters are correct. ź²°ź³¼ - - + + Failed to save the report. ź²°ź³¼ ģ €ģž„ ģ‹¤ķŒØ. - + %p% (%1 of %2 files checked) %p% (%2 중 %1 ķŒŒģ¼ 검사됨) - - + + Cppcheck Cppcheck - + No errors found. ģ—ėŸ¬ź°€ ė°œź²¬ė˜ģ§€ ģ•Šģ•˜ģŠµė‹ˆė‹¤. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. ģ—ėŸ¬ź°€ ė°œź²¬ė˜ģ—ˆģ§€ė§Œ, ź°ģ¶”ė„ė” ģ„¤ģ •ė˜ģ–“ ģžˆģŠµė‹ˆė‹¤. ģ—ėŸ¬ ģ¢…ė„˜ė„¼ ķ‘œģ‹œķ•˜ė„ė” ģ„¤ģ •ķ•˜ė ¤ė©“, 볓기 메뉓넼 ģ„ ķƒķ•˜ģ„øģš”. - - + + Failed to read the report. ź²°ź³¼ 불러오기 ģ‹¤ķŒØ. - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - + Id - + Print Report - + No errors found, nothing to print. - + First included by - + XML format version 1 is no longer supported. @@ -2587,17 +2532,17 @@ To toggle what kind of errors are shown, open view menu. - + Clear Log - + Copy this Log entry - + Copy complete Log @@ -2882,14 +2827,14 @@ To toggle what kind of errors are shown, open view menu. - - + + Statistics 통계 - + Project ķ”„ė”œģ ķŠø @@ -2915,7 +2860,7 @@ To toggle what kind of errors are shown, open view menu. - + Previous Scan 직전 검사 @@ -2980,123 +2925,123 @@ To toggle what kind of errors are shown, open view menu. ķ“ė¦½ė³“ė“œģ— 복사 - + 1 day 1ģ¼ - + %1 days %1ģ¼ - + 1 hour 1ģ‹œź°„ - + %1 hours %1ģ‹œź°„ - + 1 minute 1ė¶„ - + %1 minutes %1ė¶„ - + 1 second 1쓈 - + %1 seconds %1쓈 - + 0.%1 seconds 0.%1쓈 - + and ė° - + Project Settings ķ”„ė”œģ ķŠø 설정 - + Paths 경딜 - + Include paths Include 경딜 - + Defines Defines - + Path selected ģ„ ķƒėœ 경딜 - + Number of files scanned ź²€ģ‚¬ėœ ķŒŒģ¼ 수 - + Scan duration 검사 ģ‹œź°„ - - + + Errors ģ—ėŸ¬ - - + + Warnings 경고 - - + + Style warnings ģŠ¤ķƒ€ģ¼ 경고 - - + + Portability warnings ģ“ģ‹ģ„± 경고 - - + + Performance warnings ģ„±ėŠ„ 경고 - - + + Information messages 정볓 ė©”ģ‹œģ§€ @@ -3106,7 +3051,7 @@ To toggle what kind of errors are shown, open view menu. - + Export PDF @@ -3136,7 +3081,7 @@ To toggle what kind of errors are shown, open view menu. - + Undefines diff --git a/gui/cppcheck_nl.ts b/gui/cppcheck_nl.ts index 2d3149d2f0a..cd14a92bdc2 100644 --- a/gui/cppcheck_nl.ts +++ b/gui/cppcheck_nl.ts @@ -116,70 +116,6 @@ Parameters: -l(lijn) (bestand) Geef een naam op, een pad en eventueel parameters voor de toepassing! - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -219,12 +155,12 @@ Parameters: -l(lijn) (bestand) - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -489,30 +425,30 @@ Parameters: -l(lijn) (bestand) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + A&nalyze - + Standard Standaard @@ -522,245 +458,245 @@ Parameters: -l(lijn) (bestand) &Bestand - + &View &Weergave - + &Toolbars &Werkbalken - + C++ standard C++standaard - + &C standard C standard C standaard - + &Edit Be&werken - + &License... &Licentie... - + A&uthors... A&uteurs... - + &About... &Over... - + &Files... &Bestanden... - - + + Analyze files Check files Controleer bestanden - + Ctrl+F Ctrl+F - + &Directory... &Mappen... - - + + Analyze directory Check directory Controleer Map - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop &Stop - - + + Stop analysis Stop checking Stop controle - + Esc Esc - + &Save results to file... &Resultaten opslaan... - + Ctrl+S Ctrl+S - + &Quit &Afsluiten - + &Clear results &Resultaten wissen - + &Preferences &Voorkeuren - - - + + + Show errors Toon fouten - - - + + + Show warnings Toon waarschuwingen - - + + Show performance warnings Toon presentatie waarschuwingen - + Show &hidden Toon &verborgen - - + + Information Informatie - + Show information messages Toon informatie bericht - + Show portability warnings Toon portabiliteit waarschuwingen - + Show Cppcheck results - + Clang - + Show Clang results - + &Filter &Filter - + Filter results Filter resultaten - + Windows 32-bit ANSI Windows 32-bit ANSI - + Windows 32-bit Unicode - + Unix 32-bit - + Unix 64-bit - + Windows 64-bit - + &Print... - + Print the Current Report - + Print Pre&view... - + Open a Print Preview Dialog for the Current Results - + Open library editor - + &Check all &Controleer alles @@ -775,336 +711,336 @@ Parameters: -l(lijn) (bestand) Verberg - - + + Report - + Filter - + &Reanalyze modified files &Recheck modified files - + Reanal&yze all files - + Ctrl+Q - + Style war&nings - + E&rrors - + &Uncheck all Selecteer &niets - + Collapse &all Alles Inkl&appen - + &Expand all Alles &Uitklappen - + &Standard &Standaard - + Standard items Standaard items - + Toolbar Werkbalk - + &Categories &CategorieĆ«n - + Error categories Foute CategorieĆ«n - + &Open XML... - + Open P&roject File... Open P&oject bestand... - + Ctrl+Shift+O - + Sh&ow Scratchpad... - + &New Project File... &Nieuw Project Bestand... - + Ctrl+Shift+N - + &Log View &Log weergave - + Log View Log weergave - + C&lose Project File &Sluit Project Bestand - + &Edit Project File... &Bewerk Project Bestand... - + &Statistics &Statistieken - + &Warnings - + Per&formance warnings - + &Information - + &Portability - + P&latforms - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... - + &Auto-detect language - + &Enforce C++ - + E&nforce C - + C++14 - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 - + C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents &Inhoud - + Categories CategorieĆ«n - - + + Show style warnings Toon stijl waarschuwingen - + Open the help contents Open de help inhoud - + F1 - + &Help &Help - - + + Quick Filter: Snel Filter: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? @@ -1112,91 +1048,91 @@ Do you want to load this project file instead? Wilt u dit project laden in plaats van? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Licentie - + Authors Auteurs - + Save the report file Rapport opslaan - - + + XML files (*.xml) XML bestanden (*.xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -1205,132 +1141,126 @@ This is probably because the settings were changed between the Cppcheck versions Dit is waarschijnlijk omdat de instellingen zijn gewijzigd tussen de versies van cppcheck. Controleer (en maak) de bewerker instellingen, anders zal de bewerker niet correct starten. - + You must close the project file before selecting new files or directories! Je moet project bestanden sluiten voordat je nieuwe bestanden of mappen selekteerd! - + The library '%1' contains unknown elements: %2 - + Unsupported format - + Duplicate platform type - + Platform type redefined - - Unknown element - - - - + Unknown element - Unknown issue - - - - + + + + Error - + Open the report file Open het rapport bestand - + Text files (*.txt) Tekst bestanden (*.txt) - + CSV files (*.csv) CSV bestanden (*.csv) - + Project files (*.cppcheck);;All files(*.*) Project bestanden (*.cppcheck);;Alle bestanden(*.*) - + Select Project File Selecteer project bestand - - - - + + + + Project: Project: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1338,81 +1268,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename Selecteer project bestandsnaam - + No project file loaded Geen project bestand geladen - + The project file %1 @@ -1428,67 +1353,67 @@ Kan niet worden gevonden! Wilt u het bestand van de onlangs gebruikte project verwijderen -lijst? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1619,58 +1544,58 @@ Options: - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Misra C - + 2012 - - + + 2023 - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + ... @@ -1681,8 +1606,7 @@ Options: - - + Browse... @@ -1710,15 +1634,15 @@ Options: - + Edit Bewerk - - + + Remove Verwijder @@ -1738,124 +1662,134 @@ Options: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions - - + + Analysis - + This is a workfolder that Cppcheck will use for various purposes. - + Parser - + Cppcheck (built in) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + Check that each class has a safe public interface - + Limit analysis - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth - - Premium License - - - - + Enable inline suppressions Schakel inline suppressies in - + 2025 - + Misra C++ - + 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools @@ -1870,113 +1804,113 @@ Options: Omlaag - + Platform - + Clang (experimental) - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Max recursion in template instantiation - + Warning options - + Root path: - + Filepaths in warnings will be relative to this path - + Warning tags (separated by semicolon) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) - + Libraries - + Suppressions - + Add - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards - + Cert C++ - + Bug hunting (Premium) - + Clang analyzer - + Clang-tidy @@ -1989,82 +1923,93 @@ Options: ProjectFileDialog - + Project file: %1 Project Bestand %1 - + Select Cppcheck build dir - + Select include directory Selecteer include map - + Select a directory to check Selecteer een map om te controleren - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) - + Visual Studio - + Compile database - + Borland C++ Builder 6 - + Import Project - + + C/C++ header + + + + + Include file + + + + Select directory to ignore Selecteer een map om te negeren - + Source files - + + All files - + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) @@ -2099,7 +2044,7 @@ Options: - + (Not found) @@ -2510,102 +2455,102 @@ Gelieve te controleren of de het pad en de parameters correct zijn. ResultsView - + Print Report - + No errors found, nothing to print. - + %p% (%1 of %2 files checked) %p% (%1 van %2 bestanden gecontroleerd) - - + + Cppcheck Cppcheck - + No errors found. Geen fouten gevonden. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Fouten werden gevonden, maar volgens de configuratie zijn deze verborgen. Gebruik het uitzicht menu om te selecteren welke fouten getoond worden. - - + + Failed to read the report. Kon rapport niet lezen. - + XML format version 1 is no longer supported. - + First included by - + Id Id - + Clear Log - + Copy this Log entry - + Copy complete Log - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - - + + Failed to save the report. Kon het rapport niet opslaan. @@ -2907,14 +2852,14 @@ Gebruik het uitzicht menu om te selecteren welke fouten getoond worden. - - + + Statistics Statistieken - + Project Project @@ -2945,7 +2890,7 @@ Gebruik het uitzicht menu om te selecteren welke fouten getoond worden. - + Previous Scan Vorige scan @@ -3025,103 +2970,103 @@ Gebruik het uitzicht menu om te selecteren welke fouten getoond worden. - + 1 day 1 dag - + %1 days %1 dagen - + 1 hour 1 uur - + %1 hours %1 uren - + 1 minute 1 minuut - + %1 minutes %1 minuten - + 1 second 1 seconde - + %1 seconds %1 secondes - + 0.%1 seconds 0.%1 secondes - + and en - + Export PDF - + Project Settings Project instellingen - + Paths Paden - + Include paths Bevat paden - + Defines Omschrijft - + Undefines - + Path selected Pad Geselekteerd - + Number of files scanned Aantal bestanden gescanned - + Scan duration Scan tijd - - + + Errors Fouten @@ -3136,32 +3081,32 @@ Gebruik het uitzicht menu om te selecteren welke fouten getoond worden. - - + + Warnings Waarschuwingen - - + + Style warnings Stijl waarschuwingen - - + + Portability warnings Portabiliteit waarschuwingen - - + + Performance warnings Presentatie waarschuwingen - - + + Information messages Informatie bericht diff --git a/gui/cppcheck_ru.ts b/gui/cppcheck_ru.ts index 124e4d783aa..464bfb0d34b 100644 --- a/gui/cppcheck_ru.ts +++ b/gui/cppcheck_ru.ts @@ -116,70 +116,6 @@ Parameters: -l(line) (file) Š’Ń‹ Голжны Š·Š°Š“Š°Ń‚ŃŒ название Šø ŠæŃƒŃ‚ŃŒ Šŗ ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃŽ! - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -219,12 +155,12 @@ Parameters: -l(line) (file) - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -489,30 +425,30 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + A&nalyze Анализ - + Standard ДтанГартные @@ -522,245 +458,245 @@ Parameters: -l(line) (file) &Файл - + &View &Š’ŠøŠ“ - + &Toolbars &Панель ŠøŠ½ŃŃ‚Ń€ŃƒŠ¼ŠµŠ½Ń‚Š¾Š² - + C++ standard ДтанГарт C++ - + &C standard C standard &ДтанГарт C - + &Edit &ŠŸŃ€Š°Š²ŠŗŠ° - + &License... &Š›ŠøŃ†ŠµŠ½Š·ŠøŃ... - + A&uthors... &Авторы... - + &About... &Šž программе... - + &Files... &Файлы... - - + + Analyze files Check files ŠŸŃ€Š¾Š²ŠµŃ€ŠøŃ‚ŃŒ файлы - + Ctrl+F Ctrl+F - + &Directory... &ŠšŠ°Ń‚Š°Š»Š¾Š³... - - + + Analyze directory Check directory ŠŸŃ€Š¾Š²ŠµŃ€ŠŗŠ° каталога - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop ŠžŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ - - + + Stop analysis Stop checking ŠžŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ ŠæŃ€Š¾Š²ŠµŃ€ŠŗŃƒ - + Esc Esc - + &Save results to file... Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ отчёт в файл... - + Ctrl+S Ctrl+S - + &Quit ВыхоГ - + &Clear results ŠžŃ‡ŠøŃŃ‚ŠøŃ‚ŃŒ отчёт - + &Preferences ŠŸŠ°Ń€Š°Š¼ŠµŃ‚Ń€Ń‹ - - - + + + Show errors ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ошибки - - - + + + Show warnings ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ - - + + Show performance warnings ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚Šø - + Show &hidden ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ скрытые - - + + Information Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŠ¾Š½Š½Ń‹Šµ ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ - + Show information messages ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ информационные ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ - + Show portability warnings ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ переносимости - + Show Cppcheck results ŠŸŃ€Š¾ŃŠ¼Š¾Ń‚Ń€ Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚Š¾Š² Cppcheck - + Clang Clang - + Show Clang results ŠŸŃ€Š¾ŃŠ¼Š¾Ń‚Ń€ Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚Š¾Š² Clang - + &Filter Š¤ŠøŠ»ŃŒŃ‚Ń€ - + Filter results Š ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚Ń‹ Ń„ŠøŠ»ŃŒŃ‚Ń€Š°Ń†ŠøŠø - + Windows 32-bit ANSI Windows 32-bit ANSI - + Windows 32-bit Unicode Windows 32-bit Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... ŠŸŠµŃ‡Š°Ń‚ŃŒ... - + Print the Current Report ŠŠ°ŠæŠµŃ‡Š°Ń‚Š°Ń‚ŃŒ Ń‚ŠµŠŗŃƒŃ‰ŠøŠ¹ отчет - + Print Pre&view... ŠŸŃ€ŠµŠ“Š²Š°Ń€ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Š¹ просмотр... - + Open a Print Preview Dialog for the Current Results ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ Гиалог печати Š“Š»Ń Ń‚ŠµŠŗŃƒŃ‰ŠøŃ… Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚Š¾Š² - + Open library editor ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ реГактор библиотек - + &Check all ŠžŃ‚Š¼ŠµŃ‚ŠøŃ‚ŃŒ все @@ -775,336 +711,336 @@ Parameters: -l(line) (file) Š”ŠŗŃ€Ń‹Ń‚ŃŒ - - + + Report - + Filter Š¤ŠøŠ»ŃŒŃ‚Ń€ - + &Reanalyze modified files &Recheck modified files Заново ŠæŃ€Š¾Š²ŠµŃ€ŠøŃ‚ŃŒ измененные файлы - + Reanal&yze all files Заново ŠæŃ€Š¾Š²ŠµŃ€ŠøŃ‚ŃŒ все файлы - + Ctrl+Q - + Style war&nings Дтилистические ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ - + E&rrors ŠžŃˆŠøŠ±ŠŗŠø - + &Uncheck all Š”Š±Ń€Š¾ŃŠøŃ‚ŃŒ все - + Collapse &all Š”Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ все - + &Expand all Š Š°Š·Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ все - + &Standard ДтанГартные - + Standard items ДтанГартные ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹ - + Toolbar Панель ŠøŠ½ŃŃ‚Ń€ŃƒŠ¼ŠµŠ½Ń‚Š¾Š² - + &Categories ŠšŠ°Ń‚ŠµŠ³Š¾Ń€ŠøŠø - + Error categories ŠšŠ°Ń‚ŠµŠ³Š¾Ń€ŠøŠø ошибок - + &Open XML... &ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ XML... - + Open P&roject File... ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ файл &проекта... - + Ctrl+Shift+O - + Sh&ow Scratchpad... ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ Блокнот - + &New Project File... &ŠŠ¾Š²Ń‹Š¹ файл проекта... - + Ctrl+Shift+N - + &Log View ŠŸŠ¾ŃŠ¼Š¾Ń‚Ń€ŠµŃ‚ŃŒ &лог - + Log View ŠŸŠ¾ŃŠ¼Š¾Ń‚Ń€ŠµŃ‚ŃŒ лог - + C&lose Project File &Š—Š°ŠŗŃ€Ń‹Ń‚ŃŒ файл проекта - + &Edit Project File... &Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ файл проекта... - + &Statistics &Дтатистика - + &Warnings ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ - + Per&formance warnings ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚Šø - + &Information Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŠ¾Š½Š½Ń‹Šµ ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ - + &Portability ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ переносимости - + P&latforms ŠŸŠ»Š°Ń‚Ń„Š¾Ń€Š¼Ń‹ - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... РеГактор библиотеки - + &Auto-detect language Автоматическое опреГеление ŃŠ·Ń‹ŠŗŠ° - + &Enforce C++ ŠŸŃ€ŠøŠ½ŃƒŠ“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ C++ - + E&nforce C ŠŸŃ€ŠøŠ½ŃƒŠ“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ C - + C++14 C++14 - + Reanalyze and check library ŠŸŠ¾Š²Ń‚Š¾Ń€Š½Ń‹Š¹ анализ библиотеки - + Check configuration (defines, includes) ŠŸŃ€Š¾Š²ŠµŃ€ŠøŃ‚ŃŒ ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŃŽ (defines, includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents ŠŸŠ¾Š¼Š¾Ń‰ŃŒ - + Categories ŠšŠ°Ń‚ŠµŠ³Š¾Ń€ŠøŠø - - + + Show style warnings ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ стилистические ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ - + Open the help contents ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ ŠæŠ¾Š¼Š¾Ń‰ŃŒ - + F1 F1 - + &Help ŠŸŠ¾Š¼Š¾Ń‰ŃŒ - - + + Quick Filter: Быстрый Ń„ŠøŠ»ŃŒŃ‚Ń€: - + Select configuration Выбор ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŠø - + Found project file: %1 Do you want to load this project file instead? @@ -1113,97 +1049,97 @@ Do you want to load this project file instead? Š’Ń‹ хотите Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŃŃ‚Š¾Ń‚ проект? - + File not found Файл не найГен - + Bad XML ŠŠµŠŗŠ¾Ń€Ń€ŠµŠŗŃ‚Š½Ń‹Š¹ XML - + Missing attribute ŠŸŃ€Š¾ŠæŃƒŃ‰ŠµŠ½ Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚ - + Bad attribute value ŠŠµŠŗŠ¾Ń€Ń€ŠµŠŗŃ‚Š½Š¾Šµ значение Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Š° - + Unsupported format ŠŠµŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŠµŠ¼Ń‹Š¹ формат - + Duplicate define - + Failed to load the selected library '%1'. %2 ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ Š²Ń‹Š±Ń€Š°Š½Š½ŃƒŃŽ Š±ŠøŠ±Š»ŠøŠ¾Ń‚ŠµŠŗŃƒ '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Š›ŠøŃ†ŠµŠ½Š·ŠøŃ - + Authors Авторы - + Save the report file Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ файл с отчетом - - + + XML files (*.xml) XML-файлы (*.xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -1212,43 +1148,37 @@ This is probably because the settings were changed between the Cppcheck versions Возможно, ŃŃ‚Š¾ ŃŠ²ŃŠ·Š°Š½Š¾ с ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃŠ¼Šø в версии программы. ŠŸŠ¾Š¶Š°Š»ŃƒŠ¹ŃŃ‚Š°, ŠæŃ€Š¾Š²ŠµŃ€ŃŒŃ‚Šµ (Šø ŠøŃŠæŃ€Š°Š²ŃŒŃ‚Šµ) настройки ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ. - + You must close the project file before selecting new files or directories! Š’Ń‹ Голжны Š·Š°ŠŗŃ€Ń‹Ń‚ŃŒ проект переГ выбором новых файлов или каталогов! - + The library '%1' contains unknown elements: %2 Библиотека '%1' соГержит неизвестные ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹: %2 - + Duplicate platform type Š”ŃƒŠ±Š»ŠøŠŗŠ°Ń‚ типа платформы - + Platform type redefined ŠŸŠµŃ€ŠµŠ¾Š±ŃŠŃŠ²Š»ŠµŠ½ŠøŠµ типа платформы - + Unknown element ŠŠµŠøŠ·Š²ŠµŃŃ‚Š½Ń‹Š¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ - - Unknown element - Unknown issue - ŠŠµŠøŠ·Š²ŠµŃŃ‚Š½Š°Ń проблема - - - - - - + + + + Error ŠžŃˆŠøŠ±ŠŗŠ° @@ -1257,80 +1187,80 @@ This is probably because the settings were changed between the Cppcheck versions ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ %1. Cppcheck ŃƒŃŃ‚Š°Š½Š¾Š²Š»ŠµŠ½ некорректно. Š’Ń‹ можете ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ --data-dir=<directory> в команГной строке Š“Š»Ń ŃƒŠŗŠ°Š·Š°Š½ŠøŃ Ń€Š°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŃ файлов ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŠø. ŠžŠ±Ń€Š°Ń‚ŠøŃ‚Šµ внимание, что --data-dir преГназначен Š“Š»Ń ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Š½ŠøŃ ŃŃ†ŠµŠ½Š°Ń€ŠøŃŠ¼Šø ŃƒŃŃ‚Š°Š½Š¾Š²ŠŗŠø. ŠŸŃ€Šø Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠø Ганной опции, графический интерфейс ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»Ń не Š·Š°ŠæŃƒŃŠŗŠ°ŠµŃ‚ся. - + Open the report file ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ файл с отчетом - + Text files (*.txt) Текстовые файлы (*.txt) - + CSV files (*.csv) CSV файлы(*.csv) - + Project files (*.cppcheck);;All files(*.*) Файлы проекта (*.cppcheck);;Все файлы(*.*) - + Select Project File Выберите файл проекта - - - - + + + + Project: ŠŸŃ€Š¾ŠµŠŗŃ‚: - + No suitable files found to analyze! ŠŠµ найГено ŠæŠ¾Š“Ń…Š¾Š“ŃŃ‰ŠøŃ… файлов Š“Š»Ń анализа - + C/C++ Source Š˜ŃŃ…Š¾Š“Š½Ń‹Š¹ коГ C/C++ - + Compile database - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze Выбор файлов Š“Š»Ń анализа - + Select directory to analyze Выбор каталога Š“Š»Ń анализа - + Select the configuration that will be analyzed Выбор используемой ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŠø - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1339,7 +1269,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1350,7 +1280,7 @@ Do you want to proceed? Š’Ń‹ хотите ŠæŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŃŒ? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1359,109 +1289,104 @@ Do you want to stop the analysis and exit Cppcheck? Š’Ń‹ хотите Š¾ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ анализ Šø выйти ŠøŠ· Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML файлы (*.xml);;Текстовые файлы (*.txt);;CSV файлы (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? Š”ŠøŃ€ŠµŠŗŃ‚Š¾Ń€ŠøŃ Š“Š»Ń сборки '%1' не ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŠµŃ‚, ŃŠ¾Š·Š“Š°Ń‚ŃŒ? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1470,22 +1395,22 @@ Analysis is stopped. ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ ŠøŠ¼ŠæŠ¾Ń€Ń‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ '%1', анализ остановлен - + Project files (*.cppcheck) Файлы проекта (*.cppcheck) - + Select Project Filename Выберите ŠøŠ¼Ń файла Š“Š»Ń проекта - + No project file loaded Файл с проектом не Š·Š°Š³Ń€ŃƒŠ¶ŠµŠ½ - + The project file %1 @@ -1501,12 +1426,12 @@ Do you want to remove the file from the recently used projects -list? Єотите ŃƒŠ“Š°Š»ŠøŃ‚ŃŒ его ŠøŠ· списка проектов? - + Install - + New version available: %1. %2 @@ -1650,52 +1575,52 @@ Options: Defines Голжны Š±Ń‹Ń‚ŃŒ разГелены точкой с Š·Š°ŠæŃŃ‚Š¾Š¹ ';' - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. ŠŸŠ¾Š»Š¾Š¶ŠøŃ‚Šµ свои .cfg-файлы в оГин каталог с файлом проекта. Š’Ń‹ ŃƒŠ²ŠøŠ“ŠøŃ‚Šµ ŠøŃ… ŃŠ²ŠµŃ€Ń…Ńƒ. - + Clang (experimental) - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Max recursion in template instantiation - + Filepaths in warnings will be relative to this path - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... @@ -1704,17 +1629,17 @@ Options: MISRA C 2012 - + MISRA rule texts Файл с текстами правил MISRA - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> <html><head/><body><p>Š”ŠŗŠ¾ŠæŠøŃ€ŃƒŠ¹Ń‚Šµ текст ŠøŠ· Appendix A &quot;Summary of guidelines&quot; ŠøŠ· фала правил MISRA C 2012 pdf в текстовый файл.</p></body></html> - + ... ... @@ -1725,8 +1650,7 @@ Options: - - + Browse... ŠžŠ±Š·Š¾Ń€... @@ -1754,15 +1678,15 @@ Options: - + Edit Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ - - + + Remove Š£Š“Š°Š»ŠøŃ‚ŃŒ @@ -1782,124 +1706,134 @@ Options: ŠŸŃƒŃ‚Šø заголовочных файлов: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions - - + + Analysis Анализ - + This is a workfolder that Cppcheck will use for various purposes. - + Parser - + Cppcheck (built in) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + Check that each class has a safe public interface - + Limit analysis - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) ŠŸŃ€Š¾Š²ŠµŃ€ŠøŃ‚ŃŒ коГ в Š½ŠµŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŠ¼Ń‹Ń… ŃˆŠ°Š±Š»Š¾Š½Š°Ń… - + Max CTU depth ŠœŠ°ŠŗŃŠøŠ¼Š°Š»ŃŒŠ½Š°Ń глубина CTU - - Premium License - - - - + Enable inline suppressions Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ inline-поГавление ошибок - + 2025 - + Misra C++ - + 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools Š’Š½ŠµŃˆŠ½ŠøŠµ ŠøŠ½ŃŃ‚Ń€ŃƒŠ¼ŠµŠ½Ń‚Ń‹ @@ -1914,104 +1848,104 @@ Options: Вниз - + Platform ŠŸŠ»Š°Ń‚Ń„Š¾Ń€Š¼Š° - + Warning options ŠžŠæŃ†ŠøŠø ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠ¹ - + Root path: ŠšŠ¾Ń€Š½ŠµŠ²Š¾Š¹ каталог: - + Warning tags (separated by semicolon) Теги ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠ¹ (через ';') - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) ŠšŠ°Ń‚Š°Š»Š¾Š³ сборки Cppcheck - + Libraries Библиотеки - + Suppressions ŠŸŠ¾Š“Š°Š²Š»ŠµŠ½ŠøŃ - + Add Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ - - + + Addons Š”Š¾ŠæŠ¾Š»Š½ŠµŠ½ŠøŃ - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards ДтанГарты ŠŗŠ¾Š“ŠøŃ€Š¾Š²Š°Š½ŠøŃ - + Misra C - + 2012 - - + + 2023 - + Cert C++ - + Bug hunting (Premium) - + Clang analyzer - + Clang-tidy @@ -2024,82 +1958,93 @@ Options: ProjectFileDialog - + Project file: %1 Файл проекта: %1 - + Select Cppcheck build dir Š’Ń‹Š±Ń€Š°Ń‚ŃŒ Š“ŠøŃ€ŠµŠŗŃ‚Š¾Ń€ŠøŃŽ сборки Cppcheck - + Select include directory Выберите Š“ŠøŃ€ŠµŠŗŃ‚Š¾Ń€ŠøŃŽ Š“Š»Ń поиска заголовочных файлов - + Select a directory to check Выберите Š“ŠøŃ€ŠµŠŗŃ‚Š¾Ń€ŠøŃŽ Š“Š»Ń проверки - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) Clang-tidy (не найГен) - + Visual Studio Visual Studio - + Compile database - + Borland C++ Builder 6 Borland C++ Builder 6 - + Import Project Š˜Š¼ŠæŠ¾Ń€Ń‚ проекта - + + C/C++ header + + + + + Include file + + + + Select directory to ignore Выберите Š“ŠøŃ€ŠµŠŗŃ‚Š¾Ń€ŠøŃŽ, ŠŗŠ¾Ń‚Š¾Ń€ŃƒŃŽ наГо ŠæŃ€Š¾ŠøŠ³Š½Š¾Ń€ŠøŃ€Š¾Š²Š°Ń‚ŃŒ - + Source files - + + All files - + Exclude file - + Select MISRA rule texts file Š’Ń‹Š±Ń€Š°Ń‚ŃŒ файл текстов правил MISRA - + MISRA rule texts file (%1) Файл текстов правил MISRA (%1) @@ -2134,7 +2079,7 @@ Options: - + (Not found) (ŠŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š¾) @@ -2555,102 +2500,102 @@ Please check the application path and parameters are correct. ResultsView - + Print Report Š Š°ŃŠæŠµŃ‡Š°Ń‚Š°Ń‚ŃŒ отчет - + No errors found, nothing to print. ŠžŃˆŠøŠ±Š¾Šŗ не найГено, нечего Ń€Š°ŃŠæŠµŃ‡Š°Ń‚Ń‹Š²Š°Ń‚ŃŒ. - + %p% (%1 of %2 files checked) %p% (%1 ŠøŠ· %2 файлов проверено) - - + + Cppcheck Cppcheck - + No errors found. ŠžŃˆŠøŠ±Š¾Šŗ не найГено. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Были Š¾Š±Š½Š°Ń€ŃƒŠ¶ŠµŠ½Ń‹ ошибки, но они настроены Š±Ń‹Ń‚ŃŒ скрыты. Š”Š»Ń ŠæŠµŃ€ŠµŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŃ какие ошибки Š¾Ń‚Š¾Š±Ń€Š°Š¶Š°ŃŽŃ‚ŃŃ, откройте Š¼ŠµŠ½ŃŽ ŠæŃ€ŠµŠ“ŃŃ‚Š°Š²Š»ŠµŠ½ŠøŃ. - - + + Failed to read the report. ŠŠµ уГалось ŠæŃ€Š¾Ń‡ŠøŃ‚Š°Ń‚ŃŒ отчет. - + XML format version 1 is no longer supported. XML формат версии 1 больше не ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŠµŃ‚ŃŃ. - + First included by Только первый Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½Š½Ń‹Š¹ - + Id Id - + Clear Log ŠžŃ‡ŠøŃŃ‚ŠøŃ‚ŃŒ лог - + Copy this Log entry Š”ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š“Š°Š½Š½ŃƒŃŽ запись - + Copy complete Log Š”ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ полный лог - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - - + + Failed to save the report. ŠŠµ уГалось ŃŠ¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ отчет. @@ -2956,14 +2901,14 @@ To toggle what kind of errors are shown, open view menu. - - + + Statistics Дтатистика - + Project ŠŸŃ€Š¾ŠµŠŗŃ‚ @@ -2994,7 +2939,7 @@ To toggle what kind of errors are shown, open view menu. - + Previous Scan ПослеГнее сканирование @@ -3074,103 +3019,103 @@ To toggle what kind of errors are shown, open view menu. Экспорт PDF - + 1 day 1 Гень - + %1 days %1 Гней - + 1 hour 1 час - + %1 hours %1 часов - + 1 minute 1 Š¼ŠøŠ½ŃƒŃ‚Š° - + %1 minutes %1 Š¼ŠøŠ½ŃƒŃ‚ - + 1 second 1 секунГа - + %1 seconds %1 секунГ - + 0.%1 seconds 0.1%1 секунГ - + and Šø - + Export PDF Экспорт PDF - + Project Settings ŠŠ°ŃŃ‚Ń€Š¾Š¹ŠŗŠø проекта - + Paths ŠŸŃƒŃ‚Šø - + Include paths Š’ŠŗŠ»ŃŽŃ‡ŠµŠ½Š½Ń‹Šµ ŠæŃƒŃ‚Šø - + Defines ŠžŠ±ŃŠŃŠ²Š»ŠµŠ½Š½Ń‹Šµ Š¼Š°ŠŗŃ€Š¾Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ: - + Undefines УГаленные Š¼Š°ŠŗŃ€Š¾Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ: - + Path selected Выбранные ŠæŃƒŃ‚Šø - + Number of files scanned ŠšŠ¾Š»ŠøŃ‡ŠµŃŃ‚Š²Š¾ просканированных файлов - + Scan duration ŠŸŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ ŃŠŗŠ°Š½ŠøŃ€Š¾Š²Š°Š½ŠøŃ - - + + Errors ŠžŃˆŠøŠ±ŠŗŠø @@ -3185,32 +3130,32 @@ To toggle what kind of errors are shown, open view menu. ŠŠµ заГана Š“ŠøŃ€ŠµŠŗŃ‚Š¾Ń€ŠøŃ сборки - - + + Warnings ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ - - + + Style warnings Дтилистические ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ - - + + Portability warnings ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ переносимости - - + + Performance warnings ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚Šø - - + + Information messages Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŠ¾Š½Š½Ń‹Šµ ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ diff --git a/gui/cppcheck_sr.ts b/gui/cppcheck_sr.ts index 70b04dd196f..190dbdbe751 100644 --- a/gui/cppcheck_sr.ts +++ b/gui/cppcheck_sr.ts @@ -106,70 +106,6 @@ Parameters: -l(line) (file) - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -207,12 +143,12 @@ Parameters: -l(line) (file) - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -477,30 +413,30 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + A&nalyze - + Standard Standard @@ -510,245 +446,245 @@ Parameters: -l(line) (file) &File - + &View &View - + &Toolbars - + C++ standard - + &C standard C standard - + &Edit &Edit - + &License... &License... - + A&uthors... A&uthors... - + &About... &About... - + &Files... &Files... - - + + Analyze files Check files - + Ctrl+F Ctrl+F - + &Directory... &Directory... - - + + Analyze directory Check directory - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop &Stop - - + + Stop analysis Stop checking - + Esc Esc - + &Save results to file... &Save results to file... - + Ctrl+S Ctrl+S - + &Quit &Quit - + &Clear results &Clear results - + &Preferences &Preferences - - - + + + Show errors - - - + + + Show warnings - - + + Show performance warnings - + Show &hidden - - + + Information - + Show information messages - + Show portability warnings - + Show Cppcheck results - + Clang - + Show Clang results - + &Filter - + Filter results - + Windows 32-bit ANSI Windows 32-bit ANSI - + Windows 32-bit Unicode Windows 32-bit Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... - + Print the Current Report - + Print Pre&view... - + Open a Print Preview Dialog for the Current Results - + Open library editor - + &Check all &Check all @@ -763,559 +699,553 @@ Parameters: -l(line) (file) - - + + Report - + Filter - + &Reanalyze modified files &Recheck modified files - + Reanal&yze all files - + Ctrl+Q - + Style war&nings - + E&rrors - + &Uncheck all &Uncheck all - + Collapse &all Collapse &all - + &Expand all &Expand all - + &Standard - + Standard items - + Toolbar - + &Categories - + Error categories - + &Open XML... - + Open P&roject File... - + Ctrl+Shift+O - + Sh&ow Scratchpad... - + &New Project File... - + Ctrl+Shift+N - + &Log View - + Log View - + C&lose Project File - + &Edit Project File... - + &Statistics - + &Warnings - + Per&formance warnings - + &Information - + &Portability - + P&latforms - + C++&11 - + C&99 - + &Posix - + C&11 - + &C89 - + &C++03 - + &Library Editor... - + &Auto-detect language - + &Enforce C++ - + E&nforce C - + C++14 C++14 - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents - + Categories - - + + Show style warnings - + Open the help contents - + F1 F1 - + &Help &Help - - + + Quick Filter: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License License - + Authors Authors - + Save the report file Save the report file - - + + XML files (*.xml) XML files (*.xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. - + You must close the project file before selecting new files or directories! - + The library '%1' contains unknown elements: %2 - + Unsupported format - + Duplicate platform type - + Platform type redefined - - Unknown element - - - - + Unknown element - Unknown issue - - - - + + + + Error - + Open the report file - + Text files (*.txt) Text files (*.txt) - + CSV files (*.csv) - + Project files (*.cppcheck);;All files(*.*) - + Select Project File - - - - + + + + Project: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1323,81 +1253,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename - + No project file loaded - + The project file %1 @@ -1408,67 +1333,67 @@ Do you want to remove the file from the recently used projects -list? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1599,22 +1524,22 @@ Options: - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + ... @@ -1625,8 +1550,7 @@ Options: - - + Browse... @@ -1654,15 +1578,15 @@ Options: - + Edit - - + + Remove @@ -1692,271 +1616,281 @@ Options: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Platform - - + + Analysis - + This is a workfolder that Cppcheck will use for various purposes. - + Clang (experimental) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth - + Max recursion in template instantiation - - Premium License - - - - + Warning options - + Root path: - + Filepaths in warnings will be relative to this path - + Warning tags (separated by semicolon) - + Enable inline suppressions - + 2025 - + Misra C++ - + 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) - + Types and Functions - + Libraries - + Parser - + Cppcheck (built in) - + Check that each class has a safe public interface - + Limit analysis - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Suppressions - + Add - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 - + Thread safety - + Coding standards - + Misra C - + 2012 - - + + 2023 - + Cert C++ - + Bug hunting (Premium) - + Clang analyzer - + Clang-tidy @@ -1969,82 +1903,93 @@ Options: ProjectFileDialog - + Project file: %1 - + Select Cppcheck build dir - + Select include directory - + Select a directory to check - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) - + Visual Studio - + Compile database - + Borland C++ Builder 6 - + Import Project - + + C/C++ header + + + + + Include file + + + + Select directory to ignore - + Source files - + + All files - + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) @@ -2077,7 +2022,7 @@ Options: - + (Not found) @@ -2472,102 +2417,102 @@ Please check the application path and parameters are correct. ResultsView - + Print Report - + No errors found, nothing to print. - + %p% (%1 of %2 files checked) - - + + Cppcheck Cppcheck - + No errors found. No errors found. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. - - + + Failed to read the report. - + XML format version 1 is no longer supported. - + First included by - + Id - + Clear Log - + Copy this Log entry - + Copy complete Log - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - - + + Failed to save the report. Failed to save the report. @@ -2864,14 +2809,14 @@ To toggle what kind of errors are shown, open view menu. - - + + Statistics - + Project @@ -2902,7 +2847,7 @@ To toggle what kind of errors are shown, open view menu. - + Previous Scan @@ -2982,103 +2927,103 @@ To toggle what kind of errors are shown, open view menu. - + 1 day - + %1 days - + 1 hour - + %1 hours - + 1 minute - + %1 minutes - + 1 second - + %1 seconds - + 0.%1 seconds - + and - + Export PDF - + Project Settings - + Paths - + Include paths - + Defines - + Undefines - + Path selected - + Number of files scanned - + Scan duration - - + + Errors @@ -3093,32 +3038,32 @@ To toggle what kind of errors are shown, open view menu. - - + + Warnings - - + + Style warnings - - + + Portability warnings - - + + Performance warnings - - + + Information messages diff --git a/gui/cppcheck_sv.ts b/gui/cppcheck_sv.ts index f37121c2f2f..4f548b454d0 100644 --- a/gui/cppcheck_sv.ts +++ b/gui/cppcheck_sv.ts @@ -116,70 +116,6 @@ Parametrar: -l(line) (file) Du mĆ„ste ange namn, sƶkvƤg samt eventuellt parametrar fƶr applikationen! - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -219,12 +155,12 @@ Parametrar: -l(line) (file) - + Helpfile '%1' was not found - + Cppcheck Cppcheck @@ -495,30 +431,30 @@ Exempel: MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck - + A&nalyze Analysera - + Standard Standard @@ -528,245 +464,245 @@ Exempel: &Arkiv - + &View &Visa - + &Toolbars VerktygsfƤlt - + C++ standard C++ standard - + &C standard C standard C standard - + &Edit &Redigera - + &License... &Licens... - + A&uthors... &Utvecklat av... - + &About... &Om... - + &Files... &Filer... - - + + Analyze files Check files Analysera filer - + Ctrl+F Ctrl+F - + &Directory... &Katalog... - - + + Analyze directory Check directory Analysera mapp - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop &Stoppa - - + + Stop analysis Stop checking Stoppa analys - + Esc Esc - + &Save results to file... &Spara resultat till fil... - + Ctrl+S Ctrl+S - + &Quit &Avsluta - + &Clear results &Tƶm resultat - + &Preferences &InstƤllningar - - - + + + Show errors Visa fel - - - + + + Show warnings Visa varningar - - + + Show performance warnings Visa prestanda varningar - + Show &hidden Visa dolda - - + + Information Information - + Show information messages Visa informations meddelanden - + Show portability warnings Visa portabilitets varningar - + Show Cppcheck results Visa Cppcheck resultat - + Clang Clang - + Show Clang results Visa Clang resultat - + &Filter &Filter - + Filter results Filtrera resultat - + Windows 32-bit ANSI Windows 32-bit ANSI - + Windows 32-bit Unicode Windows 32-bit Unicode - + Unix 32-bit Unix 32-bit - + Unix 64-bit Unix 64-bit - + Windows 64-bit Windows 64-bit - + &Print... Skriv ut... - + Print the Current Report Skriv ut aktuell rapport - + Print Pre&view... Fƶrhandsgranska utskrift... - + Open a Print Preview Dialog for the Current Results Ɩppnar fƶrhandsgranskning fƶr nuvarande resultat - + Open library editor Ɩppna library editor - + &Check all &Kryssa alla @@ -781,337 +717,337 @@ Exempel: Dƶlj - - + + Report - + Filter Filter - + &Reanalyze modified files &Recheck modified files Analysera om Ƥndrade filer - + Reanal&yze all files Analysera om alla filer - + Ctrl+Q - + Style war&nings Style varningar - + E&rrors Fel - + &Uncheck all Kryssa &ur alla - + Collapse &all Ingen bra ƶversƤttning! &FƤll ihop alla - + &Expand all &Expandera alla - + &Standard &Standard - + Standard items Standard poster - + Toolbar VerktygsfƤlt - + &Categories &Kategorier - + Error categories Fel kategorier - + &Open XML... &Ɩppna XML... - + Open P&roject File... Ɩppna Projektfil... - + Ctrl+Shift+O - + Sh&ow Scratchpad... Visa Scratchpad... - + &New Project File... Ny projektfil... - + Ctrl+Shift+N - + &Log View - + Log View Logg vy - + C&lose Project File StƤng projektfil - + &Edit Project File... Redigera projektfil... - + &Statistics Statistik - + &Warnings Varningar - + Per&formance warnings Optimerings varningar - + &Information Information - + &Portability Portabilitet - + P&latforms Plattformar - + C++&11 C++11 - + C&99 C99 - + &Posix Posix - + C&11 C11 - + &C89 C89 - + &C++03 C++03 - + &Library Editor... Library Editor... - + &Auto-detect language Detektera sprĆ„k automatiskt - + &Enforce C++ Tvinga C++ - + E&nforce C Tvinga C - + C++14 C++14 - + Reanalyze and check library - + Check configuration (defines, includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + &Contents &InnehĆ„ll - + Categories Kategorier - - + + Show style warnings Visa stil varningar - + Open the help contents Ɩppna hjƤlp - + F1 F1 - + &Help &HjƤlp - - + + Quick Filter: Snabbfilter: - + Select configuration VƤlj konfiguration - + Found project file: %1 Do you want to load this project file instead? @@ -1120,97 +1056,97 @@ Do you want to load this project file instead? Vill du ladda denna projektfil istƤllet? - + File not found Filen hittades ej - + Bad XML Ogiltig XML - + Missing attribute Attribut finns ej - + Bad attribute value Ogiltigt attribut vƤrde - + Unsupported format Format stƶds ej - + Duplicate define - + Failed to load the selected library '%1'. %2 Misslyckades att ladda valda library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Licens - + Authors Utvecklare - + Save the report file Spara rapport - - + + XML files (*.xml) XML filer (*.xml) - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -1219,43 +1155,37 @@ This is probably because the settings were changed between the Cppcheck versions En trolig orsak Ƥr att instƤllningarna Ƥndrats fƶr olika Cppcheck versioner. Kontrollera programinstƤllningarna. - + You must close the project file before selecting new files or directories! Du mĆ„ste stƤnga projektfilen innan nya filer eller sƶkvƤgar kan vƤljas! - + The library '%1' contains unknown elements: %2 Library filen '%1' har element som ej hanteras: %2 - + Duplicate platform type Dubbel plattformstyp - + Platform type redefined Plattformstyp definieras igen - + Unknown element Element hanteras ej - - Unknown element - Unknown issue - NĆ„got problem - - - - - - + + + + Error Fel @@ -1264,80 +1194,80 @@ En trolig orsak Ƥr att instƤllningarna Ƥndrats fƶr olika Cppcheck versioner. Misslyckades att ladda %1. Din Cppcheck installation Ƥr ej komplett. Du kan anvƤnda --data-dir<directory> pĆ„ kommandoraden fƶr att specificera var denna fil finns. Det Ƥr meningen att --data-dir kommandot skall kƶras under installationen,sĆ„ GUIt kommer ej visas nƤr --data-dir anvƤnds allt som hƤnder Ƥr att en instƤllning gƶrs. - + Open the report file Ɩppna rapportfilen - + Text files (*.txt) Text filer (*.txt) - + CSV files (*.csv) CSV filer (*.csv) - + Project files (*.cppcheck);;All files(*.*) Projektfiler (*.cppcheck);;Alla filer(*.*) - + Select Project File VƤlj projektfil - - - - + + + + Project: Projekt: - + No suitable files found to analyze! Inga filer hittades att analysera! - + C/C++ Source - + Compile database - + Visual Studio Visual Studio - + Borland C++ Builder 6 - + Select files to analyze VƤlj filer att analysera - + Select directory to analyze VƤlj mapp att analysera - + Select the configuration that will be analyzed VƤlj konfiguration som kommer analyseras - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1346,7 +1276,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1354,7 +1284,7 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1363,109 +1293,104 @@ Do you want to stop the analysis and exit Cppcheck? Vill du stoppa analysen och avsluta Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML filer (*.xml);;Text filer (*.txt);;CSV filer (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Build dir '%1' does not exist, create it? Build dir '%1' existerar ej, skapa den? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1474,22 +1399,22 @@ Analysis is stopped. Misslyckades att importera '%1', analysen stoppas - + Project files (*.cppcheck) Projekt filer (*.cppcheck) - + Select Project Filename VƤlj Projektfil - + No project file loaded Inget projekt laddat - + The project file %1 @@ -1506,12 +1431,12 @@ Do you want to remove the file from the recently used projects -list? Vill du ta bort filen frĆ„n 'senast anvƤnda projekt'-listan? - + Install - + New version available: %1. %2 @@ -1655,12 +1580,12 @@ Options: Defines separeras med semicolon ';' - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. Obs: LƤgg dina egna .cfg filer i samma folder som projekt filen. De skall isĆ„fall visas ovan. - + ... ... @@ -1671,8 +1596,7 @@ Options: - - + Browse... @@ -1700,15 +1624,15 @@ Options: - + Edit Redigera - - + + Remove Ta bort @@ -1728,143 +1652,153 @@ Options: Include sƶkvƤgar: - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + This is a workfolder that Cppcheck will use for various purposes. - + Clang (experimental) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Max recursion in template instantiation - - Premium License - - - - + Filepaths in warnings will be relative to this path - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files - + Exclude folder... - + Exclude file... - + Enable inline suppressions AnvƤnd inline suppressions - + Misra C - + 2012 - - + + 2023 - + 2025 - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + Misra C++ - + 2008 - + Cert C++ - + Safety profiles (defined in C++ core guidelines) - + Bug hunting (Premium) - + External tools @@ -1879,140 +1813,140 @@ Options: Ned - + Platform - - + + Analysis - + Parser - + Cppcheck (built in) - + Check that each class has a safe public interface - + Limit analysis - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) - + Max CTU depth - + Warning options - + Root path: Bas sƶkvƤg: - + Warning tags (separated by semicolon) Varnings taggar (separerade med semikolon) - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) Cppcheck build dir (whole program analys, incremental analys, statistik, etc) - + Types and Functions - + Libraries Libraries - + Suppressions Suppressions - + Add LƤgg till - - + + Addons Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 Y2038 - + Thread safety TrĆ„d sƤkerhet - + Coding standards Kodstandarder - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Bug hunting - + Clang analyzer Clang analyzer - + Clang-tidy Clang-tidy @@ -2025,82 +1959,93 @@ Options: ProjectFileDialog - + Project file: %1 Projektfil: %1 - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) - + Select Cppcheck build dir VƤlj Cppcheck build dir - + + C/C++ header + + + + + Include file + + + + Select include directory VƤlj include sƶkvƤg - + Source files - + + All files - + Exclude file - + Select MISRA rule texts file - + MISRA rule texts file (%1) - + Select a directory to check VƤlj mapp att analysera - + Visual Studio Visual Studio - + Compile database - + Borland C++ Builder 6 - + Import Project Importera Projekt - + Select directory to ignore VƤlj sƶkvƤg att ignorera @@ -2135,7 +2080,7 @@ Options: - + (Not found) @@ -2559,102 +2504,102 @@ Kontrollera att sƶkvƤgen och parametrarna Ƥr korrekta. ResultsView - + Print Report Skriv ut rapport - + No errors found, nothing to print. Inga fel hittades, inget att skriva ut. - + %p% (%1 of %2 files checked) %p% (%1 av %2 filer analyserade) - - + + Cppcheck Cppcheck - + No errors found. Inga fel hittades. - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. Fel hittades, men de visas ej. Fƶr att stƤlla in vilka fel som skall visas anvƤnd visa menyn. - - + + Failed to read the report. Misslyckades att lƤsa rapporten. - + XML format version 1 is no longer supported. XML format version 1 stƶds ej lƤngre. - + First included by Fƶrst inkluderad av - + Id Id - + Clear Log - + Copy this Log entry - + Copy complete Log - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. - - + + Failed to save the report. Misslyckades med att spara rapporten. @@ -2960,14 +2905,14 @@ Fƶr att stƤlla in vilka fel som skall visas anvƤnd visa menyn. - - + + Statistics Statistik - + Project Projekt @@ -2998,7 +2943,7 @@ Fƶr att stƤlla in vilka fel som skall visas anvƤnd visa menyn. - + Previous Scan FƶregĆ„ende analys @@ -3078,103 +3023,103 @@ Fƶr att stƤlla in vilka fel som skall visas anvƤnd visa menyn. Pdf Export - + 1 day 1 dag - + %1 days %1 dagar - + 1 hour 1 timme - + %1 hours %1 timmar - + 1 minute 1 minut - + %1 minutes %1 minuter - + 1 second 1 sekund - + %1 seconds %1 sekunder - + 0.%1 seconds 0.%1 sekunder - + and och - + Export PDF Exportera PDF - + Project Settings Projekt instƤllningar - + Paths SƶkvƤgar - + Include paths Include sƶkvƤgar - + Defines Definitioner - + Undefines - + Path selected Vald sƶkvƤg - + Number of files scanned Antal analyserade filer - + Scan duration Tid - - + + Errors Fel @@ -3189,32 +3134,32 @@ Fƶr att stƤlla in vilka fel som skall visas anvƤnd visa menyn. Ingen Cppcheck build dir - - + + Warnings Varningar - - + + Style warnings Stil varningar - - + + Portability warnings Portabilitetsvarningar - - + + Performance warnings Prestanda varningar - - + + Information messages Informationsmeddelanden diff --git a/gui/cppcheck_zh_CN.ts b/gui/cppcheck_zh_CN.ts index 02477e72e81..952fbcd4d14 100644 --- a/gui/cppcheck_zh_CN.ts +++ b/gui/cppcheck_zh_CN.ts @@ -115,70 +115,6 @@ Parameters: -l(line) (file) ä½ åæ…é”»äøŗåŗ”ē”ØēØ‹åŗęŒ‡å®šåē§°ć€č·Æå¾„ä»„åŠåÆé€‰å‚ę•°ļ¼ - - ComplianceReportDialog - - - Compliance Report - - - - - Project name - - - - - Project version - - - - - Coding Standard - - - - - Misra C - - - - - Cert C - - - - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - - HTML files (*.html) - - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - - - FileViewDialog @@ -216,12 +152,12 @@ Parameters: -l(line) (file) 瓢引 - + Helpfile '%1' was not found åø®åŠ©ę–‡ä»¶ '%1' ęœŖę‰¾åˆ° - + Cppcheck Cppcheck @@ -496,20 +432,20 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck @@ -519,281 +455,281 @@ Parameters: -l(line) (file) ꖇ件(&F) - + &View ęŸ„ēœ‹(&V) - + &Toolbars å·„å…·ę (&T) - + &Help 帮助(&H) - + C++ standard C++ 标准 - + &C standard C standard &C 标准 - + &Edit 编辑(&E) - + Standard 标准 - + Categories åˆ†ē±» - + &License... č®øåÆčÆ(&L)... - + A&uthors... ä½œč€…(&U)... - + &About... å…³äŗŽ(&A)... - + &Files... ꖇ件(&F)... - - + + Analyze files Check files åˆ†ęžę–‡ä»¶ - + Ctrl+F Ctrl+F - + &Directory... 目录(&D)... - - + + Analyze directory Check directory åˆ†ęžē›®å½• - + Ctrl+D Ctrl+D - + Ctrl+R Ctrl+R - + &Stop 停止(&S) - - + + Stop analysis Stop checking åœę­¢åˆ†ęž - + Esc Esc - + &Save results to file... äæå­˜ē»“ęžœåˆ°ę–‡ä»¶(&S)... - + Ctrl+S Ctrl+S - + &Quit 退出(&Q) - + &Clear results ęø…ē©ŗē»“ęžœ(&C) - + &Preferences 首选锹(&P) - - + + Show style warnings ę˜¾ē¤ŗé£Žę ¼č­¦å‘Š - - - + + + Show errors ę˜¾ē¤ŗé”™čÆÆ - - + + Information 俔息 - + Show information messages 显示俔息消息 - + Show portability warnings ę˜¾ē¤ŗåÆē§»ę¤ę€§č­¦å‘Š - + Show Cppcheck results 显示 Cppcheck ē»“ęžœ - + Clang Clang - + Show Clang results 显示 Clang ē»“ęžœ - + &Filter 滤器(&F) - + Filter results čæ‡ę»¤ē»“ęžœ - + Windows 32-bit ANSI - + Windows 32-bit Unicode - + Unix 32-bit - + Unix 64-bit - + Windows 64-bit - + &Print... ę‰“å°(&P)... - + Print the Current Report ę‰“å°å½“å‰ęŠ„å‘Š - + Print Pre&view... ę‰“å°é¢„č§ˆ(&v)... - + Open a Print Preview Dialog for the Current Results ę‰“å¼€å½“å‰ē»“ęžœēš„ę‰“å°é¢„č§ˆēŖ—å£ - + Open library editor 打开库编辑器 - + C&lose Project File 关闭锹目文件(&L) - + &Edit Project File... 编辑锹目文件(&E)... - + &Statistics 统讔(&S) - - - + + + Show warnings ę˜¾ē¤ŗč­¦å‘Š - - + + Show performance warnings ę˜¾ē¤ŗę€§čƒ½č­¦å‘Š - + Show &hidden ę˜¾ē¤ŗéšč—é”¹(&H) - + &Check all å…ØéƒØé€‰äø­(&C) @@ -808,299 +744,299 @@ Parameters: -l(line) (file) 隐藏 - - + + Report - + A&nalyze åˆ†ęž(&A) - + Filter 滤器 - + &Reanalyze modified files &Recheck modified files é‡ę–°åˆ†ęžå·²äæ®ę”¹ēš„ę–‡ä»¶(&R) - + Reanal&yze all files é‡ę–°åˆ†ęžå…ØéƒØę–‡ä»¶(&y) - + Ctrl+Q Ctrl+Q - + Style war&nings é£Žę ¼č­¦å‘Š(&n) - + E&rrors 编辑(&r) - + &Uncheck all å…ØéƒØå–ę¶ˆé€‰äø­(&U) - + Collapse &all å…ØéƒØęŠ˜å (&A) - + &Expand all å…ØéƒØå±•å¼€(&E) - + &Standard 标准(&S) - + Standard items 标准锹 - + &Contents 内容(&C) - + Open the help contents ę‰“å¼€åø®åŠ©å†…å®¹ - + F1 F1 - + Toolbar å·„å…·ę  - + &Categories åˆ†ē±»(&C) - + Error categories é”™čÆÆåˆ†ē±» - + &Open XML... 打开 XML (&O)... - + Open P&roject File... 打开锹目文件(&R)... - + Ctrl+Shift+O Ctrl+Shift+O - + Sh&ow Scratchpad... ę˜¾ē¤ŗä¾æę”(&o)... - + &New Project File... 新建锹目文件(&N)... - + Ctrl+Shift+N Ctrl+Shift+N - + &Log View 旄志视图(&L) - + Log View 旄志视图 - + &Warnings č­¦å‘Š(&W) - + Per&formance warnings ę€§čƒ½č­¦å‘Š(&f) - + &Information 俔息(&I) - + &Portability åÆē§»ę¤ę€§(&P) - + P&latforms 平台(&l) - + C++&11 C++&11 - + C&99 C&99 - + &Posix &Posix - + C&11 C&11 - + &C89 &C89 - + &C++03 &C++03 - + &Library Editor... 库编辑器(&L)... - + &Auto-detect language č‡ŖåŠØę£€ęµ‹čÆ­čØ€(&A) - + &Enforce C++ &Enforce C++ - + E&nforce C E&nforce C - + C++14 C++14 - + Reanalyze and check library é‡ę–°åˆ†ęžå¹¶ę£€ęŸ„åŗ“ - + Check configuration (defines, includes) ę£€ęŸ„é…ē½®(defines, includes) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal åøøč§„ - + Misra C - + Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. @@ -1109,23 +1045,23 @@ This is probably because the settings were changed between the Cppcheck versions čæ™åÆčƒ½ę˜Æå› äøŗ Cppcheck äøåŒē‰ˆęœ¬é—“ēš„č®¾ē½®ęœ‰ę‰€äøåŒć€‚čÆ·ę£€ęŸ„(å¹¶äæ®å¤)ē¼–č¾‘å™Øåŗ”ē”ØēØ‹åŗč®¾ē½®ļ¼Œå¦åˆ™ē¼–č¾‘å™ØēØ‹åŗåÆčƒ½äøä¼šę­£ē”®åÆåŠØć€‚ - + You must close the project file before selecting new files or directories! åœØé€‰ę‹©ę–°ēš„ę–‡ä»¶ęˆ–ē›®å½•ä¹‹å‰ļ¼Œä½ åæ…é”»å…ˆå…³é—­ę­¤é”¹ē›®ę–‡ä»¶ļ¼ - - + + Quick Filter: åæ«é€Ÿę»¤å™Ø: - + Select configuration é€‰ę‹©é…ē½® - + Found project file: %1 Do you want to load this project file instead? @@ -1134,70 +1070,64 @@ Do you want to load this project file instead? ä½ ę˜Æå¦ęƒ³åŠ č½½čÆ„é”¹ē›®ę–‡ä»¶ļ¼Ÿ - + The library '%1' contains unknown elements: %2 åŗ“ '%1' åŒ…å«ęœŖēŸ„å…ƒē“ ļ¼š %2 - + File not found ę–‡ä»¶ęœŖę‰¾åˆ° - + Bad XML ę— ę•ˆēš„ XML - + Missing attribute ē¼ŗå¤±å±žę€§ - + Bad attribute value ę— ę•ˆēš„å±žę€§å€¼ - + Unsupported format äøę”ÆęŒēš„ę ¼å¼ - + Duplicate platform type é‡å¤ēš„å¹³å°ē±»åž‹ - + Platform type redefined å¹³å°ē±»åž‹é‡å®šä¹‰ - + Unknown element ä½ē½®å…ƒē“  - - Unknown element - Unknown issue - ęœŖēŸ„é—®é¢˜ - - - + Failed to load the selected library '%1'. %2 é€‰ę‹©ēš„åŗ“ '%1' åŠ č½½å¤±č“„ć€‚ %2 - - - - + + + + Error 错误 @@ -1206,143 +1136,138 @@ Do you want to load this project file instead? 加载 %1 å¤±č“„ć€‚ę‚Øēš„ Cppcheck å®‰č£…å·²ęŸåć€‚ę‚ØåÆä»„åœØå‘½ä»¤č”Œę·»åŠ  --data-dir=<目录> å‚ę•°ę„ęŒ‡å®šę–‡ä»¶ä½ē½®ć€‚čÆ·ę³Øę„ļ¼Œ'--data-dir' å‚ę•°åŗ”å½“ē”±å®‰č£…č„šęœ¬ä½æē”Øļ¼Œå› ę­¤ļ¼Œå½“ä½æē”Øę­¤å‚ę•°ę—¶ļ¼ŒGUIäøä¼šåÆåŠØļ¼Œę‰€å‘ē”Ÿēš„äø€åˆ‡åŖę˜Æé…ē½®äŗ†č®¾ē½®ć€‚ - - + + XML files (*.xml) XML ꖇ件(*.xml) - + Open the report file ę‰“å¼€ęŠ„å‘Šę–‡ä»¶ - + License č®øåÆčÆ - + Authors ä½œč€… - + Save the report file äæå­˜ęŠ„å‘Šę–‡ä»¶ - + Text files (*.txt) ę–‡ęœ¬ę–‡ä»¶(*.txt) - + CSV files (*.csv) CSV ꖇ件(*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Project files (*.cppcheck);;All files(*.*) 锹目文件(*.cppcheck);;ę‰€ęœ‰ę–‡ä»¶(*.*) - + Select Project File 选择锹目文件 - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Install - + New version available: %1. %2 - - - - + + + + Project: 锹目: - + No suitable files found to analyze! ę²”ęœ‰ę‰¾åˆ°åˆé€‚ēš„ę–‡ä»¶ę„åˆ†ęž! - + C/C++ Source C/C++ 源码 - + Compile database Compile database - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze é€‰ę‹©č¦åˆ†ęžēš„ę–‡ä»¶ - + Select directory to analyze é€‰ę‹©č¦åˆ†ęžēš„ē›®å½• - + Select the configuration that will be analyzed é€‰ę‹©č¦åˆ†ęžēš„é…ē½® - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1351,44 +1276,44 @@ Do you want to proceed analysis without using any of these project files? - + Duplicate define - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1399,7 +1324,7 @@ Do you want to proceed? ä½ ęƒ³ē»§ē»­å—? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1408,77 +1333,77 @@ Do you want to stop the analysis and exit Cppcheck? ę‚Øęƒ³åœę­¢åˆ†ęžå¹¶é€€å‡ŗ Cppcheck å—ļ¼Ÿ - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML ꖇ件 (*.xml);;ę–‡ęœ¬ę–‡ä»¶ (*.txt);;CSV ꖇ件 (*.csv) - + Build dir '%1' does not exist, create it? ęž„å»ŗę–‡ä»¶å¤¹ '%1' äøčƒ½å­˜åœØļ¼Œåˆ›å»ŗå®ƒå—ļ¼Ÿ - + To check the project using addons, you need a build directory. č¦ä½æē”Øę’ä»¶ę£€ęŸ„é”¹ē›®ļ¼Œę‚Øéœ€č¦äø€äøŖęž„å»ŗē›®å½•ć€‚ - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1487,22 +1412,22 @@ Do you want to stop the analysis and exit Cppcheck? 导兄 '%1' å¤±č“„ļ¼Œåˆ†ęžå·²åœę­¢ - + Project files (*.cppcheck) 锹目文件 (*.cppcheck) - + Select Project Filename é€‰ę‹©é”¹ē›®ę–‡ä»¶å - + No project file loaded é”¹ē›®ę–‡ä»¶ęœŖåŠ č½½ - + The project file %1 @@ -1657,27 +1582,27 @@ Options: å®šä¹‰åæ…é”»ē”Øåˆ†å·åˆ†éš”ć€‚ä¾‹å¦‚ļ¼šDEF1;DEF2=5;DEF3=int - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. ę³Øę„ļ¼šęŠŠä½ č‡Ŗå·±ēš„ .cfg ę–‡ä»¶ę”¾åœØå’Œé”¹ē›®ę–‡ä»¶ē›øåŒēš„ę–‡ä»¶å¤¹äø­ć€‚ä½ åŗ”čÆ„åœØäøŠé¢ēœ‹åˆ°å®ƒä»¬ć€‚ - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. å¦‚ęžœę·»åŠ äŗ†ę ‡č®°ļ¼Œę‚Øå°†čƒ½å¤Ÿå³é”®å•å‡»č­¦å‘Šå¹¶č®¾ē½®å…¶äø­äø€äøŖę ‡č®°ć€‚ę‚ØåÆä»„ę‰‹åŠØåÆ¹č­¦å‘Ščæ›č”Œåˆ†ē±»ć€‚ - + Exclude source files ęŽ’é™¤ęŗę–‡ä»¶ - + Exclude folder... ęŽ’é™¤ę–‡ä»¶å¤¹... - + Exclude file... ꎒ除ꖇ件... @@ -1686,17 +1611,17 @@ Options: MISRA C 2012 - + MISRA rule texts MISRA č§„åˆ™ę–‡ęœ¬ - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> <html><head/><body><p>从 MISRA C 2012 PDF ēš„é™„å½• A &quot;ęŒ‡å—ę‘˜č¦&quot; 复制/ē²˜č““ę–‡ęœ¬åˆ°äø€äøŖę–‡ęœ¬ę–‡ä»¶ć€‚</p></body></html> - + ... ... @@ -1707,8 +1632,7 @@ Options: - - + Browse... ęµč§ˆ... @@ -1736,15 +1660,15 @@ Options: - + Edit 编辑 - - + + Remove 移除 @@ -1764,124 +1688,134 @@ Options: åŒ…å«ē›®å½•ļ¼š - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions ē±»åž‹å’Œå‡½ę•° - - + + Analysis åˆ†ęž - + This is a workfolder that Cppcheck will use for various purposes. čæ™ę˜Æäø€äøŖ Cppcheck å°†ē”ØäŗŽå„ē§ē›®ēš„ēš„å·„ä½œę–‡ä»¶å¤¹ć€‚ - + Parser č§£ęžå™Ø - + Cppcheck (built in) Cppcheck (内建) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + Check that each class has a safe public interface ę£€ęŸ„ęÆäøŖē±»ę˜Æå¦ęœ‰äø€äøŖå®‰å…Øēš„å…¬å…±ęŽ„å£ - + Limit analysis ęžé™åˆ†ęž - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) Check code in unused templates (slower and less accurate analysis) ę£€ęŸ„ęœŖä½æē”ØęØ”ęæäø­ēš„ä»£ē ļ¼ˆę­£åøøęƒ…å†µäø‹åŗ”čÆ„ę˜Æę‰“å¼€ļ¼Œä½†ē†č®ŗäøŠåÆä»„åæ½ē•„ęœŖä½æē”ØęØ”ęæäø­ēš„č­¦å‘Šļ¼‰ - + Max CTU depth ęœ€å¤§ CTU 深度 - - Premium License - - - - + Enable inline suppressions åÆē”Øå†…č”ę–¹ę”ˆ - + 2025 - + Misra C++ - + 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting - + External tools å¤–éƒØå·„å…· @@ -1896,129 +1830,129 @@ Options: 向下 - + Platform 平台 - + Clang (experimental) Clang (å®žéŖŒę€§ēš„) - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. å¦‚ęžœä½ ęƒ³č¦č®¾č®”ä½ ēš„ē±»å°½åÆčƒ½ēš„ēµę“»å’Œå„å£®ļ¼Œé‚£ä¹ˆå…¬å…±ęŽ„å£åæ…é”»éžåøøå„å£®ć€‚Cppcheck å°†å‡č®¾å‚ę•°åÆä»„å– *任何* 值。 - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) ę£€ęŸ„å¤“ę–‡ä»¶äø­ēš„ä»£ē ļ¼ˆé€šåøøåŗ”čÆ„ę˜Æę‰“å¼€ēš„ć€‚å¦‚ęžœę‚Øęƒ³č¦äø€äøŖęœ‰é™ēš„åæ«é€Ÿåˆ†ęžļ¼Œé‚£ä¹ˆå…³ęŽ‰å®ƒ)) - + Max recursion in template instantiation ęØ”ęæå®žä¾‹åŒ–äø­ēš„ęœ€å¤§é€’å½’ - + Warning options č­¦å‘Šé€‰é”¹ - + Root path: ę ¹č·Æå¾„ļ¼š - + Filepaths in warnings will be relative to this path č­¦å‘Šäø­ēš„ę–‡ä»¶č·Æå¾„å°†ē›øåÆ¹äŗŽę­¤č·Æå¾„ - + Warning tags (separated by semicolon) č­¦å‘Šę ‡åæ—ļ¼ˆē”Øåˆ†å·éš”å¼€ļ¼‰ - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) Cppcheck ęž„å»ŗē›®å½• (ę•“äøŖēØ‹åŗåˆ†ęžć€å¢žé‡åˆ†ęžć€ē»Ÿč®”ę•°ę®ē­‰) - + Libraries åŗ“ - + Suppressions ęŠ‘åˆ¶ - + Add 添加 - - + + Addons ę’ä»¶ - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. ę³Øę„ļ¼šę’ä»¶éœ€č¦å®‰č£… <a href="https://www.python.org/">Python</a>怂 - + Y2038 Y2038 - + Thread safety 线程安全 - + Coding standards 编码标准 - + Misra C - + 2012 - - + + 2023 - + Cert C++ - + Bug hunting (Premium) - + Clang analyzer Clang analyzer - + Clang-tidy Clang-tidy @@ -2031,82 +1965,93 @@ Options: ProjectFileDialog - + Project file: %1 锹目文件: %1 - + Select Cppcheck build dir 选ꋩ Cppcheck ęž„å»ŗē›®å½• - + Select include directory 选ꋩ Include 目录 - + Select a directory to check é€‰ę‹©äø€äøŖę£€ęŸ„ē›®å½• - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) Clang-tidy (ęœŖę‰¾åˆ°) - + Visual Studio Visual Studio - + Compile database Compile database - + Borland C++ Builder 6 Borland C++ Builder 6 - + Import Project 导兄锹目 - + + C/C++ header + + + + + Include file + + + + Select directory to ignore é€‰ę‹©åæ½ē•„ēš„ē›®å½• - + Source files 源文件 - + + All files å…ØéƒØę–‡ä»¶ - + Exclude file ꎒ除ꖇ件 - + Select MISRA rule texts file 选ꋩ MISRA č§„åˆ™ę–‡ęœ¬ę–‡ä»¶ - + MISRA rule texts file (%1) MISRA č§„åˆ™ę–‡ęœ¬ę–‡ä»¶ (%1) @@ -2139,7 +2084,7 @@ Options: 第%1蔌:在 "%3" äø­ē¼ŗå¤±ēš„åæ…é€‰å±žę€§ "%2" - + (Not found) (ęœŖę‰¾åˆ°) @@ -2583,62 +2528,62 @@ Please check the application path and parameters are correct. č­¦å‘ŠčÆ¦ęƒ… - - + + Failed to save the report. äæå­˜ęŠ„å‘Šå¤±č“„ć€‚ - + Print Report ę‰“å°ęŠ„å‘Š - + No errors found, nothing to print. ę²”ęœ‰é”™čÆÆå‘ēŽ°ļ¼Œę²”ęœ‰åÆę‰“å°å†…å®¹ć€‚ - + %p% (%1 of %2 files checked) %p% (%2 äøŖę–‡ä»¶å·²ę£€ęŸ„ %1 äøŖ) - - + + Cppcheck Cppcheck - + No errors found. ęœŖå‘ēŽ°é”™čÆÆć€‚ - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. å‘ēŽ°é”™čÆÆļ¼Œä½†å®ƒä»¬č¢«č®¾äøŗéšč—ć€‚ ę‰“å¼€ā€œęŸ„ēœ‹ā€čœå•ļ¼Œåˆ‡ę¢éœ€č¦ę˜¾ē¤ŗēš„é”™čÆÆć€‚ - - + + Failed to read the report. čÆ»å–ęŠ„å‘Šå¤±č“„ć€‚ - + XML format version 1 is no longer supported. äøå†ę”ÆęŒ XML ę ¼å¼ē‰ˆęœ¬ 1怂 - + First included by é¦–ę¬”åŒ…å«äŗŽ - + Id Id @@ -2647,42 +2592,42 @@ To toggle what kind of errors are shown, open view menu. é”™čÆÆęœåÆ»åˆ†ęžęœŖå®Œęˆ - + Clear Log 清空旄志 - + Copy this Log entry å¤åˆ¶ę­¤ę—„åæ—ę”ē›® - + Copy complete Log å¤åˆ¶å®Œę•“ę—„åæ— - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. @@ -2968,14 +2913,14 @@ To toggle what kind of errors are shown, open view menu. - - + + Statistics 统讔 - + Project 锹目 @@ -3006,7 +2951,7 @@ To toggle what kind of errors are shown, open view menu. - + Previous Scan äøŠäø€ę¬”ę‰«ę @@ -3086,103 +3031,103 @@ To toggle what kind of errors are shown, open view menu. 导出 PDF - + 1 day 1 天 - + %1 days %1 天 - + 1 hour 1 å°ę—¶ - + %1 hours %1 å°ę—¶ - + 1 minute 1 分钟 - + %1 minutes %1 分钟 - + 1 second 1 ē§’ - + %1 seconds %1 ē§’ - + 0.%1 seconds 0.%1 ē§’ - + and äøŽ - + Export PDF 导出 PDF - + Project Settings 锹目设置 - + Paths 路径 - + Include paths åŒ…å«č·Æå¾„ - + Defines 定义 - + Undefines ęœŖå®šä¹‰ - + Path selected é€‰äø­ēš„č·Æå¾„ - + Number of files scanned ę‰«ęēš„ę–‡ä»¶ę•° - + Scan duration ę‰«ęę—¶é—“ - - + + Errors 错误 @@ -3197,32 +3142,32 @@ To toggle what kind of errors are shown, open view menu. ę²”ęœ‰ cppcheck ęž„å»ŗē›®å½• - - + + Warnings č­¦å‘Š - - + + Style warnings é£Žę ¼č­¦å‘Š - - + + Portability warnings ē§»ę¤åÆčƒ½ę€§č­¦å‘Š - - + + Performance warnings ę€§čƒ½č­¦å‘Š - - + + Information messages 俔息 diff --git a/gui/cppcheck_zh_TW.ts b/gui/cppcheck_zh_TW.ts index 644e92e7b49..1de96423481 100644 --- a/gui/cppcheck_zh_TW.ts +++ b/gui/cppcheck_zh_TW.ts @@ -108,65 +108,16 @@ Parameters: -l(line) (file) ComplianceReportDialog - - Compliance Report - - - - Project name - å°ˆę”ˆåēØ± + å°ˆę”ˆåēØ± - Project version - å°ˆę”ˆē‰ˆęœ¬ - - - - Coding Standard - - - - - Misra C - - - - - Cert C - + å°ˆę”ˆē‰ˆęœ¬ - - Cert C++ - - - - - List of files with md5 checksums - - - - - Compliance report - - - - HTML files (*.html) - HTML ęŖ”ę”ˆ (*.html) - - - - - Save compliance report - - - - - Failed to import '%1' (%2), can not show files in compliance report - + HTML ęŖ”ę”ˆ (*.html) @@ -206,12 +157,12 @@ Parameters: -l(line) (file) 瓢引 - + Helpfile '%1' was not found ę‰¾äøåˆ°å¹«åŠ©ęŖ” '%1' - + Cppcheck Cppcheck @@ -474,20 +425,20 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - + + + + + + + + + + - - - - + + + Cppcheck Cppcheck @@ -507,563 +458,563 @@ Parameters: -l(line) (file) ęŖ”ę”ˆ(&F) - + &View 檢視(&V) - + &Toolbars å·„å…·ę¢(&T) - - + + Report - + &Help 幫助(&H) - + A&nalyze åˆ†ęž(&N) - + C++ standard C++ 標準 - + &C standard C 標準(&C) - + &Edit 編輯(&E) - + Standard 標準 - + Categories 分锞 - + Filter 篩選 - + &License... ęŽˆę¬Š(&L)... - + A&uthors... ä½œč€…(&U)... - + &About... é—œę–¼(&A)... - + &Files... ęŖ”ę”ˆ(&F)... - - + + Analyze files åˆ†ęžęŖ”ę”ˆ - + Ctrl+F Ctrl+F - + &Directory... ē›®éŒ„(&D)... - - + + Analyze directory åˆ†ęžē›®éŒ„ - + Ctrl+D Ctrl+D - + &Reanalyze modified files é‡ę–°åˆ†ęžå·²äæ®ę”¹ēš„ęŖ”ę”ˆ(&R) - + Ctrl+R Ctrl+R - + Reanal&yze all files é‡ę–°åˆ†ęžę‰€ęœ‰ęŖ”ę”ˆ(&Y) - + &Stop 停止(&S) - - + + Stop analysis åœę­¢åˆ†ęž - + Esc Esc - + &Save results to file... å„²å­˜ēµęžœē‚ŗęŖ”ę”ˆ(&S)... - + Ctrl+S Ctrl+S - + &Quit 退出(&Q) - + Ctrl+Q Ctrl+Q - + &Clear results ęø…é™¤ēµęžœ(&C) - + &Preferences åå„½čØ­å®š(&P) - + Style war&nings ęØ£å¼č­¦å‘Š(&N) - - + + Show style warnings é”Æē¤ŗęØ£å¼č­¦å‘Š - + E&rrors 錯誤(&R) - - - + + + Show errors 锯示錯誤 - + &Check all å…ØéƒØęŖ¢ęŸ„(&C) - + &Uncheck all - + Collapse &all å…ØéƒØę‘ŗē–Š(&A) - + &Expand all å…ØéƒØå±•é–‹(&E) - + &Standard 標準(&S) - + Standard items 標準項目 - + &Contents 內容(&C) - + Open the help contents 開啟幫助內容 - + F1 F1 - + Toolbar å·„å…·ę¢ - + &Categories 分锞(&C) - + Error categories éŒÆčŖ¤åˆ†é”ž - + &Open XML... 開啟 XML(&O)... - + Open P&roject File... é–‹å•Ÿå°ˆę”ˆęŖ”(&R)... - + Ctrl+Shift+O Ctrl+Shift+O - + Sh&ow Scratchpad... - + &New Project File... ę–°å¢žå°ˆę”ˆęŖ”(&N)... - + Ctrl+Shift+N Ctrl+Shift+N - + &Log View ę—„čŖŒęŖ¢č¦–(&L) - + Log View ę—„čŖŒęŖ¢č¦– - + C&lose Project File é—œé–‰å°ˆę”ˆęŖ”(&L) - + &Edit Project File... ē·Øč¼Æå°ˆę”ˆęŖ”(&E)... - + &Statistics ēµ±čØˆč³‡ę–™(&S) - + &Warnings č­¦å‘Š(&W) - - - + + + Show warnings é”Æē¤ŗč­¦å‘Š - + Per&formance warnings ę•ˆčƒ½č­¦å‘Š(&F) - - + + Show performance warnings é”Æē¤ŗäø‹ę•ˆčƒ½č­¦å‘Š - + Show &hidden é”Æē¤ŗéš±č—é …ē›®(&H) - + &Information č³‡čØŠ(&I) - + Show information messages é”Æē¤ŗč³‡čØŠčØŠęÆ - + &Portability åÆē§»ę¤ę€§(&P) - + Show portability warnings é”Æē¤ŗåÆē§»ę¤ę€§č­¦å‘Š - + Show Cppcheck results 锯示 Cppcheck ēµęžœ - + Clang Clang - + Show Clang results 锯示 Clang ēµęžœ - + &Filter 篩選(&F) - + Filter results ēÆ©éøēµęžœ - + Windows 32-bit ANSI Windows 32 位元 ANSI - + Windows 32-bit Unicode Windows 32 位元 Unicode - + Unix 32-bit Unix 32 位元 - + Unix 64-bit Unix 64 位元 - + Windows 64-bit Windows 64 位元 - + P&latforms 平臺(&L) - + C++&11 C++&11 - + C&99 C&99 - + &Posix - + C&11 C&11 - + &C89 &C89 - + &C++03 &C++03 - + &Print... 列印(&P)... - + Print the Current Report åˆ—å°ē•¶å‰å ±å‘Š - + Print Pre&view... åˆ—å°é č¦½(&V)... - + Open a Print Preview Dialog for the Current Results é–‹å•Ÿē•¶å‰ēµęžœēš„åˆ—å°é č¦½č¦–ēŖ— - + &Library Editor... ēØ‹å¼åŗ«ē·Øč¼Æå™Ø(&L)... - + Open library editor é–‹å•ŸēØ‹å¼åŗ«ē·Øč¼Æå™Ø - + &Auto-detect language č‡Ŗå‹•åµęø¬čŖžčØ€(&A) - + &Enforce C++ - + E&nforce C - + C++14 C++14 - + Reanalyze and check library é‡ę–°åˆ†ęžäø¦ęŖ¢ęŸ„ēØ‹å¼åŗ« - + Check configuration (defines, includes) ęŖ¢ęŸ„ēµ„ę…‹ (å®šē¾©ć€åŒ…å«) - + C++17 C++17 - + C++20 C++20 - + Compliance report... - + Normal - + Misra C - + Misra C++ 2008 Misra C++ 2008 - + Cert C - + Cert C++ - + Misra C++ 2023 Misra C++ 2023 - + Autosar - + EULA... - + Thread Details - + Show thread details @@ -1091,202 +1042,196 @@ Options: Cppcheck GUI - å‘½ä»¤č”Œåƒę•ø - - + + Quick Filter: åæ«é€ŸēÆ©éø: - - - - + + + + Project: 專攈: - + There was a problem with loading the editor application settings. This is probably because the settings were changed between the Cppcheck versions. Please check (and fix) the editor application settings, otherwise the editor program might not start correctly. - + No suitable files found to analyze! ę‰¾äøåˆ°é©åˆēš„ęŖ”ę”ˆä¾†åˆ†ęžļ¼ - + You must close the project file before selecting new files or directories! ę‚Øåæ…é ˆåœØéøå–ę–°ęŖ”ę”ˆęˆ–ē›®éŒ„ä¹‹å‰é—œé–‰č©²å°ˆę”ˆęŖ”ļ¼ - + C/C++ Source C/C++ 來源檔 - + Compile database 編譯資料庫 - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze éøå–č¦åˆ†ęžēš„ęŖ”ę”ˆ - + Select directory to analyze éøå–č¦åˆ†ęžēš„ē›®éŒ„ - + Select configuration éøå–ēµ„ę…‹ - + Select the configuration that will be analyzed éøå–č¦åˆ†ęžēš„ēµ„ę…‹ - + Found project file: %1 Do you want to load this project file instead? - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - - + + Information č³‡čØŠ - + The library '%1' contains unknown elements: %2 - + File not found ę‰¾äøåˆ°ęŖ”ę”ˆ - + Bad XML - + Missing attribute - + Bad attribute value - + Unsupported format ęœŖę”Æę“ēš„ę ¼å¼ - + Duplicate platform type é‡č¤‡ēš„å¹³č‡ŗåž‹åˆ„ - + Platform type redefined å¹³č‡ŗåž‹åˆ„é‡å®šē¾© - + Duplicate define - + Unknown element ęœŖēŸ„ēš„å…ƒē“  - - Unknown element - Unknown issue - ęœŖēŸ„ēš„č­°é”Œ - - - + Failed to load the selected library '%1'. %2 ē„”ę³•č¼‰å…„éøå–ēš„ēØ‹å¼åŗ« '%1'怂 %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - - - - + + + + Error 錯誤 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1294,18 +1239,18 @@ Do you want to proceed? - - + + XML files (*.xml) XML ęŖ”ę”ˆ (*.xml) - + Open the report file é–‹å•Ÿå ±å‘ŠęŖ” - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1314,82 +1259,77 @@ Do you want to stop the analysis and exit Cppcheck? ę‚Øęƒ³åœę­¢åˆ†ęžäø¦é›¢é–‹ Cppcheck å—Žļ¼Ÿ - + About é—œę–¼ - + License ęŽˆę¬Š - + Authors ä½œč€… - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML ęŖ”ę”ˆ (*.xml);;文字檔 (*.txt);;CSV ęŖ”ę”ˆ (*.csv) - + Save the report file å„²å­˜å ±å‘ŠęŖ” - + Text files (*.txt) 文字檔 (*.txt) - + CSV files (*.csv) CSV ęŖ”ę”ˆ (*.csv) - - Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors. - - - - + Project files (*.cppcheck);;All files(*.*) å°ˆę”ˆęŖ” (*.cppcheck);;ę‰€ęœ‰ęŖ”ę”ˆ (*.*) - + Select Project File éøå–å°ˆę”ˆęŖ” - + Build dir '%1' does not exist, create it? å»ŗē½®ē›®éŒ„ '%1' äøå­˜åœØļ¼Œę˜Æå¦å»ŗē«‹å®ƒļ¼Ÿ - + To check the project using addons, you need a build directory. - + Failed to open file ē„”ę³•é–‹å•ŸęŖ”ę”ˆ - + Unknown project file format ęœŖēŸ„ēš„å°ˆę”ˆęŖ”ę ¼å¼ - + Failed to import project file ē„”ę³•åŒÆå…„å°ˆę”ˆęŖ” - + Failed to import '%1': %2 Analysis is stopped. @@ -1398,62 +1338,62 @@ Analysis is stopped. åœę­¢åˆ†ęžć€‚ - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1462,22 +1402,22 @@ Analysis is stopped. ē„”ę³•åŒÆå…„ '%1'ļ¼Œåœę­¢åˆ†ęž - + Project files (*.cppcheck) å°ˆę”ˆęŖ” (*.cppcheck) - + Select Project Filename éøå–å°ˆę”ˆęŖ”ę”ˆåēØ± - + No project file loaded - + The project file %1 @@ -1494,12 +1434,12 @@ Do you want to remove the file from the recently used projects -list? ę‚Øč¦å¾žęœ€čæ‘ä½æē”Øēš„å°ˆę”ˆåˆ—č”Øäø­ē§»é™¤č©²ęŖ”ę”ˆå—Žļ¼Ÿ - + Install 安章 - + New version available: %1. %2 åÆē”Øēš„ę–°ē‰ˆęœ¬: %1. %2 @@ -1589,8 +1529,7 @@ Do you want to remove the file from the recently used projects -list? - - + Browse... ē€č¦½... @@ -1623,15 +1562,15 @@ Do you want to remove the file from the recently used projects -list? - + Edit 編輯 - - + + Remove 移除 @@ -1671,225 +1610,235 @@ Do you want to remove the file from the recently used projects -list? - + + Include file + + + + + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> + + + + + Browse.. + + + + Types and Functions åž‹åˆ„čˆ‡å‡½å¼ - + Platform 平臺 - + Libraries ēØ‹å¼åŗ« - + Note: Put your own custom .cfg files in the same folder as the project file. You should see them above. - - + + Analysis åˆ†ęž - + Cppcheck build dir (whole program analysis, incremental analysis, statistics, etc) - + This is a workfolder that Cppcheck will use for various purposes. - + Parser å‰–ęžå™Ø - + Cppcheck (built in) Cppcheck (內建) - + Clang (experimental) - + Check level - + Reduced -- meant for usage where developer wants results directly. Limited and faster analysis with fewer results. - + Normal -- meant for normal analysis in CI. Analysis should finish in reasonable time. - + Exhaustive -- meant for nightly builds etc. Analysis time can be longer (10x slower than compilation is OK). - + If you want to design your classes to be as flexible and robust as possible then the public interface must be very robust. Cppcheck will asumme that arguments can take *any* value. - + Check that each class has a safe public interface - + Limit analysis - + Check code in headers (should be ON normally. if you want a limited quick analysis then turn this OFF) - + Check code in unused templates (should be ON normally, however in theory you can safely ignore warnings in unused templates) - + Max CTU depth - + Max recursion in template instantiation - - Premium License - - - - + Warning options č­¦å‘Šéøé … - + Root path: 根路徑: - + Filepaths in warnings will be relative to this path - + Warning tags (separated by semicolon) č­¦å‘ŠęØ™čØ˜ (ē”±åˆ†č™Ÿåˆ†éš”) - + If tags are added, you will be able to right click on warnings and set one of these tags. You can manually categorize warnings. - + Exclude source files ęŽ’é™¤ä¾†ęŗęŖ” - + Exclude folder... ęŽ’é™¤č³‡ę–™å¤¾... - + Exclude file... ęŽ’é™¤ęŖ”ę”ˆ... - + Suppressions ęŠ‘åˆ¶ - + Add ę–°å¢ž - + Enable inline suppressions - - + + Addons - + Note: Addons require <a href="https://www.python.org/">Python</a> being installed. - + Y2038 Y2038 - + Thread safety åŸ·č”Œē·’å®‰å…Ø - + Coding standards - + Misra C - + 2012 - - + + 2023 - + 2025 - + Misra C++ - + 2008 @@ -1898,17 +1847,17 @@ Do you want to remove the file from the recently used projects -list? Misra C 2012 - + MISRA rule texts - + <html><head/><body><p>Copy/paste the text from Appendix A &quot;Summary of guidelines&quot; from the MISRA C 2012 pdf to a text file.</p></body></html> - + ... ... @@ -1917,52 +1866,52 @@ Do you want to remove the file from the recently used projects -list? Misra C++ 2008 - + Cert C - + CERT-INT35-C: int precision (if size equals precision, you can leave empty) - + Cert C++ - + Autosar - + Safety profiles (defined in C++ core guidelines) - + Bug hunting (Premium) - + Bug hunting - + External tools å¤–éƒØå·„å…· - + Clang-tidy Clang-tidy - + Clang analyzer Clang åˆ†ęžå™Ø @@ -1970,82 +1919,93 @@ Do you want to remove the file from the recently used projects -list? ProjectFileDialog - + Project file: %1 å°ˆę”ˆęŖ”: %1 - + Note: Open source Cppcheck does not fully implement Misra C 2012 - + Clang-tidy (not found) Clang-tidy (ę‰¾äøåˆ°) - + Select Cppcheck build dir éøå– Cppcheck å»ŗē½®ē›®éŒ„ - + Visual Studio Visual Studio - + Compile database 編譯資料庫 - + Borland C++ Builder 6 Borland C++ Builder 6 - + Import Project åŒÆå…„å°ˆę”ˆ - + + C/C++ header + + + + + Include file + + + + Select a directory to check éøå–č¦ęŖ¢ęŸ„ēš„ē›®éŒ„ - + Select include directory éøå–åŒ…å«ē›®éŒ„ - + Select directory to ignore éøå–č¦åæ½ē•„ēš„ē›®éŒ„ - + Source files 來源檔 - + + All files ę‰€ęœ‰ęŖ”ę”ˆ - + Exclude file ęŽ’é™¤ęŖ”ę”ˆ - + Select MISRA rule texts file éøå– MISRA č¦å‰‡ę–‡å­—ęŖ” - + MISRA rule texts file (%1) MISRA č¦å‰‡ę–‡å­—ęŖ” (%1) @@ -2198,7 +2158,7 @@ Do you want to remove the file from the recently used projects -list? - + (Not found) (ę‰¾äøåˆ°) @@ -2498,101 +2458,101 @@ Please check the application path and parameters are correct. č­¦å‘Šč©³ē“°č³‡čØŠ - - + + Failed to save the report. ē„”ę³•č¼‰å…„å ±å‘Šć€‚ - + Print Report 列印報告 - + No errors found, nothing to print. - + %p% (%1 of %2 files checked) - - + + Cppcheck Cppcheck - + No errors found. ę‰¾äøåˆ°éŒÆčŖ¤ć€‚ - + Errors were found, but they are configured to be hidden. To toggle what kind of errors are shown, open view menu. - - + + Failed to read the report. ē„”ę³•č®€å–å ±å‘Šć€‚ - + XML format version 1 is no longer supported. äøå†ę”Æę“ XML ę ¼å¼ē‰ˆęœ¬ 1怂 - + First included by - + Id č­˜åˆ„č™Ÿ - + Clear Log ęø…é™¤ę—„čŖŒ - + Copy this Log entry č¤‡č£½č©²ę—„čŖŒę¢ē›® - + Copy complete Log č¤‡č£½å®Œę•“ēš„ę—„čŖŒ - + Analysis was stopped - + There was a critical error with id '%1' - + when checking %1 - + when checking a file - + Analysis was aborted. @@ -2869,14 +2829,14 @@ To toggle what kind of errors are shown, open view menu. - - + + Statistics ēµ±čØˆč³‡ę–™ - + Project 專攈 @@ -2907,7 +2867,7 @@ To toggle what kind of errors are shown, open view menu. - + Previous Scan äøŠäø€ę¬”ęŽƒę @@ -2997,133 +2957,133 @@ To toggle what kind of errors are shown, open view menu. ę²’ęœ‰ cppcheck å»ŗē½®ē›®éŒ„ - + 1 day 1 天 - + %1 days %1 天 - + 1 hour 1 å°ę™‚ - + %1 hours %1 å°ę™‚ - + 1 minute 1 分鐘 - + %1 minutes %1 分鐘 - + 1 second 1 ē§’é˜ - + %1 seconds %1 ē§’é˜ - + 0.%1 seconds 0.%1 ē§’é˜ - + and - - + + Errors 錯誤 - - + + Warnings č­¦å‘Š - - + + Style warnings ęØ£å¼č­¦å‘Š - - + + Portability warnings åÆē§»ę¤ę€§č­¦å‘Š - - + + Performance warnings ę•ˆčƒ½č­¦å‘Š - - + + Information messages č³‡čØŠčØŠęÆ - + Export PDF åŒÆå‡ŗ PDF - + Project Settings 專攈設定 - + Paths 路徑 - + Include paths åŒ…å«č·Æå¾‘ - + Defines 定義 - + Undefines 未定義 - + Path selected éøå–ēš„č·Æå¾‘ - + Number of files scanned å·²ęŽƒęēš„ęŖ”ę”ˆę•øé‡ - + Scan duration ꎃꏏꙂ間 From 9a97ccf697e1bac605ca648f50b62a04dd52bde4 Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:06:51 +0200 Subject: [PATCH 042/171] fixed #14746 import project: include path in compile_commands.json not handled well (#8591) --- lib/importproject.cpp | 6 ++++-- lib/importproject.h | 2 +- test/testimportproject.cpp | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 96e8b98f2e8..0bcda5a43bf 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -1699,8 +1699,10 @@ void ImportProject::setRelativePaths(const std::string &filename) const std::vector basePaths{Path::fromNativeSeparators(Path::getCurrentPath())}; for (auto &fs: fileSettings) { fs.file.setPath(Path::getRelativePath(fs.filename(), basePaths)); - for (auto &includePath: fs.includePaths) - includePath = Path::getRelativePath(includePath, basePaths); + for (auto &includePath: fs.includePaths) { + const std::string rel = Path::getRelativePath(includePath, basePaths); + includePath = rel.empty() ? "." : rel; + } } } diff --git a/lib/importproject.h b/lib/importproject.h index 608af552408..b8bbbed3fa3 100644 --- a/lib/importproject.h +++ b/lib/importproject.h @@ -110,6 +110,7 @@ class CPPCHECKLIB WARN_UNUSED ImportProject { bool importCompileCommands(std::istream &istr); bool importCppcheckGuiProject(std::istream &istr, Settings &settings, Suppressions &supprs); static std::string collectArgs(const std::string &cmd, std::vector &args); + void setRelativePaths(const std::string &filename); struct SharedItemsProject { bool successful = false; @@ -123,7 +124,6 @@ class CPPCHECKLIB WARN_UNUSED ImportProject { private: static void parseArgs(FileSettings &fs, const std::vector &args); - void setRelativePaths(const std::string &filename); bool importSln(std::istream &istr, const std::string &path, const std::vector &fileFilters); bool importSlnx(const std::string& filename, const std::vector& fileFilters); diff --git a/test/testimportproject.cpp b/test/testimportproject.cpp index 6f8633dbeea..88ca2fe75b7 100644 --- a/test/testimportproject.cpp +++ b/test/testimportproject.cpp @@ -42,6 +42,7 @@ class TestImporter final : public ImportProject { using ImportProject::collectArgs; using ImportProject::fsSetDefines; using ImportProject::fsSetIncludePaths; + using ImportProject::setRelativePaths; }; @@ -56,6 +57,7 @@ class TestImportProject : public TestFixture { TEST_CASE(setIncludePaths1); TEST_CASE(setIncludePaths2); TEST_CASE(setIncludePaths3); // macro names are case insensitive + TEST_CASE(setRelativePathsInclude); // #14746 TEST_CASE(importCompileCommands1); TEST_CASE(importCompileCommands2); // #8563, #9567 TEST_CASE(importCompileCommands3); // check with existing trailing / in directory @@ -134,6 +136,18 @@ class TestImportProject : public TestFixture { ASSERT_EQUALS("c:/abc/other/", fs.includePaths.front()); } + void setRelativePathsInclude() const { + const std::string cwd = Path::fromNativeSeparators(Path::getCurrentPath()); + TestImporter importer; + FileSettings fs{cwd + "/sub/a.c", Standards::Language::C, 0}; + fs.includePaths.push_back(cwd + "/"); + importer.fileSettings.push_back(fs); + importer.setRelativePaths("compile_commands.json"); + fs = importer.fileSettings.front(); + ASSERT_EQUALS(".", fs.includePaths.front()); + ASSERT_EQUALS("sub/a.c", fs.filename()); + } + void importCompileCommands1() const { REDIRECT; constexpr char json[] = R"([{ From 868451412c802b6df1b3f9516f240ccbf4d00716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 2 Jun 2026 12:07:53 +0200 Subject: [PATCH 043/171] pass `ErrorLogger` by reference in `Check`/`CheckImpl` (#8601) --- lib/check.h | 4 ++-- lib/check64bit.cpp | 4 ++-- lib/check64bit.h | 6 ++--- lib/checkassert.cpp | 4 ++-- lib/checkassert.h | 6 ++--- lib/checkautovariables.cpp | 4 ++-- lib/checkautovariables.h | 6 ++--- lib/checkbool.cpp | 4 ++-- lib/checkbool.h | 6 ++--- lib/checkbufferoverrun.cpp | 6 ++--- lib/checkbufferoverrun.h | 6 ++--- lib/checkclass.cpp | 8 +++---- lib/checkclass.h | 6 ++--- lib/checkcondition.cpp | 4 ++-- lib/checkcondition.h | 6 ++--- lib/checkexceptionsafety.cpp | 4 ++-- lib/checkexceptionsafety.h | 6 ++--- lib/checkfunctions.cpp | 4 ++-- lib/checkfunctions.h | 6 ++--- lib/checkimpl.cpp | 9 ++------ lib/checkimpl.h | 4 ++-- lib/checkinternal.cpp | 4 ++-- lib/checkinternal.h | 6 ++--- lib/checkio.cpp | 4 ++-- lib/checkio.h | 6 ++--- lib/checkleakautovar.cpp | 4 ++-- lib/checkleakautovar.h | 6 ++--- lib/checkmemoryleak.cpp | 23 +++++++++---------- lib/checkmemoryleak.h | 26 +++++++++++----------- lib/checknullpointer.cpp | 6 ++--- lib/checknullpointer.h | 6 ++--- lib/checkother.cpp | 4 ++-- lib/checkother.h | 6 ++--- lib/checkpostfixoperator.cpp | 4 ++-- lib/checkpostfixoperator.h | 6 ++--- lib/checksizeof.cpp | 4 ++-- lib/checksizeof.h | 6 ++--- lib/checkstl.cpp | 4 ++-- lib/checkstl.h | 6 ++--- lib/checkstring.cpp | 4 ++-- lib/checkstring.h | 6 ++--- lib/checktype.cpp | 4 ++-- lib/checktype.h | 6 ++--- lib/checkuninitvar.cpp | 6 ++--- lib/checkuninitvar.h | 6 ++--- lib/checkunusedvar.cpp | 4 ++-- lib/checkunusedvar.h | 6 ++--- lib/checkvaarg.cpp | 4 ++-- lib/checkvaarg.h | 6 ++--- lib/cppcheck.cpp | 4 ++-- test/fixture.h | 2 +- test/test64bit.cpp | 2 +- test/testassert.cpp | 2 +- test/testautovariables.cpp | 2 +- test/testbool.cpp | 2 +- test/testbufferoverrun.cpp | 8 +++---- test/testcharvar.cpp | 2 +- test/testclass.cpp | 38 ++++++++++++++++---------------- test/testcondition.cpp | 6 ++--- test/testconstructors.cpp | 2 +- test/testexceptionsafety.cpp | 2 +- test/testfunctions.cpp | 2 +- test/testgarbage.cpp | 2 +- test/testincompletestatement.cpp | 2 +- test/testinternal.cpp | 2 +- test/testio.cpp | 4 ++-- test/testleakautovar.cpp | 10 ++++----- test/testmemleak.cpp | 12 +++++----- test/testnullpointer.cpp | 4 ++-- test/testother.cpp | 12 +++++----- test/testpostfixoperator.cpp | 2 +- test/testsizeof.cpp | 4 ++-- test/teststl.cpp | 6 ++--- test/teststring.cpp | 2 +- test/testtype.cpp | 6 ++--- test/testuninitvar.cpp | 6 ++--- test/testunusedprivfunc.cpp | 2 +- test/testunusedvar.cpp | 8 +++---- test/testvaarg.cpp | 2 +- 79 files changed, 224 insertions(+), 232 deletions(-) diff --git a/lib/check.h b/lib/check.h index 7deab9e52e7..8dda3e41825 100644 --- a/lib/check.h +++ b/lib/check.h @@ -62,10 +62,10 @@ class CPPCHECKLIB Check { Check& operator=(const Check &) = delete; /** run checks, the token list is not simplified */ - virtual void runChecks(const Tokenizer &, ErrorLogger *) = 0; + virtual void runChecks(const Tokenizer &, ErrorLogger&) = 0; /** get error messages */ - virtual void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const = 0; + virtual void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const = 0; /** class name, used to generate documentation */ const std::string& name() const { diff --git a/lib/check64bit.cpp b/lib/check64bit.cpp index 6c45c68aaeb..345d66d9846 100644 --- a/lib/check64bit.cpp +++ b/lib/check64bit.cpp @@ -183,13 +183,13 @@ void Check64BitPortabilityImpl::returnIntegerError(const Token *tok) "The safe way is to always return a pointer.", CWE758, Certainty::normal); } -void Check64BitPortability::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void Check64BitPortability::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { Check64BitPortabilityImpl check64BitPortability(&tokenizer, tokenizer.getSettings(), errorLogger); check64BitPortability.pointerassignment(); } -void Check64BitPortability::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void Check64BitPortability::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { Check64BitPortabilityImpl c(nullptr, settings, errorLogger); c.assignmentAddressToIntegerError(nullptr); diff --git a/lib/check64bit.h b/lib/check64bit.h index bafb5646aaa..4354d2217ba 100644 --- a/lib/check64bit.h +++ b/lib/check64bit.h @@ -49,9 +49,9 @@ class CPPCHECKLIB Check64BitPortability : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check if there is 64-bit portability issues:\n" @@ -63,7 +63,7 @@ class CPPCHECKLIB Check64BitPortability : public Check { class CPPCHECKLIB Check64BitPortabilityImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - Check64BitPortabilityImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + Check64BitPortabilityImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Check for pointer assignment */ diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 8240304d83f..1d0ecde7959 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -178,13 +178,13 @@ bool CheckAssertImpl::inSameScope(const Token* returnTok, const Token* assignTok return returnTok->scope() == assignTok->scope(); } -void CheckAssert::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckAssert::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckAssertImpl checkAssert(&tokenizer, tokenizer.getSettings(), errorLogger); checkAssert.assertWithSideEffects(); } -void CheckAssert::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckAssert::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckAssertImpl c(nullptr, settings, errorLogger); c.sideEffectInAssertError(nullptr, "function"); diff --git a/lib/checkassert.h b/lib/checkassert.h index f6190bb8d25..2db9d804fcb 100644 --- a/lib/checkassert.h +++ b/lib/checkassert.h @@ -47,8 +47,8 @@ class CPPCHECKLIB CheckAssert : public Check { private: /** run checks, the token list is not simplified */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Warn if there are side effects in assert statements (since this cause different behaviour in debug/release builds).\n"; @@ -57,7 +57,7 @@ class CPPCHECKLIB CheckAssert : public Check { class CPPCHECKLIB CheckAssertImpl : public CheckImpl { public: - CheckAssertImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckAssertImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} void assertWithSideEffects(); diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index 48ca74253a5..0493f3ea459 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -817,7 +817,7 @@ void CheckAutoVariablesImpl::errorInvalidDeallocation(const Token *tok, const Va "that has been allocated dynamically.", CWE590, Certainty::normal); } -void CheckAutoVariables::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckAutoVariables::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckAutoVariablesImpl checkAutoVariables(&tokenizer, tokenizer.getSettings(), errorLogger); checkAutoVariables.assignFunctionArg(); @@ -825,7 +825,7 @@ void CheckAutoVariables::runChecks(const Tokenizer &tokenizer, ErrorLogger *erro checkAutoVariables.checkVarLifetime(); } -void CheckAutoVariables::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckAutoVariables::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckAutoVariablesImpl c(nullptr,settings,errorLogger); c.errorAutoVariableAssignment(nullptr, false); diff --git a/lib/checkautovariables.h b/lib/checkautovariables.h index 4bdbfc4c730..23d7a55a488 100644 --- a/lib/checkautovariables.h +++ b/lib/checkautovariables.h @@ -52,9 +52,9 @@ class CPPCHECKLIB CheckAutoVariables : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "A pointer to a variable is only valid as long as the variable is in scope.\n" @@ -72,7 +72,7 @@ class CPPCHECKLIB CheckAutoVariablesImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckAutoVariablesImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckAutoVariablesImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** assign function argument */ diff --git a/lib/checkbool.cpp b/lib/checkbool.cpp index 0d7516a9418..3d36c9936a1 100644 --- a/lib/checkbool.cpp +++ b/lib/checkbool.cpp @@ -512,7 +512,7 @@ void CheckBoolImpl::returnValueBoolError(const Token *tok) reportError(tok, Severity::style, "returnNonBoolInBooleanFunction", "Non-boolean value returned from function returning bool"); } -void CheckBool::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckBool::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckBoolImpl checkBool(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -529,7 +529,7 @@ void CheckBool::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkBool.checkBitwiseOnBoolean(); } -void CheckBool::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckBool::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckBoolImpl c(nullptr, settings, errorLogger); c.assignBoolToPointerError(nullptr); diff --git a/lib/checkbool.h b/lib/checkbool.h index 5eafc4d692d..53cc19c2486 100644 --- a/lib/checkbool.h +++ b/lib/checkbool.h @@ -46,9 +46,9 @@ class CPPCHECKLIB CheckBool : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Boolean type checks\n" @@ -67,7 +67,7 @@ class CPPCHECKLIB CheckBoolImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckBoolImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckBoolImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for comparison of function returning bool*/ diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 7f0612963b9..9beef9c3079 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -990,7 +990,7 @@ Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLEle /** @brief Analyse all file infos for all TU */ bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) { - CheckBufferOverrunImpl dummy(nullptr, settings, &errorLogger); + CheckBufferOverrunImpl dummy(nullptr, settings, errorLogger); dummy. logChecker("CheckBufferOverrun::analyseWholeProgram"); @@ -1214,7 +1214,7 @@ void CheckBufferOverrunImpl::negativeMemoryAllocationSizeError(const Token* tok, msg, CWE131, inconclusive ? Certainty::inconclusive : Certainty::normal); } -void CheckBufferOverrun::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckBufferOverrun::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckBufferOverrunImpl checkBufferOverrun(&tokenizer, tokenizer.getSettings(), errorLogger); checkBufferOverrun.arrayIndex(); @@ -1227,7 +1227,7 @@ void CheckBufferOverrun::runChecks(const Tokenizer &tokenizer, ErrorLogger *erro checkBufferOverrun.negativeArraySize(); } -void CheckBufferOverrun::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckBufferOverrun::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckBufferOverrunImpl c(nullptr, settings, errorLogger); c.arrayIndexError(nullptr, std::vector(), std::vector()); diff --git a/lib/checkbufferoverrun.h b/lib/checkbufferoverrun.h index b71f4520d48..566ed76bd85 100644 --- a/lib/checkbufferoverrun.h +++ b/lib/checkbufferoverrun.h @@ -64,7 +64,7 @@ class CPPCHECKLIB CheckBufferOverrun : public Check { CheckBufferOverrun() : Check("Bounds checking") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** @brief Parse current TU and extract file info */ Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; @@ -72,7 +72,7 @@ class CPPCHECKLIB CheckBufferOverrun : public Check { /** @brief Analyse all file infos for all TU */ bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; @@ -96,7 +96,7 @@ class CPPCHECKLIB CheckBufferOverrunImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckBufferOverrunImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckBufferOverrunImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} void arrayIndex(); diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index d7eb9b43b35..e917c95191e 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -106,7 +106,7 @@ static bool isVclTypeInit(const Type *type) } //--------------------------------------------------------------------------- -CheckClassImpl::CheckClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) +CheckClassImpl::CheckClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger), mSymbolDatabase(tokenizer?tokenizer->getSymbolDatabase():nullptr) {} @@ -3833,7 +3833,7 @@ bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check the code for each class.\n" @@ -100,7 +100,7 @@ class CPPCHECKLIB CheckClass : public Check { class CPPCHECKLIB CheckClassImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger); + CheckClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger); /** @brief Set of the STL types whose operator[] is not const */ static const std::set stl_containers_not_const; diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 365a677b5cb..72b61fd68b9 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -2095,7 +2095,7 @@ void CheckConditionImpl::compareValueOutOfTypeRangeError(const Token *comparison Certainty::normal); } -void CheckCondition::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckCondition::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckConditionImpl checkCondition(&tokenizer, tokenizer.getSettings(), errorLogger); checkCondition.multiCondition(); @@ -2115,7 +2115,7 @@ void CheckCondition::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog checkCondition.alwaysTrueFalse(); } -void CheckCondition::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckCondition::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckConditionImpl c(nullptr, settings, errorLogger); diff --git a/lib/checkcondition.h b/lib/checkcondition.h index 56d2c6f25e0..232b2b5b340 100644 --- a/lib/checkcondition.h +++ b/lib/checkcondition.h @@ -54,9 +54,9 @@ class CPPCHECKLIB CheckCondition : public Check { CheckCondition() : Check("Condition") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Match conditions with assignments and other conditions:\n" @@ -81,7 +81,7 @@ class CPPCHECKLIB CheckCondition : public Check { class CPPCHECKLIB CheckConditionImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckConditionImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckConditionImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** mismatching assignment / comparison */ diff --git a/lib/checkexceptionsafety.cpp b/lib/checkexceptionsafety.cpp index b0c510ed80a..29342fb4dbc 100644 --- a/lib/checkexceptionsafety.cpp +++ b/lib/checkexceptionsafety.cpp @@ -409,7 +409,7 @@ void CheckExceptionSafetyImpl::rethrowNoCurrentExceptionError(const Token *tok) CWE480, Certainty::normal); } -void CheckExceptionSafety::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckExceptionSafety::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { if (tokenizer.isC()) return; @@ -424,7 +424,7 @@ void CheckExceptionSafety::runChecks(const Tokenizer &tokenizer, ErrorLogger *er checkExceptionSafety.rethrowNoCurrentException(); } -void CheckExceptionSafety::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckExceptionSafety::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckExceptionSafetyImpl c(nullptr, settings, errorLogger); c.destructorsError(nullptr, "Class"); diff --git a/lib/checkexceptionsafety.h b/lib/checkexceptionsafety.h index 7de91ba812c..8b52d773a93 100644 --- a/lib/checkexceptionsafety.h +++ b/lib/checkexceptionsafety.h @@ -50,10 +50,10 @@ class CPPCHECKLIB CheckExceptionSafety : public Check { CheckExceptionSafety() : Check("Exception Safety") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** Generate all possible errors (for --errorlist) */ - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; /** wiki formatted description of the class (for --doc) */ std::string classInfo() const override { @@ -71,7 +71,7 @@ class CPPCHECKLIB CheckExceptionSafety : public Check { class CPPCHECKLIB CheckExceptionSafetyImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckExceptionSafetyImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckExceptionSafetyImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Don't throw exceptions in destructors */ diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index db50846b262..d04f9d9cc1d 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -853,7 +853,7 @@ void CheckFunctionsImpl::useStandardLibraryError(const Token *tok, const std::st "Consider using " + expected + " instead of loop."); } -void CheckFunctions::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckFunctions::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckFunctionsImpl checkFunctions(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -872,7 +872,7 @@ void CheckFunctions::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog checkFunctions.useStandardLibrary(); } -void CheckFunctions::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckFunctions::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckFunctionsImpl c(nullptr, settings, errorLogger); diff --git a/lib/checkfunctions.h b/lib/checkfunctions.h index 42281774482..ea7278bf0c8 100644 --- a/lib/checkfunctions.h +++ b/lib/checkfunctions.h @@ -52,9 +52,9 @@ class CPPCHECKLIB CheckFunctions : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check function usage:\n" @@ -73,7 +73,7 @@ class CPPCHECKLIB CheckFunctions : public Check { class CPPCHECKLIB CheckFunctionsImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckFunctionsImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckFunctionsImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Check for functions that should not be used */ diff --git a/lib/checkimpl.cpp b/lib/checkimpl.cpp index 2b28b829277..fb1c71a66b3 100644 --- a/lib/checkimpl.cpp +++ b/lib/checkimpl.cpp @@ -24,25 +24,20 @@ #include "tokenize.h" #include "vfvalue.h" -#include #include void CheckImpl::reportError(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe, Certainty certainty) { - assert(mErrorLogger); - // TODO: report debug warning when error is for a disabled severity const ErrorMessage errmsg(callstack, mTokenizer ? &mTokenizer->list : nullptr, severity, id, msg, cwe, certainty); - mErrorLogger->reportErr(errmsg); + mErrorLogger.reportErr(errmsg); } void CheckImpl::reportError(ErrorPath errorPath, Severity severity, const char id[], const std::string &msg, const CWE &cwe, Certainty certainty) { - assert(mErrorLogger); - // TODO: report debug warning when error is for a disabled severity const ErrorMessage errmsg(std::move(errorPath), mTokenizer ? &mTokenizer->list : nullptr, severity, id, msg, cwe, certainty); - mErrorLogger->reportErr(errmsg); + mErrorLogger.reportErr(errmsg); } bool CheckImpl::wrongData(const Token *tok, const char *str) diff --git a/lib/checkimpl.h b/lib/checkimpl.h index 36f04a23d1f..17f92da8553 100644 --- a/lib/checkimpl.h +++ b/lib/checkimpl.h @@ -37,7 +37,7 @@ class CPPCHECKLIB CheckImpl { protected: /** This constructor is used when running checks. */ - CheckImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : mTokenizer(tokenizer), mSettings(settings), mErrorLogger(errorLogger) {} public: @@ -47,7 +47,7 @@ class CPPCHECKLIB CheckImpl protected: const Tokenizer* const mTokenizer{}; const Settings& mSettings; - ErrorLogger* const mErrorLogger{}; + ErrorLogger& mErrorLogger; /** report an error */ void reportError(const Token *tok, const Severity severity, const std::string &id, const std::string &msg) { diff --git a/lib/checkinternal.cpp b/lib/checkinternal.cpp index 727df306e63..93b10210404 100644 --- a/lib/checkinternal.cpp +++ b/lib/checkinternal.cpp @@ -377,7 +377,7 @@ void CheckInternalImpl::extraWhitespaceError(const Token* tok, const std::string ); } -void CheckInternal::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckInternal::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { if (!tokenizer.getSettings().checks.isEnabled(Checks::internalCheck)) return; @@ -393,7 +393,7 @@ void CheckInternal::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogg checkInternal.checkRedundantTokCheck(); } -void CheckInternal::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckInternal::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckInternalImpl c(nullptr, settings, errorLogger); c.simplePatternError(nullptr, "class {", "Match"); diff --git a/lib/checkinternal.h b/lib/checkinternal.h index c1e5addc4da..18a1535a73f 100644 --- a/lib/checkinternal.h +++ b/lib/checkinternal.h @@ -46,9 +46,9 @@ class CPPCHECKLIB CheckInternal : public Check { CheckInternal() : Check("cppcheck internal API usage") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { // Don't include these checks on the WIKI where people can read what @@ -60,7 +60,7 @@ class CPPCHECKLIB CheckInternal : public Check { class CPPCHECKLIB CheckInternalImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckInternalImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckInternalImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check if a simple pattern is used inside Token::Match or Token::findmatch */ diff --git a/lib/checkio.cpp b/lib/checkio.cpp index a62955d3017..8012d540898 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -2050,7 +2050,7 @@ void CheckIOImpl::invalidScanfFormatWidthError(const Token* tok, nonneg int numF } } -void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckIOImpl checkIO(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -2060,7 +2060,7 @@ void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkIO.invalidScanf(); } -void CheckIO::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckIO::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckIOImpl c(nullptr, settings, errorLogger); c.coutCerrMisusageError(nullptr, "cout"); diff --git a/lib/checkio.h b/lib/checkio.h index e881e22cbf3..6fb3c9f80c2 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -50,9 +50,9 @@ class CPPCHECKLIB CheckIO : public Check { private: /** @brief Run checks on the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check format string input/output operations.\n" @@ -72,7 +72,7 @@ class CPPCHECKLIB CheckIO : public Check { class CPPCHECKLIB CheckIOImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckIOImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckIOImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for missusage of std::cout */ diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 11d1086ee5d..2fd16e85eaa 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -1278,13 +1278,13 @@ void CheckLeakAutoVarImpl::ret(const Token *tok, VarInfo &varInfo, const bool is varInfo.erase(varId); } -void CheckLeakAutoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckLeakAutoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckLeakAutoVarImpl checkLeakAutoVar(&tokenizer, tokenizer.getSettings(), errorLogger); checkLeakAutoVar.check(); } -void CheckLeakAutoVar::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckLeakAutoVar::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckLeakAutoVarImpl c(nullptr, settings, errorLogger); c.deallocReturnError(nullptr, nullptr, "p"); diff --git a/lib/checkleakautovar.h b/lib/checkleakautovar.h index 5d4fa07ec06..b613b357119 100644 --- a/lib/checkleakautovar.h +++ b/lib/checkleakautovar.h @@ -111,9 +111,9 @@ class CPPCHECKLIB CheckLeakAutoVar : public Check { CheckLeakAutoVar() : Check("Leaks (auto variables)") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Detect when a auto variable is allocated but not deallocated or deallocated twice.\n"; @@ -123,7 +123,7 @@ class CPPCHECKLIB CheckLeakAutoVar : public Check { class CPPCHECKLIB CheckLeakAutoVarImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckLeakAutoVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckLeakAutoVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** check for leaks in all scopes */ diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index d02bb607b33..dcde32737d5 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -31,7 +31,6 @@ #include "utils.h" #include -#include #include #include #include @@ -286,10 +285,8 @@ void CheckMemoryLeakImpl::reportErr(const Token *tok, Severity severity, const s void CheckMemoryLeakImpl::reportErr(const std::list &callstack, Severity severity, const std::string &id, const std::string &msg, const CWE &cwe) const { - assert(mErrorLogger); - const ErrorMessage errmsg(callstack, mTokenizer ? &mTokenizer->list : nullptr, severity, id, msg, cwe, Certainty::normal); - mErrorLogger->reportErr(errmsg); + mErrorLogger.reportErr(errmsg); } void CheckMemoryLeakImpl::memleakError(const Token *tok, const std::string &varname) const @@ -490,13 +487,13 @@ void CheckMemoryLeakInFunctionImpl::checkReallocUsage() } } -void CheckMemoryLeakInFunction::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckMemoryLeakInFunction::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, tokenizer.getSettings(), errorLogger); checkMemoryLeak.checkReallocUsage(); } -void CheckMemoryLeakInFunction::getErrorMessages(ErrorLogger *e, const Settings &settings) const +void CheckMemoryLeakInFunction::getErrorMessages(ErrorLogger& e, const Settings &settings) const { CheckMemoryLeakInFunctionImpl c(nullptr, settings, e); c.memleakError(nullptr, "varname"); @@ -691,7 +688,7 @@ void CheckMemoryLeakInClassImpl::publicAllocationError(const Token *tok, const s reportError(tok, Severity::warning, "publicAllocationError", "$symbol:" + varname + "\nPossible leak in public function. The pointer '$symbol' is not deallocated before it is allocated.", CWE398, Certainty::normal); } -void CheckMemoryLeakInClass::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckMemoryLeakInClass::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { if (!tokenizer.isCPP()) return; @@ -700,7 +697,7 @@ void CheckMemoryLeakInClass::runChecks(const Tokenizer &tokenizer, ErrorLogger * checkMemoryLeak.check(); } -void CheckMemoryLeakInClass::getErrorMessages(ErrorLogger *e, const Settings &settings) const +void CheckMemoryLeakInClass::getErrorMessages(ErrorLogger& e, const Settings &settings) const { CheckMemoryLeakInClassImpl c(nullptr, settings, e); c.publicAllocationError(nullptr, "varname"); @@ -966,15 +963,15 @@ void CheckMemoryLeakStructMemberImpl::checkStructVariable(const Variable* const } } -void CheckMemoryLeakStructMember::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckMemoryLeakStructMember::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckMemoryLeakStructMemberImpl checkMemoryLeak(&tokenizer, tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } -void CheckMemoryLeakStructMember::getErrorMessages(ErrorLogger * errorLogger, const Settings & settings) const +void CheckMemoryLeakStructMember::getErrorMessages(ErrorLogger& errorLogger, const Settings & settings) const { - (void)errorLogger; + (void)&errorLogger; (void)settings; } @@ -1218,13 +1215,13 @@ void CheckMemoryLeakNoVarImpl::unsafeArgAllocError(const Token *tok, const std:: Certainty::inconclusive); // Inconclusive because funcName may never throw } -void CheckMemoryLeakNoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckMemoryLeakNoVar::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckMemoryLeakNoVarImpl checkMemoryLeak(&tokenizer, tokenizer.getSettings(), errorLogger); checkMemoryLeak.check(); } -void CheckMemoryLeakNoVar::getErrorMessages(ErrorLogger *e, const Settings &settings) const +void CheckMemoryLeakNoVar::getErrorMessages(ErrorLogger& e, const Settings &settings) const { CheckMemoryLeakNoVarImpl c(nullptr, settings, e); c.functionCallLeak(nullptr, "funcName", "funcName"); diff --git a/lib/checkmemoryleak.h b/lib/checkmemoryleak.h index 4fa69742277..037363160de 100644 --- a/lib/checkmemoryleak.h +++ b/lib/checkmemoryleak.h @@ -72,10 +72,10 @@ class CPPCHECKLIB CheckMemoryLeakInFunction : public Check { CheckMemoryLeakInFunction() : Check("Memory leaks (function variables)") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** Report all possible errors (for the --errorlist) */ - void getErrorMessages(ErrorLogger *e, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& e, const Settings &settings) const override; /** * Get class information (--doc) @@ -98,9 +98,9 @@ class CPPCHECKLIB CheckMemoryLeakInClass : public Check { CheckMemoryLeakInClass() : Check("Memory leaks (class variables)") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *e, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& e, const Settings &settings) const override; std::string classInfo() const override { return "If the constructor allocate memory then the destructor must deallocate it.\n"; @@ -118,9 +118,9 @@ class CPPCHECKLIB CheckMemoryLeakStructMember : public Check { CheckMemoryLeakStructMember() : Check("Memory leaks (struct members)") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger * errorLogger, const Settings & settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings & settings) const override; std::string classInfo() const override { return "Don't forget to deallocate struct members\n"; @@ -138,9 +138,9 @@ class CPPCHECKLIB CheckMemoryLeakNoVar : public Check { CheckMemoryLeakNoVar() : Check("Memory leaks (address not taken)") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *e, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& e, const Settings &settings) const override; std::string classInfo() const override { return "Not taking the address to allocated memory\n"; @@ -175,7 +175,7 @@ class CPPCHECKLIB CheckMemoryLeakImpl : public CheckImpl { CheckMemoryLeakImpl(const CheckMemoryLeakImpl &) = delete; CheckMemoryLeakImpl& operator=(const CheckMemoryLeakImpl &) = delete; - CheckMemoryLeakImpl(const Tokenizer *t, const Settings &s, ErrorLogger *e) + CheckMemoryLeakImpl(const Tokenizer *t, const Settings &s, ErrorLogger &e) : CheckImpl(t, s, e) {} /** @brief What type of allocation are used.. the "Many" means that several types of allocation and deallocation are used */ @@ -254,7 +254,7 @@ class CPPCHECKLIB CheckMemoryLeakImpl : public CheckImpl { class CPPCHECKLIB CheckMemoryLeakInFunctionImpl : public CheckMemoryLeakImpl { public: /** @brief This constructor is used when running checks */ - CheckMemoryLeakInFunctionImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckMemoryLeakInFunctionImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} /** @@ -271,7 +271,7 @@ class CPPCHECKLIB CheckMemoryLeakInFunctionImpl : public CheckMemoryLeakImpl { class CPPCHECKLIB CheckMemoryLeakInClassImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakInClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckMemoryLeakInClassImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); @@ -292,7 +292,7 @@ class CPPCHECKLIB CheckMemoryLeakInClassImpl : private CheckMemoryLeakImpl { class CPPCHECKLIB CheckMemoryLeakStructMemberImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakStructMemberImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckMemoryLeakStructMemberImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); @@ -309,7 +309,7 @@ class CPPCHECKLIB CheckMemoryLeakStructMemberImpl : private CheckMemoryLeakImpl class CPPCHECKLIB CheckMemoryLeakNoVarImpl : private CheckMemoryLeakImpl { public: - CheckMemoryLeakNoVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckMemoryLeakNoVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckMemoryLeakImpl(tokenizer, settings, errorLogger) {} void check(); diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 92938b4a60f..5a83c3c6979 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -632,7 +632,7 @@ bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std:: { (void)settings; - CheckNullPointerImpl dummy(nullptr, settings, &errorLogger); + CheckNullPointerImpl dummy(nullptr, settings, errorLogger); dummy. logChecker("CheckNullPointer::analyseWholeProgram"); @@ -692,7 +692,7 @@ bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std:: return foundErrors; } -void CheckNullPointer::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckNullPointer::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckNullPointerImpl checkNullPointer(&tokenizer, tokenizer.getSettings(), errorLogger); checkNullPointer.nullPointer(); @@ -700,7 +700,7 @@ void CheckNullPointer::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorL checkNullPointer.nullConstantDereference(); } -void CheckNullPointer::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckNullPointer::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckNullPointerImpl c(nullptr, settings, errorLogger); c.nullPointerError(nullptr, "pointer", nullptr, false); diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index 8e35fd7565a..a1ccdefb658 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -56,7 +56,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** @brief Parse current TU and extract file info */ Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const override; @@ -67,7 +67,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; /** Get error messages. Used by --errorlist */ - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; /** class info in WIKI format. Used by --doc */ std::string classInfo() const override { @@ -80,7 +80,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { class CPPCHECKLIB CheckNullPointerImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckNullPointerImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckNullPointerImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 1adcaeb9c3a..f34db383aa1 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -4787,7 +4787,7 @@ void CheckOtherImpl::overlappingWriteFunction(const Token *tok, const std::strin reportError(tok, Severity::error, "overlappingWriteFunction", "Overlapping read/write in " + funcname + "() is undefined behavior"); } -void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckOtherImpl checkOther(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -4839,7 +4839,7 @@ void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkOther.checkUnionZeroInit(); } -void CheckOther::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckOther::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckOtherImpl c(nullptr, settings, errorLogger); diff --git a/lib/checkother.h b/lib/checkother.h index 97291b53769..58a61ff772a 100644 --- a/lib/checkother.h +++ b/lib/checkother.h @@ -60,9 +60,9 @@ class CPPCHECKLIB CheckOther : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Other checks\n" @@ -127,7 +127,7 @@ class CPPCHECKLIB CheckOther : public Check { class CPPCHECKLIB CheckOtherImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckOtherImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckOtherImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Is expression a comparison that checks if a nonzero (unsigned/pointer) expression is less than zero? */ diff --git a/lib/checkpostfixoperator.cpp b/lib/checkpostfixoperator.cpp index 0d72b8e3860..f15fa293c49 100644 --- a/lib/checkpostfixoperator.cpp +++ b/lib/checkpostfixoperator.cpp @@ -94,7 +94,7 @@ void CheckPostfixOperatorImpl::postfixOperatorError(const Token *tok) "adds a little extra code.", CWE398, Certainty::normal); } -void CheckPostfixOperator::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckPostfixOperator::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { if (tokenizer.isC()) return; @@ -103,7 +103,7 @@ void CheckPostfixOperator::runChecks(const Tokenizer &tokenizer, ErrorLogger *er checkPostfixOperator.postfixOperator(); } -void CheckPostfixOperator::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckPostfixOperator::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckPostfixOperatorImpl c(nullptr, settings, errorLogger); c.postfixOperatorError(nullptr); diff --git a/lib/checkpostfixoperator.h b/lib/checkpostfixoperator.h index de51a34fe42..ac1a053afe8 100644 --- a/lib/checkpostfixoperator.h +++ b/lib/checkpostfixoperator.h @@ -48,9 +48,9 @@ class CPPCHECKLIB CheckPostfixOperator : public Check { CheckPostfixOperator() : Check("Using postfix operators") {} private: - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Warn if using postfix operators ++ or -- rather than prefix operator\n"; } @@ -59,7 +59,7 @@ class CPPCHECKLIB CheckPostfixOperator : public Check { class CPPCHECKLIB CheckPostfixOperatorImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckPostfixOperatorImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckPostfixOperatorImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Check postfix operators */ diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index 694f73eeff6..b9c495733e0 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -498,7 +498,7 @@ void CheckSizeofImpl::arithOperationsOnVoidPointerError(const Token* tok, const reportError(tok, Severity::portability, "arithOperationsOnVoidPointer", "$symbol:" + varname + '\n' + message + '\n' + verbose, CWE467, Certainty::normal); } -void CheckSizeof::runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger) +void CheckSizeof::runChecks(const Tokenizer& tokenizer, ErrorLogger& errorLogger) { CheckSizeofImpl checkSizeof(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -513,7 +513,7 @@ void CheckSizeof::runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger checkSizeof.sizeofVoid(); } -void CheckSizeof::getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const +void CheckSizeof::getErrorMessages(ErrorLogger& errorLogger, const Settings& settings) const { CheckSizeofImpl c(nullptr, settings, errorLogger); c.sizeofForArrayParameterError(nullptr); diff --git a/lib/checksizeof.h b/lib/checksizeof.h index 6fa7908eb92..7540fe6785d 100644 --- a/lib/checksizeof.h +++ b/lib/checksizeof.h @@ -46,9 +46,9 @@ class CPPCHECKLIB CheckSizeof : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer& tokenizer, ErrorLogger* errorLogger) override; + void runChecks(const Tokenizer& tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings& settings) const override; std::string classInfo() const override { return "sizeof() usage checks\n" @@ -66,7 +66,7 @@ class CPPCHECKLIB CheckSizeof : public Check { class CPPCHECKLIB CheckSizeofImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckSizeofImpl(const Tokenizer* tokenizer, const Settings& settings, ErrorLogger* errorLogger) + CheckSizeofImpl(const Tokenizer* tokenizer, const Settings& settings, ErrorLogger& errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for 'sizeof sizeof ..' */ diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 08ac141610a..c8fcca48f1a 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -3453,7 +3453,7 @@ void CheckStlImpl::checkMutexes() } } -void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { if (!tokenizer.isCPP()) { return; @@ -3490,7 +3490,7 @@ void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkStl.size(); } -void CheckStl::getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const +void CheckStl::getErrorMessages(ErrorLogger& errorLogger, const Settings& settings) const { CheckStlImpl c(nullptr, settings, errorLogger); c.outOfBoundsError(nullptr, "container", nullptr, "x", nullptr); diff --git a/lib/checkstl.h b/lib/checkstl.h index b67632fbfed..4218090e707 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -53,9 +53,9 @@ class CPPCHECKLIB CheckStl : public Check { private: /** run checks, the token list is not simplified */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings& settings) const override; std::string classInfo() const override { return "Check for invalid usage of STL:\n" @@ -83,7 +83,7 @@ class CPPCHECKLIB CheckStl : public Check { class CPPCHECKLIB CheckStlImpl : public CheckImpl { public: /** This constructor is used when running checks. */ - CheckStlImpl(const Tokenizer* tokenizer, const Settings& settings, ErrorLogger* errorLogger) + CheckStlImpl(const Tokenizer* tokenizer, const Settings& settings, ErrorLogger& errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** Accessing container out of bounds using ValueFlow */ diff --git a/lib/checkstring.cpp b/lib/checkstring.cpp index 00fa80998c1..1d391895c3e 100644 --- a/lib/checkstring.cpp +++ b/lib/checkstring.cpp @@ -471,7 +471,7 @@ void CheckStringImpl::sprintfOverlappingDataError(const Token *funcTok, const To "to sprintf() or snprintf(), the results are undefined.\"", CWE628, Certainty::normal); } -void CheckString::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckString::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckStringImpl checkString(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -485,7 +485,7 @@ void CheckString::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger checkString.checkAlwaysTrueOrFalseStringCompare(); } -void CheckString::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckString::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckStringImpl c(nullptr, settings, errorLogger); c.stringLiteralWriteError(nullptr, nullptr); diff --git a/lib/checkstring.h b/lib/checkstring.h index 2c19d64332c..1614e4dc7d3 100644 --- a/lib/checkstring.h +++ b/lib/checkstring.h @@ -46,9 +46,9 @@ class CPPCHECKLIB CheckString : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Detect misusage of C-style strings:\n" @@ -65,7 +65,7 @@ class CPPCHECKLIB CheckString : public Check { class CPPCHECKLIB CheckStringImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckStringImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckStringImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief undefined behaviour, writing string literal */ diff --git a/lib/checktype.cpp b/lib/checktype.cpp index 262cb37a612..447a8924360 100644 --- a/lib/checktype.cpp +++ b/lib/checktype.cpp @@ -531,7 +531,7 @@ void CheckTypeImpl::floatToIntegerOverflowError(const Token *tok, const ValueFlo errmsg.str(), CWE190, value.isInconclusive() ? Certainty::inconclusive : Certainty::normal); } -void CheckType::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckType::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { // These are not "simplified" because casts can't be ignored CheckTypeImpl checkType(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -542,7 +542,7 @@ void CheckType::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) checkType.checkFloatToIntegerOverflow(); } -void CheckType::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckType::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckTypeImpl c(nullptr, settings, errorLogger); c.tooBigBitwiseShiftError(nullptr, 32, ValueFlow::Value(64)); diff --git a/lib/checktype.h b/lib/checktype.h index 8ebfb0fb5b2..83eedda5583 100644 --- a/lib/checktype.h +++ b/lib/checktype.h @@ -52,9 +52,9 @@ class CPPCHECKLIB CheckType : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Type checks\n" @@ -70,7 +70,7 @@ class CPPCHECKLIB CheckType : public Check { class CPPCHECKLIB CheckTypeImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckTypeImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckTypeImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for bitwise shift with too big right operand */ diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index bdfc07a8d47..7c00b705879 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1753,7 +1753,7 @@ bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::li { (void)settings; - CheckUninitVarImpl dummy(nullptr, settings, &errorLogger); + CheckUninitVarImpl dummy(nullptr, settings, errorLogger); dummy. logChecker("CheckUninitVar::analyseWholeProgram"); @@ -1797,14 +1797,14 @@ bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::li return foundErrors; } -void CheckUninitVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckUninitVar::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckUninitVarImpl checkUninitVar(&tokenizer, tokenizer.getSettings(), errorLogger); checkUninitVar.valueFlowUninit(); checkUninitVar.check(); } -void CheckUninitVar::getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const +void CheckUninitVar::getErrorMessages(ErrorLogger& errorLogger, const Settings& settings) const { CheckUninitVarImpl c(nullptr, settings, errorLogger); diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index f558fe84709..dd92b3c892b 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -66,7 +66,7 @@ class CPPCHECKLIB CheckUninitVar : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** @brief Parse current TU and extract file info */ Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; @@ -76,7 +76,7 @@ class CPPCHECKLIB CheckUninitVar : public Check { /** @brief Analyse all file infos for all TU */ bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; - void getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings& settings) const override; std::string classInfo() const override { return "Uninitialized variables\n" @@ -88,7 +88,7 @@ class CPPCHECKLIB CheckUninitVar : public Check { class CPPCHECKLIB CheckUninitVarImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckUninitVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckUninitVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} enum Alloc : std::uint8_t { NO_ALLOC, NO_CTOR_CALL, CTOR_CALL, ARRAY }; diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index dd30f65db58..fcc8746c30e 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1725,7 +1725,7 @@ bool CheckUnusedVarImpl::isEmptyType(const Type* type) return (emptyType = false); } -void CheckUnusedVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckUnusedVar::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckUnusedVarImpl checkUnusedVar(&tokenizer, tokenizer.getSettings(), errorLogger); @@ -1734,7 +1734,7 @@ void CheckUnusedVar::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLog checkUnusedVar.checkFunctionVariableUsage(); } -void CheckUnusedVar::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckUnusedVar::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckUnusedVarImpl c(nullptr, settings, errorLogger); c.unusedVariableError(nullptr, "varname"); diff --git a/lib/checkunusedvar.h b/lib/checkunusedvar.h index cddc36bb7e3..693d3213869 100644 --- a/lib/checkunusedvar.h +++ b/lib/checkunusedvar.h @@ -51,9 +51,9 @@ class CPPCHECKLIB CheckUnusedVar : public Check { private: /** @brief Run checks against the normal token list */ - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "UnusedVar checks\n" @@ -70,7 +70,7 @@ class CPPCHECKLIB CheckUnusedVar : public Check { class CPPCHECKLIB CheckUnusedVarImpl : public CheckImpl { public: /** @brief This constructor is used when running checks. */ - CheckUnusedVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckUnusedVarImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} /** @brief %Check for unused function variables */ diff --git a/lib/checkvaarg.cpp b/lib/checkvaarg.cpp index 60a27b897b5..ae8b1626ba6 100644 --- a/lib/checkvaarg.cpp +++ b/lib/checkvaarg.cpp @@ -173,14 +173,14 @@ void CheckVaargImpl::va_start_subsequentCallsError(const Token *tok, const std:: "va_start_subsequentCalls", "va_start() or va_copy() called subsequently on '" + varname + "' without va_end() in between.", CWE664, Certainty::normal); } -void CheckVaarg::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) +void CheckVaarg::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) { CheckVaargImpl check(&tokenizer, tokenizer.getSettings(), errorLogger); check.va_start_argument(); check.va_list_usage(); } -void CheckVaarg::getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const +void CheckVaarg::getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const { CheckVaargImpl c(nullptr, settings, errorLogger); c.wrongParameterTo_va_start_error(nullptr, "arg1", "arg2"); diff --git a/lib/checkvaarg.h b/lib/checkvaarg.h index 6d50bd94d0d..eea3f345bcc 100644 --- a/lib/checkvaarg.h +++ b/lib/checkvaarg.h @@ -44,10 +44,10 @@ class CPPCHECKLIB CheckVaarg : public Check { public: CheckVaarg() : Check("Vaarg") {} - void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override; + void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; private: - void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override; + void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; std::string classInfo() const override { return "Check for misusage of variable argument lists:\n" @@ -62,7 +62,7 @@ class CPPCHECKLIB CheckVaarg : public Check { class CPPCHECKLIB CheckVaargImpl : public CheckImpl { public: - CheckVaargImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger *errorLogger) + CheckVaargImpl(const Tokenizer *tokenizer, const Settings &settings, ErrorLogger &errorLogger) : CheckImpl(tokenizer, settings, errorLogger) {} void va_start_argument(); diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 471a1a8ff1e..856e9a14efa 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1358,7 +1358,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation } Timer::run(c->name() + "::runChecks", mTimerResults, [&]() { - c->runChecks(tokenizer, &mErrorLogger); + c->runChecks(tokenizer, mErrorLogger); }); } } @@ -1714,7 +1714,7 @@ void CppCheck::getErrorMessages(ErrorLogger &errorlogger) // call all "getErrorMessages" in all registered Check classes for (const Check * const c : CheckInstances::get()) - c->getErrorMessages(&errorlogger, s); + c->getErrorMessages(errorlogger, s); CheckUnusedFunctions::getErrorMessages(errorlogger); Preprocessor::getErrorMessages(errorlogger, s); diff --git a/test/fixture.h b/test/fixture.h index b927dc5de65..c5828033fd7 100644 --- a/test/fixture.h +++ b/test/fixture.h @@ -139,7 +139,7 @@ class TestFixture : public ErrorLogger { return check; } - static void runChecks(Check& check, const Tokenizer &tokenizer, ErrorLogger *errorLogger) + static void runChecks(Check& check, const Tokenizer &tokenizer, ErrorLogger& errorLogger) { check.runChecks(tokenizer, errorLogger); } diff --git a/test/test64bit.cpp b/test/test64bit.cpp index ca2654b12f1..cc96da48577 100644 --- a/test/test64bit.cpp +++ b/test/test64bit.cpp @@ -49,7 +49,7 @@ class Test64BitPortability : public TestFixture { SimpleTokenizer tokenizer(settings, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); - Check64BitPortabilityImpl check64BitPortability(&tokenizer, settings, this); + Check64BitPortabilityImpl check64BitPortability(&tokenizer, settings, *this); check64BitPortability.pointerassignment(); } diff --git a/test/testassert.cpp b/test/testassert.cpp index 651897af057..80bb5d3b827 100644 --- a/test/testassert.cpp +++ b/test/testassert.cpp @@ -40,7 +40,7 @@ class TestAssert : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckAssert check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 2474c2fe6a5..47484d7023e 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -48,7 +48,7 @@ class TestAutoVariables : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckAutoVariables check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { diff --git a/test/testbool.cpp b/test/testbool.cpp index 6156e089aee..6074bbab46a 100644 --- a/test/testbool.cpp +++ b/test/testbool.cpp @@ -89,7 +89,7 @@ class TestBool : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckBool check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 29d8fa13d17..54fcabab6d1 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -57,7 +57,7 @@ class TestBufferOverrun : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckBufferOverrun check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } // TODO: get rid of this @@ -67,7 +67,7 @@ class TestBufferOverrun : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckBufferOverrun check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -80,7 +80,7 @@ class TestBufferOverrun : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckBufferOverrun check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { @@ -5171,7 +5171,7 @@ class TestBufferOverrun : public TestFixture { // Ticket #2292: segmentation fault when using --errorlist CheckBufferOverrun check; const Check& c = getCheck(check); - c.getErrorMessages(this, settingsDefault); + c.getErrorMessages(*this, settingsDefault); // we are not interested in the output - just consume it ignore_errout(); } diff --git a/test/testcharvar.cpp b/test/testcharvar.cpp index 347557bd051..7d4a17489fc 100644 --- a/test/testcharvar.cpp +++ b/test/testcharvar.cpp @@ -47,7 +47,7 @@ class TestCharVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check char variable usage.. - CheckOtherImpl checkOther(&tokenizer, settings, this); + CheckOtherImpl checkOther(&tokenizer, settings, *this); checkOther.checkCharVariable(); } diff --git a/test/testclass.cpp b/test/testclass.cpp index 8fba8d4a340..7f1a668cae1 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -270,7 +270,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); (checkClass.checkCopyCtorAndEqOperator)(); } @@ -371,7 +371,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings0, this); + CheckClassImpl checkClass(&tokenizer, settings0, *this); (checkClass.checkExplicitConstructors)(); } @@ -528,7 +528,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, *this); (checkClass.checkDuplInheritedMembers)(); } @@ -752,7 +752,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings3, this); + CheckClassImpl checkClass(&tokenizer, settings3, *this); checkClass.copyconstructors(); } @@ -1223,7 +1223,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings0, this); + CheckClassImpl checkClass(&tokenizer, settings0, *this); checkClass.operatorEqRetRefThis(); } @@ -1694,7 +1694,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, *this); checkClass.operatorEqToSelf(); } @@ -2657,7 +2657,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, s, this); + CheckClassImpl checkClass(&tokenizer, s, *this); checkClass.virtualDestructor(); } @@ -2994,7 +2994,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); checkClass.checkMemset(); } @@ -3640,7 +3640,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, *this); checkClass.thisSubtraction(); } @@ -3680,7 +3680,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); (checkClass.checkConst)(); } @@ -7863,7 +7863,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings2, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, settings2, this); + CheckClassImpl checkClass(&tokenizer, settings2, *this); checkClass.initializerListOrder(); } @@ -8017,7 +8017,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); checkClass.initializationListUsage(); } @@ -8241,7 +8241,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings0, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, settings0, this); + CheckClassImpl checkClass(&tokenizer, settings0, *this); (checkClass.checkSelfInitialization)(); } @@ -8351,7 +8351,7 @@ class TestClass : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); checkClass.checkVirtualFunctionCallInConstructor(); } @@ -8696,7 +8696,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); (checkClass.checkOverride)(); } @@ -8908,7 +8908,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); (checkClass.checkUselessOverride)(); } @@ -9098,7 +9098,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); (checkClass.checkUnsafeClassRefMember)(); } @@ -9116,7 +9116,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, *this); (checkClass.checkThisUseAfterFree)(); } @@ -9353,7 +9353,7 @@ class TestClass : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check.. - CheckClassImpl checkClass(&tokenizer, settings, this); + CheckClassImpl checkClass(&tokenizer, settings, *this); (checkClass.checkReturnByReference)(); } diff --git a/test/testcondition.cpp b/test/testcondition.cpp index e5aedae6609..3143b6eb201 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -150,7 +150,7 @@ class TestCondition : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckCondition check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -163,7 +163,7 @@ class TestCondition : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckCondition check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void assignAndCompare() { @@ -528,7 +528,7 @@ class TestCondition : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckCondition check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void multicompare() { diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index b4f17cd25b8..5f2fd228dc4 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -52,7 +52,7 @@ class TestConstructors : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check class constructors.. - CheckClassImpl checkClass(&tokenizer, settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, *this); checkClass.constructors(); } diff --git a/test/testexceptionsafety.cpp b/test/testexceptionsafety.cpp index 46c995c231b..1be46fbf282 100644 --- a/test/testexceptionsafety.cpp +++ b/test/testexceptionsafety.cpp @@ -76,7 +76,7 @@ class TestExceptionSafety : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckExceptionSafety check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void destructors() { diff --git a/test/testfunctions.cpp b/test/testfunctions.cpp index 9ddb4c1f43c..788ff7a0d14 100644 --- a/test/testfunctions.cpp +++ b/test/testfunctions.cpp @@ -133,7 +133,7 @@ class TestFunctions : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckFunctions check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void prohibitedFunctions_posix() { diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 289b22b284e..7d91a013940 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -287,7 +287,7 @@ class TestGarbage : public TestFixture { // call all "runChecks" in all registered Check classes for (Check * const c : CheckInstances::get()) { - c->runChecks(tokenizer, this); + c->runChecks(tokenizer, *this); } return tokenizer.tokens()->stringifyList(false, false, false, true, false, nullptr, nullptr); diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index be0b3e7ad3d..b72b6524872 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -50,7 +50,7 @@ class TestIncompleteStatement : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for incomplete statements.. - CheckOtherImpl checkOther(&tokenizer, settings1, this); + CheckOtherImpl checkOther(&tokenizer, settings1, *this); checkOther.checkIncompleteStatement(); } diff --git a/test/testinternal.cpp b/test/testinternal.cpp index b724c860fae..61c36a8e7dd 100644 --- a/test/testinternal.cpp +++ b/test/testinternal.cpp @@ -57,7 +57,7 @@ class TestInternal : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckInternal check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void simplePatternInTokenMatch() { diff --git a/test/testio.cpp b/test/testio.cpp index c622bc5936d..15a65ef79c9 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -109,12 +109,12 @@ class TestIO : public TestFixture { // Check.. if (options.onlyFormatStr) { - CheckIOImpl checkIO(&tokenizer, settings1, this); + CheckIOImpl checkIO(&tokenizer, settings1, *this); checkIO.checkWrongPrintfScanfArguments(); return; } CheckIO check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void coutCerrMisusage() { diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 265e31bf3c2..b7f8b024a8c 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -236,7 +236,7 @@ class TestLeakAutoVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckLeakAutoVar check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void assign1() { @@ -3267,7 +3267,7 @@ class TestLeakAutoVarRecursiveCountLimit : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckLeakAutoVar check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { @@ -3314,7 +3314,7 @@ class TestLeakAutoVarStrcpy : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckLeakAutoVar check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { @@ -3419,7 +3419,7 @@ class TestLeakAutoVarWindows : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckLeakAutoVar check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { @@ -3492,7 +3492,7 @@ class TestLeakAutoVarPosix : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckLeakAutoVar check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 6e3d28010a1..fda118826bb 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -44,7 +44,7 @@ class TestMemleak : public TestFixture { SimpleTokenizer tokenizer(settingsDefault, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - const CheckMemoryLeakImpl c(&tokenizer, settingsDefault, this); + const CheckMemoryLeakImpl c(&tokenizer, settingsDefault, *this); return (c.functionReturnType)(&tokenizer.getSymbolDatabase()->scopeList.front().functionList.front()); } @@ -93,7 +93,7 @@ class TestMemleak : public TestFixture { // there is no allocation const Token *tok = Token::findsimplematch(tokenizer.tokens(), "ret ="); - const CheckMemoryLeakImpl check(&tokenizer, settingsDefault, nullptr); + const CheckMemoryLeakImpl check(&tokenizer, settingsDefault, *this); ASSERT_EQUALS(CheckMemoryLeakImpl::No, check.getAllocationType(tok->tokAt(2), 1)); } }; @@ -119,7 +119,7 @@ class TestMemleakInFunction : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, settings, this); + CheckMemoryLeakInFunctionImpl checkMemoryLeak(&tokenizer, settings, *this); checkMemoryLeak.checkReallocUsage(); } @@ -501,7 +501,7 @@ class TestMemleakInClass : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, settings, this); + CheckMemoryLeakInClassImpl checkMemoryLeak(&tokenizer, settings, *this); (checkMemoryLeak.check)(); } @@ -1706,7 +1706,7 @@ class TestMemleakStructMember : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakStructMemberImpl checkMemoryLeakStructMember(&tokenizer, settings, this); + CheckMemoryLeakStructMemberImpl checkMemoryLeakStructMember(&tokenizer, settings, *this); (checkMemoryLeakStructMember.check)(); } @@ -2388,7 +2388,7 @@ class TestMemleakNoVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for memory leaks.. - CheckMemoryLeakNoVarImpl checkMemoryLeakNoVar(&tokenizer, settings, this); + CheckMemoryLeakNoVarImpl checkMemoryLeakNoVar(&tokenizer, settings, *this); (checkMemoryLeakNoVar.check)(); } diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 3e9d4011500..b628d294a59 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -200,7 +200,7 @@ class TestNullPointer : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckNullPointer check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -212,7 +212,7 @@ class TestNullPointer : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckNullPointer check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } diff --git a/test/testother.cpp b/test/testother.cpp index 2394cfefe7c..e720d9c7224 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -368,7 +368,7 @@ class TestOther : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckOther check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } struct CheckPOptions @@ -385,7 +385,7 @@ class TestOther : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckOther check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } template @@ -2055,7 +2055,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizerCpp(settings, *this); ASSERT_LOC(tokenizerCpp.tokenize(code), file, line); - CheckOtherImpl checkOtherCpp(&tokenizerCpp, settings, this); + CheckOtherImpl checkOtherCpp(&tokenizerCpp, settings, *this); checkOtherCpp.warningOldStylePointerCast(); checkOtherCpp.warningDangerousTypeCast(); } @@ -2341,7 +2341,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizerCpp(settings, *this); ASSERT_LOC(tokenizerCpp.tokenize(code), file, line); - CheckOtherImpl checkOtherCpp(&tokenizerCpp, settings, this); + CheckOtherImpl checkOtherCpp(&tokenizerCpp, settings, *this); checkOtherCpp.warningIntToPointerCast(); } @@ -2380,7 +2380,7 @@ class TestOther : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckOtherImpl checkOtherCpp(&tokenizer, settings, this); + CheckOtherImpl checkOtherCpp(&tokenizer, settings, *this); checkOtherCpp.invalidPointerCast(); } @@ -12315,7 +12315,7 @@ class TestOther : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckOther check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void testEvaluationOrder() { diff --git a/test/testpostfixoperator.cpp b/test/testpostfixoperator.cpp index 07b7c03ca00..2277039820f 100644 --- a/test/testpostfixoperator.cpp +++ b/test/testpostfixoperator.cpp @@ -38,7 +38,7 @@ class TestPostfixOperator : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, settings, this); + CheckPostfixOperatorImpl checkPostfixOperator(&tokenizer, settings, *this); checkPostfixOperator.postfixOperator(); } diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index ee9416a65bc..9337252f92c 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -55,7 +55,7 @@ class TestSizeof : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckSizeof check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) @@ -67,7 +67,7 @@ class TestSizeof : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckSizeof check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void sizeofsizeof() { diff --git a/test/teststl.cpp b/test/teststl.cpp index 18549e08f9f..51fab0e6021 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -200,7 +200,7 @@ class TestStl : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckStl check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } // TODO: get rid of this @@ -211,7 +211,7 @@ class TestStl : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckStl check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } #define checkNormal(...) checkNormal_(__FILE__, __LINE__, __VA_ARGS__) @@ -222,7 +222,7 @@ class TestStl : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckStl check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void outOfBounds() { diff --git a/test/teststring.cpp b/test/teststring.cpp index 7f28f58c80a..80073ac7d91 100644 --- a/test/teststring.cpp +++ b/test/teststring.cpp @@ -75,7 +75,7 @@ class TestString : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckString check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void stringLiteralWrite() { diff --git a/test/testtype.cpp b/test/testtype.cpp index 80c3dfd32b8..2bcab8c91dc 100644 --- a/test/testtype.cpp +++ b/test/testtype.cpp @@ -62,7 +62,7 @@ class TestType : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckType check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } // TODO: get rid of this @@ -74,7 +74,7 @@ class TestType : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckType check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } struct CheckPOptions @@ -94,7 +94,7 @@ class TestType : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); CheckType check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void checkTooBigShift_Unix32() { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 0d71efbc897..b9e8a623cb7 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -127,7 +127,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVarImpl checkuninitvar(&tokenizer, settings1, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, settings1, *this); checkuninitvar.check(); } @@ -137,7 +137,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVarImpl checkuninitvar(&tokenizer, settings, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, settings, *this); checkuninitvar.check(); } @@ -3673,7 +3673,7 @@ class TestUninitVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVarImpl checkuninitvar(&tokenizer, settings, this); + CheckUninitVarImpl checkuninitvar(&tokenizer, settings, *this); (checkuninitvar.valueFlowUninit)(); } diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index 06c41bbb9c2..4a2a6ca1894 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -104,7 +104,7 @@ class TestUnusedPrivateFunction : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused private functions.. - CheckClassImpl checkClass(&tokenizer, settings1, this); + CheckClassImpl checkClass(&tokenizer, settings1, *this); checkClass.privateFunctions(); } diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index ae44305ef6a..2efe658b52e 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -291,7 +291,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, *this); checkUnusedVar.checkFunctionVariableUsage(); } @@ -311,7 +311,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, *this); (checkUnusedVar.checkStructMemberUsage)(); } @@ -324,7 +324,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, *this); (checkUnusedVar.checkStructMemberUsage)(); } @@ -337,7 +337,7 @@ class TestUnusedVar : public TestFixture { ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); // Check for unused variables.. - CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, this); + CheckUnusedVarImpl checkUnusedVar(&tokenizer, settings, *this); (checkUnusedVar.checkFunctionVariableUsage)(); } diff --git a/test/testvaarg.cpp b/test/testvaarg.cpp index 3f44b687ff3..826438fe355 100644 --- a/test/testvaarg.cpp +++ b/test/testvaarg.cpp @@ -39,7 +39,7 @@ class TestVaarg : public TestFixture { ASSERT_LOC(tokenizer.tokenize(code), file, line); CheckVaarg check; - runChecks(check, tokenizer, this); + runChecks(check, tokenizer, *this); } void run() override { From cb7c24de1886ebc2c292bf84170d7a2151897472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 2 Jun 2026 12:08:17 +0200 Subject: [PATCH 044/171] CI-windows.yml: removed hard-coded aqt version (#8604) this was missed in 4f31d0aa75c672a81c65aa37e586ce3ec7b0ee9d --- .github/workflows/CI-windows.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/CI-windows.yml b/.github/workflows/CI-windows.yml index 71d72025cf9..a76997eb007 100644 --- a/.github/workflows/CI-windows.yml +++ b/.github/workflows/CI-windows.yml @@ -47,7 +47,6 @@ jobs: modules: 'qtcharts' setup-python: 'false' cache: true - aqtversion: '==3.1.*' # TODO: remove when aqtinstall 3.2.2 is available - name: Run CMake run: | @@ -128,7 +127,6 @@ jobs: modules: 'qtcharts' setup-python: 'false' cache: true - aqtversion: '==3.1.*' # TODO: remove when aqtinstall 3.2.2 is available - name: Run CMake (without GUI) run: | From 8c2ed4e256a3d9c781019f40270bc9607f00d693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 2 Jun 2026 13:09:40 +0200 Subject: [PATCH 045/171] fix #14802: false positive: shadowFunction (shadowing non-static in static) (#8605) --- lib/checkother.cpp | 3 +++ lib/token.cpp | 7 ------- test/testother.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index f34db383aa1..b5fd0dda361 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -4194,6 +4194,9 @@ void CheckOtherImpl::checkShadowVariables() (functionScope->function->isStatic() || functionScope->function->isFriend()) && shadowed->variable() && !shadowed->variable()->isLocal()) return; + if (functionScope->functionOf && functionScope->functionOf->isClassOrStructOrUnion() && functionScope->function && + functionScope->function->isStatic() && shadowed->function() && !shadowed->function()->isStatic()) + return; if (var.scope() && var.scope()->function && var.scope()->function->isConstructor()) { if (shadowed->variable() && shadowed->variable()->isMember()) return; diff --git a/lib/token.cpp b/lib/token.cpp index 539141c0b0f..2b30419b9df 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -614,7 +614,6 @@ bool Token::simpleMatch(const Token *tok, const char pattern[], size_t pattern_l return false; // shortcut const char *current = pattern; const char *end = pattern + pattern_len; - // cppcheck-suppress shadowFunction - TODO: fix this const char *next = static_cast(std::memchr(pattern, ' ', pattern_len)); if (!next) next = end; @@ -769,7 +768,6 @@ nonneg int Token::getStrArraySize(const Token *tok) { assert(tok != nullptr); assert(tok->tokType() == eString); - // cppcheck-suppress shadowFunction - TODO: fix this const std::string str(getStringLiteral(tok->str())); int sizeofstring = 1; for (int i = 0; i < static_cast(str.size()); i++) { @@ -2359,11 +2357,9 @@ const ::Type* Token::typeOf(const Token* tok, const Token** typeTok) if (tok->valueType() && tok->valueType()->typeScope && tok->valueType()->typeScope->definedType) return tok->valueType()->typeScope->definedType; if (Token::simpleMatch(tok, "return")) { - // cppcheck-suppress shadowFunction - TODO: fix this const Scope *scope = tok->scope(); if (!scope) return nullptr; - // cppcheck-suppress shadowFunction - TODO: fix this const Function *function = scope->function; if (!function) return nullptr; @@ -2473,18 +2469,15 @@ std::pair Token::typeDecl(const Token* tok, bool poi return {var->typeStartToken(), var->typeEndToken()->next()}; } if (Token::simpleMatch(tok, "return")) { - // cppcheck-suppress shadowFunction - TODO: fix this const Scope* scope = tok->scope(); if (!scope) return {}; - // cppcheck-suppress shadowFunction - TODO: fix this const Function* function = scope->function; if (!function) return {}; return { function->retDef, function->returnDefEnd() }; } if (tok->previous() && tok->previous()->function()) { - // cppcheck-suppress shadowFunction - TODO: fix this const Function *function = tok->previous()->function(); return {function->retDef, function->returnDefEnd()}; } diff --git a/test/testother.cpp b/test/testother.cpp index e720d9c7224..93e67229f43 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -13118,6 +13118,12 @@ class TestOther : public TestFixture { check("struct S { int v(); explicit S(int v); };\n" "S::S(int v) : v(v) {}\n"); ASSERT_EQUALS("", errout_str()); + + check("struct S { int i(); static void f(int i) {} };\n"); + ASSERT_EQUALS("", errout_str()); + + check("struct S { static int i(); static void f(int i) {} };\n"); + ASSERT_EQUALS("[test.cpp:1:23] -> [test.cpp:1:46]: (style) Argument 'i' shadows outer function [shadowFunction]\n", errout_str()); } void knownArgument() { From 01e22541a84135ce2ddecdf35865a44d9fe1dfaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 2 Jun 2026 13:10:18 +0200 Subject: [PATCH 046/171] extracted `Rule` from `settings.h` to `rule.h` / added `Regex::engine()` / removed unnecessary `Rule::engine` (#8580) --- Makefile | 262 +++++++++++------------ cli/cmdlineparser.cpp | 10 +- gui/test/projectfile/testprojectfile.cpp | 5 + lib/cppcheck.cpp | 5 +- lib/cppcheck.vcxproj | 1 + lib/regex.cpp | 5 + lib/regex.h | 2 + lib/rule.h | 43 ++++ lib/settings.cpp | 12 ++ lib/settings.h | 29 +-- oss-fuzz/Makefile | 96 ++++----- test/testcmdlineparser.cpp | 11 +- test/testregex.cpp | 4 +- tools/dmake/dmake.cpp | 1 + 14 files changed, 277 insertions(+), 209 deletions(-) create mode 100644 lib/rule.h diff --git a/Makefile b/Makefile index dd739e8e6de..0fc1d8e94e6 100644 --- a/Makefile +++ b/Makefile @@ -483,13 +483,13 @@ check-nonneg: ###### Build -$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp -$(libcppdir)/tokenize.o: lib/tokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/tokenize.o: lib/tokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenize.cpp -$(libcppdir)/symboldatabase.o: lib/symboldatabase.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/symboldatabase.o: lib/symboldatabase.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/symboldatabase.cpp $(libcppdir)/addoninfo.o: lib/addoninfo.cpp externals/picojson/picojson.h lib/addoninfo.h lib/config.h lib/json.h lib/path.h lib/standards.h lib/utils.h @@ -498,28 +498,28 @@ $(libcppdir)/addoninfo.o: lib/addoninfo.cpp externals/picojson/picojson.h lib/ad $(libcppdir)/analyzerinfo.o: lib/analyzerinfo.cpp externals/tinyxml2/tinyxml2.h lib/analyzerinfo.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/mathlib.h lib/path.h lib/platform.h lib/standards.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp -$(libcppdir)/astutils.o: lib/astutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/findtoken.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/astutils.o: lib/astutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/findtoken.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/astutils.cpp -$(libcppdir)/check64bit.o: lib/check64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/check64bit.o: lib/check64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check64bit.cpp -$(libcppdir)/checkassert.o: lib/checkassert.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkassert.o: lib/checkassert.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkassert.cpp -$(libcppdir)/checkautovariables.o: lib/checkautovariables.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkautovariables.o: lib/checkautovariables.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkautovariables.cpp -$(libcppdir)/checkbool.o: lib/checkbool.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkbool.o: lib/checkbool.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbool.cpp -$(libcppdir)/checkbufferoverrun.o: lib/checkbufferoverrun.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkbufferoverrun.o: lib/checkbufferoverrun.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbufferoverrun.cpp -$(libcppdir)/checkclass.o: lib/checkclass.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkclass.o: lib/checkclass.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkclass.cpp -$(libcppdir)/checkcondition.o: lib/checkcondition.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkcondition.o: lib/checkcondition.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkcondition.cpp $(libcppdir)/checkers.o: lib/checkers.cpp lib/checkers.h lib/config.h @@ -528,64 +528,64 @@ $(libcppdir)/checkers.o: lib/checkers.cpp lib/checkers.h lib/config.h $(libcppdir)/checkersidmapping.o: lib/checkersidmapping.cpp lib/checkers.h lib/config.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersidmapping.cpp -$(libcppdir)/checkersreport.o: lib/checkersreport.cpp lib/addoninfo.h lib/checkers.h lib/checkersreport.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h +$(libcppdir)/checkersreport.o: lib/checkersreport.cpp lib/addoninfo.h lib/checkers.h lib/checkersreport.h lib/config.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersreport.cpp -$(libcppdir)/checkexceptionsafety.o: lib/checkexceptionsafety.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkexceptionsafety.o: lib/checkexceptionsafety.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkexceptionsafety.cpp -$(libcppdir)/checkfunctions.o: lib/checkfunctions.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkfunctions.o: lib/checkfunctions.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkfunctions.cpp -$(libcppdir)/checkimpl.o: lib/checkimpl.cpp lib/addoninfo.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkimpl.o: lib/checkimpl.cpp lib/addoninfo.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkimpl.cpp -$(libcppdir)/checkinternal.o: lib/checkinternal.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkinternal.o: lib/checkinternal.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkinternal.cpp -$(libcppdir)/checkio.o: lib/checkio.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkio.o: lib/checkio.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkio.cpp -$(libcppdir)/checkleakautovar.o: lib/checkleakautovar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkleakautovar.o: lib/checkleakautovar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkleakautovar.cpp -$(libcppdir)/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkmemoryleak.cpp -$(libcppdir)/checknullpointer.o: lib/checknullpointer.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checknullpointer.o: lib/checknullpointer.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checknullpointer.cpp -$(libcppdir)/checkother.o: lib/checkother.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkother.o: lib/checkother.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkother.cpp -$(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp $(libcppdir)/checks.o: lib/checks.cpp lib/check.h lib/check64bit.h lib/checkassert.h lib/checkautovariables.h lib/checkbool.h lib/checkbufferoverrun.h lib/checkclass.h lib/checkcondition.h lib/checkexceptionsafety.h lib/checkfunctions.h lib/checkimpl.h lib/checkinternal.h lib/checkio.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/checkother.h lib/checkpostfixoperator.h lib/checks.h lib/checksizeof.h lib/checkstl.h lib/checkstring.h lib/checktype.h lib/checkuninitvar.h lib/checkunusedvar.h lib/checkvaarg.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/standards.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp -$(libcppdir)/checksizeof.o: lib/checksizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checksizeof.o: lib/checksizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp -$(libcppdir)/checkstl.o: lib/checkstl.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkstl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/pathanalysis.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkstl.o: lib/checkstl.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkstl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/pathanalysis.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstl.cpp -$(libcppdir)/checkstring.o: lib/checkstring.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkstring.o: lib/checkstring.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstring.cpp -$(libcppdir)/checktype.o: lib/checktype.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checktype.o: lib/checktype.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checktype.cpp -$(libcppdir)/checkuninitvar.o: lib/checkuninitvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkuninitvar.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkuninitvar.o: lib/checkuninitvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkuninitvar.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkuninitvar.cpp -$(libcppdir)/checkunusedfunctions.o: lib/checkunusedfunctions.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/astutils.h lib/checkers.h lib/checkunusedfunctions.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkunusedfunctions.o: lib/checkunusedfunctions.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/astutils.h lib/checkers.h lib/checkunusedfunctions.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedfunctions.cpp -$(libcppdir)/checkunusedvar.o: lib/checkunusedvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkunusedvar.o: lib/checkunusedvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedvar.cpp -$(libcppdir)/checkvaarg.o: lib/checkvaarg.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkvaarg.o: lib/checkvaarg.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkvaarg.cpp $(libcppdir)/clangimport.o: lib/clangimport.cpp lib/clangimport.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h @@ -594,13 +594,13 @@ $(libcppdir)/clangimport.o: lib/clangimport.cpp lib/clangimport.h lib/config.h l $(libcppdir)/color.o: lib/color.cpp lib/color.h lib/config.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/color.cpp -$(libcppdir)/cppcheck.o: lib/cppcheck.cpp externals/picojson/picojson.h externals/simplecpp/simplecpp.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkunusedfunctions.h lib/clangimport.h lib/color.h lib/config.h lib/cppcheck.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/version.h lib/vfvalue.h +$(libcppdir)/cppcheck.o: lib/cppcheck.cpp externals/picojson/picojson.h externals/simplecpp/simplecpp.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checks.h lib/checkunusedfunctions.h lib/clangimport.h lib/color.h lib/config.h lib/cppcheck.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/rule.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/version.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/cppcheck.cpp $(libcppdir)/ctu.o: lib/ctu.cpp externals/tinyxml2/tinyxml2.h lib/astutils.h lib/check.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/ctu.cpp -$(libcppdir)/errorlogger.o: lib/errorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/errorlogger.o: lib/errorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/errorlogger.cpp $(libcppdir)/errortypes.o: lib/errortypes.cpp lib/config.h lib/errortypes.h lib/utils.h @@ -609,13 +609,13 @@ $(libcppdir)/errortypes.o: lib/errortypes.cpp lib/config.h lib/errortypes.h lib/ $(libcppdir)/findtoken.o: lib/findtoken.cpp lib/astutils.h lib/config.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/findtoken.cpp -$(libcppdir)/forwardanalyzer.o: lib/forwardanalyzer.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/forwardanalyzer.o: lib/forwardanalyzer.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/forwardanalyzer.cpp -$(libcppdir)/fwdanalysis.o: lib/fwdanalysis.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h +$(libcppdir)/fwdanalysis.o: lib/fwdanalysis.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/fwdanalysis.cpp -$(libcppdir)/importproject.o: lib/importproject.cpp externals/picojson/picojson.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/importproject.o: lib/importproject.cpp externals/picojson/picojson.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/importproject.cpp $(libcppdir)/infer.o: lib/infer.cpp lib/calculate.h lib/config.h lib/errortypes.h lib/infer.h lib/mathlib.h lib/smallvector.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h @@ -642,70 +642,70 @@ $(libcppdir)/pathmatch.o: lib/pathmatch.cpp lib/config.h lib/path.h lib/pathmatc $(libcppdir)/platform.o: lib/platform.cpp externals/tinyxml2/tinyxml2.h lib/config.h lib/mathlib.h lib/path.h lib/platform.h lib/standards.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/platform.cpp -$(libcppdir)/preprocessor.o: lib/preprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +$(libcppdir)/preprocessor.o: lib/preprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/preprocessor.cpp -$(libcppdir)/programmemory.o: lib/programmemory.cpp lib/addoninfo.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/programmemory.o: lib/programmemory.cpp lib/addoninfo.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/programmemory.cpp $(libcppdir)/regex.o: lib/regex.cpp lib/config.h lib/regex.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/regex.cpp -$(libcppdir)/reverseanalyzer.o: lib/reverseanalyzer.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/reverseanalyzer.o: lib/reverseanalyzer.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/reverseanalyzer.cpp -$(libcppdir)/sarifreport.o: lib/sarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h +$(libcppdir)/sarifreport.o: lib/sarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/sarifreport.cpp -$(libcppdir)/settings.o: lib/settings.cpp externals/picojson/picojson.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/summaries.h lib/suppressions.h lib/utils.h lib/vfvalue.h +$(libcppdir)/settings.o: lib/settings.cpp externals/picojson/picojson.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/rule.h lib/settings.h lib/standards.h lib/summaries.h lib/suppressions.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/settings.cpp $(libcppdir)/standards.o: lib/standards.cpp externals/simplecpp/simplecpp.h lib/config.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/standards.cpp -$(libcppdir)/summaries.o: lib/summaries.cpp lib/addoninfo.h lib/analyzerinfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/summaries.o: lib/summaries.cpp lib/addoninfo.h lib/analyzerinfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/summaries.cpp -$(libcppdir)/suppressions.o: lib/suppressions.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/suppressions.o: lib/suppressions.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/suppressions.cpp -$(libcppdir)/templatesimplifier.o: lib/templatesimplifier.cpp lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/templatesimplifier.o: lib/templatesimplifier.cpp lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/templatesimplifier.cpp $(libcppdir)/timer.o: lib/timer.cpp lib/config.h lib/timer.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/timer.cpp -$(libcppdir)/token.o: lib/token.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/token.o: lib/token.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/token.cpp -$(libcppdir)/tokenlist.o: lib/tokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/tokenlist.o: lib/tokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenlist.cpp $(libcppdir)/utils.o: lib/utils.cpp lib/config.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/utils.cpp -$(libcppdir)/vf_analyzers.o: lib/vf_analyzers.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/vf_analyzers.o: lib/vf_analyzers.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_analyzers.cpp -$(libcppdir)/vf_common.o: lib/vf_common.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/vf_common.o: lib/vf_common.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_common.cpp -$(libcppdir)/vf_settokenvalue.o: lib/vf_settokenvalue.cpp lib/addoninfo.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/vf_settokenvalue.o: lib/vf_settokenvalue.cpp lib/addoninfo.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_settokenvalue.cpp $(libcppdir)/vfvalue.o: lib/vfvalue.cpp lib/config.h lib/errortypes.h lib/mathlib.h lib/smallvector.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vfvalue.cpp -frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h +frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h lib/checkers.h lib/config.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_FE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ frontend/frontend.cpp -cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h +cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/rule.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp -cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h +cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp -cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/executor.cpp cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/filesettings.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/standards.h lib/utils.h @@ -714,7 +714,7 @@ cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/filesetti cli/main.o: cli/main.cpp cli/cppcheckexecutor.h lib/config.h lib/filesettings.h lib/mathlib.h lib/path.h lib/platform.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/main.cpp -cli/processexecutor.o: cli/processexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h +cli/processexecutor.o: cli/processexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/processexecutor.cpp cli/sehwrapper.o: cli/sehwrapper.cpp cli/sehwrapper.h lib/config.h lib/utils.h @@ -723,247 +723,247 @@ cli/sehwrapper.o: cli/sehwrapper.cpp cli/sehwrapper.h lib/config.h lib/utils.h cli/signalhandler.o: cli/signalhandler.cpp cli/signalhandler.h cli/stacktrace.h lib/config.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/signalhandler.cpp -cli/singleexecutor.o: cli/singleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h +cli/singleexecutor.o: cli/singleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/singleexecutor.cpp cli/stacktrace.o: cli/stacktrace.cpp cli/stacktrace.h lib/config.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/stacktrace.cpp -cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/threadexecutor.cpp -test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h +test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/fixture.cpp -test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/helpers.h +test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/helpers.cpp -test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/main.cpp test/options.o: test/options.cpp lib/config.h lib/timer.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/options.cpp -test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/test64bit.cpp -test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testanalyzerinformation.cpp -test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testassert.cpp -test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testastutils.cpp -test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testautovariables.cpp -test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbool.cpp -test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbufferoverrun.cpp -test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcharvar.cpp -test/testcheck.o: test/testcheck.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcheck.o: test/testcheck.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheck.cpp -test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheckersreport.cpp -test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclangimport.cpp -test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclass.cpp -test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/rule.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcmdlineparser.cpp -test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcolor.cpp -test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcondition.cpp -test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testconstructors.cpp -test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcppcheck.cpp -test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h +test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testerrorlogger.cpp -test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexceptionsafety.cpp -test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexecutor.cpp -test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilelister.cpp -test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilesettings.cpp -test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfrontend.cpp -test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfunctions.cpp -test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testgarbage.cpp -test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h +test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testimportproject.cpp -test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testincompletestatement.cpp -test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testinternal.cpp -test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testio.cpp -test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testleakautovar.cpp -test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testlibrary.cpp -test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmathlib.cpp -test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmemleak.cpp -test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testnullpointer.cpp -test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testoptions.cpp -test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testother.cpp -test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpath.cpp -test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpathmatch.cpp -test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testplatform.cpp -test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpostfixoperator.cpp -test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpreprocessor.cpp -test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprocessexecutor.cpp -test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprogrammemory.cpp test/testregex.o: test/testregex.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testregex.cpp -test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsarifreport.cpp -test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsettings.cpp -test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytemplate.cpp -test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytokens.cpp -test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytypedef.cpp -test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifyusing.cpp -test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsingleexecutor.cpp -test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsizeof.cpp -test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststandards.cpp -test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststl.cpp -test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststring.cpp -test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsummaries.cpp -test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsuppressions.cpp -test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsymboldatabase.cpp -test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testthreadexecutor.cpp -test/testtimer.o: test/testtimer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h +test/testtimer.o: test/testtimer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtimer.cpp -test/testtoken.o: test/testtoken.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtoken.o: test/testtoken.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtoken.cpp -test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenize.cpp -test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenlist.cpp -test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenrange.cpp -test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtype.cpp -test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testuninitvar.cpp -test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedfunctions.cpp -test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedprivfunc.cpp -test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedvar.cpp -test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testutils.cpp -test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvaarg.cpp -test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvalueflow.cpp -test/testvarid.o: test/testvarid.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvarid.o: test/testvarid.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvarid.cpp -test/testvfvalue.o: test/testvfvalue.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testvfvalue.o: test/testvfvalue.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvfvalue.cpp externals/simplecpp/simplecpp.o: externals/simplecpp/simplecpp.cpp externals/simplecpp/simplecpp.h diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 5f735c4ec56..1ad0863d96d 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -57,6 +57,7 @@ #ifdef HAVE_RULES #include "regex.h" +#include "rule.h" // xml is used for rules #include "xml.h" @@ -1304,7 +1305,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // Rule given at command line else if (std::strncmp(argv[i], "--rule=", 7) == 0) { #ifdef HAVE_RULES - Settings::Rule rule; + Rule rule; rule.pattern = 7 + argv[i]; if (rule.pattern.empty()) { @@ -1340,7 +1341,8 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a if (node && strcmp(node->Value(), "rules") == 0) node = node->FirstChildElement("rule"); for (; node && strcmp(node->Value(), "rule") == 0; node = node->NextSiblingElement()) { - Settings::Rule rule; + Rule rule; + Regex::Engine regexEngine = Regex::Engine::Pcre; for (const tinyxml2::XMLElement *subnode = node->FirstChildElement(); subnode; subnode = subnode->NextSiblingElement()) { const char * const subname = subnode->Name(); @@ -1373,7 +1375,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a else if (std::strcmp(subname, "engine") == 0) { const char * const engine = empty_if_null(subtext); if (std::strcmp(engine, "pcre") == 0) { - rule.engine = Regex::Engine::Pcre; + regexEngine = Regex::Engine::Pcre; } else { mLogger.printError(std::string("unknown regex engine '") + engine + "'."); @@ -1407,7 +1409,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } std::string regex_err; - auto regex = Regex::create(rule.pattern, rule.engine, regex_err); + auto regex = Regex::create(rule.pattern, regexEngine, regex_err); if (!regex) { mLogger.printError("unable to load rule-file '" + ruleFile + "' - pattern '" + rule.pattern + "' failed to compile (" + regex_err + ")."); return Result::Fail; diff --git a/gui/test/projectfile/testprojectfile.cpp b/gui/test/projectfile/testprojectfile.cpp index 1eb43f7d72f..3eaa2b10386 100644 --- a/gui/test/projectfile/testprojectfile.cpp +++ b/gui/test/projectfile/testprojectfile.cpp @@ -24,6 +24,10 @@ #include "settings.h" #include "suppressions.h" +#ifdef HAVE_RULES +#include "rule.h" +#endif + #include #include #include @@ -38,6 +42,7 @@ const char Settings::SafeChecks::XmlExternalFunctions[] = "external-functions"; const char Settings::SafeChecks::XmlInternalFunctions[] = "internal-functions"; const char Settings::SafeChecks::XmlExternalVariables[] = "external-variables"; Settings::Settings() : maxCtuDepth(10) {} +Settings::~Settings() = default; Platform::Platform() = default; Library::Library() = default; Library::~Library() = default; diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 856e9a14efa..5eee5dbd98c 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -47,6 +47,7 @@ #ifdef HAVE_RULES #include "regex.h" +#include "rule.h" #endif #include @@ -1415,7 +1416,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation #ifdef HAVE_RULES bool CppCheck::hasRule(const std::string &tokenlist) const { - return std::any_of(mSettings.rules.cbegin(), mSettings.rules.cend(), [&](const Settings::Rule& rule) { + return std::any_of(mSettings.rules.cbegin(), mSettings.rules.cend(), [&](const Rule& rule) { return rule.tokenlist == tokenlist; }); } @@ -1433,7 +1434,7 @@ void CppCheck::executeRules(const std::string &tokenlist, const TokenList &list) str += tok->str(); } - for (const Settings::Rule &rule : mSettings.rules) { + for (const Rule &rule : mSettings.rules) { if (rule.tokenlist != tokenlist) continue; diff --git a/lib/cppcheck.vcxproj b/lib/cppcheck.vcxproj index 5e5b9ae743a..553392c53c2 100644 --- a/lib/cppcheck.vcxproj +++ b/lib/cppcheck.vcxproj @@ -168,6 +168,7 @@ + diff --git a/lib/regex.cpp b/lib/regex.cpp index df92982204a..74e3a988cd3 100644 --- a/lib/regex.cpp +++ b/lib/regex.cpp @@ -179,6 +179,10 @@ namespace { std::string compile(); std::string match(const std::string& str, const MatchFn& matchFn) const override; + Engine engine() const override { + return Engine::Pcre; + } + private: std::string mPattern; pcre* mRe{}; @@ -254,6 +258,7 @@ static T* createAndCompileRegex(std::string pattern, std::string& err) return regex; } +// cppcheck-suppress shadowFunction - FP see #14802 std::shared_ptr Regex::create(std::string pattern, Engine engine, std::string& err) { Regex* regex = nullptr; diff --git a/lib/regex.h b/lib/regex.h index 9717ff6f05d..c17fba41d4e 100644 --- a/lib/regex.h +++ b/lib/regex.h @@ -44,6 +44,8 @@ class CPPCHECKLIB Regex Pcre = 1 }; + virtual Engine engine() const = 0; + static std::shared_ptr create(std::string pattern, Engine engine, std::string& err); }; diff --git a/lib/rule.h b/lib/rule.h new file mode 100644 index 00000000000..dd5cf92effd --- /dev/null +++ b/lib/rule.h @@ -0,0 +1,43 @@ +/* -*- C++ -*- + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2026 Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ruleH +#define ruleH + +#ifdef HAVE_RULES + +#include "errortypes.h" + +#include +#include + +class Regex; + +/** Rule */ +struct Rule +{ + std::string tokenlist = "normal"; // use normal tokenlist + std::string pattern; + std::string id = "rule"; // default id + std::string summary; + Severity severity = Severity::style; // default severity + std::shared_ptr regex; +}; +#endif // HAVE_RULES + +#endif // ruleH diff --git a/lib/settings.cpp b/lib/settings.cpp index 0df9907b3ab..a9ba14dd72b 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -24,6 +24,10 @@ #include "suppressions.h" #include "vfvalue.h" +#ifdef HAVE_RULES +#include "rule.h" +#endif + #include #include #include @@ -69,6 +73,14 @@ Settings::Settings() pid = getPid(); } +Settings::~Settings() = default; + +Settings::Settings(const Settings&) = default; +Settings & Settings::operator=(const Settings &) = default; + +Settings::Settings(Settings&&) noexcept = default; +Settings & Settings::operator=(Settings &&) noexcept = default; + std::string Settings::loadCppcheckCfg(Settings& settings, Suppressions& suppressions, bool debug) { static const std::string cfgFilename = "cppcheck.cfg"; diff --git a/lib/settings.h b/lib/settings.h index 25dee019739..80f3853bde6 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -44,20 +44,13 @@ #endif #ifdef HAVE_RULES -#include "errortypes.h" -#include "regex.h" - -#include - -class Regex; -#else -enum class Severity : std::uint8_t; +struct Rule; #endif - struct Suppressions; namespace ValueFlow { class Value; } +enum class Severity : std::uint8_t; enum class Certainty : std::uint8_t; enum class Checks : std::uint8_t; @@ -115,6 +108,13 @@ class CPPCHECKLIB WARN_UNUSED Settings { public: Settings(); + ~Settings(); + + Settings(const Settings&); + Settings& operator=(const Settings&); + + Settings(Settings&&) noexcept; + Settings& operator=(Settings&&) noexcept; static std::string loadCppcheckCfg(Settings& settings, Suppressions& suppressions, bool debug = false); @@ -372,17 +372,6 @@ class CPPCHECKLIB WARN_UNUSED Settings { int reportProgress{-1}; #ifdef HAVE_RULES - /** Rule */ - struct CPPCHECKLIB Rule { - std::string tokenlist = "normal"; // use normal tokenlist - std::string pattern; - std::string id = "rule"; // default id - std::string summary; - Severity severity = Severity::style; // default severity - Regex::Engine engine = Regex::Engine::Pcre; - std::shared_ptr regex; - }; - /** * @brief Extra rules */ diff --git a/oss-fuzz/Makefile b/oss-fuzz/Makefile index bf40964b338..988b5cb901b 100644 --- a/oss-fuzz/Makefile +++ b/oss-fuzz/Makefile @@ -153,13 +153,13 @@ simplecpp.o: ../externals/simplecpp/simplecpp.cpp ../externals/simplecpp/simplec tinyxml2.o: ../externals/tinyxml2/tinyxml2.cpp ../externals/tinyxml2/tinyxml2.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -w -D_LARGEFILE_SOURCE -c -o $@ ../externals/tinyxml2/tinyxml2.cpp -$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkuninitvar.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/programmemory.h ../lib/regex.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkuninitvar.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/programmemory.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp -$(libcppdir)/tokenize.o: ../lib/tokenize.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/tokenize.o: ../lib/tokenize.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenize.cpp -$(libcppdir)/symboldatabase.o: ../lib/symboldatabase.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/symboldatabase.o: ../lib/symboldatabase.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/symboldatabase.cpp $(libcppdir)/addoninfo.o: ../lib/addoninfo.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/config.h ../lib/json.h ../lib/path.h ../lib/standards.h ../lib/utils.h @@ -168,28 +168,28 @@ $(libcppdir)/addoninfo.o: ../lib/addoninfo.cpp ../externals/picojson/picojson.h $(libcppdir)/analyzerinfo.o: ../lib/analyzerinfo.cpp ../externals/tinyxml2/tinyxml2.h ../lib/analyzerinfo.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/standards.h ../lib/utils.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp -$(libcppdir)/astutils.o: ../lib/astutils.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/astutils.o: ../lib/astutils.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/astutils.cpp -$(libcppdir)/check64bit.o: ../lib/check64bit.cpp ../lib/addoninfo.h ../lib/check.h ../lib/check64bit.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/check64bit.o: ../lib/check64bit.cpp ../lib/addoninfo.h ../lib/check.h ../lib/check64bit.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check64bit.cpp -$(libcppdir)/checkassert.o: ../lib/checkassert.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkassert.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkassert.o: ../lib/checkassert.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkassert.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkassert.cpp -$(libcppdir)/checkautovariables.o: ../lib/checkautovariables.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkautovariables.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkautovariables.o: ../lib/checkautovariables.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkautovariables.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkautovariables.cpp -$(libcppdir)/checkbool.o: ../lib/checkbool.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbool.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkbool.o: ../lib/checkbool.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbool.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbool.cpp -$(libcppdir)/checkbufferoverrun.o: ../lib/checkbufferoverrun.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbufferoverrun.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkbufferoverrun.o: ../lib/checkbufferoverrun.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbufferoverrun.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbufferoverrun.cpp -$(libcppdir)/checkclass.o: ../lib/checkclass.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkclass.o: ../lib/checkclass.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkclass.cpp -$(libcppdir)/checkcondition.o: ../lib/checkcondition.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkcondition.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkcondition.o: ../lib/checkcondition.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkcondition.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkcondition.cpp $(libcppdir)/checkers.o: ../lib/checkers.cpp ../lib/checkers.h ../lib/config.h @@ -198,64 +198,64 @@ $(libcppdir)/checkers.o: ../lib/checkers.cpp ../lib/checkers.h ../lib/config.h $(libcppdir)/checkersidmapping.o: ../lib/checkersidmapping.cpp ../lib/checkers.h ../lib/config.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersidmapping.cpp -$(libcppdir)/checkersreport.o: ../lib/checkersreport.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkersreport.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/standards.h ../lib/utils.h +$(libcppdir)/checkersreport.o: ../lib/checkersreport.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkersreport.h ../lib/config.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/standards.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersreport.cpp -$(libcppdir)/checkexceptionsafety.o: ../lib/checkexceptionsafety.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkexceptionsafety.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkexceptionsafety.o: ../lib/checkexceptionsafety.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkexceptionsafety.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkexceptionsafety.cpp -$(libcppdir)/checkfunctions.o: ../lib/checkfunctions.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkfunctions.o: ../lib/checkfunctions.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkfunctions.cpp -$(libcppdir)/checkimpl.o: ../lib/checkimpl.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkimpl.o: ../lib/checkimpl.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkimpl.cpp -$(libcppdir)/checkinternal.o: ../lib/checkinternal.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkinternal.o: ../lib/checkinternal.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkinternal.cpp -$(libcppdir)/checkio.o: ../lib/checkio.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkio.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkio.o: ../lib/checkio.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkio.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkio.cpp -$(libcppdir)/checkleakautovar.o: ../lib/checkleakautovar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkleakautovar.o: ../lib/checkleakautovar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkleakautovar.cpp -$(libcppdir)/checkmemoryleak.o: ../lib/checkmemoryleak.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkmemoryleak.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkmemoryleak.o: ../lib/checkmemoryleak.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkmemoryleak.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkmemoryleak.cpp -$(libcppdir)/checknullpointer.o: ../lib/checknullpointer.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checknullpointer.o: ../lib/checknullpointer.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checknullpointer.cpp -$(libcppdir)/checkother.o: ../lib/checkother.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkother.o: ../lib/checkother.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkother.cpp -$(libcppdir)/checkpostfixoperator.o: ../lib/checkpostfixoperator.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkpostfixoperator.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkpostfixoperator.o: ../lib/checkpostfixoperator.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkpostfixoperator.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp $(libcppdir)/checks.o: ../lib/checks.cpp ../lib/check.h ../lib/check64bit.h ../lib/checkassert.h ../lib/checkautovariables.h ../lib/checkbool.h ../lib/checkbufferoverrun.h ../lib/checkclass.h ../lib/checkcondition.h ../lib/checkexceptionsafety.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/checkio.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/checkother.h ../lib/checkpostfixoperator.h ../lib/checks.h ../lib/checksizeof.h ../lib/checkstl.h ../lib/checkstring.h ../lib/checktype.h ../lib/checkuninitvar.h ../lib/checkunusedvar.h ../lib/checkvaarg.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/standards.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp -$(libcppdir)/checksizeof.o: ../lib/checksizeof.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checksizeof.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checksizeof.o: ../lib/checksizeof.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checksizeof.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp -$(libcppdir)/checkstl.o: ../lib/checkstl.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkstl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/pathanalysis.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkstl.o: ../lib/checkstl.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkstl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/pathanalysis.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstl.cpp -$(libcppdir)/checkstring.o: ../lib/checkstring.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkstring.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkstring.o: ../lib/checkstring.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkstring.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstring.cpp -$(libcppdir)/checktype.o: ../lib/checktype.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checktype.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checktype.o: ../lib/checktype.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checktype.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checktype.cpp -$(libcppdir)/checkuninitvar.o: ../lib/checkuninitvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkuninitvar.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkuninitvar.o: ../lib/checkuninitvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkuninitvar.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkuninitvar.cpp -$(libcppdir)/checkunusedfunctions.o: ../lib/checkunusedfunctions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/astutils.h ../lib/checkers.h ../lib/checkunusedfunctions.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkunusedfunctions.o: ../lib/checkunusedfunctions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/astutils.h ../lib/checkers.h ../lib/checkunusedfunctions.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedfunctions.cpp -$(libcppdir)/checkunusedvar.o: ../lib/checkunusedvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkunusedvar.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkunusedvar.o: ../lib/checkunusedvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkunusedvar.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedvar.cpp -$(libcppdir)/checkvaarg.o: ../lib/checkvaarg.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkvaarg.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkvaarg.o: ../lib/checkvaarg.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkvaarg.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkvaarg.cpp $(libcppdir)/clangimport.o: ../lib/clangimport.cpp ../lib/clangimport.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h @@ -264,13 +264,13 @@ $(libcppdir)/clangimport.o: ../lib/clangimport.cpp ../lib/clangimport.h ../lib/c $(libcppdir)/color.o: ../lib/color.cpp ../lib/color.h ../lib/config.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/color.cpp -$(libcppdir)/cppcheck.o: ../lib/cppcheck.cpp ../externals/picojson/picojson.h ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/check.h ../lib/checkers.h ../lib/checks.h ../lib/checkunusedfunctions.h ../lib/clangimport.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/suppressions.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/version.h ../lib/vfvalue.h +$(libcppdir)/cppcheck.o: ../lib/cppcheck.cpp ../externals/picojson/picojson.h ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/check.h ../lib/checkers.h ../lib/checks.h ../lib/checkunusedfunctions.h ../lib/clangimport.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/regex.h ../lib/rule.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/suppressions.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/version.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/cppcheck.cpp $(libcppdir)/ctu.o: ../lib/ctu.cpp ../externals/tinyxml2/tinyxml2.h ../lib/astutils.h ../lib/check.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/ctu.cpp -$(libcppdir)/errorlogger.o: ../lib/errorlogger.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/errorlogger.o: ../lib/errorlogger.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/errorlogger.cpp $(libcppdir)/errortypes.o: ../lib/errortypes.cpp ../lib/config.h ../lib/errortypes.h ../lib/utils.h @@ -279,13 +279,13 @@ $(libcppdir)/errortypes.o: ../lib/errortypes.cpp ../lib/config.h ../lib/errortyp $(libcppdir)/findtoken.o: ../lib/findtoken.cpp ../lib/astutils.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/findtoken.cpp -$(libcppdir)/forwardanalyzer.o: ../lib/forwardanalyzer.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/forwardanalyzer.o: ../lib/forwardanalyzer.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/forwardanalyzer.cpp -$(libcppdir)/fwdanalysis.o: ../lib/fwdanalysis.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/fwdanalysis.o: ../lib/fwdanalysis.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/fwdanalysis.cpp -$(libcppdir)/importproject.o: ../lib/importproject.cpp ../externals/picojson/picojson.h ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/filesettings.h ../lib/importproject.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/pathmatch.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/importproject.o: ../lib/importproject.cpp ../externals/picojson/picojson.h ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/filesettings.h ../lib/importproject.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/pathmatch.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/importproject.cpp $(libcppdir)/infer.o: ../lib/infer.cpp ../lib/calculate.h ../lib/config.h ../lib/errortypes.h ../lib/infer.h ../lib/mathlib.h ../lib/smallvector.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h @@ -312,55 +312,55 @@ $(libcppdir)/pathmatch.o: ../lib/pathmatch.cpp ../lib/config.h ../lib/path.h ../ $(libcppdir)/platform.o: ../lib/platform.cpp ../externals/tinyxml2/tinyxml2.h ../lib/config.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/standards.h ../lib/utils.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/platform.cpp -$(libcppdir)/preprocessor.o: ../lib/preprocessor.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/regex.h ../lib/settings.h ../lib/standards.h ../lib/suppressions.h ../lib/utils.h +$(libcppdir)/preprocessor.o: ../lib/preprocessor.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/settings.h ../lib/standards.h ../lib/suppressions.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/preprocessor.cpp -$(libcppdir)/programmemory.o: ../lib/programmemory.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/programmemory.o: ../lib/programmemory.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/programmemory.cpp $(libcppdir)/regex.o: ../lib/regex.cpp ../lib/config.h ../lib/regex.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/regex.cpp -$(libcppdir)/reverseanalyzer.o: ../lib/reverseanalyzer.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/reverseanalyzer.o: ../lib/reverseanalyzer.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/reverseanalyzer.cpp -$(libcppdir)/sarifreport.o: ../lib/sarifreport.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/sarifreport.h ../lib/settings.h ../lib/standards.h ../lib/utils.h +$(libcppdir)/sarifreport.o: ../lib/sarifreport.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/sarifreport.h ../lib/settings.h ../lib/standards.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/sarifreport.cpp -$(libcppdir)/settings.o: ../lib/settings.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/standards.h ../lib/summaries.h ../lib/suppressions.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/settings.o: ../lib/settings.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/rule.h ../lib/settings.h ../lib/standards.h ../lib/summaries.h ../lib/suppressions.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/settings.cpp $(libcppdir)/standards.o: ../lib/standards.cpp ../externals/simplecpp/simplecpp.h ../lib/config.h ../lib/standards.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/standards.cpp -$(libcppdir)/summaries.o: ../lib/summaries.cpp ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/summaries.o: ../lib/summaries.cpp ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/summaries.cpp -$(libcppdir)/suppressions.o: ../lib/suppressions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/pathmatch.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/suppressions.o: ../lib/suppressions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/pathmatch.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/suppressions.cpp -$(libcppdir)/templatesimplifier.o: ../lib/templatesimplifier.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/templatesimplifier.o: ../lib/templatesimplifier.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/templatesimplifier.cpp $(libcppdir)/timer.o: ../lib/timer.cpp ../lib/config.h ../lib/timer.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/timer.cpp -$(libcppdir)/token.o: ../lib/token.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/tokenrange.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/token.o: ../lib/token.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/tokenrange.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/token.cpp -$(libcppdir)/tokenlist.o: ../lib/tokenlist.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/tokenlist.o: ../lib/tokenlist.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenlist.cpp $(libcppdir)/utils.o: ../lib/utils.cpp ../lib/config.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/utils.cpp -$(libcppdir)/vf_analyzers.o: ../lib/vf_analyzers.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/vf_analyzers.o: ../lib/vf_analyzers.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_analyzers.cpp -$(libcppdir)/vf_common.o: ../lib/vf_common.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/vf_common.o: ../lib/vf_common.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_common.cpp -$(libcppdir)/vf_settokenvalue.o: ../lib/vf_settokenvalue.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/regex.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/vf_settokenvalue.o: ../lib/vf_settokenvalue.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_settokenvalue.cpp $(libcppdir)/vfvalue.o: ../lib/vfvalue.cpp ../lib/config.h ../lib/errortypes.h ../lib/mathlib.h ../lib/smallvector.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 135b7c782be..3b88e050f82 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -33,6 +33,11 @@ #include "suppressions.h" #include "utils.h" +#ifdef HAVE_RULES +#include "regex.h" +#include "rule.h" +#endif + #include #include #include @@ -2728,14 +2733,14 @@ class TestCmdlineParser : public TestFixture { ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT_EQUALS(2, settings->rules.size()); auto it = settings->rules.cbegin(); - ASSERT_EQUALS_ENUM(Regex::Engine::Pcre, it->engine); + ASSERT_EQUALS_ENUM(Regex::Engine::Pcre, it->regex->engine()); ASSERT_EQUALS("raw", it->tokenlist); ASSERT_EQUALS(".+", it->pattern); ASSERT_EQUALS_ENUM(Severity::error, it->severity); ASSERT_EQUALS("ruleId1", it->id); ASSERT_EQUALS("ruleSummary1", it->summary); ++it; - ASSERT_EQUALS_ENUM(Regex::Engine::Pcre, it->engine); + ASSERT_EQUALS_ENUM(Regex::Engine::Pcre, it->regex->engine()); ASSERT_EQUALS("define", it->tokenlist); ASSERT_EQUALS(".*", it->pattern); ASSERT_EQUALS_ENUM(Severity::warning, it->severity); @@ -2759,7 +2764,7 @@ class TestCmdlineParser : public TestFixture { ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT_EQUALS(1, settings->rules.size()); auto it = settings->rules.cbegin(); - ASSERT_EQUALS_ENUM(Regex::Engine::Pcre, it->engine); + ASSERT_EQUALS_ENUM(Regex::Engine::Pcre, it->regex->engine()); ASSERT_EQUALS("define", it->tokenlist); ASSERT_EQUALS(".+", it->pattern); ASSERT_EQUALS_ENUM(Severity::error, it->severity); diff --git a/test/testregex.cpp b/test/testregex.cpp index 85ab8007478..f26a9fee4fa 100644 --- a/test/testregex.cpp +++ b/test/testregex.cpp @@ -47,8 +47,10 @@ class TestRegExBase : public TestFixture { std::shared_ptr assertRegex_(const char* file, int line, std::string pattern, const std::string& exp_err = "") const { std::string regex_err; auto r = Regex::create(std::move(pattern), mEngine, regex_err); - if (exp_err.empty()) + if (exp_err.empty()) { ASSERT_LOC(!!r.get(), file, line); + ASSERT_EQUALS_ENUM_LOC(mEngine, r->engine(), file, line); + } else ASSERT_LOC(!r.get(), file, line); // only not set if we encountered an error ASSERT_EQUALS_LOC(exp_err, regex_err, file, line); diff --git a/tools/dmake/dmake.cpp b/tools/dmake/dmake.cpp index d2147efa8c6..a434c710631 100644 --- a/tools/dmake/dmake.cpp +++ b/tools/dmake/dmake.cpp @@ -502,6 +502,7 @@ int main(int argc, char **argv) libfiles_h.emplace("json.h"); libfiles_h.emplace("matchcompiler.h"); libfiles_h.emplace("precompiled.h"); + libfiles_h.emplace("rule.h"); libfiles_h.emplace("smallvector.h"); libfiles_h.emplace("sourcelocation.h"); libfiles_h.emplace("tokenrange.h"); From 21ea669c0750a00583a1d060e8301b0da8b974cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 2 Jun 2026 13:11:00 +0200 Subject: [PATCH 047/171] some `Check::FileInfo`/`CTU::FileInfo` usage cleanups (#8612) --- lib/check.h | 13 ++++++------- lib/checkbufferoverrun.cpp | 10 ++++++---- lib/checkbufferoverrun.h | 6 +++--- lib/checkclass.cpp | 10 ++++++---- lib/checkclass.h | 6 +++--- lib/checknullpointer.cpp | 8 ++++---- lib/checknullpointer.h | 6 +++--- lib/checkuninitvar.cpp | 8 ++++---- lib/checkuninitvar.h | 6 +++--- lib/cppcheck.cpp | 11 +++++------ lib/cppcheck.h | 2 +- lib/ctu.cpp | 2 +- lib/ctu.h | 4 +++- test/testbufferoverrun.cpp | 4 ++-- test/testclass.cpp | 4 ++-- test/testnullpointer.cpp | 4 ++-- test/testuninitvar.cpp | 4 ++-- 17 files changed, 56 insertions(+), 52 deletions(-) diff --git a/lib/check.h b/lib/check.h index 8dda3e41825..00a360d1bf2 100644 --- a/lib/check.h +++ b/lib/check.h @@ -78,25 +78,24 @@ class CPPCHECKLIB Check { /** Base class used for whole-program analysis */ class CPPCHECKLIB FileInfo { public: - explicit FileInfo(std::string f0 = {}) : file0(std::move(f0)) {} + explicit FileInfo(std::string f0) : file0(std::move(f0)) {} virtual ~FileInfo() = default; - virtual std::string toString() const { - return std::string(); - } + virtual std::string toString() const = 0; std::string file0; }; - virtual FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/, const std::string& /*currentConfig*/) const { + virtual const FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/, const std::string& /*currentConfig*/) const { return nullptr; } - virtual FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const { + virtual const FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const { (void)xmlElement; + (void)file0; return nullptr; } // Return true if an error is reported. - virtual bool analyseWholeProgram(const CTU::FileInfo& /*ctu*/, const std::list& /*fileInfo*/, const Settings& /*settings*/, ErrorLogger & /*errorLogger*/) { + virtual bool analyseWholeProgram(const CTU::FileInfo& /*ctu*/, const std::list& /*fileInfo*/, const Settings& /*settings*/, ErrorLogger & /*errorLogger*/) { return false; } diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 9beef9c3079..d278208fcc3 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -900,6 +900,8 @@ namespace /** data for multifile checking */ class MyFileInfo : public Check::FileInfo { public: + explicit MyFileInfo(std::string f0) : Check::FileInfo(std::move(f0)) {} + using Check::FileInfo::FileInfo; /** unsafe array index usage */ std::list unsafeArrayIndex; @@ -952,7 +954,7 @@ bool CheckBufferOverrunImpl::isCtuUnsafePointerArith(const Settings &settings, c } /** @brief Parse current TU and extract file info */ -Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const +const Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const { const std::list &unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, CheckBufferOverrunImpl::isCtuUnsafeArrayIndex); const std::list &unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, CheckBufferOverrunImpl::isCtuUnsafePointerArith); @@ -965,12 +967,12 @@ Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, con return fileInfo; } -Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const +const Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const { const std::string arrayIndex("array-index"); const std::string pointerArith("pointer-arith"); - auto *fileInfo = new MyFileInfo; + auto *fileInfo = new MyFileInfo(file0); for (const tinyxml2::XMLElement *e = xmlElement->FirstChildElement(); e; e = e->NextSiblingElement()) { const char* name = e->Name(); if (name == arrayIndex) @@ -988,7 +990,7 @@ Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLEle } /** @brief Analyse all file infos for all TU */ -bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) +bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) { CheckBufferOverrunImpl dummy(nullptr, settings, errorLogger); dummy. diff --git a/lib/checkbufferoverrun.h b/lib/checkbufferoverrun.h index 566ed76bd85..b0e8b28eba0 100644 --- a/lib/checkbufferoverrun.h +++ b/lib/checkbufferoverrun.h @@ -67,14 +67,14 @@ class CPPCHECKLIB CheckBufferOverrun : public Check { void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; + const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; /** @brief Analyse all file infos for all TU */ - bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override; std::string classInfo() const override { return "Out of bounds checking:\n" diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index e917c95191e..7d3fa5c51ec 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -3693,6 +3693,8 @@ namespace /* multifile checking; one definition rule violations */ class MyFileInfo : public Check::FileInfo { public: + explicit MyFileInfo(std::string f0) : Check::FileInfo(std::move(f0)) {} + using Check::FileInfo::FileInfo; struct NameLoc { std::string className; @@ -3728,7 +3730,7 @@ namespace }; } -Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const +const Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const { if (!tokenizer.isCPP()) return nullptr; @@ -3798,9 +3800,9 @@ Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Setti return fileInfo; } -Check::FileInfo * CheckClass::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const +const Check::FileInfo * CheckClass::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const { - auto *fileInfo = new MyFileInfo; + auto *fileInfo = new MyFileInfo(file0); for (const tinyxml2::XMLElement *e = xmlElement->FirstChildElement(); e; e = e->NextSiblingElement()) { if (std::strcmp(e->Name(), "class") != 0) continue; @@ -3828,7 +3830,7 @@ Check::FileInfo * CheckClass::loadFileInfoFromXml(const tinyxml2::XMLElement *xm return fileInfo; } -bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) +bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) { (void)ctu; (void)settings; diff --git a/lib/checkclass.h b/lib/checkclass.h index 6a91646ba57..a5d20432351 100644 --- a/lib/checkclass.h +++ b/lib/checkclass.h @@ -61,12 +61,12 @@ class CPPCHECKLIB CheckClass : public Check { void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const override; + const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const override; - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override; /** @brief Analyse all file infos for all TU */ - bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 5a83c3c6979..9790f7f2724 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -604,7 +604,7 @@ namespace }; } -Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const +const Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const { (void)currentConfig; @@ -617,18 +617,18 @@ Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const return fileInfo; } -Check::FileInfo * CheckNullPointer::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const +const Check::FileInfo * CheckNullPointer::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const { const std::list &unsafeUsage = CTU::loadUnsafeUsageListFromXml(xmlElement); if (unsafeUsage.empty()) return nullptr; - auto *fileInfo = new MyFileInfo; + auto *fileInfo = new MyFileInfo(file0); fileInfo->unsafeUsage = unsafeUsage; return fileInfo; } -bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) +bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) { (void)settings; diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index a1ccdefb658..d0bc44899a9 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -59,12 +59,12 @@ class CPPCHECKLIB CheckNullPointer : public Check { void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const override; + const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const override; - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override; /** @brief Analyse all file infos for all TU */ - bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; /** Get error messages. Used by --errorlist */ void getErrorMessages(ErrorLogger& errorLogger, const Settings &settings) const override; diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 7c00b705879..6bc2a86b8a5 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1727,7 +1727,7 @@ static bool isVariableUsage(const Settings &settings, const Token *argtok, CTU:: return isVariableUsage(settings, argtok, &value->value); } -Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const +const Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const { const std::list &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, ::isVariableUsage); if (unsafeUsage.empty()) @@ -1738,18 +1738,18 @@ Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const S return fileInfo; } -Check::FileInfo * CheckUninitVar::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const +const Check::FileInfo * CheckUninitVar::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const { const std::list &unsafeUsage = CTU::loadUnsafeUsageListFromXml(xmlElement); if (unsafeUsage.empty()) return nullptr; - auto *fileInfo = new MyFileInfo; + auto *fileInfo = new MyFileInfo(file0); fileInfo->unsafeUsage = unsafeUsage; return fileInfo; } -bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) +bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) { (void)settings; diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index dd92b3c892b..47d9061be18 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -69,12 +69,12 @@ class CPPCHECKLIB CheckUninitVar : public Check { void runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) override; /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; + const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override; - Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; + const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override; /** @brief Analyse all file infos for all TU */ - bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; + bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; void getErrorMessages(ErrorLogger& errorLogger, const Settings& settings) const override; diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 5eee5dbd98c..da078e5eb20 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1379,7 +1379,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation if (mSettings.useSingleJob() || analyzerInformation) { // Analyse the tokens.. { - CTU::FileInfo * const fi1 = CTU::getFileInfo(tokenizer); + const CTU::FileInfo * const fi1 = CTU::getFileInfo(tokenizer); if (analyzerInformation) analyzerInformation->setFileInfo("ctu", fi1->toString()); if (mSettings.useSingleJob()) @@ -1390,7 +1390,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation if (!doUnusedFunctionOnly) { for (const Check * const c : CheckInstances::get()) { - if (Check::FileInfo * const fi = c->getFileInfo(tokenizer, mSettings, currentConfig)) { + if (const Check::FileInfo * const fi = c->getFileInfo(tokenizer, mSettings, currentConfig)) { if (analyzerInformation) analyzerInformation->setFileInfo(c->name(), fi->toString()); if (mSettings.useSingleJob()) @@ -1855,7 +1855,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st executeAddonsWholeProgram(files, fileSettings, ctuInfo); - std::list fileInfoList; + std::list fileInfoList; CTU::FileInfo ctuFileInfo; const auto handler = [&fileInfoList, &ctuFileInfo](const char* checkattr, const tinyxml2::XMLElement* e, const AnalyzerInformation::Info& filesTxtInfo) { @@ -1865,8 +1865,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st } for (const Check *check : CheckInstances::get()) { if (checkattr == check->name()) { - if (Check::FileInfo* fi = check->loadFileInfoFromXml(e)) { - fi->file0 = filesTxtInfo.sourceFile; + if (const Check::FileInfo* fi = check->loadFileInfoFromXml(e, filesTxtInfo.sourceFile)) { fileInfoList.push_back(fi); } } @@ -1884,7 +1883,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st c->analyseWholeProgram(ctuFileInfo, fileInfoList, mSettings, mErrorLogger); } - for (Check::FileInfo *fi : fileInfoList) + for (const Check::FileInfo *fi : fileInfoList) delete fi; return mLogger->exitcode(); diff --git a/lib/cppcheck.h b/lib/cppcheck.h index d72e65ebb34..014b15e393a 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -250,7 +250,7 @@ class CPPCHECKLIB CppCheck { bool mUseGlobalSuppressions; /** File info used for whole program analysis */ - std::list mFileInfo; + std::list mFileInfo; /** Callback for executing a shell command (exe, args, output) */ ExecuteCmdFn mExecuteCommand; diff --git a/lib/ctu.cpp b/lib/ctu.cpp index 938bb2a4dcc..fee3acb85ae 100644 --- a/lib/ctu.cpp +++ b/lib/ctu.cpp @@ -310,7 +310,7 @@ static int isCallFunction(const Scope *scope, int argnr, const Token *&tok) } -CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer) +const CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer) { const SymbolDatabase * const symbolDatabase = tokenizer.getSymbolDatabase(); diff --git a/lib/ctu.h b/lib/ctu.h index 4f5e0b0294c..60120064284 100644 --- a/lib/ctu.h +++ b/lib/ctu.h @@ -52,6 +52,8 @@ namespace tinyxml2 { namespace CTU { class CPPCHECKLIB FileInfo : public Check::FileInfo { public: + FileInfo() : Check::FileInfo("") {} + enum class InvalidValueType : std::uint8_t { null, uninit, bufferOverflow }; std::string toString() const override; @@ -160,7 +162,7 @@ namespace CTU { CPPCHECKLIB std::string getFunctionId(const Tokenizer &tokenizer, const Function *function); /** @brief Parse current TU and extract file info */ - CPPCHECKLIB RET_NONNULL FileInfo *getFileInfo(const Tokenizer &tokenizer); + CPPCHECKLIB RET_NONNULL const FileInfo *getFileInfo(const Tokenizer &tokenizer); CPPCHECKLIB std::list getUnsafeUsage(const Tokenizer &tokenizer, const Settings &settings, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, FileInfo::Value *value)); diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 54fcabab6d1..23e55748ce6 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -5361,9 +5361,9 @@ class TestBufferOverrun : public TestFixture { SimpleTokenizer tokenizer(settings0, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); + const CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); - std::list fileInfo; + std::list fileInfo; CheckBufferOverrun check; Check& c = getCheck(check); fileInfo.push_back(c.getFileInfo(tokenizer, settings0, "")); diff --git a/test/testclass.cpp b/test/testclass.cpp index 7f1a668cae1..ae5068dcb9d 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -9282,7 +9282,7 @@ class TestClass : public TestFixture { Check &check = getCheck(checkClass); // getFileInfo - std::list fileInfo; + std::list fileInfo; for (const std::string& c: code) { const std::string filename = std::to_string(fileInfo.size()) + ".cpp"; SimpleTokenizer tokenizer{settingsDefault, *this, filename}; @@ -9333,7 +9333,7 @@ class TestClass : public TestFixture { CheckClass check; const Check& c = getCheck(check); - Check::FileInfo * fileInfo = (c.getFileInfo)(tokenizer, settings1, ""); + const Check::FileInfo * fileInfo = (c.getFileInfo)(tokenizer, settings1, ""); delete fileInfo; } diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index b628d294a59..99ece1c57fc 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -4690,11 +4690,11 @@ class TestNullPointer : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); + const CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); CheckNullPointer check; Check& c = getCheck(check); - std::list fileInfo; + std::list fileInfo; fileInfo.push_back(c.getFileInfo(tokenizer, settings, "")); c.analyseWholeProgram(*ctu, fileInfo, settings, *this); // TODO: check result while (!fileInfo.empty()) { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index b9e8a623cb7..e0c5512f1fd 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -5576,10 +5576,10 @@ class TestUninitVar : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); + const CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); // Check code.. - std::list fileInfo; + std::list fileInfo; CheckUninitVar check; Check& c = getCheck(check); fileInfo.push_back(c.getFileInfo(tokenizer, settings, "")); From cc77855312f0c80ef68107c4beb4e362f2b6863e Mon Sep 17 00:00:00 2001 From: Andrew C Aitchison <45234463+andrew-aitchison@users.noreply.github.com> Date: Tue, 2 Jun 2026 14:29:43 +0100 Subject: [PATCH 048/171] Add functions thread-unsafe in Ubuntu 26.04 (#8598) --- addons/threadsafety.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/threadsafety.py b/addons/threadsafety.py index 9475e1a5b0d..390a245d4e1 100755 --- a/addons/threadsafety.py +++ b/addons/threadsafety.py @@ -111,6 +111,8 @@ 'cuserid', 'drand48', 'ecvt', + 'elf_fill', + 'elf_flagelf', 'encrypt', 'endfsent', 'endgrent', From 54b9fa5523d2744250d72219afb3170756a4d8f3 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 2 Jun 2026 15:50:27 +0200 Subject: [PATCH 049/171] Fix #14808 FN leakNoVarFunctionCall with new (#8611) --- lib/checkmemoryleak.cpp | 3 +++ test/testmemleak.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index dcde32737d5..cc8b6853f11 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -1049,6 +1049,9 @@ void CheckMemoryLeakNoVarImpl::checkForUnreleasedInputArgument(const Scope *scop if (alloc == New || alloc == NewArray) { const Token* typeTok = arg->next(); bool bail = !typeTok->isStandardType() && + (!typeTok->valueType() || + (typeTok->valueType()->type < ValueType::Type::SMART_POINTER && + typeTok->valueType()->type != ValueType::Type::POD)) && !mSettings.library.detectContainerOrIterator(typeTok) && !mSettings.library.podtype(typeTok->expressionString()); if (bail && typeTok->type() && typeTok->type()->classScope && diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index fda118826bb..783a10ad089 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -2613,6 +2613,21 @@ class TestMemleakNoVar : public TestFixture { ASSERT_EQUALS("[test.cpp:2:19]: (error) Allocation with new, strlen doesn't release it. [leakNoVarFunctionCall]\n" "[test.cpp:5:20]: (error) Allocation with new, strlen doesn't release it. [leakNoVarFunctionCall]\n", errout_str()); + + check("int* f1() { return new int; }\n" // #14808 + "std::string* f2() { return new std::string(\"abc\"); }\n" + "std::clock_t* f3() { return new std::clock_t; }\n" + "QWidget* f4(QObject* parent) { return new QWidget(parent); }\n" + "void g(QObject* parent) {\n" + " assert(f1());\n" + " assert(f2());\n" + " assert(f3());\n" + " assert(f4(parent));\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6:12]: (error) Allocation with f1, assert doesn't release it. [leakNoVarFunctionCall]\n" + "[test.cpp:7:12]: (error) Allocation with f2, assert doesn't release it. [leakNoVarFunctionCall]\n" + "[test.cpp:8:12]: (error) Allocation with f3, assert doesn't release it. [leakNoVarFunctionCall]\n", + errout_str()); } void missingAssignment() { From 8cc4d37530b6d97d1bb71d47b93961a5d7dbe87e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 2 Jun 2026 17:33:24 +0200 Subject: [PATCH 050/171] regex.cpp: fixed `unmatchedSuppression` (#8617) --- lib/regex.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/regex.cpp b/lib/regex.cpp index 74e3a988cd3..3a94b293ed5 100644 --- a/lib/regex.cpp +++ b/lib/regex.cpp @@ -258,7 +258,6 @@ static T* createAndCompileRegex(std::string pattern, std::string& err) return regex; } -// cppcheck-suppress shadowFunction - FP see #14802 std::shared_ptr Regex::create(std::string pattern, Engine engine, std::string& err) { Regex* regex = nullptr; From 26bff2d66cfb3572d994eca6556d5a9a05fee89e Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Tue, 2 Jun 2026 19:49:58 +0200 Subject: [PATCH 051/171] Update get_checkers.py and lib/checkers.cpp (#8616) Co-authored-by: William Jakobsson --- lib/checkers.cpp | 375 ++++++++++++++++++++++-------------------- tools/get_checkers.py | 85 +++++++--- 2 files changed, 251 insertions(+), 209 deletions(-) diff --git a/lib/checkers.cpp b/lib/checkers.cpp index f7d7f913da6..3b425926b9e 100644 --- a/lib/checkers.cpp +++ b/lib/checkers.cpp @@ -109,7 +109,7 @@ namespace checkers { {"CheckMemoryLeakNoVar::check",""}, {"CheckMemoryLeakNoVar::checkForUnsafeArgAlloc",""}, {"CheckMemoryLeakStructMember::check",""}, - {"CheckNullPointer::analyseWholeProgram","unusedfunctions"}, + {"CheckNullPointer::analyseWholeProgram",""}, {"CheckNullPointer::arithmetic",""}, {"CheckNullPointer::nullConstantDereference",""}, {"CheckNullPointer::nullPointer",""}, @@ -1677,9 +1677,25 @@ std::vector checkers::autosarInfo{ }; std::vector checkers::certCInfo{ - {"PRE30-C", "L3"}, - {"PRE31-C", "L3"}, - {"PRE32-C", "L3"}, + {"ARR30-C", "L2"}, + {"ARR32-C", "L2"}, + {"ARR36-C", "L3"}, + {"ARR37-C", "L2"}, + {"ARR38-C", "L2"}, + {"ARR39-C", "L2"}, + {"CON30-C", "L3"}, + {"CON31-C", "L3"}, + {"CON32-C", "L3"}, + {"CON33-C", "L3"}, + {"CON34-C", "L3"}, + {"CON35-C", "L3"}, + {"CON36-C", "L3"}, + {"CON37-C", "L3"}, + {"CON38-C", "L3"}, + {"CON39-C", "L3"}, + {"CON40-C", "L2"}, + {"CON41-C", "L3"}, + {"CON43-C", "L3"}, {"DCL30-C", "L2"}, {"DCL31-C", "L3"}, {"DCL36-C", "L2"}, @@ -1688,6 +1704,15 @@ std::vector checkers::certCInfo{ {"DCL39-C", "L3"}, {"DCL40-C", "L3"}, {"DCL41-C", "L2"}, + {"ENV30-C", "L3"}, + {"ENV31-C", "L3"}, + {"ENV32-C", "L1"}, + {"ENV33-C", "L1"}, + {"ENV34-C", "L3"}, + {"ERR30-C", "L1"}, + {"ERR32-C", "L3"}, + {"ERR33-C", "L1"}, + {"ERR34-C", "L2"}, {"EXP30-C", "L2"}, {"EXP32-C", "L2"}, {"EXP33-C", "L1"}, @@ -1695,7 +1720,7 @@ std::vector checkers::certCInfo{ {"EXP35-C", "L2"}, {"EXP36-C", "L3"}, {"EXP37-C", "L3"}, - {"EXP39-C", "L2"}, + {"EXP39-C", "L3"}, {"EXP40-C", "L3"}, {"EXP42-C", "L1"}, {"EXP43-C", "L3"}, @@ -1703,36 +1728,6 @@ std::vector checkers::certCInfo{ {"EXP45-C", "L2"}, {"EXP46-C", "L2"}, {"EXP47-C", "L2"}, - {"INT30-C", "L2"}, - {"INT31-C", "L1"}, - {"INT32-C", "L1"}, - {"INT33-C", "L2"}, - {"INT34-C", "L3"}, - {"INT35-C", "L3"}, - {"INT36-C", "L3"}, - {"FLP30-C", "L2"}, - {"FLP32-C", "L1"}, - {"FLP34-C", "L3"}, - {"FLP36-C", "L3"}, - {"FLP37-C", "L3"}, - {"ARR30-C", "L2"}, - {"ARR32-C", "L2"}, - {"ARR36-C", "L3"}, - {"ARR37-C", "L2"}, - {"ARR38-C", "L2"}, - {"ARR39-C", "L2"}, - {"STR30-C", "L2"}, - {"STR31-C", "L2"}, - {"STR32-C", "L1"}, - {"STR34-C", "L2"}, - {"STR37-C", "L3"}, - {"STR38-C", "L1"}, - {"MEM30-C", "L2"}, - {"MEM31-C", "L3"}, - {"MEM33-C", "L3"}, - {"MEM34-C", "L2"}, - {"MEM35-C", "L2"}, - {"MEM36-C", "L3"}, {"FIO30-C", "L1"}, {"FIO32-C", "L3"}, {"FIO34-C", "L1"}, @@ -1746,32 +1741,24 @@ std::vector checkers::certCInfo{ {"FIO45-C", "L2"}, {"FIO46-C", "L3"}, {"FIO47-C", "L2"}, - {"ENV30-C", "L3"}, - {"ENV31-C", "L3"}, - {"ENV32-C", "L1"}, - {"ENV33-C", "L1"}, - {"ENV34-C", "L3"}, - {"SIG30-C", "L1"}, - {"SIG31-C", "L1"}, - {"SIG34-C", "L3"}, - {"SIG35-C", "L3"}, - {"ERR30-C", "L1"}, - {"ERR32-C", "L3"}, - {"ERR33-C", "L1"}, - {"ERR34-C", "L2"}, - {"CON30-C", "L3"}, - {"CON31-C", "L3"}, - {"CON32-C", "L3"}, - {"CON33-C", "L3"}, - {"CON34-C", "L3"}, - {"CON35-C", "L3"}, - {"CON36-C", "L3"}, - {"CON37-C", "L3"}, - {"CON38-C", "L3"}, - {"CON39-C", "L3"}, - {"CON40-C", "L2"}, - {"CON41-C", "L3"}, - {"CON43-C", "L3"}, + {"FLP30-C", "L2"}, + {"FLP32-C", "L1"}, + {"FLP34-C", "L3"}, + {"FLP36-C", "L3"}, + {"FLP37-C", "L3"}, + {"INT30-C", "L2"}, + {"INT31-C", "L1"}, + {"INT32-C", "L1"}, + {"INT33-C", "L2"}, + {"INT34-C", "L3"}, + {"INT35-C", "L3"}, + {"INT36-C", "L3"}, + {"MEM30-C", "L2"}, + {"MEM31-C", "L3"}, + {"MEM33-C", "L3"}, + {"MEM34-C", "L2"}, + {"MEM35-C", "L2"}, + {"MEM36-C", "L3"}, {"MSC30-C", "L3"}, {"MSC32-C", "L1"}, {"MSC33-C", "L2"}, @@ -1796,21 +1783,42 @@ std::vector checkers::certCInfo{ {"POS52-C", "L3"}, {"POS53-C", "L2"}, {"POS54-C", "L1"}, + {"PRE30-C", "L3"}, + {"PRE31-C", "L3"}, + {"PRE32-C", "L3"}, + {"SIG30-C", "L1"}, + {"SIG31-C", "L1"}, + {"SIG34-C", "L3"}, + {"SIG35-C", "L3"}, + {"STR30-C", "L2"}, + {"STR31-C", "L2"}, + {"STR32-C", "L1"}, + {"STR34-C", "L2"}, + {"STR37-C", "L3"}, + {"STR38-C", "L1"}, {"WIN30-C", "L3"}, // Recommendations - {"PRE00-C", "L3"}, - {"PRE01-C", "L1"}, - {"PRE02-C", "L1"}, - {"PRE04-C", "L3"}, - {"PRE05-C", "L3"}, - {"PRE06-C", "L3"}, - {"PRE07-C", "L3"}, - {"PRE08-C", "L3"}, - {"PRE09-C", "L1"}, - {"PRE10-C", "L1"}, - {"PRE11-C", "L2"}, - {"PRE12-C", "L3"}, - {"PRE13-C", "L3"}, + {"API00-C", "L3"}, + {"API01-C", "L1"}, + {"API02-C", "L1"}, + {"API03-C", "L3"}, + {"API04-C", "L3"}, + {"API05-C", "L1"}, + {"API07-C", "L3"}, + {"API09-C", "L3"}, + {"API10-C", "L3"}, + {"ARR00-C", "L2"}, + {"ARR01-C", "L1"}, + {"ARR02-C", "L2"}, + {"CON01-C", "L3"}, + {"CON02-C", "L3"}, + {"CON03-C", "L3"}, + {"CON04-C", "L3"}, + {"CON05-C", "L3"}, + {"CON06-C", "L3"}, + {"CON07-C", "L2"}, + {"CON08-C", "L3"}, + {"CON09-C", "L3"}, {"DCL00-C", "L3"}, {"DCL01-C", "L3"}, {"DCL02-C", "L3"}, @@ -1834,6 +1842,16 @@ std::vector checkers::certCInfo{ {"DCL21-C", "L3"}, {"DCL22-C", "L3"}, {"DCL23-C", "L2"}, + {"ENV01-C", "L2"}, + {"ENV02-C", "L3"}, + {"ENV03-C", "L2"}, + {"ERR00-C", "L3"}, + {"ERR01-C", "L2"}, + {"ERR02-C", "L3"}, + {"ERR04-C", "L3"}, + {"ERR05-C", "L2"}, + {"ERR06-C", "L3"}, + {"ERR07-C", "L1"}, {"EXP00-C", "L2"}, {"EXP02-C", "L3"}, {"EXP03-C", "L3"}, @@ -1850,44 +1868,6 @@ std::vector checkers::certCInfo{ {"EXP16-C", "L2"}, {"EXP19-C", "L1"}, {"EXP20-C", "L1"}, - {"INT00-C", "L3"}, - {"INT01-C", "L2"}, - {"INT02-C", "L3"}, - {"INT04-C", "L1"}, - {"INT05-C", "L2"}, - {"INT07-C", "L1"}, - {"INT08-C", "L3"}, - {"INT09-C", "L3"}, - {"INT10-C", "L3"}, - {"INT12-C", "L3"}, - {"INT13-C", "L2"}, - {"INT14-C", "L3"}, - {"INT15-C", "L2"}, - {"INT16-C", "L3"}, - {"INT17-C", "L3"}, - {"INT18-C", "L1"}, - {"FLP00-C", "L3"}, - {"FLP01-C", "L3"}, - {"FLP02-C", "L3"}, - {"FLP03-C", "L3"}, - {"FLP04-C", "L3"}, - {"FLP05-C", "L3"}, - {"FLP06-C", "L3"}, - {"FLP07-C", "L3"}, - {"ARR00-C", "L2"}, - {"ARR01-C", "L1"}, - {"ARR02-C", "L2"}, - {"STR00-C", "L3"}, - {"STR01-C", "L3"}, - {"STR02-C", "L2"}, - {"STR03-C", "L3"}, - {"STR04-C", "L3"}, - {"STR05-C", "L3"}, - {"STR06-C", "L2"}, - {"STR08-C", "L2"}, - {"STR09-C", "L3"}, - {"STR10-C", "L3"}, - {"STR11-C", "L2"}, {"FIO01-C", "L1"}, {"FIO02-C", "L3"}, {"FIO03-C", "L3"}, @@ -1908,36 +1888,41 @@ std::vector checkers::certCInfo{ {"FIO22-C", "L3"}, {"FIO23-C", "L3"}, {"FIO24-C", "L3"}, - {"ENV01-C", "L2"}, - {"ENV02-C", "L3"}, - {"ENV03-C", "L2"}, - {"SIG00-C", "L2"}, - {"SIG01-C", "L3"}, - {"SIG02-C", "L2"}, - {"ERR00-C", "L3"}, - {"ERR01-C", "L2"}, - {"ERR02-C", "L3"}, - {"ERR04-C", "L3"}, - {"ERR05-C", "L2"}, - {"ERR06-C", "L3"}, - {"ERR07-C", "L1"}, - {"API00-C", "L3"}, - {"API01-C", "L1"}, - {"API02-C", "L1"}, - {"API03-C", "L3"}, - {"API04-C", "L3"}, - {"API05-C", "L1"}, - {"API07-C", "L3"}, - {"API09-C", "L3"}, - {"API10-C", "L3"}, - {"CON01-C", "L3"}, - {"CON02-C", "L3"}, - {"CON04-C", "L3"}, - {"CON05-C", "L3"}, - {"CON06-C", "L3"}, - {"CON07-C", "L2"}, - {"CON08-C", "L3"}, - {"CON09-C", "L3"}, + {"FLP00-C", "L3"}, + {"FLP01-C", "L3"}, + {"FLP02-C", "L3"}, + {"FLP03-C", "L3"}, + {"FLP04-C", "L3"}, + {"FLP05-C", "L3"}, + {"FLP06-C", "L3"}, + {"FLP07-C", "L3"}, + {"INT00-C", "L3"}, + {"INT01-C", "L2"}, + {"INT02-C", "L3"}, + {"INT04-C", "L1"}, + {"INT05-C", "L2"}, + {"INT07-C", "L1"}, + {"INT08-C", "L3"}, + {"INT09-C", "L3"}, + {"INT10-C", "L3"}, + {"INT12-C", "L3"}, + {"INT13-C", "L2"}, + {"INT14-C", "L3"}, + {"INT15-C", "L2"}, + {"INT16-C", "L3"}, + {"INT17-C", "L3"}, + {"INT18-C", "L1"}, + {"MEM00-C", "L1"}, + {"MEM01-C", "L2"}, + {"MEM02-C", "L3"}, + {"MEM03-C", "L3"}, + {"MEM04-C", "L2"}, + {"MEM05-C", "L2"}, + {"MEM06-C", "L3"}, + {"MEM07-C", "L2"}, + {"MEM10-C", "L3"}, + {"MEM11-C", "L3"}, + {"MEM12-C", "L3"}, {"MSC00-C", "L3"}, {"MSC01-C", "L3"}, {"MSC04-C", "L3"}, @@ -1964,6 +1949,32 @@ std::vector checkers::certCInfo{ {"POS02-C", "L2"}, {"POS04-C", "L3"}, {"POS05-C", "L3"}, + {"PRE00-C", "L3"}, + {"PRE01-C", "L1"}, + {"PRE02-C", "L1"}, + {"PRE04-C", "L3"}, + {"PRE05-C", "L3"}, + {"PRE06-C", "L3"}, + {"PRE07-C", "L3"}, + {"PRE08-C", "L3"}, + {"PRE09-C", "L1"}, + {"PRE10-C", "L1"}, + {"PRE11-C", "L2"}, + {"PRE12-C", "L3"}, + {"PRE13-C", "L3"}, + {"SIG00-C", "L2"}, + {"SIG01-C", "L3"}, + {"SIG02-C", "L2"}, + {"STR00-C", "L3"}, + {"STR01-C", "L3"}, + {"STR02-C", "L2"}, + {"STR03-C", "L3"}, + {"STR04-C", "L3"}, + {"STR05-C", "L3"}, + {"STR06-C", "L2"}, + {"STR09-C", "L3"}, + {"STR10-C", "L3"}, + {"STR11-C", "L2"}, {"WIN00-C", "L2"}, {"WIN01-C", "L1"}, {"WIN02-C", "L1"}, @@ -1972,6 +1983,22 @@ std::vector checkers::certCInfo{ }; std::vector checkers::certCppInfo{ + {"CON50-CPP", "L3"}, + {"CON51-CPP", "L2"}, + {"CON52-CPP", "L3"}, + {"CON53-CPP", "L3"}, + {"CON54-CPP", "L3"}, + {"CON55-CPP", "L3"}, + {"CON56-CPP", "L3"}, + {"CTR50-CPP", "L2"}, + {"CTR51-CPP", "L2"}, + {"CTR52-CPP", "L2"}, + {"CTR53-CPP", "L2"}, + {"CTR54-CPP", "L3"}, + {"CTR55-CPP", "L2"}, + {"CTR56-CPP", "L2"}, + {"CTR57-CPP", "L3"}, + {"CTR58-CPP", "L2"}, {"DCL50-CPP", "L1"}, {"DCL51-CPP", "L3"}, {"DCL52-CPP", "L3"}, @@ -1983,6 +2010,19 @@ std::vector checkers::certCppInfo{ {"DCL58-CPP", "L2"}, {"DCL59-CPP", "L3"}, {"DCL60-CPP", "L2"}, + {"ERR50-CPP", "L3"}, + {"ERR51-CPP", "L2"}, + {"ERR52-CPP", "L3"}, + {"ERR53-CPP", "L3"}, + {"ERR54-CPP", "L1"}, + {"ERR55-CPP", "L2"}, + {"ERR56-CPP", "L2"}, + {"ERR57-CPP", "L3"}, + {"ERR58-CPP", "L2"}, + {"ERR59-CPP", "L2"}, + {"ERR60-CPP", "L3"}, + {"ERR61-CPP", "L3"}, + {"ERR62-CPP", "L3"}, {"EXP50-CPP", "L2"}, {"EXP51-CPP", "L3"}, {"EXP52-CPP", "L3"}, @@ -1997,20 +2037,9 @@ std::vector checkers::certCppInfo{ {"EXP61-CPP", "L2"}, {"EXP62-CPP", "L1"}, {"EXP63-CPP", "L2"}, + {"FIO50-CPP", "L2"}, + {"FIO51-CPP", "L3"}, {"INT50-CPP", "L3"}, - {"CTR50-CPP", "L2"}, - {"CTR51-CPP", "L2"}, - {"CTR52-CPP", "L2"}, - {"CTR53-CPP", "L2"}, - {"CTR54-CPP", "L3"}, - {"CTR55-CPP", "L2"}, - {"CTR56-CPP", "L2"}, - {"CTR57-CPP", "L3"}, - {"CTR58-CPP", "L2"}, - {"STR50-CPP", "L2"}, - {"STR51-CPP", "L1"}, - {"STR52-CPP", "L2"}, - {"STR53-CPP", "L3"}, {"MEM50-CPP", "L2"}, {"MEM51-CPP", "L2"}, {"MEM52-CPP", "L1"}, @@ -2019,21 +2048,11 @@ std::vector checkers::certCppInfo{ {"MEM55-CPP", "L2"}, {"MEM56-CPP", "L2"}, {"MEM57-CPP", "L3"}, - {"FIO50-CPP", "L2"}, - {"FIO51-CPP", "L3"}, - {"ERR50-CPP", "L3"}, - {"ERR51-CPP", "L2"}, - {"ERR52-CPP", "L3"}, - {"ERR53-CPP", "L3"}, - {"ERR54-CPP", "L1"}, - {"ERR55-CPP", "L2"}, - {"ERR56-CPP", "L2"}, - {"ERR57-CPP", "L3"}, - {"ERR58-CPP", "L2"}, - {"ERR59-CPP", "L2"}, - {"ERR60-CPP", "L3"}, - {"ERR61-CPP", "L3"}, - {"ERR62-CPP", "L3"}, + {"MSC50-CPP", "L3"}, + {"MSC51-CPP", "L1"}, + {"MSC52-CPP", "L2"}, + {"MSC53-CPP", "L3"}, + {"MSC54-CPP", "L2"}, {"OOP50-CPP", "L3"}, {"OOP51-CPP", "L3"}, {"OOP52-CPP", "L3"}, @@ -2043,17 +2062,9 @@ std::vector checkers::certCppInfo{ {"OOP56-CPP", "L3"}, {"OOP57-CPP", "L1"}, {"OOP58-CPP", "L2"}, - {"CON50-CPP", "L3"}, - {"CON51-CPP", "L2"}, - {"CON52-CPP", "L3"}, - {"CON53-CPP", "L3"}, - {"CON54-CPP", "L3"}, - {"CON55-CPP", "L3"}, - {"CON56-CPP", "L3"}, - {"MSC50-CPP", "L3"}, - {"MSC51-CPP", "L1"}, - {"MSC52-CPP", "L2"}, - {"MSC53-CPP", "L3"}, - {"MSC54-CPP", "L2"}, + {"STR50-CPP", "L2"}, + {"STR51-CPP", "L1"}, + {"STR52-CPP", "L2"}, + {"STR53-CPP", "L3"}, }; diff --git a/tools/get_checkers.py b/tools/get_checkers.py index 4594b773dc2..48455200fb5 100644 --- a/tools/get_checkers.py +++ b/tools/get_checkers.py @@ -2,8 +2,18 @@ import glob import os import re +import sys import requests +try: + from tqdm import tqdm +except ImportError: + # Fallback: passthrough iterator if tqdm is not installed + def tqdm(iterable, total=None, desc=None, **kwargs): + if desc: + print(desc, file=sys.stderr) + return iterable + def print_checkers(glob_pattern:str): checkers = {} for filename in glob.glob(glob_pattern): @@ -908,44 +918,65 @@ def print_checkers(glob_pattern:str): }; """) +# SEI CERT is available as markdown files at +# https://github.com/cmu-sei/secure-coding-standards +CERT_REPO = 'cmu-sei/secure-coding-standards' +CERT_BRANCH = 'main' + +# Cache git tree +_cert_tree = None + +def listCertFiles(content_subdir:str): + """Lists the rules and recommendation files for one part of the standard.""" + global _cert_tree + if _cert_tree is None: + url = 'https://api.github.com/repos/%s/git/trees/%s?recursive=1' % (CERT_REPO, CERT_BRANCH) + _cert_tree = requests.get(url, timeout=50).json()['tree'] + prefix = 'content/' + content_subdir + files = [] + for entry in _cert_tree: + path = entry['path'] + if entry['type'] != 'blob' or not path.startswith(prefix) or not path.endswith('.md'): + continue + if 'index' in path.rsplit('/', 1)[-1].lower(): + continue + files.append(path) + return sorted(files) -def getCertCInfo(main_url:str): +def printCertCInfo(content_subdir:str): """Fetches CERT C rules information.""" - # Fetching the CERT C rules page - r = requests.get(main_url, timeout=30) - mainpage = r.text - for line in mainpage.split('\n'): - res = re.search(r'(Rule|Rec.) \d\d[.] [A-Za-z ]+ [(][A-Z][A-Z][A-Z][)]', line) + paths = listCertFiles(content_subdir) + rules = {} + for path in tqdm(paths, total=len(paths), desc=f'Fetching {content_subdir}', file=sys.stderr): + raw = 'https://raw.githubusercontent.com/%s/%s/%s' % (CERT_REPO, CERT_BRANCH, path) + text = requests.get(raw, timeout=30).text + res = re.search(r'^#\s+([A-Z]{3}\d{2}-C(?:PP)?)\b', text, re.MULTILINE) if res is None: continue - r = requests.get('https://wiki.sei.cmu.edu' + res.group(1), timeout=30) - text = r.text.replace('\n', '').replace('', '\n').replace('', '\n') - rules = [] - for line in text.split('\n'): - if not line.startswith(']+>([A-Z][A-Z][A-Z][0-9][0-9]-CP*)<.*>(L[1-3])<.+', line) - if res: - if res.group(1) == 'EXP40-C' and 'EXP39-C' not in rules: - print(' {"EXP39-C", "L2"},') - print(' {"%s", "%s"},' % (res.group(1), res.group(2))) - rules.append(res.group(1)) - if 'EXP45-C' in rules: - if 'EXP46-C' not in rules: - print(' {"EXP46-C", "L2"},') - if 'EXP47-C' not in rules: - print(' {"EXP47-C", "L2"},') + head = re.search(r'^#{0,4}\s*Risk Assessments?\s*$', text, re.MULTILINE) + if head is None: + continue + section = text[head.end():] + nexthead = re.search(r'^#{1,4}\s+\S', section, re.MULTILINE) + if nexthead: + section = section[:nexthead.start()] + level = re.search(r'\bL[1-3]\b', section) + if level is None: + continue + rules[res.group(1)] = level.group(0) + for rule_id, level in dict(sorted(rules.items())).items(): + print(' {"%s", "%s"},' % (rule_id, level)) + print('std::vector checkers::certCInfo{') -getCertCInfo('https://wiki.sei.cmu.edu/confluence/display/c/2+Rules') +printCertCInfo('4.sei-cert-c-coding-standard/03.rules/') print(' // Recommendations') -getCertCInfo('https://wiki.sei.cmu.edu/confluence/display/c/3+Recommendations') +printCertCInfo('4.sei-cert-c-coding-standard/08.recommendations/') print('};') print('') print('std::vector checkers::certCppInfo{') -getCertCInfo('https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046682') +printCertCInfo('5.sei-cert-cpp-coding-standard/3.rules/') print('};') print('') From e1053dba3b0988dc828d7a9c4b2a8f6c9866035b Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 3 Jun 2026 08:37:59 +0200 Subject: [PATCH 052/171] Add test for #11841 (#8621) Co-authored-by: chrchr-github --- test/testsymboldatabase.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index e981c8ea546..84681b00c85 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -430,6 +430,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(symboldatabase110); TEST_CASE(symboldatabase111); // [[fallthrough]] TEST_CASE(symboldatabase112); // explicit operator + TEST_CASE(symboldatabase113); TEST_CASE(createSymbolDatabaseFindAllScopes1); TEST_CASE(createSymbolDatabaseFindAllScopes2); @@ -5864,6 +5865,33 @@ class TestSymbolDatabase : public TestFixture { ASSERT(f && f->function() && f->function()->isExplicit()); } + void symboldatabase113() { // #11841 + GET_SYMBOL_DB("template \n" + "struct S {\n" + " S();\n" + " int& g() { return a; }\n" + " struct I;\n" + "private:\n" + " int a;\n" + "};\n" + "template <>\n" + "struct S::I{};\n"); + ASSERT(db->scopeList.size() == 4); + auto it = db->scopeList.begin(); + ++it; + ASSERT_EQUALS_ENUM(ScopeType::eStruct, it->type); + ASSERT_EQUALS("I", it->className); + ASSERT_EQUALS(0, it->varlist.size()); + ++it; + ASSERT_EQUALS_ENUM(ScopeType::eStruct, it->type); + ASSERT_EQUALS("S < int >", it->className); + ASSERT_EQUALS(1, it->varlist.size()); + ++it; + ASSERT_EQUALS_ENUM(ScopeType::eFunction, it->type); + ASSERT_EQUALS("g", it->className); + ASSERT_EQUALS(0, it->varlist.size()); + } + void createSymbolDatabaseFindAllScopes1() { GET_SYMBOL_DB("void f() { union {int x; char *p;} a={0}; }"); ASSERT(db->scopeList.size() == 3); From 49b8c2aade94ccb592411a7fd35a0aafe91d7914 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 3 Jun 2026 19:32:41 +0200 Subject: [PATCH 053/171] Add test for #12041 (#8626) --- test/testsimplifytypedef.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/testsimplifytypedef.cpp b/test/testsimplifytypedef.cpp index 022412139f1..84a95a81cfc 100644 --- a/test/testsimplifytypedef.cpp +++ b/test/testsimplifytypedef.cpp @@ -232,6 +232,7 @@ class TestSimplifyTypedef : public TestFixture { TEST_CASE(simplifyTypedef159); TEST_CASE(simplifyTypedef160); TEST_CASE(simplifyTypedef161); + TEST_CASE(simplifyTypedef162); TEST_CASE(simplifyTypedefFunction1); TEST_CASE(simplifyTypedefFunction2); // ticket #1685 @@ -3859,6 +3860,14 @@ class TestSimplifyTypedef : public TestFixture { TODO_ASSERT_EQUALS(exp2, cur2, tok(code2)); } + void simplifyTypedef162() { + const char code[] = "using std::vector;\n" // #12041 + "typedef vector ints;\n" + "void f(ints v);\n"; + const char exp[] = "void f ( std :: vector < int > v ) ;"; + ASSERT_EQUALS(exp, tok(code)); + } + void simplifyTypedefFunction1() { { const char code[] = "typedef void (*my_func)();\n" From 9f74c2db8bc800b1f1e612dd8cccf868725eaaf4 Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Thu, 4 Jun 2026 09:06:25 +0200 Subject: [PATCH 054/171] fix #14813 crash: recheck in gui sometimes crashes (#8628) --- gui/resultstree.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/resultstree.cpp b/gui/resultstree.cpp index c553855e99e..fc70fdb84af 100644 --- a/gui/resultstree.cpp +++ b/gui/resultstree.cpp @@ -427,8 +427,8 @@ void ResultsTree::clear(const QString &filename) if (stripped == fileItem->text() || filename == fileItem->errorItem->file0) { - mModel->removeRow(i); mErrorList.removeAll(fileItem->errorItem->toString()); + mModel->removeRow(i); break; } } @@ -445,8 +445,8 @@ void ResultsTree::clearRecheckFile(const QString &filename) QString storedfile = fileItem->getErrorPathItem().file; storedfile = ((!mCheckPath.isEmpty() && storedfile.startsWith(mCheckPath)) ? storedfile.mid(mCheckPath.length() + 1) : storedfile); if (actualfile == storedfile) { - mModel->removeRow(i); mErrorList.removeAll(fileItem->errorItem->toString()); + mModel->removeRow(i); break; } } From bb69f669438f9d243a2a12aec509b0431aae4fe4 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 4 Jun 2026 09:44:08 +0200 Subject: [PATCH 055/171] Fix #14772 FN returnDanglingLifetime for new expression (#8570) --- lib/checkautovariables.cpp | 7 +++++-- test/testautovariables.cpp | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index 0493f3ea459..b848928ebf4 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -614,8 +614,11 @@ void CheckAutoVariablesImpl::checkVarLifetimeScope(const Token * start, const To } } } - const bool escape = Token::simpleMatch(tok->astParent(), "throw") || - (Token::simpleMatch(tok->astParent(), "return") && !Function::returnsStandardType(scope->function)); + const Token* retThrow = tok->astParent(); + if (Token::simpleMatch(retThrow, "new")) + retThrow = retThrow->astParent(); + const bool escape = Token::simpleMatch(retThrow, "throw") || + (Token::simpleMatch(retThrow, "return") && !Function::returnsStandardType(scope->function)); std::unordered_set exprs; for (const ValueFlow::Value& val:tok->values()) { if (!val.isLocalLifetimeValue() && !val.isSubFunctionLifetimeValue()) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 47484d7023e..9fe3e126660 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -4062,6 +4062,14 @@ class TestAutoVariables : public TestFixture { " struct S s = { .i = 0, true };\n" "}\n"); // don't crash ASSERT_EQUALS("", errout_str()); + + check("struct A { int& r; };\n" // #14772 + "A* f() {\n" + " int x = 0;\n" + " return new A{ x };\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4:19] -> [test.cpp:3:9] -> [test.cpp:4:17]: (error) Returning object that points to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); } void danglingLifetimeInitList() { From 56d86d3fabb33f2d2ca392d008dcbb80301bd1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Thu, 4 Jun 2026 09:59:14 +0200 Subject: [PATCH 056/171] settings.h: forward declare `AddonInfo` (#8602) --- Makefile | 248 +++++++++++------------ gui/test/projectfile/testprojectfile.cpp | 1 + lib/settings.cpp | 1 + lib/settings.h | 2 +- oss-fuzz/Makefile | 88 ++++---- 5 files changed, 171 insertions(+), 169 deletions(-) diff --git a/Makefile b/Makefile index 0fc1d8e94e6..42b754733ec 100644 --- a/Makefile +++ b/Makefile @@ -483,13 +483,13 @@ check-nonneg: ###### Build -$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/valueflow.o: lib/valueflow.cpp lib/analyzer.h lib/astutils.h lib/calculate.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/forwardanalyzer.h lib/infer.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp -$(libcppdir)/tokenize.o: lib/tokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/tokenize.o: lib/tokenize.cpp externals/simplecpp/simplecpp.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenize.cpp -$(libcppdir)/symboldatabase.o: lib/symboldatabase.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/symboldatabase.o: lib/symboldatabase.cpp lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/symboldatabase.cpp $(libcppdir)/addoninfo.o: lib/addoninfo.cpp externals/picojson/picojson.h lib/addoninfo.h lib/config.h lib/json.h lib/path.h lib/standards.h lib/utils.h @@ -498,28 +498,28 @@ $(libcppdir)/addoninfo.o: lib/addoninfo.cpp externals/picojson/picojson.h lib/ad $(libcppdir)/analyzerinfo.o: lib/analyzerinfo.cpp externals/tinyxml2/tinyxml2.h lib/analyzerinfo.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/mathlib.h lib/path.h lib/platform.h lib/standards.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp -$(libcppdir)/astutils.o: lib/astutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/findtoken.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/astutils.o: lib/astutils.cpp lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/findtoken.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/astutils.cpp -$(libcppdir)/check64bit.o: lib/check64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/check64bit.o: lib/check64bit.cpp lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check64bit.cpp -$(libcppdir)/checkassert.o: lib/checkassert.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkassert.o: lib/checkassert.cpp lib/astutils.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkassert.cpp -$(libcppdir)/checkautovariables.o: lib/checkautovariables.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkautovariables.o: lib/checkautovariables.cpp lib/astutils.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkautovariables.cpp -$(libcppdir)/checkbool.o: lib/checkbool.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkbool.o: lib/checkbool.cpp lib/astutils.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbool.cpp -$(libcppdir)/checkbufferoverrun.o: lib/checkbufferoverrun.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkbufferoverrun.o: lib/checkbufferoverrun.cpp externals/tinyxml2/tinyxml2.h lib/astutils.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbufferoverrun.cpp -$(libcppdir)/checkclass.o: lib/checkclass.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkclass.o: lib/checkclass.cpp externals/tinyxml2/tinyxml2.h lib/astutils.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkclass.cpp -$(libcppdir)/checkcondition.o: lib/checkcondition.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkcondition.o: lib/checkcondition.cpp lib/astutils.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkcondition.cpp $(libcppdir)/checkers.o: lib/checkers.cpp lib/checkers.h lib/config.h @@ -531,61 +531,61 @@ $(libcppdir)/checkersidmapping.o: lib/checkersidmapping.cpp lib/checkers.h lib/c $(libcppdir)/checkersreport.o: lib/checkersreport.cpp lib/addoninfo.h lib/checkers.h lib/checkersreport.h lib/config.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersreport.cpp -$(libcppdir)/checkexceptionsafety.o: lib/checkexceptionsafety.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkexceptionsafety.o: lib/checkexceptionsafety.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkexceptionsafety.cpp -$(libcppdir)/checkfunctions.o: lib/checkfunctions.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkfunctions.o: lib/checkfunctions.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkfunctions.cpp -$(libcppdir)/checkimpl.o: lib/checkimpl.cpp lib/addoninfo.h lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkimpl.o: lib/checkimpl.cpp lib/checkers.h lib/checkimpl.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkimpl.cpp -$(libcppdir)/checkinternal.o: lib/checkinternal.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkinternal.o: lib/checkinternal.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkinternal.cpp -$(libcppdir)/checkio.o: lib/checkio.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkio.o: lib/checkio.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkio.cpp -$(libcppdir)/checkleakautovar.o: lib/checkleakautovar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkleakautovar.o: lib/checkleakautovar.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkleakautovar.cpp -$(libcppdir)/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkmemoryleak.cpp -$(libcppdir)/checknullpointer.o: lib/checknullpointer.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checknullpointer.o: lib/checknullpointer.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checknullpointer.cpp -$(libcppdir)/checkother.o: lib/checkother.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkother.o: lib/checkother.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkother.cpp -$(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp $(libcppdir)/checks.o: lib/checks.cpp lib/check.h lib/check64bit.h lib/checkassert.h lib/checkautovariables.h lib/checkbool.h lib/checkbufferoverrun.h lib/checkclass.h lib/checkcondition.h lib/checkexceptionsafety.h lib/checkfunctions.h lib/checkimpl.h lib/checkinternal.h lib/checkio.h lib/checkleakautovar.h lib/checkmemoryleak.h lib/checknullpointer.h lib/checkother.h lib/checkpostfixoperator.h lib/checks.h lib/checksizeof.h lib/checkstl.h lib/checkstring.h lib/checktype.h lib/checkuninitvar.h lib/checkunusedvar.h lib/checkvaarg.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/standards.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp -$(libcppdir)/checksizeof.o: lib/checksizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checksizeof.o: lib/checksizeof.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp -$(libcppdir)/checkstl.o: lib/checkstl.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkstl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/pathanalysis.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkstl.o: lib/checkstl.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkstl.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/pathanalysis.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstl.cpp -$(libcppdir)/checkstring.o: lib/checkstring.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkstring.o: lib/checkstring.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstring.cpp -$(libcppdir)/checktype.o: lib/checktype.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checktype.o: lib/checktype.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checktype.cpp -$(libcppdir)/checkuninitvar.o: lib/checkuninitvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkuninitvar.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkuninitvar.o: lib/checkuninitvar.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/checkuninitvar.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkuninitvar.cpp -$(libcppdir)/checkunusedfunctions.o: lib/checkunusedfunctions.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/astutils.h lib/checkers.h lib/checkunusedfunctions.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/checkunusedfunctions.o: lib/checkunusedfunctions.cpp externals/tinyxml2/tinyxml2.h lib/analyzerinfo.h lib/astutils.h lib/checkers.h lib/checkunusedfunctions.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedfunctions.cpp -$(libcppdir)/checkunusedvar.o: lib/checkunusedvar.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/checkunusedvar.o: lib/checkunusedvar.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedvar.cpp -$(libcppdir)/checkvaarg.o: lib/checkvaarg.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/checkvaarg.o: lib/checkvaarg.cpp lib/astutils.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkvaarg.cpp $(libcppdir)/clangimport.o: lib/clangimport.cpp lib/clangimport.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h @@ -600,7 +600,7 @@ $(libcppdir)/cppcheck.o: lib/cppcheck.cpp externals/picojson/picojson.h external $(libcppdir)/ctu.o: lib/ctu.cpp externals/tinyxml2/tinyxml2.h lib/astutils.h lib/check.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/ctu.cpp -$(libcppdir)/errorlogger.o: lib/errorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/errorlogger.o: lib/errorlogger.cpp externals/tinyxml2/tinyxml2.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/errorlogger.cpp $(libcppdir)/errortypes.o: lib/errortypes.cpp lib/config.h lib/errortypes.h lib/utils.h @@ -609,13 +609,13 @@ $(libcppdir)/errortypes.o: lib/errortypes.cpp lib/config.h lib/errortypes.h lib/ $(libcppdir)/findtoken.o: lib/findtoken.cpp lib/astutils.h lib/config.h lib/errortypes.h lib/findtoken.h lib/library.h lib/mathlib.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/findtoken.cpp -$(libcppdir)/forwardanalyzer.o: lib/forwardanalyzer.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/forwardanalyzer.o: lib/forwardanalyzer.cpp lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/forwardanalyzer.cpp -$(libcppdir)/fwdanalysis.o: lib/fwdanalysis.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h +$(libcppdir)/fwdanalysis.o: lib/fwdanalysis.cpp lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/fwdanalysis.cpp -$(libcppdir)/importproject.o: lib/importproject.cpp externals/picojson/picojson.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h +$(libcppdir)/importproject.o: lib/importproject.cpp externals/picojson/picojson.h externals/tinyxml2/tinyxml2.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/importproject.cpp $(libcppdir)/infer.o: lib/infer.cpp lib/calculate.h lib/config.h lib/errortypes.h lib/infer.h lib/mathlib.h lib/smallvector.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h @@ -642,19 +642,19 @@ $(libcppdir)/pathmatch.o: lib/pathmatch.cpp lib/config.h lib/path.h lib/pathmatc $(libcppdir)/platform.o: lib/platform.cpp externals/tinyxml2/tinyxml2.h lib/config.h lib/mathlib.h lib/path.h lib/platform.h lib/standards.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/platform.cpp -$(libcppdir)/preprocessor.o: lib/preprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +$(libcppdir)/preprocessor.o: lib/preprocessor.cpp externals/simplecpp/simplecpp.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/preprocessor.cpp -$(libcppdir)/programmemory.o: lib/programmemory.cpp lib/addoninfo.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/programmemory.o: lib/programmemory.cpp lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/programmemory.cpp $(libcppdir)/regex.o: lib/regex.cpp lib/config.h lib/regex.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/regex.cpp -$(libcppdir)/reverseanalyzer.o: lib/reverseanalyzer.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h +$(libcppdir)/reverseanalyzer.o: lib/reverseanalyzer.cpp lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/reverseanalyzer.cpp -$(libcppdir)/sarifreport.o: lib/sarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h +$(libcppdir)/sarifreport.o: lib/sarifreport.cpp externals/picojson/picojson.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/sarifreport.cpp $(libcppdir)/settings.o: lib/settings.cpp externals/picojson/picojson.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/rule.h lib/settings.h lib/standards.h lib/summaries.h lib/suppressions.h lib/utils.h lib/vfvalue.h @@ -663,49 +663,49 @@ $(libcppdir)/settings.o: lib/settings.cpp externals/picojson/picojson.h lib/addo $(libcppdir)/standards.o: lib/standards.cpp externals/simplecpp/simplecpp.h lib/config.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/standards.cpp -$(libcppdir)/summaries.o: lib/summaries.cpp lib/addoninfo.h lib/analyzerinfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/summaries.o: lib/summaries.cpp lib/analyzerinfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/summaries.cpp $(libcppdir)/suppressions.o: lib/suppressions.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/suppressions.cpp -$(libcppdir)/templatesimplifier.o: lib/templatesimplifier.cpp lib/addoninfo.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/templatesimplifier.o: lib/templatesimplifier.cpp lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/templatesimplifier.cpp $(libcppdir)/timer.o: lib/timer.cpp lib/config.h lib/timer.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/timer.cpp -$(libcppdir)/token.o: lib/token.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/valueflow.h lib/vfvalue.h +$(libcppdir)/token.o: lib/token.cpp externals/simplecpp/simplecpp.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/valueflow.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/token.cpp -$(libcppdir)/tokenlist.o: lib/tokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h +$(libcppdir)/tokenlist.o: lib/tokenlist.cpp externals/simplecpp/simplecpp.h lib/astutils.h lib/checkers.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/keywords.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenlist.cpp $(libcppdir)/utils.o: lib/utils.cpp lib/config.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/utils.cpp -$(libcppdir)/vf_analyzers.o: lib/vf_analyzers.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/vf_analyzers.o: lib/vf_analyzers.cpp lib/analyzer.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vf_analyzers.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_analyzers.cpp -$(libcppdir)/vf_common.o: lib/vf_common.cpp lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/vf_common.o: lib/vf_common.cpp lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_common.cpp -$(libcppdir)/vf_settokenvalue.o: lib/vf_settokenvalue.cpp lib/addoninfo.h lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h +$(libcppdir)/vf_settokenvalue.o: lib/vf_settokenvalue.cpp lib/astutils.h lib/calculate.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueflow.h lib/vf_common.h lib/vf_settokenvalue.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_settokenvalue.cpp $(libcppdir)/vfvalue.o: lib/vfvalue.cpp lib/config.h lib/errortypes.h lib/mathlib.h lib/smallvector.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vfvalue.cpp -frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h lib/checkers.h lib/config.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h +frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/checkers.h lib/config.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_FE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ frontend/frontend.cpp cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/rule.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp -cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h +cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp -cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +cli/executor.o: cli/executor.cpp cli/executor.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/executor.cpp cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/filesettings.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/standards.h lib/utils.h @@ -714,7 +714,7 @@ cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/filesetti cli/main.o: cli/main.cpp cli/cppcheckexecutor.h lib/config.h lib/filesettings.h lib/mathlib.h lib/path.h lib/platform.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/main.cpp -cli/processexecutor.o: cli/processexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h +cli/processexecutor.o: cli/processexecutor.cpp cli/executor.h cli/processexecutor.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/processexecutor.cpp cli/sehwrapper.o: cli/sehwrapper.cpp cli/sehwrapper.h lib/config.h lib/utils.h @@ -723,247 +723,247 @@ cli/sehwrapper.o: cli/sehwrapper.cpp cli/sehwrapper.h lib/config.h lib/utils.h cli/signalhandler.o: cli/signalhandler.cpp cli/signalhandler.h cli/stacktrace.h lib/config.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/signalhandler.cpp -cli/singleexecutor.o: cli/singleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h +cli/singleexecutor.o: cli/singleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/singleexecutor.cpp cli/stacktrace.o: cli/stacktrace.cpp cli/stacktrace.h lib/config.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/stacktrace.cpp -cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/threadexecutor.cpp -test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h +test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h test/options.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/fixture.cpp -test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/checkers.h lib/config.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/helpers.h +test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h externals/tinyxml2/tinyxml2.h lib/checkers.h lib/config.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/helpers.cpp -test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/main.cpp test/options.o: test/options.cpp lib/config.h lib/timer.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/options.cpp -test/test64bit.o: test/test64bit.cpp lib/addoninfo.h lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/test64bit.o: test/test64bit.cpp lib/check.h lib/check64bit.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/test64bit.cpp -test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testanalyzerinformation.o: test/testanalyzerinformation.cpp externals/tinyxml2/tinyxml2.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testanalyzerinformation.cpp -test/testassert.o: test/testassert.cpp lib/addoninfo.h lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testassert.o: test/testassert.cpp lib/check.h lib/checkassert.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testassert.cpp -test/testastutils.o: test/testastutils.cpp lib/addoninfo.h lib/astutils.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testastutils.o: test/testastutils.cpp lib/astutils.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testastutils.cpp -test/testautovariables.o: test/testautovariables.cpp lib/addoninfo.h lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testautovariables.o: test/testautovariables.cpp lib/check.h lib/checkautovariables.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testautovariables.cpp -test/testbool.o: test/testbool.cpp lib/addoninfo.h lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testbool.o: test/testbool.cpp lib/check.h lib/checkbool.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbool.cpp -test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/addoninfo.h lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testbufferoverrun.o: test/testbufferoverrun.cpp lib/check.h lib/checkbufferoverrun.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testbufferoverrun.cpp -test/testcharvar.o: test/testcharvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcharvar.o: test/testcharvar.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcharvar.cpp -test/testcheck.o: test/testcheck.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcheck.o: test/testcheck.cpp lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheck.cpp test/testcheckersreport.o: test/testcheckersreport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcheckersreport.cpp -test/testclangimport.o: test/testclangimport.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testclangimport.o: test/testclangimport.cpp lib/check.h lib/checkers.h lib/clangimport.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclangimport.cpp -test/testclass.o: test/testclass.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testclass.o: test/testclass.cpp lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testclass.cpp -test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/rule.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testcmdlineparser.o: test/testcmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/regex.h lib/rule.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcmdlineparser.cpp -test/testcolor.o: test/testcolor.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testcolor.o: test/testcolor.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcolor.cpp -test/testcondition.o: test/testcondition.cpp lib/addoninfo.h lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testcondition.o: test/testcondition.cpp lib/check.h lib/checkcondition.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcondition.cpp -test/testconstructors.o: test/testconstructors.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testconstructors.o: test/testconstructors.cpp lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testconstructors.cpp test/testcppcheck.o: test/testcppcheck.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testcppcheck.cpp -test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h +test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/xml.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testerrorlogger.cpp -test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/check.h lib/checkers.h lib/checkexceptionsafety.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexceptionsafety.cpp -test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testexecutor.o: test/testexecutor.cpp cli/executor.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexecutor.cpp -test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilelister.cpp -test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfilesettings.o: test/testfilesettings.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilesettings.cpp -test/testfrontend.o: test/testfrontend.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testfrontend.o: test/testfrontend.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfrontend.cpp -test/testfunctions.o: test/testfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testfunctions.o: test/testfunctions.cpp lib/check.h lib/checkers.h lib/checkfunctions.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfunctions.cpp -test/testgarbage.o: test/testgarbage.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testgarbage.o: test/testgarbage.cpp lib/check.h lib/checkers.h lib/checks.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testgarbage.cpp -test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h +test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testimportproject.cpp -test/testincompletestatement.o: test/testincompletestatement.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testincompletestatement.o: test/testincompletestatement.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testincompletestatement.cpp -test/testinternal.o: test/testinternal.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testinternal.o: test/testinternal.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkinternal.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testinternal.cpp -test/testio.o: test/testio.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testio.o: test/testio.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkio.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testio.cpp -test/testleakautovar.o: test/testleakautovar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testleakautovar.o: test/testleakautovar.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testleakautovar.cpp -test/testlibrary.o: test/testlibrary.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testlibrary.o: test/testlibrary.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testlibrary.cpp -test/testmathlib.o: test/testmathlib.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testmathlib.o: test/testmathlib.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmathlib.cpp -test/testmemleak.o: test/testmemleak.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testmemleak.o: test/testmemleak.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkmemoryleak.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testmemleak.cpp -test/testnullpointer.o: test/testnullpointer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testnullpointer.o: test/testnullpointer.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testnullpointer.cpp -test/testoptions.o: test/testoptions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h +test/testoptions.o: test/testoptions.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h test/options.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testoptions.cpp -test/testother.o: test/testother.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testother.o: test/testother.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testother.cpp -test/testpath.o: test/testpath.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpath.o: test/testpath.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpath.cpp -test/testpathmatch.o: test/testpathmatch.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testpathmatch.o: test/testpathmatch.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpathmatch.cpp -test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h +test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/xml.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testplatform.cpp -test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpostfixoperator.cpp -test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpreprocessor.cpp -test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprocessexecutor.cpp -test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testprogrammemory.o: test/testprogrammemory.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprogrammemory.cpp -test/testregex.o: test/testregex.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testregex.o: test/testregex.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testregex.cpp -test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsarifreport.cpp -test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsettings.o: test/testsettings.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsettings.cpp -test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytemplate.o: test/testsimplifytemplate.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytemplate.cpp -test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytokens.o: test/testsimplifytokens.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytokens.cpp -test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifytypedef.o: test/testsimplifytypedef.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytypedef.cpp -test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsimplifyusing.o: test/testsimplifyusing.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifyusing.cpp -test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testsingleexecutor.o: test/testsingleexecutor.cpp cli/executor.h cli/singleexecutor.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsingleexecutor.cpp -test/testsizeof.o: test/testsizeof.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsizeof.o: test/testsizeof.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checksizeof.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsizeof.cpp -test/teststandards.o: test/teststandards.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/teststandards.o: test/teststandards.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststandards.cpp -test/teststl.o: test/teststl.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststl.o: test/teststl.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststl.cpp -test/teststring.o: test/teststring.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/teststring.o: test/teststring.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststring.cpp -test/testsummaries.o: test/testsummaries.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testsummaries.o: test/testsummaries.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/summaries.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsummaries.cpp test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsuppressions.cpp -test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testsymboldatabase.o: test/testsymboldatabase.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsymboldatabase.cpp -test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h +test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testthreadexecutor.cpp -test/testtimer.o: test/testtimer.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h +test/testtimer.o: test/testtimer.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/timer.h lib/utils.h test/fixture.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtimer.cpp -test/testtoken.o: test/testtoken.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtoken.o: test/testtoken.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtoken.cpp -test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenize.cpp -test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenlist.o: test/testtokenlist.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenlist.cpp -test/testtokenrange.o: test/testtokenrange.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testtokenrange.o: test/testtokenrange.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/tokenrange.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtokenrange.cpp -test/testtype.o: test/testtype.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testtype.o: test/testtype.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checktype.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtype.cpp -test/testuninitvar.o: test/testuninitvar.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testuninitvar.o: test/testuninitvar.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testuninitvar.cpp -test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/check.h lib/checkers.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedfunctions.cpp -test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/addoninfo.h lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedprivfunc.o: test/testunusedprivfunc.cpp lib/check.h lib/checkclass.h lib/checkers.h lib/checkimpl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedprivfunc.cpp -test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedvar.cpp -test/testutils.o: test/testutils.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h +test/testutils.o: test/testutils.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testutils.cpp -test/testvaarg.o: test/testvaarg.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h +test/testvaarg.o: test/testvaarg.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvaarg.cpp -test/testvalueflow.o: test/testvalueflow.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvalueflow.o: test/testvalueflow.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvalueflow.cpp -test/testvarid.o: test/testvarid.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h +test/testvarid.o: test/testvarid.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvarid.cpp -test/testvfvalue.o: test/testvfvalue.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h +test/testvfvalue.o: test/testvfvalue.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h lib/vfvalue.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testvfvalue.cpp externals/simplecpp/simplecpp.o: externals/simplecpp/simplecpp.cpp externals/simplecpp/simplecpp.h diff --git a/gui/test/projectfile/testprojectfile.cpp b/gui/test/projectfile/testprojectfile.cpp index 3eaa2b10386..efc1dce6c4f 100644 --- a/gui/test/projectfile/testprojectfile.cpp +++ b/gui/test/projectfile/testprojectfile.cpp @@ -18,6 +18,7 @@ #include "testprojectfile.h" +#include "addoninfo.h" #include "library.h" #include "platform.h" #include "projectfile.h" diff --git a/lib/settings.cpp b/lib/settings.cpp index a9ba14dd72b..95d4c4e953b 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +#include "addoninfo.h" #include "config.h" #include "errortypes.h" #include "settings.h" diff --git a/lib/settings.h b/lib/settings.h index 80f3853bde6..04ddb9adb9a 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -21,7 +21,6 @@ #define settingsH //--------------------------------------------------------------------------- -#include "addoninfo.h" #include "config.h" #include "library.h" #include "platform.h" @@ -47,6 +46,7 @@ struct Rule; #endif struct Suppressions; +struct AddonInfo; namespace ValueFlow { class Value; } diff --git a/oss-fuzz/Makefile b/oss-fuzz/Makefile index 988b5cb901b..eeb795bd35c 100644 --- a/oss-fuzz/Makefile +++ b/oss-fuzz/Makefile @@ -153,13 +153,13 @@ simplecpp.o: ../externals/simplecpp/simplecpp.cpp ../externals/simplecpp/simplec tinyxml2.o: ../externals/tinyxml2/tinyxml2.cpp ../externals/tinyxml2/tinyxml2.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -w -D_LARGEFILE_SOURCE -c -o $@ ../externals/tinyxml2/tinyxml2.cpp -$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkuninitvar.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/programmemory.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/valueflow.o: ../lib/valueflow.cpp ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkuninitvar.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/forwardanalyzer.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/programmemory.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/valueflow.cpp -$(libcppdir)/tokenize.o: ../lib/tokenize.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/tokenize.o: ../lib/tokenize.cpp ../externals/simplecpp/simplecpp.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/timer.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenize.cpp -$(libcppdir)/symboldatabase.o: ../lib/symboldatabase.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/symboldatabase.o: ../lib/symboldatabase.cpp ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/symboldatabase.cpp $(libcppdir)/addoninfo.o: ../lib/addoninfo.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/config.h ../lib/json.h ../lib/path.h ../lib/standards.h ../lib/utils.h @@ -168,28 +168,28 @@ $(libcppdir)/addoninfo.o: ../lib/addoninfo.cpp ../externals/picojson/picojson.h $(libcppdir)/analyzerinfo.o: ../lib/analyzerinfo.cpp ../externals/tinyxml2/tinyxml2.h ../lib/analyzerinfo.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/standards.h ../lib/utils.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp -$(libcppdir)/astutils.o: ../lib/astutils.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/astutils.o: ../lib/astutils.cpp ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/astutils.cpp -$(libcppdir)/check64bit.o: ../lib/check64bit.cpp ../lib/addoninfo.h ../lib/check.h ../lib/check64bit.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/check64bit.o: ../lib/check64bit.cpp ../lib/check.h ../lib/check64bit.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/check64bit.cpp -$(libcppdir)/checkassert.o: ../lib/checkassert.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkassert.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkassert.o: ../lib/checkassert.cpp ../lib/astutils.h ../lib/check.h ../lib/checkassert.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkassert.cpp -$(libcppdir)/checkautovariables.o: ../lib/checkautovariables.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkautovariables.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkautovariables.o: ../lib/checkautovariables.cpp ../lib/astutils.h ../lib/check.h ../lib/checkautovariables.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkautovariables.cpp -$(libcppdir)/checkbool.o: ../lib/checkbool.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbool.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkbool.o: ../lib/checkbool.cpp ../lib/astutils.h ../lib/check.h ../lib/checkbool.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbool.cpp -$(libcppdir)/checkbufferoverrun.o: ../lib/checkbufferoverrun.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkbufferoverrun.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkbufferoverrun.o: ../lib/checkbufferoverrun.cpp ../externals/tinyxml2/tinyxml2.h ../lib/astutils.h ../lib/check.h ../lib/checkbufferoverrun.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkbufferoverrun.cpp -$(libcppdir)/checkclass.o: ../lib/checkclass.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkclass.o: ../lib/checkclass.cpp ../externals/tinyxml2/tinyxml2.h ../lib/astutils.h ../lib/check.h ../lib/checkclass.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkclass.cpp -$(libcppdir)/checkcondition.o: ../lib/checkcondition.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkcondition.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkcondition.o: ../lib/checkcondition.cpp ../lib/astutils.h ../lib/check.h ../lib/checkcondition.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkcondition.cpp $(libcppdir)/checkers.o: ../lib/checkers.cpp ../lib/checkers.h ../lib/config.h @@ -201,61 +201,61 @@ $(libcppdir)/checkersidmapping.o: ../lib/checkersidmapping.cpp ../lib/checkers.h $(libcppdir)/checkersreport.o: ../lib/checkersreport.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkersreport.h ../lib/config.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/standards.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkersreport.cpp -$(libcppdir)/checkexceptionsafety.o: ../lib/checkexceptionsafety.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkexceptionsafety.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkexceptionsafety.o: ../lib/checkexceptionsafety.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkexceptionsafety.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkexceptionsafety.cpp -$(libcppdir)/checkfunctions.o: ../lib/checkfunctions.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkfunctions.o: ../lib/checkfunctions.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkfunctions.cpp -$(libcppdir)/checkimpl.o: ../lib/checkimpl.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkimpl.o: ../lib/checkimpl.cpp ../lib/checkers.h ../lib/checkimpl.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkimpl.cpp -$(libcppdir)/checkinternal.o: ../lib/checkinternal.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkinternal.o: ../lib/checkinternal.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkinternal.cpp -$(libcppdir)/checkio.o: ../lib/checkio.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkio.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkio.o: ../lib/checkio.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkio.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkio.cpp -$(libcppdir)/checkleakautovar.o: ../lib/checkleakautovar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkleakautovar.o: ../lib/checkleakautovar.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkleakautovar.cpp -$(libcppdir)/checkmemoryleak.o: ../lib/checkmemoryleak.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkmemoryleak.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkmemoryleak.o: ../lib/checkmemoryleak.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkmemoryleak.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkmemoryleak.cpp -$(libcppdir)/checknullpointer.o: ../lib/checknullpointer.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checknullpointer.o: ../lib/checknullpointer.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checknullpointer.cpp -$(libcppdir)/checkother.o: ../lib/checkother.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkother.o: ../lib/checkother.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkother.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkother.cpp -$(libcppdir)/checkpostfixoperator.o: ../lib/checkpostfixoperator.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkpostfixoperator.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkpostfixoperator.o: ../lib/checkpostfixoperator.cpp ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkpostfixoperator.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkpostfixoperator.cpp $(libcppdir)/checks.o: ../lib/checks.cpp ../lib/check.h ../lib/check64bit.h ../lib/checkassert.h ../lib/checkautovariables.h ../lib/checkbool.h ../lib/checkbufferoverrun.h ../lib/checkclass.h ../lib/checkcondition.h ../lib/checkexceptionsafety.h ../lib/checkfunctions.h ../lib/checkimpl.h ../lib/checkinternal.h ../lib/checkio.h ../lib/checkleakautovar.h ../lib/checkmemoryleak.h ../lib/checknullpointer.h ../lib/checkother.h ../lib/checkpostfixoperator.h ../lib/checks.h ../lib/checksizeof.h ../lib/checkstl.h ../lib/checkstring.h ../lib/checktype.h ../lib/checkuninitvar.h ../lib/checkunusedvar.h ../lib/checkvaarg.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/standards.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checks.cpp -$(libcppdir)/checksizeof.o: ../lib/checksizeof.cpp ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checksizeof.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checksizeof.o: ../lib/checksizeof.cpp ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checksizeof.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checksizeof.cpp -$(libcppdir)/checkstl.o: ../lib/checkstl.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkstl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/pathanalysis.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkstl.o: ../lib/checkstl.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkstl.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/pathanalysis.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstl.cpp -$(libcppdir)/checkstring.o: ../lib/checkstring.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkstring.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkstring.o: ../lib/checkstring.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkstring.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkstring.cpp -$(libcppdir)/checktype.o: ../lib/checktype.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checktype.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checktype.o: ../lib/checktype.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checktype.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checktype.cpp -$(libcppdir)/checkuninitvar.o: ../lib/checkuninitvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkuninitvar.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkuninitvar.o: ../lib/checkuninitvar.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checknullpointer.h ../lib/checkuninitvar.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkuninitvar.cpp -$(libcppdir)/checkunusedfunctions.o: ../lib/checkunusedfunctions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/astutils.h ../lib/checkers.h ../lib/checkunusedfunctions.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/checkunusedfunctions.o: ../lib/checkunusedfunctions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/analyzerinfo.h ../lib/astutils.h ../lib/checkers.h ../lib/checkunusedfunctions.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedfunctions.cpp -$(libcppdir)/checkunusedvar.o: ../lib/checkunusedvar.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkunusedvar.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/checkunusedvar.o: ../lib/checkunusedvar.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkunusedvar.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkunusedvar.cpp -$(libcppdir)/checkvaarg.o: ../lib/checkvaarg.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkvaarg.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/checkvaarg.o: ../lib/checkvaarg.cpp ../lib/astutils.h ../lib/check.h ../lib/checkers.h ../lib/checkimpl.h ../lib/checkvaarg.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/checkvaarg.cpp $(libcppdir)/clangimport.o: ../lib/clangimport.cpp ../lib/clangimport.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h @@ -270,7 +270,7 @@ $(libcppdir)/cppcheck.o: ../lib/cppcheck.cpp ../externals/picojson/picojson.h .. $(libcppdir)/ctu.o: ../lib/ctu.cpp ../externals/tinyxml2/tinyxml2.h ../lib/astutils.h ../lib/check.h ../lib/config.h ../lib/ctu.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/ctu.cpp -$(libcppdir)/errorlogger.o: ../lib/errorlogger.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/errorlogger.o: ../lib/errorlogger.cpp ../externals/tinyxml2/tinyxml2.h ../lib/check.h ../lib/checkers.h ../lib/color.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/errorlogger.cpp $(libcppdir)/errortypes.o: ../lib/errortypes.cpp ../lib/config.h ../lib/errortypes.h ../lib/utils.h @@ -279,13 +279,13 @@ $(libcppdir)/errortypes.o: ../lib/errortypes.cpp ../lib/config.h ../lib/errortyp $(libcppdir)/findtoken.o: ../lib/findtoken.cpp ../lib/astutils.h ../lib/config.h ../lib/errortypes.h ../lib/findtoken.h ../lib/library.h ../lib/mathlib.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/findtoken.cpp -$(libcppdir)/forwardanalyzer.o: ../lib/forwardanalyzer.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/forwardanalyzer.o: ../lib/forwardanalyzer.cpp ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/forwardanalyzer.cpp -$(libcppdir)/fwdanalysis.o: ../lib/fwdanalysis.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/fwdanalysis.o: ../lib/fwdanalysis.cpp ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/fwdanalysis.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/fwdanalysis.cpp -$(libcppdir)/importproject.o: ../lib/importproject.cpp ../externals/picojson/picojson.h ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/filesettings.h ../lib/importproject.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/pathmatch.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h +$(libcppdir)/importproject.o: ../lib/importproject.cpp ../externals/picojson/picojson.h ../externals/tinyxml2/tinyxml2.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/filesettings.h ../lib/importproject.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/pathmatch.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/importproject.cpp $(libcppdir)/infer.o: ../lib/infer.cpp ../lib/calculate.h ../lib/config.h ../lib/errortypes.h ../lib/infer.h ../lib/mathlib.h ../lib/smallvector.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h @@ -312,19 +312,19 @@ $(libcppdir)/pathmatch.o: ../lib/pathmatch.cpp ../lib/config.h ../lib/path.h ../ $(libcppdir)/platform.o: ../lib/platform.cpp ../externals/tinyxml2/tinyxml2.h ../lib/config.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/standards.h ../lib/utils.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/platform.cpp -$(libcppdir)/preprocessor.o: ../lib/preprocessor.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/settings.h ../lib/standards.h ../lib/suppressions.h ../lib/utils.h +$(libcppdir)/preprocessor.o: ../lib/preprocessor.cpp ../externals/simplecpp/simplecpp.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/preprocessor.h ../lib/settings.h ../lib/standards.h ../lib/suppressions.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/preprocessor.cpp -$(libcppdir)/programmemory.o: ../lib/programmemory.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/programmemory.o: ../lib/programmemory.cpp ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/infer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/programmemory.cpp $(libcppdir)/regex.o: ../lib/regex.cpp ../lib/config.h ../lib/regex.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/regex.cpp -$(libcppdir)/reverseanalyzer.o: ../lib/reverseanalyzer.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h +$(libcppdir)/reverseanalyzer.o: ../lib/reverseanalyzer.cpp ../lib/analyzer.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/forwardanalyzer.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/reverseanalyzer.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueptr.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/reverseanalyzer.cpp -$(libcppdir)/sarifreport.o: ../lib/sarifreport.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/check.h ../lib/checkers.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/sarifreport.h ../lib/settings.h ../lib/standards.h ../lib/utils.h +$(libcppdir)/sarifreport.o: ../lib/sarifreport.cpp ../externals/picojson/picojson.h ../lib/check.h ../lib/checkers.h ../lib/config.h ../lib/cppcheck.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/sarifreport.h ../lib/settings.h ../lib/standards.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/sarifreport.cpp $(libcppdir)/settings.o: ../lib/settings.cpp ../externals/picojson/picojson.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/json.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/rule.h ../lib/settings.h ../lib/standards.h ../lib/summaries.h ../lib/suppressions.h ../lib/utils.h ../lib/vfvalue.h @@ -333,34 +333,34 @@ $(libcppdir)/settings.o: ../lib/settings.cpp ../externals/picojson/picojson.h .. $(libcppdir)/standards.o: ../lib/standards.cpp ../externals/simplecpp/simplecpp.h ../lib/config.h ../lib/standards.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/standards.cpp -$(libcppdir)/summaries.o: ../lib/summaries.cpp ../lib/addoninfo.h ../lib/analyzerinfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/summaries.o: ../lib/summaries.cpp ../lib/analyzerinfo.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/summaries.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/summaries.cpp $(libcppdir)/suppressions.o: ../lib/suppressions.cpp ../externals/tinyxml2/tinyxml2.h ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/filesettings.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/pathmatch.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/suppressions.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h ../lib/xml.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/suppressions.cpp -$(libcppdir)/templatesimplifier.o: ../lib/templatesimplifier.cpp ../lib/addoninfo.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/templatesimplifier.o: ../lib/templatesimplifier.cpp ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenize.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/templatesimplifier.cpp $(libcppdir)/timer.o: ../lib/timer.cpp ../lib/config.h ../lib/timer.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/timer.cpp -$(libcppdir)/token.o: ../lib/token.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/tokenrange.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h +$(libcppdir)/token.o: ../lib/token.cpp ../externals/simplecpp/simplecpp.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/tokenrange.h ../lib/utils.h ../lib/valueflow.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/token.cpp -$(libcppdir)/tokenlist.o: ../lib/tokenlist.cpp ../externals/simplecpp/simplecpp.h ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h +$(libcppdir)/tokenlist.o: ../lib/tokenlist.cpp ../externals/simplecpp/simplecpp.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errorlogger.h ../lib/errortypes.h ../lib/keywords.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/standards.h ../lib/templatesimplifier.h ../lib/token.h ../lib/tokenlist.h ../lib/utils.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/tokenlist.cpp $(libcppdir)/utils.o: ../lib/utils.cpp ../lib/config.h ../lib/utils.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/utils.cpp -$(libcppdir)/vf_analyzers.o: ../lib/vf_analyzers.cpp ../lib/addoninfo.h ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/vf_analyzers.o: ../lib/vf_analyzers.cpp ../lib/analyzer.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/programmemory.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/valueptr.h ../lib/vf_analyzers.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_analyzers.cpp -$(libcppdir)/vf_common.o: ../lib/vf_common.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/vf_common.o: ../lib/vf_common.cpp ../lib/astutils.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/path.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_common.cpp -$(libcppdir)/vf_settokenvalue.o: ../lib/vf_settokenvalue.cpp ../lib/addoninfo.h ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h +$(libcppdir)/vf_settokenvalue.o: ../lib/vf_settokenvalue.cpp ../lib/astutils.h ../lib/calculate.h ../lib/checkers.h ../lib/config.h ../lib/errortypes.h ../lib/library.h ../lib/mathlib.h ../lib/platform.h ../lib/settings.h ../lib/smallvector.h ../lib/sourcelocation.h ../lib/standards.h ../lib/symboldatabase.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/valueflow.h ../lib/vf_common.h ../lib/vf_settokenvalue.h ../lib/vfvalue.h $(CXX) ${LIB_FUZZING_ENGINE} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/vf_settokenvalue.cpp $(libcppdir)/vfvalue.o: ../lib/vfvalue.cpp ../lib/config.h ../lib/errortypes.h ../lib/mathlib.h ../lib/smallvector.h ../lib/templatesimplifier.h ../lib/token.h ../lib/utils.h ../lib/vfvalue.h From 550189be664fa27e754df5eb8f182748e7dd56df Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Thu, 4 Jun 2026 10:26:32 +0200 Subject: [PATCH 057/171] fixed #14738 gui recheck file not working properly when importing compile_commands.json (#8625) --- gui/mainwindow.cpp | 11 +++++++++-- gui/mainwindow.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 15f3e8e0665..bf73828bed4 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -559,13 +559,20 @@ void MainWindow::saveSettings() const mUI->mResults->saveSettings(mSettings); } -void MainWindow::doAnalyzeProject(ImportProject p, const bool checkLib, const bool checkConfig) +void MainWindow::doAnalyzeProject(ImportProject p, const bool checkLib, const bool checkConfig, const QStringList& recheckFiles) { Settings checkSettings; auto supprs = std::make_shared(); if (!getCppcheckSettings(checkSettings, *supprs)) return; + // filter requested files + if (!recheckFiles.isEmpty()) { + p.fileSettings.remove_if([&](const FileSettings& fs) { + return !recheckFiles.contains(QString::fromStdString(fs.filename())); + }); + } + clearResults(); mIsLogfileLoaded = false; @@ -1958,7 +1965,7 @@ void MainWindow::analyzeProject(const ProjectFile *projectFile, const QStringLis msg.exec(); return; } - doAnalyzeProject(p, checkLib, checkConfig); // TODO: avoid copy + doAnalyzeProject(p, checkLib, checkConfig, recheckFiles); // TODO: avoid copy return; } diff --git a/gui/mainwindow.h b/gui/mainwindow.h index febd3a41d4c..c654a2c94f0 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -309,7 +309,7 @@ private slots: * @param checkLib Flag to indicate if library should be checked * @param checkConfig Flag to indicate if the configuration should be checked. */ - void doAnalyzeProject(ImportProject p, bool checkLib = false, bool checkConfig = false); + void doAnalyzeProject(ImportProject p, bool checkLib = false, bool checkConfig = false, const QStringList& recheckFiles = QStringList()); /** * @brief Analyze all files specified in parameter files From 0491f5911627315760adcda62217a2763b3d71bb Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Thu, 4 Jun 2026 10:37:08 +0200 Subject: [PATCH 058/171] Clear releasenotes [skip ci] (#8623) --- releasenotes.txt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/releasenotes.txt b/releasenotes.txt index 4fb45b90070..185f06390e3 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -1,14 +1,11 @@ -Release Notes for Cppcheck 2.21 +Release Notes for Cppcheck 2.22 Major bug fixes & crashes: - New checks: -- MISRA C 2012 rule 10.3 now warns on assigning integer literals 0 and 1 to bool in C99 and later while preserving the existing C89 behavior. -- funcArgNamesDifferentUnnamed warns on function declarations/definitions where a parameter in either location is unnamed -- uninitMemberVarNoCtor warns on user-defined types where (1) some but not all members requiring initialization have in-class initializers or (2) there is a mixture of members which do/do not require initialization. -- fcloseInLoopCondition warns when fclose() is used as a while loop condition, which may skip the loop body or double-close the file handle. +- C/C++ support: - @@ -23,9 +20,4 @@ Infrastructure & dependencies: - Other: -- Make it possible to specify the regular expression engine using the `engine` element in a rule XML. -- Added CLI option `--exitcode-suppress` to specify an error ID which should not result in a non-zero exitcode. -- Moved source code from https://github.com/danmar/cppcheck to https://github.com/cppcheck-opensource/cppcheck -- The official Windows binary is now built with Visual Studio 2026. -- Updated simplecpp to 1.7.0. - From 2285c1daf9e61ce9f27c16a62a362130c799422f Mon Sep 17 00:00:00 2001 From: Tomo Dote Date: Fri, 5 Jun 2026 05:02:53 +0900 Subject: [PATCH 059/171] Update Japanese translation for v2.21 (#8630) Update only Japanese translation - modified: gui/cppcheck_ja.ts --- gui/cppcheck_ja.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gui/cppcheck_ja.ts b/gui/cppcheck_ja.ts index b3252ec769d..a071727ad56 100644 --- a/gui/cppcheck_ja.ts +++ b/gui/cppcheck_ja.ts @@ -1732,17 +1732,17 @@ Options: Include file - + ć‚¤ćƒ³ć‚Æćƒ«ćƒ¼ćƒ‰ćƒ•ć‚”ć‚¤ćƒ« <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Force inclusion of a header file</span></p></body></html> - + <html><head/><body><p><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">ćƒ˜ćƒƒćƒ€ćƒ•ć‚”ć‚¤ćƒ«ć‚’å¼·åˆ¶ēš„ć«ć‚¤ćƒ³ć‚Æćƒ«ćƒ¼ćƒ‰ć—ć¾ć™</span></p></body></html> Browse.. - + ćƒ–ćƒ©ć‚¦ć‚ŗ.. @@ -2091,12 +2091,12 @@ Options: C/C++ header - + C/C++ć®ćƒ˜ćƒƒćƒ€ćƒ¼ Include file - + ćƒ•ć‚”ć‚¤ćƒ«ć®ć‚¤ćƒ³ć‚Æćƒ«ćƒ¼ćƒ‰ From 70af35891e33d2d077137910437e8f2626b0a08f Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Fri, 5 Jun 2026 12:57:55 +0200 Subject: [PATCH 060/171] createrelease: tweaks [skip ci] (#8635) --- createrelease | 93 ++++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 41 deletions(-) diff --git a/createrelease b/createrelease index de85d64395b..6a611a5a469 100755 --- a/createrelease +++ b/createrelease @@ -1,6 +1,6 @@ #!/bin/bash # -# A script for creating release packages. The release packages are create in the home directory. +# A script for creating release packages. The release packages are created in the home directory. # # Create release candidate # ======================== @@ -8,15 +8,22 @@ # Review trac roadmap, are tickets closed properly? # Only tickets that should be retargeted should be open. # -# update cppcheck used in premium addon CI -# create jira issue "CI: update cppcheck binary" -# cd ~/cppchecksolutions/addon/tools && python3 ci-update-cppcheck.py +# Versioning scheme +# ======================== +# VERSION=2.22.0 # the new release tag created +# PREV=2.21.0 # the previous release +# BRANCH=2.22.x # release branch +# +# 2.22.x BRANCH - release branch +# 2.22.0 TAG - the release +# 2.22.1, ... TAG - patch releases +# 2.22.0-rc1 TAG - release candidate # -# update mappings.. +# Update mappings: # cd ~/cppchecksolutions/addon/coverage # CPPCHECK_REPO=~/cppchecksolutions/cppcheck python3 coverage.py --code # -# check every isPremiumEnabled call: TODO write helper script +# Check every isPremiumEnabled call: TODO write helper script # - every id should be in --errorlist # git grep 'isPremiumEnabled[(]"' | sed 's/.*isPremiumEnabled[(]"//' | sed 's/".*//' | sort | uniq > ids1.txt # ./cppcheck --errorlist | grep ' id="' | sed 's/.* id="//' | sed 's/".*//' | sort | uniq > ids2.txt @@ -29,93 +36,97 @@ # - ensure latest build was successful # - ensure cfg files etc are included (win_installer/cppcheck.wxs) # -# self check, fix critical issues: +# Self check, fix critical issues: # make clean && make CXXOPTS=-O2 MATCHCOMPILER=yes -j4 # ./cppcheck -D__CPPCHECK__ -D__GNUC__ -DCHECK_INTERNAL -DHAVE_RULES --std=c++11 --library=cppcheck-lib --library=qt --enable=style --inconclusive --inline-suppr --suppress=bitwiseOnBoolean --suppress=shadowFunction --suppress=useStlAlgorithm --suppress=*:externals/picojson.h --suppress=functionConst --suppress=functionStatic --suppress=normalCheckLevelMaxBranches --xml cli gui/*.cpp lib 2> selfcheck.xml # -# Generate lib/checkers.cpp (TODO the premium checkers should not be statically coded) +# Generate lib/checkers.cpp: (TODO the premium checkers should not be statically coded) # cd ~/cppchecksolutions/cppcheck && python3 tools/get_checkers.py > lib/checkers.cpp # -# Update copyright year TODO release script -# git diff 2.8 -- */*.cpp */*.h | grep '^diff --git a/' | sed 's|.* b/||' | xargs sed -i 's/Copyright (C) 2007-20[12]./Copyright (C) 2007-2022/' +# Update copyright year: TODO release script +# git diff $PREV -- */*.cpp */*.h | grep '^diff --git a/' | sed 's|.* b/||' | xargs sed -i "s/Copyright (C) 2007-20[12]./Copyright (C) 2007-$(date +%Y)/" # git diff | grep '^diff --git a/' # # Make sure "cppcheck --errorlist" works: # make clean && make -j4 && ./cppcheck --errorlist > errlist.xml && xmllint --noout errlist.xml # # Update AUTHORS using output from: -# git log --format='%aN' 2.7..HEAD | sort -u > AUTHORS2 && diff -y AUTHORS AUTHORS2 | less +# git log --format='%aN' $PREV..HEAD | sort -u > AUTHORS2 && diff -y AUTHORS AUTHORS2 | less +# Include github usernames in PR title and commit message # -# Update GUI translations -# lupdate gui.pro +# Update GUI translations: +# cd ~/cppchecksolutions/cppcheck/gui && lupdate gui.pro # -# Create 2.18.x branch -# git checkout -b 2.18.x ; git push -u origin 2.18.x +# Create new release branch: +# git checkout -b $BRANCH && git push -u origin $BRANCH # in fork: -# * add upstream: git remote add upstream git@github.com:/cppcheck-opensource//cppcheck.git -# * add branch: git fetch upstream 2.19.x +# * add upstream: git remote add upstream git@github.com:cppcheck-opensource/cppcheck.git +# * add branch: git fetch upstream $BRANCH # # Release notes: # - ensure safety critical issues are listed properly # - empty the releasenotes.txt in main branch # # Update version numbers in: -# python3 tools/release-set-version.py 2.19.0 +# python3 tools/release-set-version.py $VERSION # Verify: # grep '\.99' */*.[ch]* && grep '[0-9][0-9] dev' */*.[ch]* # egrep "2\.[0-9]+" */*.h */*.cpp man/*.md | grep -v "test/test" | less -# git commit -a -m "2.8: Set versions" +# git commit -a -m "$VERSION: Set versions" # # Build and test the windows installer # # Update the Makefile: # make dmake && ./dmake --release -# git commit -a -m "2.8: Updated Makefile" +# git commit -a -m "$VERSION: Updated Makefile" +# +# Push changes: +# git push # # Ensure that CI is happy # # Tag: -# git tag 2.8-rc1 +# git tag $VERSION-rc1 # git push --tags # # Release -# ======= +# ======================== # # Remove "-rc1" from versions. Test: git grep "\-rc[0-9]" # # Create a release folder on sourceforge: # https://sourceforge.net/projects/cppcheck/files/cppcheck/ # -# git tag 2.8 ; git push --tags -# ./createrelease 2.8 +# git tag $VERSION && git push --tags +# ./createrelease $VERSION # -# copy msi from release-windows, install and test cppcheck -# copy manual from build-manual +# Copy msi from release-windows, install and test cppcheck +# Copy manual from build-manual # # Update download link on index.php main page # # Trac: -# 1. Create ticket "2.18 safety cosmetic changes" -# git log --format=oneline 2.17.0..HEAD | egrep -v "^[0-9a-f]*[ ][ ]*([Ff]ix|fixed|Fixup|Fixes|refs)?[ ]*#*[0-9]+" +# 1. Create ticket "$VERSION safety cosmetic changes" +# git log --format=oneline $PREV..HEAD | egrep -v "^[0-9a-f]*[ ][ ]*([Ff]ix|fixed|Fixup|Fixes|refs)?[ ]*#*[0-9]+" # 2. Check priorities for all tickets in milestone. Should be: safety-* # 3. Create new milestone # 4. Close old milestone # -# write a news +# Write a news # -# save "cppcheck --doc" output on wiki +# Save "cppcheck --doc" output on wiki # -# compile new democlient: +# Compile new democlient: # ssh -t danielmarjamaki,cppcheck@shell.sourceforge.net create # ./build-cppcheck.sh # -# create a ticket with data from http://cppcheck1.osuosl.org:8000/time_gt.html for performance tracking +# Create a ticket with data from http://cppcheck1.osuosl.org:8000/time_gt.html for performance tracking # (example: https://trac.cppcheck.net/ticket/13715) # - type: defect # - component: Performance -# - summary: [meta] performance regressions in 2.x +# - summary: [meta] performance regressions in $VERSION # -# run daca with new release +# Run daca with new release: # 1. edit tools/donate-cpu-server.py. Update OLD_VERSION and SERVER_VERSION # 2. scp -i ~/.ssh/osuosl_id_rsa tools/donate-cpu-server.py danielmarjamaki@cppcheck1.osuosl.org:/var/daca@home/ # @@ -123,14 +134,14 @@ # * trac: cd /var && nice tar -cJf ~/trac.tar.xz trac-cppcheck/db/trac.db # * daca: cd /var && nice tar -cJf ~/daca.tar.xz daca@home # * git: git checkout -f && git checkout main && git pull && tar -cJf git.tar.xz .git -# * git log 2.16.0..2.17.0 > Changelog -# * mkdir out && python3 ~/cppchecksolutions/release/getWorkflowAndIssueLogs.py -r /cppcheck-opensource//cppcheck -t 2.15.0 -p out +# * git log $PREV..$VERSION > Changelog +# * mkdir out && python3 ~/cppchecksolutions/release/getWorkflowAndIssueLogs.py -r /cppcheck-opensource//cppcheck -t $VERSION -p out -# Folder/tag to use -folder=$1 -tag=$folder.0 +# Folder/tag to use: +tag=$1 +folder=${tag%.*} -# Name of release +# Name of release: releasename=cppcheck-$tag set -e @@ -162,7 +173,7 @@ scp htdocs/* danielmarjamaki,cppcheck@web.sourceforge.net:htdocs/ cd .. rm -rf upload -# Local cppcheck binary +# Local cppcheck binary: mkdir -p ~/.cppcheck/$tag cd ~/.cppcheck/$tag cp -R ~/cppcheck/cfg . From 117bdff20d2355c669b8bb56dd53db7b90d5dc48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 5 Jun 2026 16:55:36 +0200 Subject: [PATCH 061/171] bumped version to 2.21.99/2.22 (#8633) --- CMakeLists.txt | 2 +- cli/main.cpp | 2 +- lib/version.h | 4 ++-- man/manual.md | 2 +- man/reference-cfg-format.md | 2 +- man/writing-addons.md | 2 +- win_installer/productInfo.wxi | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c037a10b36..b5857a8413a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.22) -project(Cppcheck VERSION 2.20.99 LANGUAGES CXX) +project(Cppcheck VERSION 2.21.99 LANGUAGES CXX) include(cmake/options.cmake) diff --git a/cli/main.cpp b/cli/main.cpp index 9bea4336c84..d1a635e1f6f 100644 --- a/cli/main.cpp +++ b/cli/main.cpp @@ -20,7 +20,7 @@ /** * * @mainpage Cppcheck - * @version 2.20.99 + * @version 2.21.99 * * @section overview_sec Overview * Cppcheck is a simple tool for static analysis of C/C++ code. diff --git a/lib/version.h b/lib/version.h index 2a64885ffa8..6d25dd4c158 100644 --- a/lib/version.h +++ b/lib/version.h @@ -20,8 +20,8 @@ #ifndef versionH #define versionH -#define CPPCHECK_VERSION_STRING "2.21 dev" -#define CPPCHECK_VERSION 2,20,99,0 +#define CPPCHECK_VERSION_STRING "2.22 dev" +#define CPPCHECK_VERSION 2,21,99,0 #define LEGALCOPYRIGHT L"Copyright (C) 2007-2026 Cppcheck team." diff --git a/man/manual.md b/man/manual.md index 8d8d5b22350..47a3a43fd36 100644 --- a/man/manual.md +++ b/man/manual.md @@ -1,6 +1,6 @@ --- title: Cppcheck manual -subtitle: Version 2.21 dev +subtitle: Version 2.22 dev author: Cppcheck team lang: en documentclass: report diff --git a/man/reference-cfg-format.md b/man/reference-cfg-format.md index 3067d0a8f2c..f426057ab47 100644 --- a/man/reference-cfg-format.md +++ b/man/reference-cfg-format.md @@ -1,6 +1,6 @@ --- title: Cppcheck .cfg format -subtitle: Version 2.21 dev +subtitle: Version 2.22 dev author: Cppcheck team lang: en documentclass: report diff --git a/man/writing-addons.md b/man/writing-addons.md index e593c2e9cce..2627671fa87 100644 --- a/man/writing-addons.md +++ b/man/writing-addons.md @@ -1,6 +1,6 @@ --- title: Writing addons -subtitle: Version 2.21 dev +subtitle: Version 2.22 dev author: Cppcheck team lang: en documentclass: report diff --git a/win_installer/productInfo.wxi b/win_installer/productInfo.wxi index f89e956dbb8..85e73ea3ca2 100644 --- a/win_installer/productInfo.wxi +++ b/win_installer/productInfo.wxi @@ -1,8 +1,8 @@ - + - + From 707f262560ac3be5136a0e6e9cf62b388fd6d946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 5 Jun 2026 16:56:00 +0200 Subject: [PATCH 062/171] daca: update OLD_VERSION (#8631) --- tools/donate-cpu-server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py index 6f44ea679a7..63a55f5b338 100755 --- a/tools/donate-cpu-server.py +++ b/tools/donate-cpu-server.py @@ -26,10 +26,10 @@ # Version scheme (MAJOR.MINOR.PATCH) should orientate on "Semantic Versioning" https://semver.org/ # Every change in this script should result in increasing the version number accordingly (exceptions may be cosmetic # changes) -SERVER_VERSION = "1.3.68" +SERVER_VERSION = "1.3.69" # TODO: fetch from GitHub tags -OLD_VERSION = '2.20.0' +OLD_VERSION = '2.21.0' HEAD_MARKER = 'head results:' INFO_MARKER = 'info messages:' From fdbb42c76083d717b9b1206ec368c7f0431fb12a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Mon, 8 Jun 2026 08:35:56 +0200 Subject: [PATCH 063/171] removed unnecessary friend declarations from checks (#8613) --- lib/check64bit.h | 2 -- lib/checkclass.h | 4 ---- lib/checkio.h | 2 -- lib/checkmemoryleak.h | 8 -------- lib/checknullpointer.h | 2 -- lib/checkother.h | 4 ---- lib/checkpostfixoperator.h | 2 -- lib/checkuninitvar.h | 2 -- lib/checkunusedvar.h | 2 -- 9 files changed, 28 deletions(-) diff --git a/lib/check64bit.h b/lib/check64bit.h index 4354d2217ba..cab82cf1148 100644 --- a/lib/check64bit.h +++ b/lib/check64bit.h @@ -41,8 +41,6 @@ class Tokenizer; */ class CPPCHECKLIB Check64BitPortability : public Check { - friend class Test64BitPortability; - public: /** This constructor is used when registering the Check64BitPortability */ Check64BitPortability() : Check("64-bit portability") {} diff --git a/lib/checkclass.h b/lib/checkclass.h index a5d20432351..2573d99f2f5 100644 --- a/lib/checkclass.h +++ b/lib/checkclass.h @@ -49,10 +49,6 @@ enum class FunctionType : std::uint8_t; /** @brief %Check classes. Uninitialized member variables, non-conforming operators, missing virtual destructor, etc */ class CPPCHECKLIB CheckClass : public Check { - friend class TestClass; - friend class TestConstructors; - friend class TestUnusedPrivateFunction; - public: /** @brief This constructor is used when registering the CheckClass */ CheckClass() : Check("Class") {} diff --git a/lib/checkio.h b/lib/checkio.h index 6fb3c9f80c2..9f125e6bd7b 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -42,8 +42,6 @@ enum class Severity : std::uint8_t; /** @brief %Check input output operations. */ class CPPCHECKLIB CheckIO : public Check { - friend class TestIO; - public: /** @brief This constructor is used when registering CheckIO */ CheckIO() : Check("IO using format string") {} diff --git a/lib/checkmemoryleak.h b/lib/checkmemoryleak.h index 037363160de..fdb7748f9ed 100644 --- a/lib/checkmemoryleak.h +++ b/lib/checkmemoryleak.h @@ -65,8 +65,6 @@ enum class Severity : std::uint8_t; */ class CPPCHECKLIB CheckMemoryLeakInFunction : public Check { - friend class TestMemleakInFunction; - public: /** @brief This constructor is used when registering this class */ CheckMemoryLeakInFunction() : Check("Memory leaks (function variables)") {} @@ -92,8 +90,6 @@ class CPPCHECKLIB CheckMemoryLeakInFunction : public Check { */ class CPPCHECKLIB CheckMemoryLeakInClass : public Check { - friend class TestMemleakInClass; - public: CheckMemoryLeakInClass() : Check("Memory leaks (class variables)") {} @@ -112,8 +108,6 @@ class CPPCHECKLIB CheckMemoryLeakInClass : public Check { /** @brief detect simple memory leaks for struct members */ class CPPCHECKLIB CheckMemoryLeakStructMember : public Check { - friend class TestMemleakStructMember; - public: CheckMemoryLeakStructMember() : Check("Memory leaks (struct members)") {} @@ -132,8 +126,6 @@ class CPPCHECKLIB CheckMemoryLeakStructMember : public Check { /** @brief detect simple memory leaks (address not taken) */ class CPPCHECKLIB CheckMemoryLeakNoVar : public Check { - friend class TestMemleakNoVar; - public: CheckMemoryLeakNoVar() : Check("Memory leaks (address not taken)") {} diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index d0bc44899a9..bc494dad70f 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -48,8 +48,6 @@ namespace ValueFlow /** @brief check for null pointer dereferencing */ class CPPCHECKLIB CheckNullPointer : public Check { - friend class TestNullPointer; - public: /** @brief This constructor is used when registering the CheckNullPointer */ CheckNullPointer() : Check("Null pointer") {} diff --git a/lib/checkother.h b/lib/checkother.h index 58a61ff772a..7f21ffc00f8 100644 --- a/lib/checkother.h +++ b/lib/checkother.h @@ -50,10 +50,6 @@ struct UnionMember; /** @brief Various small checks */ class CPPCHECKLIB CheckOther : public Check { - friend class TestCharVar; - friend class TestIncompleteStatement; - friend class TestOther; - public: /** @brief This constructor is used when registering the CheckClass */ CheckOther() : Check("Other") {} diff --git a/lib/checkpostfixoperator.h b/lib/checkpostfixoperator.h index ac1a053afe8..5898cefcc3c 100644 --- a/lib/checkpostfixoperator.h +++ b/lib/checkpostfixoperator.h @@ -41,8 +41,6 @@ class Tokenizer; */ class CPPCHECKLIB CheckPostfixOperator : public Check { - friend class TestPostfixOperator; - public: /** This constructor is used when registering the CheckPostfixOperator */ CheckPostfixOperator() : Check("Using postfix operators") {} diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index 47d9061be18..a9156adfe36 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -58,8 +58,6 @@ struct VariableValue { /** @brief Checking for uninitialized variables */ class CPPCHECKLIB CheckUninitVar : public Check { - friend class TestUninitVar; - public: /** @brief This constructor is used when registering the CheckUninitVar */ CheckUninitVar() : Check("Uninitialized variables") {} diff --git a/lib/checkunusedvar.h b/lib/checkunusedvar.h index 693d3213869..2239b4a60d8 100644 --- a/lib/checkunusedvar.h +++ b/lib/checkunusedvar.h @@ -43,8 +43,6 @@ class Tokenizer; /** @brief Various small checks */ class CPPCHECKLIB CheckUnusedVar : public Check { - friend class TestUnusedVar; - public: /** @brief This constructor is used when registering the CheckClass */ CheckUnusedVar() : Check("UnusedVar") {} From 22b3464e06086b68a31ed4200054834191c0b528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Mon, 8 Jun 2026 08:40:06 +0200 Subject: [PATCH 064/171] constified more pointers in containers (#8615) --- lib/clangimport.cpp | 2 +- lib/symboldatabase.cpp | 8 ++++---- lib/templatesimplifier.cpp | 4 ++-- lib/templatesimplifier.h | 8 ++++---- lib/tokenize.cpp | 20 ++++++++++---------- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index c96a678347a..417e94e8798 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -303,7 +303,7 @@ namespace clangimport { } // "}" tokens that are not end-of-scope - std::set mNotScope; + std::set mNotScope; std::map scopeAccessControl; private: diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index dda3e9b1e0b..4b923a328ca 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -175,9 +175,9 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() // Store current access in each scope (depends on evaluation progress) std::map access; - std::map> forwardDecls; + std::map> forwardDecls; - const std::function findForwardDeclScope = [&](const Token *tok, Scope *startScope) { + const std::function findForwardDeclScope = [&](const Token *tok, const Scope *startScope) { if (tok->str() == "::") return findForwardDeclScope(tok->next(), &scopeList.front()); @@ -187,14 +187,14 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() }); if (it == startScope->nestedList.cend()) - return static_cast(nullptr); + return static_cast(nullptr); return findForwardDeclScope(tok->tokAt(2), *it); } auto it = forwardDecls.find(startScope); if (it == forwardDecls.cend()) - return static_cast(nullptr); + return static_cast(nullptr); return it->second.count(tok->str()) > 0 ? startScope : nullptr; }; diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 1fe1df10037..9c8c8fdde9a 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -623,7 +623,7 @@ void TemplateSimplifier::deleteToken(Token *tok) tok->deleteThis(); } -static void invalidateForwardDecls(const Token* beg, const Token* end, std::map* forwardDecls) { +static void invalidateForwardDecls(const Token* beg, const Token* end, std::map* forwardDecls) { if (!forwardDecls) return; for (auto& fwd : *forwardDecls) { @@ -635,7 +635,7 @@ static void invalidateForwardDecls(const Token* beg, const Token* end, std::map< } } -bool TemplateSimplifier::removeTemplate(Token *tok, std::map* forwardDecls) +bool TemplateSimplifier::removeTemplate(Token *tok, std::map* forwardDecls) { if (!Token::simpleMatch(tok, "template <")) return false; diff --git a/lib/templatesimplifier.h b/lib/templatesimplifier.h index f6e507459a9..3c5fed3ea1c 100644 --- a/lib/templatesimplifier.h +++ b/lib/templatesimplifier.h @@ -463,7 +463,7 @@ class CPPCHECKLIB TemplateSimplifier { /** * Remove a specific "template < ..." template class/function */ - static bool removeTemplate(Token *tok, std::map* forwardDecls = nullptr); + static bool removeTemplate(Token *tok, std::map* forwardDecls = nullptr); /** Syntax error * @throws InternalError thrown unconditionally @@ -512,9 +512,9 @@ class CPPCHECKLIB TemplateSimplifier { std::list mTemplateDeclarations; std::list mTemplateForwardDeclarations; - std::map mTemplateForwardDeclarationsMap; - std::map mTemplateSpecializationMap; - std::map mTemplatePartialSpecializationMap; + std::map mTemplateForwardDeclarationsMap; + std::map mTemplateSpecializationMap; + std::map mTemplatePartialSpecializationMap; std::list mTemplateInstantiations; std::list mInstantiatedTemplates; std::list mMemberFunctionsToDelete; diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 6305e0f021a..c5b001f5d32 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -549,9 +549,9 @@ namespace { private: Token* mTypedefToken; // The "typedef" token Token* mEndToken{nullptr}; // Semicolon - std::pair mRangeType; - std::pair mRangeTypeQualifiers; - std::pair mRangeAfterVar; + std::pair mRangeType; + std::pair mRangeTypeQualifiers; + std::pair mRangeAfterVar; Token* mNameToken{nullptr}; bool mFail = false; bool mReplaceFailed = false; @@ -565,13 +565,13 @@ namespace { // TODO handle unnamed structs etc if (Token::Match(start, "const| enum|struct|union|class %name%| {")) { - const std::pair rangeBefore(start, Token::findsimplematch(start, "{")); + const std::pair rangeBefore(start, Token::findsimplematch(start, "{")); // find typedef name token Token* nameToken = rangeBefore.second->link()->next(); while (Token::Match(nameToken, "%name%|* %name%|*")) nameToken = nameToken->next(); - const std::pair rangeQualifiers(rangeBefore.second->link()->next(), nameToken); + const std::pair rangeQualifiers(rangeBefore.second->link()->next(), nameToken); if (Token::Match(nameToken, "%name% ;")) { if (Token::Match(rangeBefore.second->previous(), "enum|struct|union|class {")) @@ -723,7 +723,7 @@ namespace { // Special handling of function pointer cast if (isFunctionPointer && isCast(tok->previous())) { tok->insertToken("*"); - Token* const tok_1 = insertTokens(tok, std::pair(mRangeType.first, mNameToken->linkAt(1))); + Token* const tok_1 = insertTokens(tok, std::pair(mRangeType.first, mNameToken->linkAt(1))); tok_1->originalName(originalname); tok->deleteThis(); return; @@ -998,7 +998,7 @@ namespace { return false; } - static Token* insertTokens(Token* to, std::pair range) { + static Token* insertTokens(Token* to, std::pair range) { for (const Token* from = range.first; from != range.second; from = from->next()) { to->insertToken(from->str()); to->next()->column(to->column()); @@ -5537,7 +5537,7 @@ void Tokenizer::createLinks2() bool isStruct = false; std::stack type; - std::stack templateTokens; + std::stack templateTokens; for (Token *token = list.front(); token; token = token->next()) { if (Token::Match(token, "%name%|> %name% [:<]")) isStruct = true; @@ -7026,7 +7026,7 @@ void Tokenizer::simplifyFunctionParameters() // We have found old style function, now we need to change it // First step: Get list of argument names in parentheses - std::map argumentNames; + std::map argumentNames; bool bailOut = false; const Token * tokparam = nullptr; @@ -7145,7 +7145,7 @@ void Tokenizer::simplifyFunctionParameters() if (argumentNames.size() != argumentNames2.size()) { //move back 'tok1' to the last ';' tok1 = tok1->previous(); - for (const std::pair& argumentName : argumentNames) { + for (const std::pair& argumentName : argumentNames) { if (argumentNames2.find(argumentName.first) == argumentNames2.end()) { //add the missing parameter argument declaration tok1->insertToken(";"); From ac63eb55d1c2ea30ee663542f1a040af67364a5a Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 10 Jun 2026 20:43:09 +0200 Subject: [PATCH 065/171] Fix #14180 FN intToPointerCast with binary integer literal (#8643) Co-authored-by: chrchr-github --- lib/checkother.cpp | 2 ++ test/testother.cpp | 3 +++ 2 files changed, 5 insertions(+) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index b5fd0dda361..801dc529568 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -464,6 +464,8 @@ void CheckOtherImpl::warningIntToPointerCast() format = "decimal"; else if (MathLib::isOct(from->str())) format = "octal"; + else if (MathLib::isBin(from->str())) + format = "binary"; else continue; intToPointerCastError(tok, format); diff --git a/test/testother.cpp b/test/testother.cpp index 93e67229f43..73f10cbe76e 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -2362,6 +2362,9 @@ class TestOther : public TestFixture { checkIntToPointerCast("struct S { int i; };\n" // #13886, don't crash "int f() { return sizeof(((struct S*)0)->i); }"); ASSERT_EQUALS("", errout_str()); + + checkIntToPointerCast("auto p = (int*)0b10;"); // #14180 + ASSERT_EQUALS("[test.cpp:1:10]: (portability) Casting non-zero binary integer literal to pointer. [intToPointerCast]\n", errout_str()); } struct CheckInvalidPointerCastOptions From 21de4faec57386799dff4abe7acdfd9b1c43f244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Wed, 10 Jun 2026 20:43:28 +0200 Subject: [PATCH 066/171] updated *.ts [skip ci] (#8634) --- gui/cppcheck_de.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_es.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_fi.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_fr.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_it.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_ja.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_ka.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_ko.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_nl.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_ru.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_sr.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_sv.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_zh_CN.ts | 182 +++++++++++++++++++++--------------------- gui/cppcheck_zh_TW.ts | 182 +++++++++++++++++++++--------------------- 14 files changed, 1274 insertions(+), 1274 deletions(-) diff --git a/gui/cppcheck_de.ts b/gui/cppcheck_de.ts index 3f9d9ed53d7..1361296b8ca 100644 --- a/gui/cppcheck_de.ts +++ b/gui/cppcheck_de.ts @@ -485,18 +485,18 @@ Parameter: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -636,14 +636,14 @@ Parameter: -l(line) (file) - + Show errors Zeige Fehler - + Show warnings Zeige Warnungen @@ -659,8 +659,8 @@ Parameter: -l(line) (file) Zeige &versteckte - - + + Information Information @@ -1083,17 +1083,17 @@ Parameter: -l(line) (file) - + Quick Filter: Schnellfilter: - + Select configuration Konfiguration wƤhlen - + Found project file: %1 Do you want to load this project file instead? @@ -1102,97 +1102,97 @@ Do you want to load this project file instead? Mƶchten Sie stattdessen diese ƶffnen? - + File not found Datei nicht gefunden - + Bad XML Fehlerhaftes XML - + Missing attribute Fehlendes Attribut - + Bad attribute value Falscher Attributwert - + Duplicate platform type Plattformtyp doppelt - + Platform type redefined Plattformtyp neu definiert - + Duplicate define - + Failed to load the selected library '%1'. %2 Laden der ausgewƤhlten Bibliothek '%1' schlug fehl. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Lizenz - + Authors Autoren - + Save the report file Speichert die Berichtdatei - - + + XML files (*.xml) XML-Dateien (*.xml) @@ -1206,32 +1206,32 @@ This is probably because the settings were changed between the Cppcheck versions Dies wurde vermutlich durch einen Wechsel der Cppcheck-Version hervorgerufen. Bitte prüfen (und korrigieren) Sie die Einstellungen, andernfalls kƶnnte die Editor-Anwendung nicht korrekt starten. - + You must close the project file before selecting new files or directories! Sie müssen die Projektdatei schließen, bevor Sie neue Dateien oder Verzeichnisse auswƤhlen! - + The library '%1' contains unknown elements: %2 Die Bibliothek '%1' enthƤlt unbekannte Elemente: %2 - + Unsupported format Nicht unterstütztes Format - + Unknown element Unbekanntes Element - - - - + + + + Error Fehler @@ -1240,80 +1240,80 @@ Dies wurde vermutlich durch einen Wechsel der Cppcheck-Version hervorgerufen. Bi Laden von %1 fehlgeschlagen. Ihre Cppcheck-Installation ist defekt. Sie kƶnnen --data-dir=<Verzeichnis> als Kommandozeilenparameter verwenden, um anzugeben, wo die Datei sich befindet. Bitte beachten Sie, dass --data-dir in Installationsroutinen genutzt werden soll, und die GUI bei dessen Nutzung nicht startet, sondern die Einstellungen konfiguriert. - + Open the report file Berichtdatei ƶffnen - + Text files (*.txt) Textdateien (*.txt) - + CSV files (*.csv) CSV-Dateien (*.csv) - + Project files (*.cppcheck);;All files(*.*) Projektdateien (*.cppcheck);;Alle Dateien(*.*) - + Select Project File Projektdatei auswƤhlen - - - + + + Project: Projekt: - + No suitable files found to analyze! Keine passenden Dateien für Analyse gefunden! - + C/C++ Source C/C++-Quellcode - + Compile database Compilerdatenbank - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++-Builder 6 - + Select files to analyze Dateien für Analyse auswƤhlen - + Select directory to analyze Verzeichnis für Analyse auswƤhlen - + Select the configuration that will be analyzed Zu analysierende Konfiguration auswƤhlen - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1322,7 +1322,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1333,7 +1333,7 @@ Eine neue XML-Datei zu ƶffnen wird die aktuellen Ergebnisse lƶschen Mƶchten sie fortfahren? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1342,104 +1342,104 @@ Do you want to stop the analysis and exit Cppcheck? Wollen sie die Analyse abbrechen und Cppcheck beenden? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML-Dateien (*.xml);;Textdateien (*.txt);;CSV-Dateien (*.csv) - + Build dir '%1' does not exist, create it? Erstellungsverzeichnis '%1' existiert nicht. Erstellen? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1448,22 +1448,22 @@ Analysis is stopped. Import von '%1' fehlgeschlagen; Analyse wurde abgebrochen. - + Project files (*.cppcheck) Projektdateien (*.cppcheck) - + Select Project Filename Projektnamen auswƤhlen - + No project file loaded Keine Projektdatei geladen - + The project file %1 @@ -1480,12 +1480,12 @@ Do you want to remove the file from the recently used projects -list? Mƶchten Sie die Datei von der Liste der zuletzt benutzten Projekte entfernen? - + Install - + New version available: %1. %2 diff --git a/gui/cppcheck_es.ts b/gui/cppcheck_es.ts index 32485d556f3..bbe8bed24d5 100644 --- a/gui/cppcheck_es.ts +++ b/gui/cppcheck_es.ts @@ -414,18 +414,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -580,13 +580,13 @@ Parameters: -l(line) (file) - + Show errors Mostrar errores - - + + Information Información @@ -1000,7 +1000,7 @@ Parameters: -l(line) (file) - + Show warnings Mostrar advertencias @@ -1023,117 +1023,117 @@ This is probably because the settings were changed between the Cppcheck versions - + You must close the project file before selecting new files or directories! Ā”Tienes que cerrar el proyecto antes de seleccionar nuevos ficheros o carpetas! - + Select configuration - + File not found Archivo no encontrado - + Bad XML XML malformado - + Missing attribute Falta el atributo - + Bad attribute value - + Unsupported format Formato no soportado - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - - + + XML files (*.xml) Archivos XML (*.xml) - + Open the report file Abrir informe - + License Licencia - + Authors Autores - + Save the report file Guardar informe - + Quick Filter: Filtro rĆ”pido: - + Found project file: %1 Do you want to load this project file instead? @@ -1142,112 +1142,112 @@ Do you want to load this project file instead? ĀæQuiere cargar este fichero de proyecto en su lugar? - + The library '%1' contains unknown elements: %2 La biblioteca '%1' contiene elementos deconocidos: %2 - + Duplicate platform type - + Platform type redefined - + Unknown element - - - - + + + + Error Error - + Text files (*.txt) Ficheros de texto (*.txt) - + CSV files (*.csv) Ficheros CVS (*.cvs) - + Project files (*.cppcheck);;All files(*.*) Ficheros de proyecto (*.cppcheck;;Todos los ficheros (*.*) - + Select Project File Selecciona el archivo de proyecto - - - + + + Project: Proyecto: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1255,76 +1255,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename Selecciona el nombre del proyecto - + No project file loaded No hay ningĆŗn proyecto cargado - + The project file %1 @@ -1341,67 +1341,67 @@ Do you want to remove the file from the recently used projects -list? ĀæQuiere eliminar el fichero de la lista de proyectos recientes? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information diff --git a/gui/cppcheck_fi.ts b/gui/cppcheck_fi.ts index 5a41a1cb41d..517362d852b 100644 --- a/gui/cppcheck_fi.ts +++ b/gui/cppcheck_fi.ts @@ -417,18 +417,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -572,14 +572,14 @@ Parameters: -l(line) (file) - + Show errors - + Show warnings @@ -595,8 +595,8 @@ Parameters: -l(line) (file) - - + + Information @@ -1020,103 +1020,103 @@ Parameters: -l(line) (file) - + Quick Filter: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Lisenssi - + Authors TekijƤt - + Save the report file Tallenna raportti - - + + XML files (*.xml) XML-tiedostot (*xml) @@ -1128,126 +1128,126 @@ This is probably because the settings were changed between the Cppcheck versions - + You must close the project file before selecting new files or directories! - + The library '%1' contains unknown elements: %2 - + Unsupported format - + Duplicate platform type - + Platform type redefined - + Unknown element - - - - + + + + Error - + Open the report file - + Text files (*.txt) Tekstitiedostot (*.txt) - + CSV files (*.csv) - + Project files (*.cppcheck);;All files(*.*) - + Select Project File - - - + + + Project: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1255,76 +1255,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename - + No project file loaded - + The project file %1 @@ -1335,67 +1335,67 @@ Do you want to remove the file from the recently used projects -list? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information diff --git a/gui/cppcheck_fr.ts b/gui/cppcheck_fr.ts index 828dffa7ad2..7e8651d8ec3 100644 --- a/gui/cppcheck_fr.ts +++ b/gui/cppcheck_fr.ts @@ -423,18 +423,18 @@ ParamĆØtres : -l(ligne) (fichier) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck @@ -645,38 +645,38 @@ ParamĆØtres : -l(ligne) (fichier) - + License Licence - + Authors Auteurs - + Save the report file Sauvegarder le rapport - - + + XML files (*.xml) Fichiers XML (*.xml) - + About - + Text files (*.txt) Fichiers Texte (*.txt) - + CSV files (*.csv) Fichiers CSV (*.csv) @@ -699,7 +699,7 @@ ParamĆØtres : -l(ligne) (fichier) - + Show errors Afficher les erreurs @@ -771,7 +771,7 @@ ParamĆØtres : -l(ligne) (fichier) - + Show warnings Afficher les avertissements @@ -787,8 +787,8 @@ ParamĆØtres : -l(ligne) (fichier) - - + + Information Information @@ -803,129 +803,129 @@ ParamĆØtres : -l(ligne) (fichier) Afficher les problĆØmes de portabilitĆ© - + You must close the project file before selecting new files or directories! Vous devez d'abord fermer le projet avant de choisir des fichiers/rĆ©pertoires - + Open the report file Ouvrir le rapport - + Project files (*.cppcheck);;All files(*.*) - + Select Project File - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Select Project Filename - + No project file loaded - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -948,12 +948,12 @@ This is probably because the settings were changed between the Cppcheck versions - + Quick Filter: Filtre rapide : - + Found project file: %1 Do you want to load this project file instead? @@ -961,14 +961,14 @@ Do you want to load this project file instead? - - - + + + Project: Projet : - + The project file %1 @@ -1019,59 +1019,59 @@ Do you want to remove the file from the recently used projects -list? - - - - + + + + Error Erreur - + File not found Fichier introuvable - + Bad XML Mauvais fichier XML - + Missing attribute Attribut manquant - + Bad attribute value Mauvaise valeur d'attribut - + Failed to load the selected library '%1'. %2 Echec lors du chargement de la bibliothĆØque '%1'. %2 - + Unsupported format Format non supportĆ© - + The library '%1' contains unknown elements: %2 La bibliothĆØque '%1' contient des Ć©lĆ©ments inconnus: %2 - + Duplicate platform type - + Platform type redefined @@ -1101,12 +1101,12 @@ Do you want to remove the file from the recently used projects -list? - + Unknown element - + Select configuration @@ -1129,7 +1129,7 @@ Options: - + Build dir '%1' does not exist, create it? @@ -1157,76 +1157,76 @@ Options: - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + No suitable files found to analyze! - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Duplicate define - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1373,7 +1373,7 @@ Do you want to stop the analysis and exit Cppcheck? - + Project files (*.cppcheck) @@ -1398,27 +1398,27 @@ Do you want to stop the analysis and exit Cppcheck? - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Current results will be cleared. Opening a new XML file will clear current results. diff --git a/gui/cppcheck_it.ts b/gui/cppcheck_it.ts index 46ec9cb51d8..2c19aa2e50b 100644 --- a/gui/cppcheck_it.ts +++ b/gui/cppcheck_it.ts @@ -426,18 +426,18 @@ Parametri: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -581,14 +581,14 @@ Parametri: -l(line) (file) - + Show errors Mostra gli errori - + Show warnings Mostra gli avvisi @@ -604,8 +604,8 @@ Parametri: -l(line) (file) Mostra &i nascosti - - + + Information Informazione @@ -1029,17 +1029,17 @@ Parametri: -l(line) (file) - + Quick Filter: Rapido filtro: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? @@ -1048,91 +1048,91 @@ Do you want to load this project file instead? Vuoi piuttosto caricare questo file di progetto? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Unsupported format - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Licenza - + Authors Autori - + Save the report file Salva il file di rapporto - - + + XML files (*.xml) File XML (*.xml) @@ -1146,121 +1146,121 @@ This is probably because the settings were changed between the Cppcheck versions Probabilmente ciò ĆØ avvenuto perchĆ© le impostazioni sono state modificate tra le versioni di Cppcheck. Per favore controlla (e sistema) le impostazioni delle applicazioni editor, altrimenti il programma editor può non partire correttamente. - + You must close the project file before selecting new files or directories! Devi chiudere il file di progetto prima di selezionare nuovi file o cartelle! - + The library '%1' contains unknown elements: %2 - + Duplicate platform type - + Platform type redefined - + Unknown element - - - - + + + + Error - + Open the report file Apri il file di rapporto - + Text files (*.txt) File di testo (*.txt) - + CSV files (*.csv) Files CSV (*.csv) - + Project files (*.cppcheck);;All files(*.*) Files di progetto (*.cppcheck);;Tutti i files(*.*) - + Select Project File Seleziona il file di progetto - - - + + + Project: Progetto: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1268,76 +1268,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename Seleziona il nome del file di progetto - + No project file loaded Nessun file di progetto caricato - + The project file %1 @@ -1354,67 +1354,67 @@ Do you want to remove the file from the recently used projects -list? Vuoi rimuovere il file dalla lista dei progetti recentemente usati? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information diff --git a/gui/cppcheck_ja.ts b/gui/cppcheck_ja.ts index a071727ad56..6c8269b4143 100644 --- a/gui/cppcheck_ja.ts +++ b/gui/cppcheck_ja.ts @@ -491,18 +491,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -657,13 +657,13 @@ Parameters: -l(line) (file) - + Show errors ć‚Øćƒ©ćƒ¼ć‚’č”Øē¤ŗ - - + + Information ęƒ…å ± @@ -770,7 +770,7 @@ Parameters: -l(line) (file) - + Show warnings č­¦å‘Šć‚’č”Øē¤ŗ @@ -1102,23 +1102,23 @@ This is probably because the settings were changed between the Cppcheck versions Cppcheckć®å¤ć„ćƒćƒ¼ć‚øćƒ§ćƒ³ć®čØ­å®šć«ćÆäŗ’ę›ę€§ćŒć‚ć‚Šć¾ć›ć‚“ć€‚ć‚Øćƒ‡ć‚£ć‚æć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®čØ­å®šć‚’ē¢ŗčŖć—ć¦äæ®ę­£ć—ć¦ćć ć•ć„ć€ćć†ć—ćŖć„ćØę­£ć—ćčµ·å‹•ć§ććŖć„ć‹ć‚‚ć—ć‚Œć¾ć›ć‚“ć€‚ - + You must close the project file before selecting new files or directories! ę–°ć—ć„ćƒ•ć‚”ć‚¤ćƒ«ļ¼ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ć«ćÆē¾åœØć®ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć‚’é–‰ć˜ć¦ćć ć•ć„! - + Quick Filter: ć‚Æć‚¤ćƒƒć‚Æćƒ•ć‚£ćƒ«ć‚æļ¼š - + Select configuration ć‚³ćƒ³ćƒ•ć‚£ć‚°ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®éøęŠž - + Found project file: %1 Do you want to load this project file instead? @@ -1127,64 +1127,64 @@ Do you want to load this project file instead? ē¾åœØć®ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć®ä»£ć‚ć‚Šć«ć“ć®ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć‚’čŖ­ćæč¾¼ć‚“ć§ć‚‚ć‹ć¾ć„ć¾ć›ć‚“ć‹ļ¼Ÿ - + The library '%1' contains unknown elements: %2 ć“ć®ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖ '%1' ć«ćÆę¬”ć®äøę˜ŽćŖč¦ē“ ćŒå«ć¾ć‚Œć¦ć„ć¾ć™ć€‚ %2 - + File not found ćƒ•ć‚”ć‚¤ćƒ«ćŒć‚ć‚Šć¾ć›ć‚“ - + Bad XML äøę­£ćŖXML - + Missing attribute å±žę€§ćŒć‚ć‚Šć¾ć›ć‚“ - + Bad attribute value äøę­£ćŖå±žę€§ćŒć‚ć‚Šć¾ć™ - + Unsupported format ć‚µćƒćƒ¼ćƒˆć•ć‚Œć¦ć„ćŖć„ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ - + Duplicate platform type ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ć®ēØ®é”žćŒé‡č¤‡ć—ć¦ć„ć¾ć™ - + Platform type redefined ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ć®ēØ®é”žćŒå†å®šē¾©ć•ć‚Œć¾ć—ćŸ - + Unknown element äøę˜ŽćŖč¦ē“  - + Failed to load the selected library '%1'. %2 éøęŠžć—ćŸćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć®čŖ­ćæč¾¼ćæć«å¤±ę•—ć—ć¾ć—ćŸ '%1' %2 - - - - + + + + Error ć‚Øćƒ©ćƒ¼ @@ -1197,38 +1197,38 @@ Do you want to load this project file instead? %1 - %2 の読み込みに失敗 - - + + XML files (*.xml) XML ćƒ•ć‚”ć‚¤ćƒ« (*.xml) - + Open the report file ćƒ¬ćƒćƒ¼ćƒˆć‚’é–‹ć - + License ćƒ©ć‚¤ć‚»ćƒ³ć‚¹ - + Authors ä½œč€… - + Save the report file ćƒ¬ćƒćƒ¼ćƒˆć‚’äæå­˜ - + Text files (*.txt) ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.txt) - + CSV files (*.csv) CSVå½¢å¼ćƒ•ć‚”ć‚¤ćƒ« (*.csv) @@ -1237,32 +1237,32 @@ Do you want to load this project file instead? ć‚³ćƒ³ćƒ—ćƒ©ć‚¤ć‚¢ćƒ³ć‚¹ćƒ¬ćƒćƒ¼ćƒˆć‚’ć™ćć«ē”Ÿęˆć§ćć¾ć›ć‚“ć€‚č§£ęžćŒå®Œäŗ†ć—ęˆåŠŸć—ć¦ć„ćŖć‘ć‚Œć°ćŖć‚Šć¾ć›ć‚“ć€‚ć‚³ćƒ¼ćƒ‰ć‚’å†č§£ęžć—ć¦ć€č‡“å‘½ēš„ćŖć‚Øćƒ©ćƒ¼ćŒćŖć„ć“ćØć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚ - + Project files (*.cppcheck);;All files(*.*) ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.cppcheck);;ć™ć¹ć¦ć®ćƒ•ć‚”ć‚¤ćƒ«(*.*) - + Select Project File ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć‚’éøęŠž - + Failed to open file ćƒ•ć‚”ć‚¤ćƒ«ć‚’é–‹ćć®ć«å¤±ę•—ć—ć¾ć—ćŸ - + Unknown project file format ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć®å½¢å¼ćŒäøę˜Žć§ć™ - + Failed to import project file ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸ - + Failed to import '%1': %2 Analysis is stopped. @@ -1271,70 +1271,70 @@ Analysis is stopped. č§£ęžć‚’åœę­¢ć—ć¾ć—ćŸć€‚ - + Failed to import '%1' (%2), analysis is stopped '%1' (%2) ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸć€‚č§£ęžćÆåœę­¢ - + Install ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ« - + New version available: %1. %2 ę–°ć—ć„ćƒćƒ¼ć‚øćƒ§ćƒ³ćŒåˆ©ē”ØåÆčƒ½ć§ć™ć€‚: %1. %2 - - - + + + Project: ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆ: - + No suitable files found to analyze! ćƒć‚§ćƒƒć‚ÆåÆ¾č±”ć®ćƒ•ć‚”ć‚¤ćƒ«ćŒćæć¤ć‹ć‚Šć¾ć›ć‚“! - + C/C++ Source C/C++ć®ć‚½ćƒ¼ć‚¹ć‚³ćƒ¼ćƒ‰ - + Compile database ć‚³ćƒ³ćƒ‘ć‚¤ćƒ«ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze ćƒć‚§ćƒƒć‚ÆåÆ¾č±”ć®ćƒ•ć‚”ć‚¤ćƒ«ć‚’éøęŠž - + Select directory to analyze ćƒć‚§ćƒƒć‚Æć™ć‚‹ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’éøęŠžć—ć¦ćć ć•ć„ - + Select the configuration that will be analyzed ćƒć‚§ćƒƒć‚Æć®čØ­å®šć‚’éøęŠž - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1343,37 +1343,37 @@ Do you want to proceed analysis without using any of these project files? - + Duplicate define é‡č¤‡ć—ćŸå®šē¾© - + File not found: '%1' ćƒ•ć‚”ć‚¤ćƒ«ćŒć‚ć‚Šć¾ć›ć‚“: '%1' - + Failed to load/setup addon %1: %2 ć‚¢ćƒ‰ć‚Ŗćƒ³ć®čŖ­ćæč¾¼ćæć¾ćŸćÆčØ­å®šć«å¤±ę•— %1 - %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. %1ć®ćƒ­ćƒ¼ćƒ‰ć«å¤±ę•—ć—ć¾ć—ćŸć€‚ć‚ćŖćŸć® Cppcheck ćÆę­£ć—ćć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚ć‚ćŖćŸćÆ --data-dir=<directory> ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć‚’ä½æć£ć¦ć“ć®ćƒ•ć‚”ć‚¤ćƒ«ć®å “ę‰€ć‚’ęŒ‡å®šć§ćć¾ć™ć€‚ćŸć ć—ć€ć“ć® --data-dir ćÆć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć«ć‚ˆć£ć¦ä½æē”Øć•ć‚Œć¦ć„ćŖć‘ć‚Œć°ćŖć‚Šć¾ć›ć‚“ć€‚ć¾ćŸGUIē‰ˆćÆć“ć‚Œć‚’ä½æē”Øć—ć¾ć›ć‚“ć€‚ć•ć‚‰ć«ć€å…Øć¦ć®čØ­å®šćÆčŖæę•“ęøˆćæć§ćŖć‘ć‚Œć°ćŖć‚Šć¾ć›ć‚“ć€‚ - + Failed to load %1 - %2 Analysis is aborted. 読み込みに失敗 %1 - %2 - - + + %1 Analysis is aborted. @@ -1382,7 +1382,7 @@ Analysis is aborted. č§£ęžćÆäø­ę­¢ć—ćŸć€‚ - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1392,7 +1392,7 @@ Do you want to proceed? ꖰ恗恏XMLćƒ•ć‚”ć‚¤ćƒ«ć‚’é–‹ććØē¾åœØć®ēµęžœćŒå‰Šé™¤ć•ć‚Œć¾ć™ć€‚å®Ÿč”Œć—ć¾ć™ć‹ļ¼Ÿ - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1401,77 +1401,77 @@ Do you want to stop the analysis and exit Cppcheck? ćƒć‚§ćƒƒć‚Æć‚’äø­ę–­ć—ć¦ć€Cppcheckを終了しますか? - + About CppCheck恫恤恄恦 - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML ćƒ•ć‚”ć‚¤ćƒ« (*.xml);;ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.txt);;CSVćƒ•ć‚”ć‚¤ćƒ« (*.csv) - + Build dir '%1' does not exist, create it? ćƒ“ćƒ«ćƒ‰ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖ'%1'ćŒć‚ć‚Šć¾ć›ć‚“ć€‚ä½œęˆć—ć¾ć™ć‹? - + To check the project using addons, you need a build directory. ć‚¢ćƒ‰ć‚Ŗćƒ³ć‚’ä½æē”Øć—ć¦ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć‚’ćƒć‚§ćƒƒć‚Æć™ć‚‹ćŸć‚ć«ćÆć€ćƒ“ćƒ«ćƒ‰ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖćŒåæ…č¦ć§ć™ć€‚ - + Show Mandatory åæ…é ˆć‚’č”Øē¤ŗ - + Show Required 要求を蔨示 - + Show Advisory ęŽØå„Øć‚’č”Øē¤ŗ - + Show Document ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’č”Øē¤ŗ - + Show L1 L1を蔨示 - + Show L2 L2を蔨示 - + Show L3 L3を蔨示 - + Show style ć‚¹ć‚æć‚¤ćƒ«ć‚’č”Øē¤ŗ - + Show portability ē§»ę¤åÆčƒ½ę€§ć‚’č”Øē¤ŗ - + Show performance ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć‚’č”Øē¤ŗ - + Show information ęƒ…å ±ć‚’č”Øē¤ŗ @@ -1480,22 +1480,22 @@ Do you want to stop the analysis and exit Cppcheck? '%1'ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆć«å¤±ę•—ć—ć¾ć—ćŸć€‚(ćƒć‚§ćƒƒć‚Æäø­ę–­) - + Project files (*.cppcheck) ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ« (*.cppcheck) - + Select Project Filename ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«åć‚’éøęŠž - + No project file loaded ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆćƒ•ć‚”ć‚¤ćƒ«ćŒčŖ­ćæč¾¼ć¾ć‚Œć¦ć„ć¾ć›ć‚“ - + The project file %1 diff --git a/gui/cppcheck_ka.ts b/gui/cppcheck_ka.ts index f6d571ab3f5..52c0657f646 100644 --- a/gui/cppcheck_ka.ts +++ b/gui/cppcheck_ka.ts @@ -467,18 +467,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -622,14 +622,14 @@ Parameters: -l(line) (file) - + Show errors įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - + Show warnings įƒ’įƒįƒ¤įƒ įƒ—įƒ®įƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ @@ -645,8 +645,8 @@ Parameters: -l(line) (file) įƒ“įƒįƒ›įƒįƒšįƒ£įƒšįƒ˜įƒ” &įƒ©įƒ•įƒ”įƒœįƒ”įƒ‘įƒ - - + + Information įƒ˜įƒœįƒ¤įƒįƒ įƒ›įƒįƒŖįƒ˜įƒ @@ -1070,17 +1070,17 @@ Parameters: -l(line) (file) - + Quick Filter: ეწრაფი ფილტრი: - + Select configuration įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ™įƒįƒœįƒ¤įƒ˜įƒ’įƒ£įƒ įƒįƒŖįƒ˜įƒ - + Found project file: %1 Do you want to load this project file instead? @@ -1089,61 +1089,61 @@ Do you want to load this project file instead? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ—, įƒ”įƒįƒ›įƒįƒ’įƒ˜įƒ”įƒ įƒįƒ“, įƒ”įƒ” įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒįƒ—? - + File not found ფაილი įƒœįƒįƒžįƒįƒ•įƒœįƒ˜ არაა - + Bad XML įƒįƒ įƒįƒ”įƒ¬įƒįƒ įƒ˜ XML - + Missing attribute įƒįƒ™įƒšįƒ˜įƒ įƒįƒ¢įƒ įƒ˜įƒ‘įƒ£įƒ¢įƒ˜ - + Bad attribute value įƒįƒ įƒįƒ”įƒ¬įƒįƒ įƒ˜ įƒįƒ¢įƒ įƒ˜įƒ‘įƒ£įƒ¢įƒ˜įƒ” įƒ›įƒœįƒ˜įƒØįƒ•įƒœįƒ”įƒšįƒįƒ‘įƒ - + Unsupported format įƒ›įƒ®įƒįƒ įƒ“įƒįƒ£įƒ­įƒ”įƒ įƒ”įƒšįƒ˜ įƒ¤įƒįƒ įƒ›įƒįƒ¢įƒ˜ - + Duplicate define įƒ’įƒįƒ›įƒ”įƒįƒ įƒ”įƒ‘įƒ£įƒšįƒ˜ įƒįƒ¦įƒ¬įƒ”įƒ įƒ - + Failed to load the selected library '%1'. %2 įƒ©įƒįƒ•įƒįƒ įƒ“įƒ įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒ•įƒ įƒ›įƒįƒœįƒ˜įƒØįƒœįƒ£įƒšįƒ˜ įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” '%1'. %2 - + File not found: '%1' ფაილი įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ”: '%1' - + Failed to load/setup addon %1: %2 įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒ˜įƒ” (%1) įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒ•įƒ/įƒ›įƒįƒ įƒ’įƒ”įƒ‘įƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. @@ -1152,8 +1152,8 @@ Analysis is aborted. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ“įƒ. - - + + %1 Analysis is aborted. @@ -1162,23 +1162,23 @@ Analysis is aborted. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ•įƒ”įƒ¢įƒ˜įƒšįƒ˜įƒ. - + License įƒšįƒ˜įƒŖįƒ”įƒœįƒ–įƒ˜įƒ - + Authors įƒįƒ•įƒ¢įƒįƒ įƒ”įƒ‘įƒ˜ - + Save the report file įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” ფაილში įƒ©įƒįƒ¬įƒ”įƒ įƒ - - + + XML files (*.xml) XML įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.xml) @@ -1190,115 +1190,115 @@ This is probably because the settings were changed between the Cppcheck versions - + You must close the project file before selecting new files or directories! ახალი įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜įƒ” ან įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ”įƒ”įƒ‘įƒ˜įƒ” įƒįƒ įƒ©įƒ”įƒ•įƒįƒ›įƒ“įƒ” įƒžįƒ įƒįƒ įƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი įƒ£įƒœįƒ“įƒ įƒ“įƒįƒ®įƒ£įƒ įƒįƒ—! - + The library '%1' contains unknown elements: %2 įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ '%1' įƒ£įƒŖįƒœįƒįƒ‘ įƒ”įƒšįƒ”įƒ›įƒ”įƒœįƒ¢įƒ”įƒ‘įƒ” įƒØįƒ”įƒ˜įƒŖįƒįƒ•įƒ”: %2 - + Duplicate platform type įƒ’įƒįƒ›įƒ”įƒįƒ įƒ”įƒ‘įƒ£įƒšįƒ˜ įƒžįƒšįƒįƒ¢įƒ¤įƒįƒ įƒ›įƒ˜įƒ” įƒ¢įƒ˜įƒžįƒ˜ - + Platform type redefined įƒžįƒšįƒįƒ¢įƒ¤įƒįƒ įƒ›įƒ˜įƒ” įƒ¢įƒ˜įƒžįƒ˜ įƒ—įƒįƒ•įƒ“įƒįƒœ įƒįƒ¦įƒ˜įƒ¬įƒ”įƒ įƒ - + Unknown element įƒ£įƒŖįƒœįƒįƒ‘įƒ˜ įƒ”įƒšįƒ”įƒ›įƒ”įƒœįƒ¢įƒ˜ - - - - + + + + Error įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ - + Open the report file įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” ფაილიე įƒ’įƒįƒ®įƒ”įƒœįƒ - + Text files (*.txt) įƒ¢įƒ”įƒ„įƒ”įƒ¢įƒ£įƒ įƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.txt) - + CSV files (*.csv) CSV įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.csv) - + Project files (*.cppcheck);;All files(*.*) įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.cppcheck);;įƒ§įƒ•įƒ”įƒšįƒ ფაილი(*.*) - + Select Project File įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი - - - + + + Project: įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜: - + No suitable files found to analyze! įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒįƒ—įƒ•įƒ˜įƒ” įƒØįƒ”įƒ”įƒįƒ¤įƒ”įƒ įƒ˜įƒ”įƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ įƒįƒ¦įƒ›įƒįƒ©įƒ”įƒœįƒ˜įƒšįƒ˜ არაა! - + C/C++ Source C/C++ ეაწყიეი įƒ™įƒįƒ“įƒ˜ - + Compile database įƒ›įƒįƒœįƒįƒŖįƒ”įƒ›įƒ—įƒ įƒ‘įƒįƒ–įƒ˜įƒ” įƒ™įƒįƒ›įƒžįƒ˜įƒšįƒįƒŖįƒ˜įƒ - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze įƒįƒ˜įƒ įƒ©įƒ”įƒ— įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” - + Select directory to analyze įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” - + Select the configuration that will be analyzed įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒ™įƒįƒœįƒ¤įƒ˜įƒ’įƒ£įƒ įƒįƒŖįƒ˜įƒ įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜įƒ”įƒ—įƒ•įƒ˜įƒ” - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1307,7 +1307,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1318,7 +1318,7 @@ Do you want to proceed? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ—, įƒ’įƒįƒįƒ’įƒ įƒ«įƒ”įƒšįƒįƒ—? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1327,12 +1327,12 @@ Do you want to stop the analysis and exit Cppcheck? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ—, įƒ’įƒįƒįƒ©įƒ”įƒ įƒįƒ— įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ“įƒ įƒ’įƒįƒ®įƒ•įƒ˜įƒ“įƒ”įƒ— Cppcheck-įƒ“įƒįƒœ? - + About įƒØįƒ”įƒ”įƒįƒ®įƒ”įƒ‘ - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.xml);;įƒ¢įƒ”įƒ„įƒ”įƒ¢įƒ£įƒ įƒ˜ įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.txt);;CSV įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.csv) @@ -1341,32 +1341,32 @@ Do you want to stop the analysis and exit Cppcheck? įƒØįƒ”įƒ”įƒįƒ‘įƒįƒ›įƒ˜įƒ”įƒįƒ‘įƒ˜įƒ” įƒįƒœįƒ’įƒįƒ įƒ˜įƒØįƒ˜įƒ” įƒ’įƒ”įƒœįƒ”įƒ įƒįƒŖįƒ˜įƒ ახლა įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ, įƒ įƒįƒ“įƒ’įƒįƒœ įƒÆįƒ”įƒ  įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ¬įƒįƒ įƒ›įƒįƒ¢įƒ”įƒ‘įƒ˜įƒ— įƒ£įƒœįƒ“įƒ įƒ“įƒįƒ”įƒ įƒ£įƒšįƒ“įƒ”įƒ”. įƒ”įƒŖįƒįƒ“įƒ”įƒ—, įƒ™įƒįƒ“įƒ˜įƒ” įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒ—įƒįƒ•įƒ˜įƒ“įƒįƒœ įƒ’įƒįƒ£įƒØįƒ•įƒįƒ— įƒ“įƒ įƒ“įƒįƒ įƒ¬įƒ›įƒ£įƒœįƒ“įƒ”įƒ—, įƒ įƒįƒ› įƒ™įƒ įƒ˜įƒ¢įƒ˜įƒ™įƒ£įƒšįƒ˜ įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ˜ არ įƒįƒ įƒ”įƒ”įƒ‘įƒįƒ‘įƒ”. - + Build dir '%1' does not exist, create it? įƒįƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” (%1) არ įƒįƒ įƒ”įƒ”įƒ‘įƒįƒ‘įƒ”. įƒØįƒ”įƒ•įƒ„įƒ›įƒœįƒ? - + To check the project using addons, you need a build directory. įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ“įƒįƒ›įƒįƒ¢įƒ”įƒ‘įƒ”įƒ‘įƒ˜įƒ— įƒØįƒ”įƒ”įƒįƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒšįƒįƒ“ įƒįƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒįƒ„įƒįƒ¦įƒįƒšįƒ“įƒ” įƒ’įƒ­įƒ˜įƒ įƒ“įƒ”įƒ‘įƒįƒ—. - + Failed to open file ფაილიე įƒ’įƒįƒ®įƒ”įƒœįƒ˜įƒ” įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ - + Unknown project file format įƒ£įƒŖįƒœįƒįƒ‘įƒ˜ įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒ¤įƒįƒ įƒ›įƒįƒ¢įƒ˜ - + Failed to import project file įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒØįƒ”įƒ›įƒįƒ¢įƒįƒœįƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ - + Failed to import '%1': %2 Analysis is stopped. @@ -1375,27 +1375,27 @@ Analysis is stopped. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ“įƒ. - + Failed to import '%1' (%2), analysis is stopped '%1'-იე (%2) įƒØįƒ”įƒ›įƒįƒ¢įƒįƒœįƒ įƒ©įƒįƒ•įƒįƒ įƒ“įƒ. įƒįƒœįƒįƒšįƒ˜įƒ–įƒ˜ įƒØįƒ”įƒ¬įƒ§įƒ“įƒ - + Project files (*.cppcheck) įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” įƒ¤įƒįƒ˜įƒšįƒ”įƒ‘įƒ˜ (*.cppcheck) - + Select Project Filename įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილიე įƒ”įƒįƒ®įƒ”įƒšįƒ˜ - + No project file loaded įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ˜įƒ” ფაილი įƒ©įƒįƒ¢įƒ•įƒ˜įƒ įƒ—įƒ£įƒšįƒ˜ არაა - + The project file %1 @@ -1412,67 +1412,67 @@ Do you want to remove the file from the recently used projects -list? įƒ’įƒœįƒ”įƒ‘įƒįƒ•įƒ— įƒ¬įƒįƒØįƒįƒšįƒįƒ— įƒ”įƒ” ფაილი ახლახან įƒ’įƒįƒ›įƒįƒ§įƒ”įƒœįƒ”įƒ‘įƒ£įƒšįƒ˜ įƒžįƒ įƒįƒ”įƒ„įƒ¢įƒ”įƒ‘įƒ˜įƒ” įƒ”įƒ˜įƒ˜įƒ“įƒįƒœ? - + Install įƒ“įƒįƒ§įƒ”įƒœįƒ”įƒ‘įƒ - + New version available: %1. %2 įƒ®įƒ”įƒšįƒ›įƒ˜įƒ”įƒįƒ¬įƒ•įƒ“įƒįƒ›įƒ˜įƒ ახალი įƒ•įƒ”įƒ įƒ”įƒ˜įƒ: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information diff --git a/gui/cppcheck_ko.ts b/gui/cppcheck_ko.ts index 18720477f08..611eede0491 100644 --- a/gui/cppcheck_ko.ts +++ b/gui/cppcheck_ko.ts @@ -423,18 +423,18 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -578,7 +578,7 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - + Show errors ģ• ėŸ¬ ķ‘œģ‹œ @@ -685,7 +685,7 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - + Show warnings 경고 ķ‘œģ‹œ @@ -756,8 +756,8 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - - + + Information 정볓 @@ -808,7 +808,7 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - + Quick Filter: 빠넸 ķ•„ķ„°: @@ -822,12 +822,12 @@ This is probably because the settings were changed between the Cppcheck versions Cppcheck 버전간 설정 방법 ģ°Øģ“ė•Œė¬øģø 것으딜 ė³“ģž…ė‹ˆė‹¤. ķŽøģ§‘źø° ģ„¤ģ •ģ„ 검사(ė° ģˆ˜ģ •)ķ•“ģ£¼ģ„øģš”, 그렇지 ģ•Šģœ¼ė©“ ķŽøģ§‘źø°ź°€ ģ œėŒ€ė”œ ģ‹œģž‘ķ•˜ģ§€ ģ•ŠģŠµė‹ˆė‹¤. - + You must close the project file before selecting new files or directories! 새딜욓 ķŒŒģ¼ģ“ė‚˜ 디렉토리넼 ģ„ ķƒķ•˜źø° 전에 ķ”„ė”œģ ķŠø ķŒŒģ¼ģ„ ė‹«ģœ¼ģ„øģš”! - + Found project file: %1 Do you want to load this project file instead? @@ -836,210 +836,210 @@ Do you want to load this project file instead? ģ“ ķ”„ė”œģ ķŠø ķŒŒģ¼ģ„ ė¶ˆėŸ¬ģ˜¤ź² ģŠµė‹ˆź¹Œ? - - + + XML files (*.xml) XML ķŒŒģ¼ (*.xml) - + Open the report file ė³“ź³ ģ„œ ķŒŒģ¼ ģ—“źø° - + License ģ €ģž‘ź¶Œ - + Authors ģ œģž‘ģž - + Save the report file ė³“ź³ ģ„œ ķŒŒģ¼ ģ €ģž„ - + Text files (*.txt) ķ…ģŠ¤ķŠø ķŒŒģ¼ (*.txt) - + CSV files (*.csv) CSV ķŒŒģ¼ (*.csv) - + Project files (*.cppcheck);;All files(*.*) ķ”„ė”œģ ķŠø ķŒŒģ¼ (*.cppcheck);;ėŖØė“  ķŒŒģ¼(*.*) - + Select Project File ķ”„ė”œģ ķŠø ķŒŒģ¼ ģ„ ķƒ - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information - - - + + + Project: ķ”„ė”œģ ķŠø: - + Duplicate define - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + About - + To check the project using addons, you need a build directory. - + Select Project Filename ķ”„ė”œģ ķŠø ķŒŒģ¼ģ“ė¦„ ģ„ ķƒ - + No project file loaded ķ”„ė”œģ ķŠø ķŒŒģ¼ 불러오기 ģ‹¤ķŒØ - + The project file %1 @@ -1066,57 +1066,57 @@ Do you want to remove the file from the recently used projects -list? - - - - + + + + Error - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Failed to load the selected library '%1'. %2 - + Unsupported format - + The library '%1' contains unknown elements: %2 - + Duplicate platform type - + Platform type redefined @@ -1146,12 +1146,12 @@ Do you want to remove the file from the recently used projects -list? - + Unknown element - + Select configuration @@ -1174,7 +1174,7 @@ Options: - + Build dir '%1' does not exist, create it? @@ -1202,39 +1202,39 @@ Options: - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + No suitable files found to analyze! - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1381,7 +1381,7 @@ Do you want to stop the analysis and exit Cppcheck? C++14 - + Project files (*.cppcheck) @@ -1406,27 +1406,27 @@ Do you want to stop the analysis and exit Cppcheck? C++20 - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Current results will be cleared. Opening a new XML file will clear current results. diff --git a/gui/cppcheck_nl.ts b/gui/cppcheck_nl.ts index cd14a92bdc2..7c58587662b 100644 --- a/gui/cppcheck_nl.ts +++ b/gui/cppcheck_nl.ts @@ -427,18 +427,18 @@ Parameters: -l(lijn) (bestand) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -582,14 +582,14 @@ Parameters: -l(lijn) (bestand) - + Show errors Toon fouten - + Show warnings Toon waarschuwingen @@ -605,8 +605,8 @@ Parameters: -l(lijn) (bestand) Toon &verborgen - - + + Information Informatie @@ -1030,17 +1030,17 @@ Parameters: -l(lijn) (bestand) - + Quick Filter: Snel Filter: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? @@ -1048,86 +1048,86 @@ Do you want to load this project file instead? Wilt u dit project laden in plaats van? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Licentie - + Authors Auteurs - + Save the report file Rapport opslaan - - + + XML files (*.xml) XML bestanden (*.xml) @@ -1141,126 +1141,126 @@ This is probably because the settings were changed between the Cppcheck versions Dit is waarschijnlijk omdat de instellingen zijn gewijzigd tussen de versies van cppcheck. Controleer (en maak) de bewerker instellingen, anders zal de bewerker niet correct starten. - + You must close the project file before selecting new files or directories! Je moet project bestanden sluiten voordat je nieuwe bestanden of mappen selekteerd! - + The library '%1' contains unknown elements: %2 - + Unsupported format - + Duplicate platform type - + Platform type redefined - + Unknown element - - - - + + + + Error - + Open the report file Open het rapport bestand - + Text files (*.txt) Tekst bestanden (*.txt) - + CSV files (*.csv) CSV bestanden (*.csv) - + Project files (*.cppcheck);;All files(*.*) Project bestanden (*.cppcheck);;Alle bestanden(*.*) - + Select Project File Selecteer project bestand - - - + + + Project: Project: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1268,76 +1268,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename Selecteer project bestandsnaam - + No project file loaded Geen project bestand geladen - + The project file %1 @@ -1353,67 +1353,67 @@ Kan niet worden gevonden! Wilt u het bestand van de onlangs gebruikte project verwijderen -lijst? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information diff --git a/gui/cppcheck_ru.ts b/gui/cppcheck_ru.ts index 464bfb0d34b..a6608d90f7d 100644 --- a/gui/cppcheck_ru.ts +++ b/gui/cppcheck_ru.ts @@ -427,18 +427,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -582,14 +582,14 @@ Parameters: -l(line) (file) - + Show errors ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ошибки - + Show warnings ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŃ @@ -605,8 +605,8 @@ Parameters: -l(line) (file) ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ скрытые - - + + Information Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŠ¾Š½Š½Ń‹Šµ ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ @@ -1030,17 +1030,17 @@ Parameters: -l(line) (file) - + Quick Filter: Быстрый Ń„ŠøŠ»ŃŒŃ‚Ń€: - + Select configuration Выбор ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŠø - + Found project file: %1 Do you want to load this project file instead? @@ -1049,92 +1049,92 @@ Do you want to load this project file instead? Š’Ń‹ хотите Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŃŃ‚Š¾Ń‚ проект? - + File not found Файл не найГен - + Bad XML ŠŠµŠŗŠ¾Ń€Ń€ŠµŠŗŃ‚Š½Ń‹Š¹ XML - + Missing attribute ŠŸŃ€Š¾ŠæŃƒŃ‰ŠµŠ½ Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚ - + Bad attribute value ŠŠµŠŗŠ¾Ń€Ń€ŠµŠŗŃ‚Š½Š¾Šµ значение Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Š° - + Unsupported format ŠŠµŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŠµŠ¼Ń‹Š¹ формат - + Duplicate define - + Failed to load the selected library '%1'. %2 ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ Š²Ń‹Š±Ń€Š°Š½Š½ŃƒŃŽ Š±ŠøŠ±Š»ŠøŠ¾Ń‚ŠµŠŗŃƒ '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Š›ŠøŃ†ŠµŠ½Š·ŠøŃ - + Authors Авторы - + Save the report file Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ файл с отчетом - - + + XML files (*.xml) XML-файлы (*.xml) @@ -1148,37 +1148,37 @@ This is probably because the settings were changed between the Cppcheck versions Возможно, ŃŃ‚Š¾ ŃŠ²ŃŠ·Š°Š½Š¾ с ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃŠ¼Šø в версии программы. ŠŸŠ¾Š¶Š°Š»ŃƒŠ¹ŃŃ‚Š°, ŠæŃ€Š¾Š²ŠµŃ€ŃŒŃ‚Šµ (Šø ŠøŃŠæŃ€Š°Š²ŃŒŃ‚Šµ) настройки ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ. - + You must close the project file before selecting new files or directories! Š’Ń‹ Голжны Š·Š°ŠŗŃ€Ń‹Ń‚ŃŒ проект переГ выбором новых файлов или каталогов! - + The library '%1' contains unknown elements: %2 Библиотека '%1' соГержит неизвестные ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹: %2 - + Duplicate platform type Š”ŃƒŠ±Š»ŠøŠŗŠ°Ń‚ типа платформы - + Platform type redefined ŠŸŠµŃ€ŠµŠ¾Š±ŃŠŃŠ²Š»ŠµŠ½ŠøŠµ типа платформы - + Unknown element ŠŠµŠøŠ·Š²ŠµŃŃ‚Š½Ń‹Š¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ - - - - + + + + Error ŠžŃˆŠøŠ±ŠŗŠ° @@ -1187,80 +1187,80 @@ This is probably because the settings were changed between the Cppcheck versions ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ %1. Cppcheck ŃƒŃŃ‚Š°Š½Š¾Š²Š»ŠµŠ½ некорректно. Š’Ń‹ можете ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ --data-dir=<directory> в команГной строке Š“Š»Ń ŃƒŠŗŠ°Š·Š°Š½ŠøŃ Ń€Š°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŃ файлов ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŠø. ŠžŠ±Ń€Š°Ń‚ŠøŃ‚Šµ внимание, что --data-dir преГназначен Š“Š»Ń ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Š½ŠøŃ ŃŃ†ŠµŠ½Š°Ń€ŠøŃŠ¼Šø ŃƒŃŃ‚Š°Š½Š¾Š²ŠŗŠø. ŠŸŃ€Šø Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠø Ганной опции, графический интерфейс ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»Ń не Š·Š°ŠæŃƒŃŠŗŠ°ŠµŃ‚ся. - + Open the report file ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ файл с отчетом - + Text files (*.txt) Текстовые файлы (*.txt) - + CSV files (*.csv) CSV файлы(*.csv) - + Project files (*.cppcheck);;All files(*.*) Файлы проекта (*.cppcheck);;Все файлы(*.*) - + Select Project File Выберите файл проекта - - - + + + Project: ŠŸŃ€Š¾ŠµŠŗŃ‚: - + No suitable files found to analyze! ŠŠµ найГено ŠæŠ¾Š“Ń…Š¾Š“ŃŃ‰ŠøŃ… файлов Š“Š»Ń анализа - + C/C++ Source Š˜ŃŃ…Š¾Š“Š½Ń‹Š¹ коГ C/C++ - + Compile database - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze Выбор файлов Š“Š»Ń анализа - + Select directory to analyze Выбор каталога Š“Š»Ń анализа - + Select the configuration that will be analyzed Выбор используемой ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŠø - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1269,7 +1269,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1280,7 +1280,7 @@ Do you want to proceed? Š’Ń‹ хотите ŠæŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŃŒ? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1289,104 +1289,104 @@ Do you want to stop the analysis and exit Cppcheck? Š’Ń‹ хотите Š¾ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ анализ Šø выйти ŠøŠ· Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML файлы (*.xml);;Текстовые файлы (*.txt);;CSV файлы (*.csv) - + Build dir '%1' does not exist, create it? Š”ŠøŃ€ŠµŠŗŃ‚Š¾Ń€ŠøŃ Š“Š»Ń сборки '%1' не ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŠµŃ‚, ŃŠ¾Š·Š“Š°Ń‚ŃŒ? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1395,22 +1395,22 @@ Analysis is stopped. ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ ŠøŠ¼ŠæŠ¾Ń€Ń‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ '%1', анализ остановлен - + Project files (*.cppcheck) Файлы проекта (*.cppcheck) - + Select Project Filename Выберите ŠøŠ¼Ń файла Š“Š»Ń проекта - + No project file loaded Файл с проектом не Š·Š°Š³Ń€ŃƒŠ¶ŠµŠ½ - + The project file %1 @@ -1426,12 +1426,12 @@ Do you want to remove the file from the recently used projects -list? Єотите ŃƒŠ“Š°Š»ŠøŃ‚ŃŒ его ŠøŠ· списка проектов? - + Install - + New version available: %1. %2 diff --git a/gui/cppcheck_sr.ts b/gui/cppcheck_sr.ts index 190dbdbe751..07e8059f724 100644 --- a/gui/cppcheck_sr.ts +++ b/gui/cppcheck_sr.ts @@ -415,18 +415,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -570,14 +570,14 @@ Parameters: -l(line) (file) - + Show errors - + Show warnings @@ -593,8 +593,8 @@ Parameters: -l(line) (file) - - + + Information @@ -1018,103 +1018,103 @@ Parameters: -l(line) (file) - + Quick Filter: - + Select configuration - + Found project file: %1 Do you want to load this project file instead? - + File not found - + Bad XML - + Missing attribute - + Bad attribute value - + Duplicate define - + Failed to load the selected library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License License - + Authors Authors - + Save the report file Save the report file - - + + XML files (*.xml) XML files (*.xml) @@ -1126,126 +1126,126 @@ This is probably because the settings were changed between the Cppcheck versions - + You must close the project file before selecting new files or directories! - + The library '%1' contains unknown elements: %2 - + Unsupported format - + Duplicate platform type - + Platform type redefined - + Unknown element - - - - + + + + Error - + Open the report file - + Text files (*.txt) Text files (*.txt) - + CSV files (*.csv) - + Project files (*.cppcheck);;All files(*.*) - + Select Project File - - - + + + Project: - + No suitable files found to analyze! - + C/C++ Source - + Compile database - + Visual Studio - + Borland C++ Builder 6 - + Select files to analyze - + Select directory to analyze - + Select the configuration that will be analyzed - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1253,76 +1253,76 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) - + Build dir '%1' does not exist, create it? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Project files (*.cppcheck) - + Select Project Filename - + No project file loaded - + The project file %1 @@ -1333,67 +1333,67 @@ Do you want to remove the file from the recently used projects -list? - + Install - + New version available: %1. %2 - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information diff --git a/gui/cppcheck_sv.ts b/gui/cppcheck_sv.ts index 4f548b454d0..4b8164d7775 100644 --- a/gui/cppcheck_sv.ts +++ b/gui/cppcheck_sv.ts @@ -433,18 +433,18 @@ Exempel: - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -588,14 +588,14 @@ Exempel: - + Show errors Visa fel - + Show warnings Visa varningar @@ -611,8 +611,8 @@ Exempel: Visa dolda - - + + Information Information @@ -1037,17 +1037,17 @@ Exempel: - + Quick Filter: Snabbfilter: - + Select configuration VƤlj konfiguration - + Found project file: %1 Do you want to load this project file instead? @@ -1056,92 +1056,92 @@ Do you want to load this project file instead? Vill du ladda denna projektfil istƤllet? - + File not found Filen hittades ej - + Bad XML Ogiltig XML - + Missing attribute Attribut finns ej - + Bad attribute value Ogiltigt attribut vƤrde - + Unsupported format Format stƶds ej - + Duplicate define - + Failed to load the selected library '%1'. %2 Misslyckades att ladda valda library '%1'. %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + License Licens - + Authors Utvecklare - + Save the report file Spara rapport - - + + XML files (*.xml) XML filer (*.xml) @@ -1155,37 +1155,37 @@ This is probably because the settings were changed between the Cppcheck versions En trolig orsak Ƥr att instƤllningarna Ƥndrats fƶr olika Cppcheck versioner. Kontrollera programinstƤllningarna. - + You must close the project file before selecting new files or directories! Du mĆ„ste stƤnga projektfilen innan nya filer eller sƶkvƤgar kan vƤljas! - + The library '%1' contains unknown elements: %2 Library filen '%1' har element som ej hanteras: %2 - + Duplicate platform type Dubbel plattformstyp - + Platform type redefined Plattformstyp definieras igen - + Unknown element Element hanteras ej - - - - + + + + Error Fel @@ -1194,80 +1194,80 @@ En trolig orsak Ƥr att instƤllningarna Ƥndrats fƶr olika Cppcheck versioner. Misslyckades att ladda %1. Din Cppcheck installation Ƥr ej komplett. Du kan anvƤnda --data-dir<directory> pĆ„ kommandoraden fƶr att specificera var denna fil finns. Det Ƥr meningen att --data-dir kommandot skall kƶras under installationen,sĆ„ GUIt kommer ej visas nƤr --data-dir anvƤnds allt som hƤnder Ƥr att en instƤllning gƶrs. - + Open the report file Ɩppna rapportfilen - + Text files (*.txt) Text filer (*.txt) - + CSV files (*.csv) CSV filer (*.csv) - + Project files (*.cppcheck);;All files(*.*) Projektfiler (*.cppcheck);;Alla filer(*.*) - + Select Project File VƤlj projektfil - - - + + + Project: Projekt: - + No suitable files found to analyze! Inga filer hittades att analysera! - + C/C++ Source - + Compile database - + Visual Studio Visual Studio - + Borland C++ Builder 6 - + Select files to analyze VƤlj filer att analysera - + Select directory to analyze VƤlj mapp att analysera - + Select the configuration that will be analyzed VƤlj konfiguration som kommer analyseras - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1276,7 +1276,7 @@ Do you want to proceed analysis without using any of these project files? - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1284,7 +1284,7 @@ Do you want to proceed? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1293,104 +1293,104 @@ Do you want to stop the analysis and exit Cppcheck? Vill du stoppa analysen och avsluta Cppcheck? - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML filer (*.xml);;Text filer (*.txt);;CSV filer (*.csv) - + Build dir '%1' does not exist, create it? Build dir '%1' existerar ej, skapa den? - + To check the project using addons, you need a build directory. - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1399,22 +1399,22 @@ Analysis is stopped. Misslyckades att importera '%1', analysen stoppas - + Project files (*.cppcheck) Projekt filer (*.cppcheck) - + Select Project Filename VƤlj Projektfil - + No project file loaded Inget projekt laddat - + The project file %1 @@ -1431,12 +1431,12 @@ Do you want to remove the file from the recently used projects -list? Vill du ta bort filen frĆ„n 'senast anvƤnda projekt'-listan? - + Install - + New version available: %1. %2 diff --git a/gui/cppcheck_zh_CN.ts b/gui/cppcheck_zh_CN.ts index 952fbcd4d14..5860c842a16 100644 --- a/gui/cppcheck_zh_CN.ts +++ b/gui/cppcheck_zh_CN.ts @@ -434,18 +434,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -600,13 +600,13 @@ Parameters: -l(line) (file) - + Show errors ę˜¾ē¤ŗé”™čÆÆ - - + + Information 俔息 @@ -713,7 +713,7 @@ Parameters: -l(line) (file) - + Show warnings ę˜¾ē¤ŗč­¦å‘Š @@ -1045,23 +1045,23 @@ This is probably because the settings were changed between the Cppcheck versions čæ™åÆčƒ½ę˜Æå› äøŗ Cppcheck äøåŒē‰ˆęœ¬é—“ēš„č®¾ē½®ęœ‰ę‰€äøåŒć€‚čÆ·ę£€ęŸ„(å¹¶äæ®å¤)ē¼–č¾‘å™Øåŗ”ē”ØēØ‹åŗč®¾ē½®ļ¼Œå¦åˆ™ē¼–č¾‘å™ØēØ‹åŗåÆčƒ½äøä¼šę­£ē”®åÆåŠØć€‚ - + You must close the project file before selecting new files or directories! åœØé€‰ę‹©ę–°ēš„ę–‡ä»¶ęˆ–ē›®å½•ä¹‹å‰ļ¼Œä½ åæ…é”»å…ˆå…³é—­ę­¤é”¹ē›®ę–‡ä»¶ļ¼ - + Quick Filter: åæ«é€Ÿę»¤å™Ø: - + Select configuration é€‰ę‹©é…ē½® - + Found project file: %1 Do you want to load this project file instead? @@ -1070,64 +1070,64 @@ Do you want to load this project file instead? ä½ ę˜Æå¦ęƒ³åŠ č½½čÆ„é”¹ē›®ę–‡ä»¶ļ¼Ÿ - + The library '%1' contains unknown elements: %2 åŗ“ '%1' åŒ…å«ęœŖēŸ„å…ƒē“ ļ¼š %2 - + File not found ę–‡ä»¶ęœŖę‰¾åˆ° - + Bad XML ę— ę•ˆēš„ XML - + Missing attribute ē¼ŗå¤±å±žę€§ - + Bad attribute value ę— ę•ˆēš„å±žę€§å€¼ - + Unsupported format äøę”ÆęŒēš„ę ¼å¼ - + Duplicate platform type é‡å¤ēš„å¹³å°ē±»åž‹ - + Platform type redefined å¹³å°ē±»åž‹é‡å®šä¹‰ - + Unknown element ä½ē½®å…ƒē“  - + Failed to load the selected library '%1'. %2 é€‰ę‹©ēš„åŗ“ '%1' åŠ č½½å¤±č“„ć€‚ %2 - - - - + + + + Error 错误 @@ -1136,138 +1136,138 @@ Do you want to load this project file instead? 加载 %1 å¤±č“„ć€‚ę‚Øēš„ Cppcheck å®‰č£…å·²ęŸåć€‚ę‚ØåÆä»„åœØå‘½ä»¤č”Œę·»åŠ  --data-dir=<目录> å‚ę•°ę„ęŒ‡å®šę–‡ä»¶ä½ē½®ć€‚čÆ·ę³Øę„ļ¼Œ'--data-dir' å‚ę•°åŗ”å½“ē”±å®‰č£…č„šęœ¬ä½æē”Øļ¼Œå› ę­¤ļ¼Œå½“ä½æē”Øę­¤å‚ę•°ę—¶ļ¼ŒGUIäøä¼šåÆåŠØļ¼Œę‰€å‘ē”Ÿēš„äø€åˆ‡åŖę˜Æé…ē½®äŗ†č®¾ē½®ć€‚ - - + + XML files (*.xml) XML ꖇ件(*.xml) - + Open the report file ę‰“å¼€ęŠ„å‘Šę–‡ä»¶ - + License č®øåÆčÆ - + Authors ä½œč€… - + Save the report file äæå­˜ęŠ„å‘Šę–‡ä»¶ - + Text files (*.txt) ę–‡ęœ¬ę–‡ä»¶(*.txt) - + CSV files (*.csv) CSV ꖇ件(*.csv) - + Project files (*.cppcheck);;All files(*.*) 锹目文件(*.cppcheck);;ę‰€ęœ‰ę–‡ä»¶(*.*) - + Select Project File 选择锹目文件 - + Failed to open file - + Unknown project file format - + Failed to import project file - + Failed to import '%1': %2 Analysis is stopped. - + Failed to import '%1' (%2), analysis is stopped - + Install - + New version available: %1. %2 - - - + + + Project: 锹目: - + No suitable files found to analyze! ę²”ęœ‰ę‰¾åˆ°åˆé€‚ēš„ę–‡ä»¶ę„åˆ†ęž! - + C/C++ Source C/C++ 源码 - + Compile database Compile database - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze é€‰ę‹©č¦åˆ†ęžēš„ę–‡ä»¶ - + Select directory to analyze é€‰ę‹©č¦åˆ†ęžēš„ē›®å½• - + Select the configuration that will be analyzed é€‰ę‹©č¦åˆ†ęžēš„é…ē½® - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? @@ -1276,44 +1276,44 @@ Do you want to proceed analysis without using any of these project files? - + Duplicate define - + File not found: '%1' - + Failed to load/setup addon %1: %2 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1324,7 +1324,7 @@ Do you want to proceed? ä½ ęƒ³ē»§ē»­å—? - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1333,77 +1333,77 @@ Do you want to stop the analysis and exit Cppcheck? ę‚Øęƒ³åœę­¢åˆ†ęžå¹¶é€€å‡ŗ Cppcheck å—ļ¼Ÿ - + About - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML ꖇ件 (*.xml);;ę–‡ęœ¬ę–‡ä»¶ (*.txt);;CSV ꖇ件 (*.csv) - + Build dir '%1' does not exist, create it? ęž„å»ŗę–‡ä»¶å¤¹ '%1' äøčƒ½å­˜åœØļ¼Œåˆ›å»ŗå®ƒå—ļ¼Ÿ - + To check the project using addons, you need a build directory. č¦ä½æē”Øę’ä»¶ę£€ęŸ„é”¹ē›®ļ¼Œę‚Øéœ€č¦äø€äøŖęž„å»ŗē›®å½•ć€‚ - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1412,22 +1412,22 @@ Do you want to stop the analysis and exit Cppcheck? 导兄 '%1' å¤±č“„ļ¼Œåˆ†ęžå·²åœę­¢ - + Project files (*.cppcheck) 锹目文件 (*.cppcheck) - + Select Project Filename é€‰ę‹©é”¹ē›®ę–‡ä»¶å - + No project file loaded é”¹ē›®ę–‡ä»¶ęœŖåŠ č½½ - + The project file %1 diff --git a/gui/cppcheck_zh_TW.ts b/gui/cppcheck_zh_TW.ts index 1de96423481..841650ba5b1 100644 --- a/gui/cppcheck_zh_TW.ts +++ b/gui/cppcheck_zh_TW.ts @@ -427,18 +427,18 @@ Parameters: -l(line) (file) - - - - - - - - - - - - + + + + + + + + + + + + Cppcheck Cppcheck @@ -640,7 +640,7 @@ Parameters: -l(line) (file) - + Show errors 锯示錯誤 @@ -768,7 +768,7 @@ Parameters: -l(line) (file) - + Show warnings é”Æē¤ŗč­¦å‘Š @@ -1043,15 +1043,15 @@ Options: - + Quick Filter: åæ«é€ŸēÆ©éø: - - - + + + Project: 專攈: @@ -1063,175 +1063,175 @@ This is probably because the settings were changed between the Cppcheck versions - + No suitable files found to analyze! ę‰¾äøåˆ°é©åˆēš„ęŖ”ę”ˆä¾†åˆ†ęžļ¼ - + You must close the project file before selecting new files or directories! ę‚Øåæ…é ˆåœØéøå–ę–°ęŖ”ę”ˆęˆ–ē›®éŒ„ä¹‹å‰é—œé–‰č©²å°ˆę”ˆęŖ”ļ¼ - + C/C++ Source C/C++ 來源檔 - + Compile database 編譯資料庫 - + Visual Studio Visual Studio - + Borland C++ Builder 6 Borland C++ Builder 6 - + Select files to analyze éøå–č¦åˆ†ęžēš„ęŖ”ę”ˆ - + Select directory to analyze éøå–č¦åˆ†ęžēš„ē›®éŒ„ - + Select configuration éøå–ēµ„ę…‹ - + Select the configuration that will be analyzed éøå–č¦åˆ†ęžēš„ēµ„ę…‹ - + Found project file: %1 Do you want to load this project file instead? - + Found project files from the directory. Do you want to proceed analysis without using any of these project files? - - + + Information č³‡čØŠ - + The library '%1' contains unknown elements: %2 - + File not found ę‰¾äøåˆ°ęŖ”ę”ˆ - + Bad XML - + Missing attribute - + Bad attribute value - + Unsupported format ęœŖę”Æę“ēš„ę ¼å¼ - + Duplicate platform type é‡č¤‡ēš„å¹³č‡ŗåž‹åˆ„ - + Platform type redefined å¹³č‡ŗåž‹åˆ„é‡å®šē¾© - + Duplicate define - + Unknown element ęœŖēŸ„ēš„å…ƒē“  - + Failed to load the selected library '%1'. %2 ē„”ę³•č¼‰å…„éøå–ēš„ēØ‹å¼åŗ« '%1'怂 %2 - + File not found: '%1' - + Failed to load/setup addon %1: %2 - - - - + + + + Error 錯誤 - + Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir=<directory> at the command line to specify where this file is located. Please note that --data-dir is supposed to be used by installation scripts and therefore the GUI does not start when it is used, all that happens is that the setting is configured. Analysis is aborted. - + Failed to load %1 - %2 Analysis is aborted. - - + + %1 Analysis is aborted. - + Current results will be cleared. Opening a new XML file will clear current results. @@ -1239,18 +1239,18 @@ Do you want to proceed? - - + + XML files (*.xml) XML ęŖ”ę”ˆ (*.xml) - + Open the report file é–‹å•Ÿå ±å‘ŠęŖ” - + Analyzer is running. Do you want to stop the analysis and exit Cppcheck? @@ -1259,77 +1259,77 @@ Do you want to stop the analysis and exit Cppcheck? ę‚Øęƒ³åœę­¢åˆ†ęžäø¦é›¢é–‹ Cppcheck å—Žļ¼Ÿ - + About é—œę–¼ - + License ęŽˆę¬Š - + Authors ä½œč€… - + XML files (*.xml);;Text files (*.txt);;CSV files (*.csv) XML ęŖ”ę”ˆ (*.xml);;文字檔 (*.txt);;CSV ęŖ”ę”ˆ (*.csv) - + Save the report file å„²å­˜å ±å‘ŠęŖ” - + Text files (*.txt) 文字檔 (*.txt) - + CSV files (*.csv) CSV ęŖ”ę”ˆ (*.csv) - + Project files (*.cppcheck);;All files(*.*) å°ˆę”ˆęŖ” (*.cppcheck);;ę‰€ęœ‰ęŖ”ę”ˆ (*.*) - + Select Project File éøå–å°ˆę”ˆęŖ” - + Build dir '%1' does not exist, create it? å»ŗē½®ē›®éŒ„ '%1' äøå­˜åœØļ¼Œę˜Æå¦å»ŗē«‹å®ƒļ¼Ÿ - + To check the project using addons, you need a build directory. - + Failed to open file ē„”ę³•é–‹å•ŸęŖ”ę”ˆ - + Unknown project file format ęœŖēŸ„ēš„å°ˆę”ˆęŖ”ę ¼å¼ - + Failed to import project file ē„”ę³•åŒÆå…„å°ˆę”ˆęŖ” - + Failed to import '%1': %2 Analysis is stopped. @@ -1338,62 +1338,62 @@ Analysis is stopped. åœę­¢åˆ†ęžć€‚ - + Failed to import '%1' (%2), analysis is stopped - + Show Mandatory - + Show Required - + Show Advisory - + Show Document - + Show L1 - + Show L2 - + Show L3 - + Show style - + Show portability - + Show performance - + Show information @@ -1402,22 +1402,22 @@ Analysis is stopped. ē„”ę³•åŒÆå…„ '%1'ļ¼Œåœę­¢åˆ†ęž - + Project files (*.cppcheck) å°ˆę”ˆęŖ” (*.cppcheck) - + Select Project Filename éøå–å°ˆę”ˆęŖ”ę”ˆåēØ± - + No project file loaded - + The project file %1 @@ -1434,12 +1434,12 @@ Do you want to remove the file from the recently used projects -list? ę‚Øč¦å¾žęœ€čæ‘ä½æē”Øēš„å°ˆę”ˆåˆ—č”Øäø­ē§»é™¤č©²ęŖ”ę”ˆå—Žļ¼Ÿ - + Install 安章 - + New version available: %1. %2 åÆē”Øēš„ę–°ē‰ˆęœ¬: %1. %2 From 9becbb6e8a3b98f080fbf2a44e18997602f65c5b Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 12 Jun 2026 15:50:12 +0200 Subject: [PATCH 067/171] Partial fix for #14833 FN returnDanglingLifetime with memcpy() (#8647) --- cfg/std.cfg | 28 ++++++++++++++-------------- test/cfg/std.cpp | 18 +++++++++++++++--- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/cfg/std.cfg b/cfg/std.cfg index ec5fbb72548..245142c091d 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -3989,7 +3989,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false @@ -4010,7 +4010,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false @@ -4056,7 +4056,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun false - + arg1 @@ -4077,7 +4077,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun false - + arg1 @@ -4118,7 +4118,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false @@ -4136,7 +4136,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false @@ -4812,7 +4812,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false @@ -4828,9 +4828,9 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + - + arg1 false @@ -4942,7 +4942,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false @@ -5057,7 +5057,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false @@ -5123,10 +5123,10 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
- + false - + arg1 @@ -5373,7 +5373,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun - + arg1 false diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index 0344b98455c..77c9d99cd5d 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -869,7 +869,7 @@ char * overlappingWriteFunction_strncat(const char *src, char *dest, const std:: // cppcheck-suppress overlappingWriteFunction (void)strncat(dest, dest+1, 2); char buffer[] = "strncat"; - // cppcheck-suppress overlappingWriteFunction + // cppcheck-suppress [overlappingWriteFunction,returnDanglingLifetime] return strncat(buffer, buffer + 1, 3); } @@ -882,7 +882,7 @@ wchar_t * overlappingWriteFunction_wcsncat(const wchar_t *src, wchar_t *dest, co // cppcheck-suppress overlappingWriteFunction (void)wcsncat(dest, dest+1, 2); wchar_t buffer[] = L"strncat"; - // cppcheck-suppress overlappingWriteFunction + // cppcheck-suppress [overlappingWriteFunction,returnDanglingLifetime] return wcsncat(buffer, buffer + 1, 3); } @@ -917,8 +917,8 @@ char * overlappingWriteFunction_strncpy(char *buf, const std::size_t count) void * overlappingWriteFunction_memmove(void) { - // No warning shall be shown: char str[] = "memmove handles overlapping data well"; + // cppcheck-suppress returnDanglingLifetime return memmove(str,str+3,4); } @@ -4982,6 +4982,18 @@ std::span returnDanglingLifetime_std_span1() { } #endif +void* returnDanglingLifetime_memcpy() { // #14833 + char a[4]; + // cppcheck-suppress returnDanglingLifetime + return memcpy(a, "abc", 4); +} + +wchar_t* returnDanglingLifetime_wcscat() { + wchar_t a[10]{L"abc"}; + // cppcheck-suppress returnDanglingLifetime + return wcscat(a, L"def"); +} + void beginEnd() { std::vector v; From 2fac13df7df98b719c411e9b26bc2a8e641a8372 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sun, 14 Jun 2026 22:32:36 +0200 Subject: [PATCH 068/171] Fix #14838 FP invalidLifetime, objectIndex with copy to pointer alias (#8649) Co-authored-by: chrchr-github --- lib/valueflow.cpp | 2 +- test/testvalueflow.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 64a48285fdc..68e989c0738 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -2591,7 +2591,7 @@ static void valueFlowLifetimeFunction(Token *tok, const TokenList &tokenlist, Er std::vector args = getArguments(tok); if (iArg > 0 && iArg <= args.size()) { const Token* varTok = args[iArg - 1]; - if (varTok->variable() && varTok->variable()->isLocal()) + if (varTok->variable() && varTok->variable()->isLocal() && varTok->variable()->isArray()) LifetimeStore{ varTok, "Passed to '" + tok->str() + "'.", ValueFlow::Value::LifetimeKind::Address }.byRef( tok->next(), tokenlist, errorLogger, settings); } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 65f198dcbab..0c8addb3b94 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -908,6 +908,19 @@ class TestValueFlow : public TestFixture { ASSERT_EQUALS(true, lifetimes.size() == 1); ASSERT_EQUALS(true, lifetimes.front() == "a"); } + { + const char code[] = "void f(const char *s, size_t len) {\n" + " char buf[10];\n" + " {\n" + " char *tmp = buf;\n" + " s = strcpy(tmp, s);\n" + " }\n" + " if (s[len] == '\0') {}\n" + "}\n"; + lifetimes = lifetimeValues(code, "s ["); + ASSERT_EQUALS(true, lifetimes.size() == 1); + ASSERT_EQUALS(true, lifetimes.front() == "buf"); + } } void valueFlowArrayElement() { From 987d3b48a3fe1591444e9586da59e62feb4a7510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Berder?= <18538310+francois-berder@users.noreply.github.com> Date: Mon, 15 Jun 2026 00:30:27 +0200 Subject: [PATCH 069/171] fwdanalysis: Remove unused What::ValueFlow mode (#8650) The What::ValueFlow mode and its state (mValueFlow, mValueFlowKnown, KnownAndToken) are not used since commit 921887a281, which switched to valueFlowForwardExpression instead of FwdAnalysis::valueFlow(). --- lib/fwdanalysis.cpp | 85 ++++----------------------------------------- lib/fwdanalysis.h | 14 ++------ 2 files changed, 9 insertions(+), 90 deletions(-) diff --git a/lib/fwdanalysis.cpp b/lib/fwdanalysis.cpp index c45213a4be9..ddcbbbd1fa9 100644 --- a/lib/fwdanalysis.cpp +++ b/lib/fwdanalysis.cpp @@ -30,6 +30,7 @@ #include #include #include +#include static bool isUnchanged(const Token *startToken, const Token *endToken, const std::set &exprVarIds, bool local) { @@ -94,7 +95,7 @@ static bool hasVolatileCastOrVar(const Token *expr) return ret; } -FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token *startToken, const Token *endToken, const std::set &exprVarIds, bool local, bool inInnerClass, int depth) +FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token *startToken, const Token *endToken, const std::set &exprVarIds, bool local, bool inInnerClass, int depth) const { // Parse the given tokens if (++depth > 1000) @@ -155,10 +156,6 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token * } if (tok->str() == "}") { - // Known value => possible value - if (tok->scope() == expr->scope()) - mValueFlowKnown = false; - if (tok->scope()->isLoopScope()) { // check condition const Token *conditionStart = nullptr; @@ -195,65 +192,6 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token * if (Token::simpleMatch(tok, "asm (")) return Result(Result::Type::BAILOUT); - if (mWhat == What::ValueFlow && (Token::Match(tok, "while|for (") || Token::simpleMatch(tok, "do {"))) { - const Token *bodyStart = nullptr; - const Token *conditionStart = nullptr; - if (Token::simpleMatch(tok, "do {")) { - bodyStart = tok->next(); - if (Token::simpleMatch(bodyStart->link(), "} while (")) - conditionStart = bodyStart->link()->tokAt(2); - } else { - conditionStart = tok->next(); - if (Token::simpleMatch(conditionStart->link(), ") {")) - bodyStart = conditionStart->link()->next(); - } - - if (!bodyStart || !conditionStart) - return Result(Result::Type::BAILOUT); - - // Is expr changed in condition? - if (!isUnchanged(conditionStart, conditionStart->link(), exprVarIds, local)) - return Result(Result::Type::BAILOUT); - - // Is expr changed in loop body? - if (!isUnchanged(bodyStart, bodyStart->link(), exprVarIds, local)) - return Result(Result::Type::BAILOUT); - } - - if (mWhat == What::ValueFlow && Token::simpleMatch(tok, "if (") && Token::simpleMatch(tok->linkAt(1), ") {")) { - const Token *bodyStart = tok->linkAt(1)->next(); - const Token *conditionStart = tok->next(); - const Token *condTok = conditionStart->astOperand2(); - if (const ValueFlow::Value* v = condTok->getKnownValue(ValueFlow::Value::ValueType::INT)) { - const bool cond = !!v->intvalue; - if (cond) { - FwdAnalysis::Result result = checkRecursive(expr, bodyStart, bodyStart->link(), exprVarIds, local, true, depth); - if (result.type != Result::Type::NONE) - return result; - } else if (Token::simpleMatch(bodyStart->link(), "} else {")) { - bodyStart = bodyStart->link()->tokAt(2); - FwdAnalysis::Result result = checkRecursive(expr, bodyStart, bodyStart->link(), exprVarIds, local, true, depth); - if (result.type != Result::Type::NONE) - return result; - } - } - tok = bodyStart->link(); - if (isReturnScope(tok, mSettings.library)) - return Result(Result::Type::BAILOUT); - if (Token::simpleMatch(tok, "} else {")) - tok = tok->linkAt(2); - if (!tok) - return Result(Result::Type::BAILOUT); - - // Is expr changed in condition? - if (!isUnchanged(conditionStart, conditionStart->link(), exprVarIds, local)) - return Result(Result::Type::BAILOUT); - - // Is expr changed in condition body? - if (!isUnchanged(bodyStart, bodyStart->link(), exprVarIds, local)) - return Result(Result::Type::BAILOUT); - } - if (!local && Token::Match(tok, "%name% (") && !Token::simpleMatch(tok->linkAt(1), ") {")) { // TODO: this is a quick bailout return Result(Result::Type::BAILOUT); @@ -279,22 +217,15 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token * parent = parent->astParent(); if (parent->str() == "(" && !parent->isCast()) break; - if (isSameExpression(false, expr, parent, mSettings, true, false, nullptr)) { + if (isSameExpression(false, expr, parent, mSettings, true, false, nullptr)) same = true; - if (mWhat == What::ValueFlow) { - KnownAndToken v; - v.known = mValueFlowKnown; - v.token = parent; - mValueFlow.push_back(v); - } - } if (Token::Match(parent, ". %var%") && parent->next()->varId() && exprVarIds.find(parent->next()->varId()) == exprVarIds.end() && isSameExpression(false, expr->astOperand1(), parent->astOperand1(), mSettings, true, false, nullptr)) { other = true; break; } } - if (mWhat != What::ValueFlow && same && Token::simpleMatch(parent->astParent(), "[") && parent == parent->astParent()->astOperand2()) { + if (same && Token::simpleMatch(parent->astParent(), "[") && parent == parent->astParent()->astOperand2()) { return Result(Result::Type::READ); } if (other) @@ -381,8 +312,6 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token * return result1; if (mWhat == What::UnusedValue && result1.type == Result::Type::WRITE && expr->variable() && expr->variable()->isReference()) return result1; - if (mWhat == What::ValueFlow && result1.type == Result::Type::WRITE) - mValueFlowKnown = false; if (mWhat == What::Reassign && result1.type == Result::Type::BREAK) { const Token *scopeEndToken = findNextTokenFromBreak(result1.token); if (scopeEndToken) { @@ -394,8 +323,6 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token * if (Token::simpleMatch(tok->linkAt(1), "} else {")) { const Token *elseStart = tok->linkAt(1)->tokAt(2); const Result &result2 = checkRecursive(expr, elseStart, elseStart->link(), exprVarIds, local, inInnerClass, depth); - if (mWhat == What::ValueFlow && result2.type == Result::Type::WRITE) - mValueFlowKnown = false; if (result2.type == Result::Type::READ || result2.type == Result::Type::BAILOUT) return result2; if (result1.type == Result::Type::WRITE && result2.type == Result::Type::WRITE) @@ -454,7 +381,7 @@ std::set FwdAnalysis::getExprVarIds(const Token* expr, bool* localOu return exprVarIds; } -FwdAnalysis::Result FwdAnalysis::check(const Token* expr, const Token* startToken, const Token* endToken) +FwdAnalysis::Result FwdAnalysis::check(const Token* expr, const Token* startToken, const Token* endToken) const { // all variable ids in expr. bool local = true; @@ -475,7 +402,7 @@ FwdAnalysis::Result FwdAnalysis::check(const Token* expr, const Token* startToke Result result = checkRecursive(expr, startToken, endToken, exprVarIds, local, false); // Break => continue checking in outer scope - while (mWhat!=What::ValueFlow && result.type == FwdAnalysis::Result::Type::BREAK) { + while (result.type == FwdAnalysis::Result::Type::BREAK) { const Token *scopeEndToken = findNextTokenFromBreak(result.token); if (!scopeEndToken) break; diff --git a/lib/fwdanalysis.h b/lib/fwdanalysis.h index 389ea195da2..34d0da24d4d 100644 --- a/lib/fwdanalysis.h +++ b/lib/fwdanalysis.h @@ -25,7 +25,6 @@ #include #include -#include class Token; class Settings; @@ -60,11 +59,6 @@ class FwdAnalysis { */ bool unusedValue(const Token *expr, const Token *startToken, const Token *endToken); - struct KnownAndToken { - bool known{}; - const Token* token{}; - }; - /** Is there some possible alias for given expression */ bool possiblyAliased(const Token *expr, const Token *startToken) const; @@ -80,13 +74,11 @@ class FwdAnalysis { const Token* token{}; }; - Result check(const Token *expr, const Token *startToken, const Token *endToken); - Result checkRecursive(const Token *expr, const Token *startToken, const Token *endToken, const std::set &exprVarIds, bool local, bool inInnerClass, int depth=0); + Result check(const Token *expr, const Token *startToken, const Token *endToken) const; + Result checkRecursive(const Token *expr, const Token *startToken, const Token *endToken, const std::set &exprVarIds, bool local, bool inInnerClass, int depth=0) const; const Settings &mSettings; - enum class What : std::uint8_t { Reassign, UnusedValue, ValueFlow } mWhat = What::Reassign; - std::vector mValueFlow; - bool mValueFlowKnown = true; + enum class What : std::uint8_t { Reassign, UnusedValue } mWhat = What::Reassign; }; #endif // fwdanalysisH From a7faefc9203cf14850ea4e4d35aed0f854eaeccd Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 16 Jun 2026 08:53:23 +0200 Subject: [PATCH 070/171] Fix #14847 Function pointer argument triggers false positive funcArgNamesDifferentUnnamed (#8653) --- lib/checkother.cpp | 4 ++-- test/testother.cpp | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 801dc529568..551c3a47543 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -4043,7 +4043,7 @@ void CheckOtherImpl::checkFuncArgNamesDifferent() definitions[j] = variable->nameToken(); } // get the declaration (search for first token with varId) - while (decl && !Token::Match(decl, ",|)|;")) { + while (decl && !Token::Match(decl, "[,;]")) { // skip everything after the assignment because // it could also have a varId or be the first // token with a varId if there is no name token @@ -4052,7 +4052,7 @@ void CheckOtherImpl::checkFuncArgNamesDifferent() break; } // skip over templates and arrays - if (decl->link() && decl->str() != "(") + if (decl->link() && !Token::Match(decl, "[()]")) decl = decl->link(); else if (decl->varId()) declarations[j] = decl; diff --git a/test/testother.cpp b/test/testother.cpp index 73f10cbe76e..c8a95c9882b 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -12955,6 +12955,10 @@ class TestOther : public TestFixture { "[test.cpp:1:12]: (style, inconclusive) Function 'f' argument 1 names different: declaration 'a' definition ''. [funcArgNamesDifferentUnnamed]\n" "[test.cpp:4:12]: (style, inconclusive) Function 'g' argument 1 names different: declaration '' definition 'b'. [funcArgNamesDifferentUnnamed]\n", errout_str()); + + check("void f(void (*fp)(), int x);\n" // #14847 + "void f(void (*fp)(), int x) {}\n"); + ASSERT_EQUALS("", errout_str()); } void funcArgOrderDifferent() { From 051584cdbd6b0292e55492ea29cc1ef762eab7e1 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 16 Jun 2026 19:28:59 +0200 Subject: [PATCH 071/171] Refs #12986: Tokenizer: don't simplify init list containing default-constructed element (#8640) --- lib/tokenize.cpp | 3 ++- test/testsimplifytokens.cpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index c5b001f5d32..f195cdd7ad6 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3862,7 +3862,8 @@ void Tokenizer::simplifyRedundantConsecutiveBraces() for (Token *tok = list.front(); tok;) { if (Token::simpleMatch(tok, "= {")) { tok = tok->linkAt(1); - } else if (Token::simpleMatch(tok, "{ {") && Token::simpleMatch(tok->linkAt(1), "} }")) { + } else if (Token::simpleMatch(tok, "{ {") && Token::simpleMatch(tok->linkAt(1), "} }") && + !Token::Match(tok->previous(), "%name%")) { //remove internal parentheses tok->linkAt(1)->deleteThis(); tok->deleteNext(); diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 6077438a9cf..2f04653a379 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -1422,6 +1422,7 @@ class TestSimplifyTokens : public TestFixture { ASSERT_EQUALS("void f ( ) { }", tok("void f(){{{}}}")); ASSERT_EQUALS("void f ( ) { for ( ; ; ) { } }", tok("void f () { for(;;){} }")); ASSERT_EQUALS("void f ( ) { { scope_lock lock ; foo ( ) ; } { scope_lock lock ; bar ( ) ; } }", tok("void f () { {scope_lock lock; foo();} {scope_lock lock; bar();} }")); + ASSERT_EQUALS("std :: map < int , int > m { { } } ;", tok("std::map m{ {} };")); } void simplifyOverride() { // ticket #5069 From 1d0ff1a3518ea32b87f175957dfe65cb92e94607 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 16 Jun 2026 21:39:44 +0200 Subject: [PATCH 072/171] Fix #14842 FN memleak in function with trailing return type (regression) (#8651) Co-authored-by: chrchr-github --- lib/tokenize.cpp | 19 +++++++++++++++++-- test/testtokenize.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index f195cdd7ad6..59da46a0b28 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7334,6 +7334,19 @@ void Tokenizer::simplifyVarDecl(const bool only_k_r_fpar) simplifyVarDecl(list.front(), nullptr, only_k_r_fpar); } +static Token* isTrailingReturnType(Token* tok) +{ + while (Token::Match(tok, "%name%|::|>")) { + if (Token* open = tok->findOpeningBracket()) + tok = open->tokAt(-1); + else + tok = tok->tokAt(-1); + } + if (tok && Token::simpleMatch(tok->tokAt(-1), ") .")) + return tok->tokAt(-1); + return nullptr; +} + // cppcheck-suppress functionConst - has side effects void Tokenizer::simplifyVarDecl(Token * tokBegin, const Token * const tokEnd, const bool only_k_r_fpar) { @@ -7361,14 +7374,16 @@ void Tokenizer::simplifyVarDecl(Token * tokBegin, const Token * const tokEnd, co if (!tok->linkAt(1)) syntaxError(tokBegin); // Check for lambdas before skipping - if (Token::Match(tok->tokAt(-2), ") . %name%")) { // trailing return type + if (Token* trailingStart = isTrailingReturnType(tok)) { // TODO: support lambda without parameter clause? - Token* lambdaStart = tok->linkAt(-2)->previous(); + Token* lambdaStart = trailingStart->link()->tokAt(-1); if (Token::simpleMatch(lambdaStart, "]")) lambdaStart = lambdaStart->link(); Token* lambdaEnd = findLambdaEndScope(lambdaStart); if (lambdaEnd) simplifyVarDecl(lambdaEnd->link()->next(), lambdaEnd, only_k_r_fpar); + else + simplifyVarDecl(tok->tokAt(2), tok->linkAt(1), only_k_r_fpar); } else { for (Token* tok2 = tok->next(); tok2 != tok->linkAt(1); tok2 = tok2->next()) { Token* lambdaEnd = findLambdaEndScope(tok2); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 5f4d59503e2..b1e3e87cdcf 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -233,6 +233,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(vardecl32); TEST_CASE(vardecl33); TEST_CASE(vardecl34); + TEST_CASE(vardecl35); TEST_CASE(vardecl_stl_1); TEST_CASE(vardecl_stl_2); TEST_CASE(vardecl_stl_3); @@ -2857,6 +2858,32 @@ class TestTokenizer : public TestFixture { } } + void vardecl35() { // #14842 + { + const char code[] = "auto f() -> void {\n" + " auto p = new int;\n" + " *p = 0;\n" + "}\n"; + ASSERT_EQUALS("auto f ( ) . void {\n" + "auto p ; p = new int ;\n" + "* p = 0 ;\n" + "}", tokenizeAndStringify(code)); + ignore_errout(); + } + { + const char code[] = "auto f() -> ::std::vector {\n" + " int i = 0;\n" + " return { i };\n" + "}"; + ASSERT_EQUALS("auto f ( ) . :: std :: vector < int > {\n" + "int i ; i = 0 ;\n" + "return { i } ;\n" + "}", + tokenizeAndStringify(code)); + ignore_errout(); + } + } + void volatile_variables() { { const char code[] = "volatile int a=0;\n" From 6f17c161fddd038b82072027097de58b4b5f35c0 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 16 Jun 2026 21:48:38 +0200 Subject: [PATCH 073/171] Fix #11751 FP accessMoved after passing value to function (#8646) --- lib/forwardanalyzer.cpp | 2 +- test/testvalueflow.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 5c97528372b..0999a08d908 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -845,7 +845,7 @@ namespace { return Break(); } else if (Token* callTok = callExpr(tok)) { // TODO: Dont traverse tokens a second time - if (start != callTok && tok != callTok && updateRecursive(callTok->astOperand1()) == Progress::Break) + if (start != callTok && tok != callTok && (tok->str() != "." || tok != callTok->astOperand1()) && updateRecursive(callTok->astOperand1()) == Progress::Break) return Break(); // Since the call could be an unknown macro, traverse the tokens as a range instead of recursively if (!Token::simpleMatch(callTok, "( )") && diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 0c8addb3b94..247d2ae6012 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1090,6 +1090,14 @@ class TestValueFlow : public TestFixture { " }\n" "}\n"; ASSERT_EQUALS(false, testValueOfX(code, 13U, ValueFlow::Value::MoveKind::MovedVariable)); + + code = "struct S { int f(int); };\n" // #11751 + "S g(S);\n" + "void h() {\n" + " S x;\n" + " g(std::move(x)).f(1);\n" + "}\n"; + ASSERT_EQUALS(false, testValueOfX(code, 5U, ValueFlow::Value::MoveKind::MovedVariable)); } void valueFlowCalculations() { From 4a4e12d323cefc23ed5066cffbfbcf988c80b351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 16 Jun 2026 22:13:05 +0200 Subject: [PATCH 074/171] fixed #14084 - run CMake with `--warn-uninitialized` in CI (#8290) --- .github/workflows/CI-unixish-docker.yml | 2 +- .github/workflows/CI-unixish.yml | 40 +++++++++++++------------ .github/workflows/CI-windows.yml | 6 ++-- .github/workflows/clang-tidy.yml | 2 +- .github/workflows/iwyu.yml | 4 +-- .github/workflows/release-windows.yml | 2 +- .github/workflows/sanitizers.yml | 2 +- .github/workflows/selfcheck.yml | 10 +++---- cmake/options.cmake | 2 +- 9 files changed, 36 insertions(+), 34 deletions(-) diff --git a/.github/workflows/CI-unixish-docker.yml b/.github/workflows/CI-unixish-docker.yml index a38feb452f0..16c1615ed04 100644 --- a/.github/workflows/CI-unixish-docker.yml +++ b/.github/workflows/CI-unixish-docker.yml @@ -72,7 +72,7 @@ jobs: - name: Run CMake run: | - cmake -S . -B cmake.output -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=${{ matrix.with_gui }} -DWITH_QCHART=On -DBUILD_TRIAGE=${{ matrix.with_gui }} -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=${{ matrix.with_gui }} -DWITH_QCHART=On -DBUILD_TRIAGE=${{ matrix.with_gui }} -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - name: CMake build if: matrix.full_build diff --git a/.github/workflows/CI-unixish.yml b/.github/workflows/CI-unixish.yml index 3251a6b5adb..4a7d94c4057 100644 --- a/.github/workflows/CI-unixish.yml +++ b/.github/workflows/CI-unixish.yml @@ -58,13 +58,13 @@ jobs: - name: CMake build on ubuntu (with GUI / system tinyxml2) if: contains(matrix.os, 'ubuntu') run: | - cmake -S . -B cmake.output.tinyxml2 -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_BUNDLED_TINYXML2=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + cmake -S . -B cmake.output.tinyxml2 -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_BUNDLED_TINYXML2=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache cmake --build cmake.output.tinyxml2 -- -j$(nproc) - name: CMake build on macos (with GUI / system tinyxml2) if: contains(matrix.os, 'macos') run: | - cmake -S . -B cmake.output.tinyxml2 -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_BUNDLED_TINYXML2=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 + cmake -S . -B cmake.output.tinyxml2 -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_BUNDLED_TINYXML2=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 cmake --build cmake.output.tinyxml2 -- -j$(nproc) - name: Run CMake test (system tinyxml2) @@ -127,12 +127,12 @@ jobs: - name: Run CMake on ubuntu (with GUI) if: contains(matrix.os, 'ubuntu') run: | - cmake -S . -B cmake.output -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install - name: Run CMake on macos (with GUI) if: contains(matrix.os, 'macos') run: | - cmake -S . -B cmake.output -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 - name: Run CMake build run: | @@ -154,13 +154,13 @@ jobs: - name: Run CMake on ubuntu (no CLI) if: matrix.os == 'ubuntu-22.04' run: | - cmake -S . -B cmake.output_nocli -Werror=dev -DBUILD_TESTING=Off -DBUILD_CLI=Off + cmake -S . -B cmake.output_nocli -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DBUILD_CLI=Off - name: Run CMake on ubuntu (no CLI / with tests) if: matrix.os == 'ubuntu-22.04' run: | # the test and CLI code are too intertwined so for now we need to reject that - if cmake -S . -B cmake.output_nocli_tests -Werror=dev -DBUILD_TESTING=On -DBUILD_CLI=Off; then + if cmake -S . -B cmake.output_nocli_tests -Werror=dev --warn-uninitialized -DBUILD_TESTING=On -DBUILD_CLI=Off; then exit 1 else exit 0 @@ -169,18 +169,18 @@ jobs: - name: Run CMake on ubuntu (no CLI / with GUI) if: matrix.os == 'ubuntu-22.04' run: | - cmake -S . -B cmake.output_nocli_gui -Werror=dev -DBUILD_TESTING=Off -DBUILD_CLI=Off -DBUILD_GUI=On + cmake -S . -B cmake.output_nocli_gui -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DBUILD_CLI=Off -DBUILD_GUI=On - name: Run CMake on ubuntu (no GUI) if: matrix.os == 'ubuntu-22.04' run: | - cmake -S . -B cmake.output_nogui -Werror=dev -DBUILD_TESTING=Off -DBUILD_GUI=Off + cmake -S . -B cmake.output_nogui -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DBUILD_GUI=Off - name: Run CMake on ubuntu (no GUI / with triage) if: matrix.os == 'ubuntu-22.04' run: | # cannot build triage without GUI - if cmake -S . -B cmake.output_nogui_triage -Werror=dev -DBUILD_TESTING=Off -DBUILD_GUI=Off -DBUILD_TRIAGE=On; then + if cmake -S . -B cmake.output_nogui_triage -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DBUILD_GUI=Off -DBUILD_TRIAGE=On; then exit 1 else exit 0 @@ -189,7 +189,7 @@ jobs: - name: Run CMake on ubuntu (no CLI / no GUI) if: matrix.os == 'ubuntu-22.04' run: | - cmake -S . -B cmake.output_nocli_nogui -Werror=dev -DBUILD_TESTING=Off -DBUILD_GUI=Off + cmake -S . -B cmake.output_nocli_nogui -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DBUILD_GUI=Off build_cmake_cxxstd: @@ -243,12 +243,12 @@ jobs: - name: Run CMake on ubuntu (with GUI) if: contains(matrix.os, 'ubuntu') run: | - cmake -S . -B cmake.output -Werror=dev -DCMAKE_CXX_STANDARD=${{ matrix.cxxstd }} -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DCMAKE_CXX_STANDARD=${{ matrix.cxxstd }} -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - name: Run CMake on macos (with GUI) if: contains(matrix.os, 'macos') run: | - cmake -S . -B cmake.output -Werror=dev -DCMAKE_CXX_STANDARD=${{ matrix.cxxstd }} -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DCMAKE_CXX_STANDARD=${{ matrix.cxxstd }} -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DQt6_DIR=$(brew --prefix qt@6)/lib/cmake/Qt6 - name: Run CMake build run: | @@ -373,7 +373,7 @@ jobs: run: | # make sure we fail when Boost is requested and not available. # will fail because no package configuration is available. - if cmake -S . -B cmake.output.boost-force-noavail -Werror=dev -DBUILD_TESTING=Off -DUSE_BOOST=On; then + if cmake -S . -B cmake.output.boost-force-noavail -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DUSE_BOOST=On; then exit 1 else exit 0 @@ -386,12 +386,12 @@ jobs: - name: Run CMake on macOS (force Boost) run: | - cmake -S . -B cmake.output.boost-force -Werror=dev -DBUILD_TESTING=Off -DUSE_BOOST=On + cmake -S . -B cmake.output.boost-force -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DUSE_BOOST=On - name: Run CMake on macOS (no Boost) run: | # make sure Boost is not used when disabled even though it is available - cmake -S . -B cmake.output.boost-no -Werror=dev -DBUILD_TESTING=Off -DUSE_BOOST=Off + cmake -S . -B cmake.output.boost-no -Werror=dev --warn-uninitialized -DBUILD_TESTING=Off -DUSE_BOOST=Off if grep -q '\-DHAVE_BOOST' ./cmake.output.boost-no/compile_commands.json; then exit 1 else @@ -400,7 +400,7 @@ jobs: - name: Run CMake on macOS (with Boost) run: | - cmake -S . -B cmake.output.boost -Werror=dev -DBUILD_TESTING=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + cmake -S . -B cmake.output.boost -Werror=dev --warn-uninitialized -DBUILD_TESTING=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache grep -q '\-DHAVE_BOOST' ./cmake.output.boost/compile_commands.json - name: Build with CMake on macOS (with Boost) @@ -436,11 +436,13 @@ jobs: - name: Run CMake (without GUI) run: | export PATH=cmake-${{ env.CMAKE_VERSION_FULL }}-linux-x86_64/bin:$PATH + # FIXME: cannot use --warn-uninitialized here as it completely breaks the build cmake -S . -B cmake.output -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On - name: Run CMake (with GUI) run: | export PATH=cmake-${{ env.CMAKE_VERSION_FULL }}-linux-x86_64/bin:$PATH + # FIXME: cannot use --warn-uninitialized here as it completely breaks the build cmake -S . -B cmake.output.gui -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On build: @@ -596,7 +598,7 @@ jobs: - name: Test Signalhandler run: | - cmake -S . -B build.cmake.signal -Werror=dev -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On + cmake -S . -B build.cmake.signal -Werror=dev --warn-uninitialized -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On cmake --build build.cmake.signal --target test-signalhandler -- -j$(nproc) # TODO: how to run this without copying the file? cp build.cmake.signal/bin/test-s* . @@ -607,7 +609,7 @@ jobs: - name: Test Stacktrace if: contains(matrix.os, 'ubuntu') run: | - cmake -S . -B build.cmake.stack -Werror=dev -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On + cmake -S . -B build.cmake.stack -Werror=dev --warn-uninitialized -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On cmake --build build.cmake.stack --target test-stacktrace -- -j$(nproc) # TODO: how to run this without copying the file? cp build.cmake.stack/bin/test-s* . @@ -734,7 +736,7 @@ jobs: - name: CMake run: | - cmake -S . -B cmake.output -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DENABLE_CHECK_INTERNAL=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DENABLE_CHECK_INTERNAL=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On - name: Generate dependencies run: | diff --git a/.github/workflows/CI-windows.yml b/.github/workflows/CI-windows.yml index a76997eb007..f9d108eefc9 100644 --- a/.github/workflows/CI-windows.yml +++ b/.github/workflows/CI-windows.yml @@ -52,7 +52,7 @@ jobs: run: | rem TODO: enable rules? rem specify Release build so matchcompiler is used - cmake -S . -B build -Werror=dev -DCMAKE_BUILD_TYPE=Release -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DBUILD_TESTING=Off -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DBUILD_ONLINE_HELP=On -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! + cmake -S . -B build -Werror=dev --warn-uninitialized -DCMAKE_BUILD_TYPE=Release -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DBUILD_TESTING=Off -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DBUILD_ONLINE_HELP=On -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! - name: Build GUI release run: | @@ -91,7 +91,7 @@ jobs: - name: Run CMake run: | - cmake -S . -B build.cxxstd -Werror=dev -A x64 -DCMAKE_CXX_STANDARD=${{ matrix.cxxstd }} -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! + cmake -S . -B build.cxxstd -Werror=dev --warn-uninitialized -A x64 -DCMAKE_CXX_STANDARD=${{ matrix.cxxstd }} -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! - name: Build run: | @@ -270,7 +270,7 @@ jobs: - name: Test SEH wrapper if: matrix.config == 'release' run: | - cmake -S . -B build.cmake.seh -Werror=dev -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! + cmake -S . -B build.cmake.seh -Werror=dev --warn-uninitialized -DBUILD_TESTING=On -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! cmake --build build.cmake.seh --target test-sehwrapper || exit /b !errorlevel! :: TODO: how to run this without copying the file? copy build.cmake.seh\bin\Debug\test-sehwrapper.exe . || exit /b !errorlevel! diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml index c4f8cc0cf6b..7a5b317693a 100644 --- a/.github/workflows/clang-tidy.yml +++ b/.github/workflows/clang-tidy.yml @@ -61,7 +61,7 @@ jobs: - name: Prepare CMake run: | - cmake -S . -B cmake.output -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_COMPILE_WARNING_AS_ERROR=On + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_COMPILE_WARNING_AS_ERROR=On env: CC: clang-22 CXX: clang++-22 diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml index 3b972dca443..de047b8d10a 100644 --- a/.github/workflows/iwyu.yml +++ b/.github/workflows/iwyu.yml @@ -126,7 +126,7 @@ jobs: - name: Prepare CMake run: | # TODO: re-enable HAVE_RULES - cmake -S . -B cmake.output -Werror=dev -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=Off -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.stdlib == 'libc++' }} + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=Off -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.stdlib == 'libc++' }} env: CC: clang CXX: clang++ @@ -234,7 +234,7 @@ jobs: - name: Prepare CMake run: | # TODO: re-enable HAVE_RULES - cmake -S . -B cmake.output -Werror=dev -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=Off -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.use_libcxx }} + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=Off -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.use_libcxx }} env: CC: clang-22 CXX: clang++-22 diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml index f59e77a2dca..8d09a55302e 100644 --- a/.github/workflows/release-windows.yml +++ b/.github/workflows/release-windows.yml @@ -85,7 +85,7 @@ jobs: run: | :: TODO: enable rules? :: specify Release build so matchcompiler is used - cmake -S . -B build -Werror=dev -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=Off -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_ONLINE_HELP=On -DUSE_BOOST=ON -DBOOST_INCLUDEDIR=%GITHUB_WORKSPACE%\boost -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! + cmake -S . -B build -Werror=dev --warn-uninitialized -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=Off -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_ONLINE_HELP=On -DUSE_BOOST=ON -DBOOST_INCLUDEDIR=%GITHUB_WORKSPACE%\boost -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! cmake --build build --target cppcheck-gui --config Release || exit /b !errorlevel! # TODO: package PDBs diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml index d7ff31939d0..ea0a0276c99 100644 --- a/.github/workflows/sanitizers.yml +++ b/.github/workflows/sanitizers.yml @@ -96,7 +96,7 @@ jobs: - name: CMake run: | - cmake -S . -B cmake.output -Werror=dev -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify ${{ matrix.cmake_opts }} -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify ${{ matrix.cmake_opts }} -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache env: CC: clang-22 CXX: clang++-22 diff --git a/.github/workflows/selfcheck.yml b/.github/workflows/selfcheck.yml index dcdf8bfbdd3..6bd87f9243f 100644 --- a/.github/workflows/selfcheck.yml +++ b/.github/workflows/selfcheck.yml @@ -64,7 +64,7 @@ jobs: # unusedFunction - start - name: CMake run: | - cmake -S . -B cmake.output -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=ON -DWITH_QCHART=ON -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off + cmake -S . -B cmake.output -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=On -DBUILD_GUI=ON -DWITH_QCHART=ON -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off - name: Generate dependencies run: | @@ -90,7 +90,7 @@ jobs: # unusedFunction notest - start - name: CMake (no test) run: | - cmake -S . -B cmake.output.notest -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=Off -DBUILD_GUI=ON -DBUILD_TRIAGE=On -DWITH_QCHART=ON -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off + cmake -S . -B cmake.output.notest -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=Off -DBUILD_GUI=ON -DBUILD_TRIAGE=On -DWITH_QCHART=ON -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off - name: Generate dependencies (no test) run: | @@ -112,7 +112,7 @@ jobs: # unusedFunction notest nogui - start - name: CMake (no test / no gui) run: | - cmake -S . -B cmake.output.notest_nogui -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=Off -DENABLE_CHECK_INTERNAL=On -DCPPCHK_GLIBCXX_DEBUG=Off + cmake -S . -B cmake.output.notest_nogui -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=Off -DENABLE_CHECK_INTERNAL=On -DCPPCHK_GLIBCXX_DEBUG=Off - name: Generate dependencies (no test / no gui) run: | @@ -131,7 +131,7 @@ jobs: # unusedFunction notest nocli - start - name: CMake (no test / no cli) run: | - cmake -S . -B cmake.output.notest_nocli -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=Off -DBUILD_CLI=Off -DBUILD_GUI=ON -DWITH_QCHART=ON -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off + cmake -S . -B cmake.output.notest_nocli -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=Off -DBUILD_CLI=Off -DBUILD_GUI=ON -DWITH_QCHART=ON -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off - name: Generate dependencies (no test / no cli) run: | @@ -154,7 +154,7 @@ jobs: # unusedFunction notest nocli nogui - start - name: CMake (no test / no cli / no gui) run: | - cmake -S . -B cmake.output.notest_nocli_nogui -Werror=dev -DHAVE_RULES=On -DBUILD_TESTING=Off -DBUILD_CLI=Off -DBUILD_GUI=Off -DENABLE_CHECK_INTERNAL=On -DCPPCHK_GLIBCXX_DEBUG=Off + cmake -S . -B cmake.output.notest_nocli_nogui -Werror=dev --warn-uninitialized -DHAVE_RULES=On -DBUILD_TESTING=Off -DBUILD_CLI=Off -DBUILD_GUI=Off -DENABLE_CHECK_INTERNAL=On -DCPPCHK_GLIBCXX_DEBUG=Off - name: Generate dependencies (no test / no cli / no gui) run: | diff --git a/cmake/options.cmake b/cmake/options.cmake index d640710e428..0fa27e4734b 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -145,7 +145,7 @@ string(LENGTH "${FILESDIR}" _filesdir_len) # override FILESDIR if it is set or empty if(FILESDIR OR ${_filesdir_len} EQUAL 0) # TODO: verify that it is an absolute path? - set(FILESDIR_DEF ${FILESDIR}) + set(FILESDIR_DEF "${FILESDIR}") else() set(FILESDIR_DEF ${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME} CACHE STRING "Cppcheck files directory") endif() From 0d7884dad223e7f472b4af125e4e04fdc9d6bb02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Berder?= <18538310+francois-berder@users.noreply.github.com> Date: Wed, 17 Jun 2026 08:45:11 +0200 Subject: [PATCH 075/171] Fix #958: warn when feof() is used as a while loop condition (#8422) feof() only returns true after a read has already failed, causing the loop body to execute once more after the last successful read. Read errors also go undetected since feof() does not distinguish them from EOF. --------- Signed-off-by: Francois Berder --- lib/checkers.cpp | 1 + lib/checkio.cpp | 133 +++++++++++++++++++++++++++++++++ lib/checkio.h | 4 + man/checkers/wrongfeofUsage.md | 42 +++++++++++ releasenotes.txt | 2 +- test/cli/other_test.py | 8 +- test/testio.cpp | 50 +++++++++++++ 7 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 man/checkers/wrongfeofUsage.md diff --git a/lib/checkers.cpp b/lib/checkers.cpp index 3b425926b9e..cc8c4054ea2 100644 --- a/lib/checkers.cpp +++ b/lib/checkers.cpp @@ -101,6 +101,7 @@ namespace checkers { {"CheckFunctions::useStandardLibrary","style"}, {"CheckIO::checkCoutCerrMisusage","c"}, {"CheckIO::checkFileUsage",""}, + {"CheckIO::checkWrongfeofUsage",""}, {"CheckIO::checkWrongPrintfScanfArguments",""}, {"CheckIO::invalidScanf",""}, {"CheckLeakAutoVar::check","notclang"}, diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 8012d540898..f632ca99e9e 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -507,6 +507,137 @@ void CheckIOImpl::invalidScanfError(const Token *tok) CWE119, Certainty::normal); } +static const Token* findFileReadCall(const Token *start, const Token *end, int varid) +{ + const Token* found = Token::findmatch(start, "fgets|fgetc|getc|fread|fscanf (", end); + while (found) { + const std::vector args = getArguments(found); + if (!args.empty()) { + const bool match = (found->str() == "fscanf") + ? args.front()->varId() == varid + : args.back()->varId() == varid; + if (match) + return found; + } + found = Token::findmatch(found->next(), "fgets|fgetc|getc|fread|fscanf (", end); + } + return nullptr; +} + +void CheckIOImpl::checkWrongfeofUsage() +{ + const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); + + logChecker("CheckIO::checkWrongfeofUsage"); + + for (const Scope * scope : symbolDatabase->functionScopes) { + for (const Token *tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { + // TODO: Handle for loops + if (!Token::Match(tok, "while ( ! feof ( %var% )")) + continue; + + // Bail out if we cannot identify file pointer + const int fpVarId = tok->tokAt(5)->varId(); + if (fpVarId == 0) + continue; + + const Token *endCond = tok->linkAt(1); + const Token *bodyStart; + const Token *bodyEnd; + + if (Token::simpleMatch(tok->previous(), "}") && tok->previous()->scope()->type == ScopeType::eDo) { + bodyEnd = tok->previous(); + bodyStart = bodyEnd->link(); + } else { + if (!Token::simpleMatch(endCond, ") {")) + continue; + bodyEnd = endCond->linkAt(1); + bodyStart = endCond->next(); + } + + // Bail out if the loop contains control flow (too complex to analyze) + if (Token::findmatch(bodyStart, "return|break|goto|continue|throw", bodyEnd)) + continue; + + // Bail out if fp is used outside of known file I/O functions. + // If it is passed to an unknown function, reads may occur there. + bool fpUsedElsewhere = false; + for (const Token *t = bodyStart->next(); t && t != bodyEnd; t = t->next()) { + if (t->varId() != fpVarId) + continue; + const Token *p = t->astParent(); + while (p && p->str() == ",") + p = p->astParent(); + if (!p || !Token::Match(p->astOperand1(), "fgets|fgetc|getc|fread|fscanf|fprintf|fwrite|fputs|fputc|putc")) { + fpUsedElsewhere = true; + break; + } + } + if (fpUsedElsewhere) + continue; + + // No file read call in the loop: feof can never become true inside it + const Token *loopFileReadCallTok = findFileReadCall(bodyStart, bodyEnd, fpVarId); + if (!loopFileReadCallTok) { + // TODO: Warn about infinite loop + continue; + } + + // Find last file read + const Token *lastLoopFileReadCallTok = loopFileReadCallTok; + while (loopFileReadCallTok) { + lastLoopFileReadCallTok = loopFileReadCallTok; + loopFileReadCallTok = findFileReadCall(lastLoopFileReadCallTok->next(), bodyEnd, fpVarId); + } + + // Warn if the destination of the last file read is used after the call before bodyEnd. + // If it is not, the stale buffer is never accessed on the extra iteration at EOF. + + if (lastLoopFileReadCallTok->str() == "fgetc" || lastLoopFileReadCallTok->str() == "getc") { + // Warn if the return value feeds into an expression (astParent of the call node) + if (lastLoopFileReadCallTok->astParent() && lastLoopFileReadCallTok->astParent()->astParent()) + wrongfeofUsage(getCondTok(tok)); + } else { + const std::vector args = getArguments(lastLoopFileReadCallTok); + // Collect destination varIds + std::vector destVarIds; + if (lastLoopFileReadCallTok->str() == "fscanf") { + // args[0]=fp, args[1]=format, args[2+]=destinations (typically &var) + for (std::size_t i = 2; i < args.size(); ++i) { + const Token *destTok = Token::Match(args[i], "& %var%") ? args[i]->next() : args[i]; + if (destTok->varId() != 0) + destVarIds.push_back(destTok->varId()); + } + } else { + // Handle fgets, fread + // First argument is the destination buffer + if (!args.empty() && args.front()->varId() != 0) + destVarIds.push_back(args.front()->varId()); + } + + // Search for any destination use between this call's ';' and endBody + const Token *semiColonTok = lastLoopFileReadCallTok->linkAt(1)->next(); + for (const Token *t = semiColonTok; t && t != bodyEnd; t = t->next()) { + if (std::find(destVarIds.begin(), destVarIds.end(), t->varId()) != destVarIds.end()) { + wrongfeofUsage(getCondTok(tok)); + break; + } + } + } + } + } +} + +void CheckIOImpl::wrongfeofUsage(const Token * tok) +{ + reportError(tok, Severity::warning, + "wrongfeofUsage", + "Using feof() as a loop condition causes the last line to be processed twice.\n" + "feof() returns true only after a read has failed due to end-of-file, so the loop " + "body executes once more after the last successful read. Check the return value of " + "the read function instead (e.g. fgets, fread, fscanf)."); +} + //--------------------------------------------------------------------------- // printf("%u", "xyz"); // Wrong argument type // printf("%u%s", 1); // Too few arguments @@ -2057,6 +2188,7 @@ void CheckIO::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) checkIO.checkWrongPrintfScanfArguments(); checkIO.checkCoutCerrMisusage(); checkIO.checkFileUsage(); + checkIO.checkWrongfeofUsage(); checkIO.invalidScanf(); } @@ -2072,6 +2204,7 @@ void CheckIO::getErrorMessages(ErrorLogger& errorLogger, const Settings &setting c.fcloseInLoopConditionError(nullptr, "fp"); c.seekOnAppendedFileError(nullptr); c.incompatibleFileOpenError(nullptr, "tmp"); + c.wrongfeofUsage(nullptr); c.invalidScanfError(nullptr); c.wrongPrintfScanfArgumentsError(nullptr, "printf",3,2); c.invalidScanfArgTypeError_s(nullptr, 1, "s", nullptr); diff --git a/lib/checkio.h b/lib/checkio.h index 9f125e6bd7b..dff49006bab 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -82,6 +82,9 @@ class CPPCHECKLIB CheckIOImpl : public CheckImpl { /** @brief scanf can crash if width specifiers are not used */ void invalidScanf(); + /** @brief %Check wrong usage of feof */ + void checkWrongfeofUsage(); + /** @brief %Checks type and number of arguments given to functions like printf or scanf*/ void checkWrongPrintfScanfArguments(); @@ -127,6 +130,7 @@ class CPPCHECKLIB CheckIOImpl : public CheckImpl { void seekOnAppendedFileError(const Token *tok); void incompatibleFileOpenError(const Token *tok, const std::string &filename); void invalidScanfError(const Token *tok); + void wrongfeofUsage(const Token *tok); void wrongPrintfScanfArgumentsError(const Token* tok, const std::string &functionName, nonneg int numFormat, diff --git a/man/checkers/wrongfeofUsage.md b/man/checkers/wrongfeofUsage.md new file mode 100644 index 00000000000..9a3d0bbf5f6 --- /dev/null +++ b/man/checkers/wrongfeofUsage.md @@ -0,0 +1,42 @@ +# wrongfeofUsage + +**Message**: Using feof() as a loop condition causes the last line to be processed twice.
+**Category**: Correctness
+**Severity**: Warning
+**Language**: C/C++ + +## Description + +`feof()` returns non-zero only after a read operation has failed because the end of file was reached. When used as the sole condition of a loop, the loop body executes one extra time after the last successful read: the read fails silently (or returns partial data), and only then does `feof()` return true and terminate the loop. + +This checker matches `while (!feof(fp))` and `do { ... } while (!feof(fp))` loops and warns when all of the following are true: + +- The loop body contains at least one file-read call (`fgets`, `fgetc`, `getc`, `fread`, or `fscanf`) on the same file pointer. +- The destination (return value or output buffer) of the **last** file-read call in the loop is used after that call within the same loop iteration. + +The checker skips loops that contain a control-flow statement (`return`, `break`, `goto`, `continue`, `throw`) as those are too complex to analyze reliably, and loops where the file pointer appears in a context other than a recognised I/O function (`fgets`, `fgetc`, `getc`, `fread`, `fscanf`, `fprintf`, `fwrite`, `fputs`, `fputc`, `putc`). + +## How to fix + +Check the return value of the read function directly in the loop condition. + +Before: +```c +void process(FILE *fp) { + char line[256]; + while (!feof(fp)) { /* wrong: processes last line twice */ + fgets(line, sizeof(line), fp); + puts(line); + } +} +``` + +After: +```c +void process(FILE *fp) { + char line[256]; + while (fgets(line, sizeof(line), fp) != NULL) { + puts(line); + } +} +``` \ No newline at end of file diff --git a/releasenotes.txt b/releasenotes.txt index 185f06390e3..2141c34f001 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -5,7 +5,7 @@ Major bug fixes & crashes: - New checks: -- +- Warn when feof() is used as a while loop condition (wrongfeofUsage). C/C++ support: - diff --git a/test/cli/other_test.py b/test/cli/other_test.py index 243f600b5a6..f788a7d21c8 100644 --- a/test/cli/other_test.py +++ b/test/cli/other_test.py @@ -4318,25 +4318,25 @@ def __test_active_checkers(tmp_path, active_cnt, total_cnt, use_misra=False, use def test_active_unusedfunction_only(tmp_path): - __test_active_checkers(tmp_path, 1, 186, use_unusedfunction_only=True) + __test_active_checkers(tmp_path, 1, 187, use_unusedfunction_only=True) def test_active_unusedfunction_only_builddir(tmp_path): checkers_exp = [ 'CheckUnusedFunctions::check' ] - __test_active_checkers(tmp_path, 1, 186, use_unusedfunction_only=True, checkers_exp=checkers_exp) + __test_active_checkers(tmp_path, 1, 187, use_unusedfunction_only=True, checkers_exp=checkers_exp) def test_active_unusedfunction_only_misra(tmp_path): - __test_active_checkers(tmp_path, 1, 386, use_unusedfunction_only=True, use_misra=True) + __test_active_checkers(tmp_path, 1, 387, use_unusedfunction_only=True, use_misra=True) def test_active_unusedfunction_only_misra_builddir(tmp_path): checkers_exp = [ 'CheckUnusedFunctions::check' ] - __test_active_checkers(tmp_path, 1, 386, use_unusedfunction_only=True, use_misra=True, checkers_exp=checkers_exp) + __test_active_checkers(tmp_path, 1, 387, use_unusedfunction_only=True, use_misra=True, checkers_exp=checkers_exp) def test_analyzerinfo(tmp_path): diff --git a/test/testio.cpp b/test/testio.cpp index 15a65ef79c9..adfb6e31daf 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -45,6 +45,7 @@ class TestIO : public TestFixture { TEST_CASE(seekOnAppendedFile); TEST_CASE(fflushOnInputStream); TEST_CASE(incompatibleFileOpen); + TEST_CASE(testWrongfeofUsage); // #958 TEST_CASE(testScanf1); // Scanf without field limiters TEST_CASE(testScanf2); @@ -766,6 +767,55 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3:16]: (warning) The file '\"tmp\"' is opened for read and write access at the same time on different streams [incompatibleFileOpen]\n", errout_str()); } + void testWrongfeofUsage() { // ticket #958 + check("void foo(FILE * fp) {\n" + " while (!feof(fp)) \n" + " {\n" + " char line[100];\n" + " fgets(line, sizeof(line), fp);\n" + " dostuff(line);\n" + " }\n" + "}"); + ASSERT_EQUALS("[test.cpp:2:10]: (warning) Using feof() as a loop condition causes the last line to be processed twice. [wrongfeofUsage]\n", errout_str()); + + check("int foo(FILE *fp) {\n" + " char line[100];\n" + " while (fgets(line, sizeof(line), fp)) {}\n" + " if (!feof(fp))\n" + " return 1;\n" + " return 0;\n" + "}"); + ASSERT_EQUALS("", errout_str()); + + check("void foo(FILE *fp){\n" + " char line[100];\n" + " fgets(line, sizeof(line), fp);\n" + " while (!feof(fp)){\n" + " dostuff(line);\n" + " fgets(line, sizeof(line), fp);" + " }\n" + "}"); + ASSERT_EQUALS("", errout_str()); + + check("void foo(FILE *fp) {\n" + " char line[100];\n" + " do {\n" + " fgets(line, sizeof(line), fp);\n" + " dostuff(line);\n" + " } while (!feof(fp));\n" + "}"); + ASSERT_EQUALS("[test.cpp:6:12]: (warning) Using feof() as a loop condition causes the last line to be processed twice. [wrongfeofUsage]\n", errout_str()); + + check("void foo(FILE *fp) {\n" + " char line[100];\n" + " do {\n" + " dostuff(line);\n" + " fgets(line, sizeof(line), fp);\n" + " } while (!feof(fp));\n" + "}"); + ASSERT_EQUALS("", errout_str()); + } + void testScanf1() { check("void foo() {\n" From fec0f8daf8c4c5aed9750c84c7df764d436ca77e Mon Sep 17 00:00:00 2001 From: correctmost <134317971+correctmost@users.noreply.github.com> Date: Wed, 17 Jun 2026 02:46:06 -0400 Subject: [PATCH 076/171] gtk.cfg: Remove extra semicolons from g_return* macros (#8632) The extra semicolons caused unknownMacro errors when checking code like this: ```c if (hadj) g_return_if_fail (GTK_IS_ADJUSTMENT (hadj)); else hadj = GTK_ADJUSTMENT (...) ``` They were introduced in commit c0b530947, but they are not actually present in the upstream GLib macros. --- cfg/gtk.cfg | 8 ++++---- test/cfg/gtk.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/cfg/gtk.cfg b/cfg/gtk.cfg index 14cd032945e..71d0f3dee05 100644 --- a/cfg/gtk.cfg +++ b/cfg/gtk.cfg @@ -4,10 +4,10 @@ - - - - + + + + diff --git a/test/cfg/gtk.c b/test/cfg/gtk.c index cab41ffa1cd..4accf7b63ec 100644 --- a/test/cfg/gtk.c +++ b/test/cfg/gtk.c @@ -596,3 +596,43 @@ void gtk_widget_destroy_test() { // cppcheck-suppress mismatchAllocDealloc g_object_unref(widget); } + +void g_return_if_fail_test(const char *s) { + // cppcheck-suppress valueFlowBailout + g_return_if_fail(s); + + if (*s) + // cppcheck-suppress valueFlowBailout + g_return_if_fail(*s == 'a'); + else + g_info("Test the else branch can be parsed"); +} + +int g_return_val_if_fail_test(const char *s) { + // cppcheck-suppress valueFlowBailout + g_return_val_if_fail(s, 1); + + if (*s) + // cppcheck-suppress valueFlowBailout + g_return_val_if_fail(*s == 'a', 1); + else + g_info("Test the else branch can be parsed"); + + return 0; +} + +void g_return_if_reached_test(const char *s) { + if (s) + g_return_if_reached(); + else + g_info("Test the else branch can be parsed"); +} + +int g_return_val_if_reached_test(const char *s) { + if (s) + g_return_val_if_reached(1); + else + g_info("Test the else branch can be parsed"); + + return 0; +} From be0052b65baf181d0ddd345878f4b577aa48a1c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Wed, 17 Jun 2026 09:50:52 +0200 Subject: [PATCH 077/171] refs #14345 - dropped some untranslatable strings (#8073) --- gui/applicationdialog.cpp | 2 +- gui/cppcheck_de.ts | 100 ++++++-------------------- gui/cppcheck_es.ts | 118 ++++-------------------------- gui/cppcheck_fi.ts | 128 +++------------------------------ gui/cppcheck_fr.ts | 144 ------------------------------------- gui/cppcheck_it.ts | 118 ++++-------------------------- gui/cppcheck_ja.ts | 94 +++++++----------------- gui/cppcheck_ka.ts | 100 ++++++-------------------- gui/cppcheck_ko.ts | 118 ++++-------------------------- gui/cppcheck_nl.ts | 128 +++------------------------------ gui/cppcheck_ru.ts | 110 +++++----------------------- gui/cppcheck_sr.ts | 118 ++++-------------------------- gui/cppcheck_sv.ts | 110 +++++----------------------- gui/cppcheck_zh_CN.ts | 116 ++++-------------------------- gui/cppcheck_zh_TW.ts | 104 ++++++--------------------- gui/fileviewdialog.cpp | 4 +- gui/helpdialog.cpp | 2 +- gui/librarydialog.cpp | 6 +- gui/mainwindow.cpp | 30 ++++---- gui/mainwindow.ui | 14 ++-- gui/platforms.cpp | 10 +-- gui/projectfile.ui | 4 +- gui/projectfiledialog.cpp | 4 +- gui/resultstree.cpp | 6 +- gui/resultsview.cpp | 4 +- gui/translationhandler.cpp | 2 +- 26 files changed, 249 insertions(+), 1445 deletions(-) diff --git a/gui/applicationdialog.cpp b/gui/applicationdialog.cpp index bc8804d6f97..bdf9a4f827e 100644 --- a/gui/applicationdialog.cpp +++ b/gui/applicationdialog.cpp @@ -80,7 +80,7 @@ void ApplicationDialog::ok() { if (mUI->mName->text().isEmpty() || mUI->mPath->text().isEmpty()) { QMessageBox msg(QMessageBox::Warning, - tr("Cppcheck"), + "Cppcheck", tr("You must specify a name, a path and optionally parameters for the application!"), QMessageBox::Ok, this); diff --git a/gui/cppcheck_de.ts b/gui/cppcheck_de.ts index 1361296b8ca..a9429aa1c94 100644 --- a/gui/cppcheck_de.ts +++ b/gui/cppcheck_de.ts @@ -107,9 +107,8 @@ Parameter: -l(line) (file) Anzeigeanwendung auswƤhlen - Cppcheck - Cppcheck + Cppcheck @@ -176,10 +175,8 @@ Parameter: -l(line) (file) Konnte die Datei nicht finden: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -210,9 +207,8 @@ Parameter: -l(line) (file) Hilfedatei '%1' nicht gefunden - Cppcheck - Cppcheck + Cppcheck @@ -332,11 +328,8 @@ Parameter: -l(line) (file) Bibliothek ƶffnen - - - Cppcheck - Cppcheck + Cppcheck @@ -482,23 +475,8 @@ Parameter: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -1006,29 +984,16 @@ Parameter: -l(line) (file) - Misra C - Misra C - - - - Misra C++ 2008 - + Misra C - Cert C - Cert C + Cert C - Cert C++ - Cert C++ - - - - Misra C++ 2023 - + Cert C++ @@ -1288,14 +1253,12 @@ Dies wurde vermutlich durch einen Wechsel der Cppcheck-Version hervorgerufen. Bi Compilerdatenbank - Visual Studio - Visual Studio + Visual Studio - Borland C++ Builder 6 - Borland C++-Builder 6 + Borland C++-Builder 6 @@ -1567,29 +1530,24 @@ Options: Nativ - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit, ANSI + Windows 32-bit, ANSI - Windows 32-bit Unicode - Windows 32-bit, Unicode + Windows 32-bit, Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1980,14 +1938,12 @@ Options: - Clang analyzer - Clang-Analyzer + Clang-Analyzer - Clang-tidy - Clang-Tidy + Clang-Tidy @@ -2028,9 +1984,8 @@ Options: Clang-tidy (nicht gefunden) - Visual Studio - Visual Studio + Visual Studio @@ -2038,9 +1993,8 @@ Options: Compilerdatenbank - Borland C++ Builder 6 - Borland C++-Builder 6 + Borland C++-Builder 6 @@ -2316,11 +2270,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2443,10 +2392,8 @@ Options: Kein Tag - - Cppcheck - Cppcheck + Cppcheck @@ -2534,10 +2481,8 @@ Bitte überprüfen Sie ob der Pfad und die Parameter der Anwendung richtig einge %p% (%1 von %2 Dateien geprüft) - - Cppcheck - Cppcheck + Cppcheck @@ -3210,9 +3155,8 @@ The user interface language has been reset to English. Open the Preferences-dial Die Sprache wurde auf Englisch zurückgesetzt. Ɩffnen Sie den Einstellungen-Dialog um eine verfügbare Sprache auszuwƤhlen. - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_es.ts b/gui/cppcheck_es.ts index bbe8bed24d5..fa03b4457cc 100644 --- a/gui/cppcheck_es.ts +++ b/gui/cppcheck_es.ts @@ -95,9 +95,8 @@ Parameters: -l(line) (file) Selecciona la aplicación para visualizar - Cppcheck - Cppcheck + Cppcheck @@ -113,10 +112,8 @@ Parameters: -l(line) (file) No se ha encontrado el fichero: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -147,9 +144,8 @@ Parameters: -l(line) (file) - Cppcheck - Cppcheck + Cppcheck @@ -269,11 +265,8 @@ Parameters: -l(line) (file) Abrir archivo de biblioteca - - - Cppcheck - Cppcheck + Cppcheck @@ -411,23 +404,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -952,31 +930,6 @@ Parameters: -l(line) (file) Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1214,16 +1167,6 @@ Do you want to load this project file instead? Compile database - - - Visual Studio - - - - - Borland C++ Builder 6 - - Select files to analyze @@ -1482,29 +1425,24 @@ Options: - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit ANSI + Windows 32-bit ANSI - Windows 32-bit Unicode - Windows 32-bit Unicode + Windows 32-bit Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1892,16 +1830,6 @@ Options: Bug hunting (Premium) - - - Clang analyzer - - - - - Clang-tidy - - Defines: @@ -1940,21 +1868,11 @@ Options: Clang-tidy (not found) - - - Visual Studio - - Compile database - - - Borland C++ Builder 6 - - Import Project @@ -2230,11 +2148,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2371,10 +2284,8 @@ Options: - - Cppcheck - Cppcheck + Cppcheck @@ -2483,10 +2394,8 @@ Por favor comprueba que la ruta a la aplicación y los parĆ”metros son correctos %p% (%1 of %2 archivos comprobados) - - Cppcheck - Cppcheck + Cppcheck @@ -3133,9 +3042,8 @@ The user interface language has been reset to English. Open the Preferences-dial El idioma de la interfaz grĆ”fica ha sido cambiado a InglĆ©s. Abra la ventana de Preferencias para seleccionar alguno de los idiomas disponibles. - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_fi.ts b/gui/cppcheck_fi.ts index 517362d852b..bf379534998 100644 --- a/gui/cppcheck_fi.ts +++ b/gui/cppcheck_fi.ts @@ -96,9 +96,8 @@ Parameters: -l(line) (file) Valitse ohjelma jolla avata virhetiedosto - Cppcheck - Cppcheck + Cppcheck @@ -116,10 +115,8 @@ Parameters: -l(line) (file) Tiedostoa %1 ei lƶytynyt - - Cppcheck - Cppcheck + Cppcheck @@ -150,9 +147,8 @@ Parameters: -l(line) (file) - Cppcheck - Cppcheck + Cppcheck @@ -272,11 +268,8 @@ Parameters: -l(line) (file) - - - Cppcheck - Cppcheck + Cppcheck @@ -414,23 +407,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -942,31 +920,6 @@ Parameters: -l(line) (file) Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1214,16 +1167,6 @@ This is probably because the settings were changed between the Cppcheck versions Compile database - - - Visual Studio - - - - - Borland C++ Builder 6 - - Select files to analyze @@ -1475,31 +1418,6 @@ Options: Native - - - Unix 32-bit - - - - - Unix 64-bit - - - - - Windows 32-bit ANSI - - - - - Windows 32-bit Unicode - - - - - Windows 64-bit - - ProjectFile @@ -1886,16 +1804,6 @@ Options: Bug hunting (Premium) - - - Clang analyzer - - - - - Clang-tidy - - Defines: @@ -1934,21 +1842,11 @@ Options: Clang-tidy (not found) - - - Visual Studio - - Compile database - - - Borland C++ Builder 6 - - Import Project @@ -2226,11 +2124,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2349,10 +2242,8 @@ Options: - - Cppcheck - Cppcheck + Cppcheck @@ -2437,10 +2328,8 @@ Tarkista ettƤ ohjelman polku ja parametrit ovat oikeat. - - Cppcheck - Cppcheck + Cppcheck @@ -3102,9 +2991,8 @@ The user interface language has been reset to English. Open the Preferences-dial - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_fr.ts b/gui/cppcheck_fr.ts index 7e8651d8ec3..6d464bc46af 100644 --- a/gui/cppcheck_fr.ts +++ b/gui/cppcheck_fr.ts @@ -65,11 +65,6 @@ General Public License version 3 Select viewer application SĆ©lection de l'application - - - Cppcheck - - &Executable: @@ -123,12 +118,6 @@ ParamĆØtres : -l(ligne) (fichier) Could not find the file: %1 Ne trouve pas le fichier : %1 - - - - Cppcheck - - Could not read the file: %1 @@ -157,11 +146,6 @@ ParamĆØtres : -l(ligne) (fichier) Helpfile '%1' was not found - - - Cppcheck - - LibraryAddFunctionDialog @@ -279,13 +263,6 @@ ParamĆØtres : -l(ligne) (fichier) Save as - - - - - Cppcheck - - Save the library as @@ -419,25 +396,6 @@ ParamĆØtres : -l(ligne) (fichier) MainWindow - - - - - - - - - - - - - - - - - Cppcheck - - Checking for updates @@ -599,31 +557,6 @@ ParamĆØtres : -l(ligne) (fichier) Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1407,16 +1340,6 @@ Do you want to stop the analysis and exit Cppcheck? Compile database - - - Visual Studio - - - - - Borland C++ Builder 6 - - Current results will be cleared. @@ -1461,31 +1384,6 @@ Do you want to proceed? Platforms - - - Unix 32-bit - - - - - Unix 64-bit - - - - - Windows 32-bit ANSI - - - - - Windows 32-bit Unicode - - - - - Windows 64-bit - - Native @@ -1691,16 +1589,6 @@ Do you want to proceed? Bug hunting - - - Clang analyzer - - - - - Clang-tidy - - @@ -1969,21 +1857,11 @@ Do you want to proceed? MISRA rule texts file (%1) - - - Visual Studio - - Compile database - - - Borland C++ Builder 6 - - QObject @@ -2212,11 +2090,6 @@ Do you want to proceed? Tags - - - CWE - - QPlatformTheme @@ -2259,12 +2132,6 @@ Do you want to proceed? Undefined file Fichier indĆ©terminĆ© - - - - Cppcheck - - Could not start %1 @@ -2427,12 +2294,6 @@ Please select the default editor application in preferences/Applications.Results RĆ©sultats - - - - Cppcheck - - No errors found. @@ -3101,11 +2962,6 @@ Pour configurer les erreurs affichĆ©es, ouvrez le menu d'affichage. - - - Cppcheck - - TxtReport diff --git a/gui/cppcheck_it.ts b/gui/cppcheck_it.ts index 2c19aa2e50b..65b31b59b1e 100644 --- a/gui/cppcheck_it.ts +++ b/gui/cppcheck_it.ts @@ -107,9 +107,8 @@ Parametri: -l(line) (file) Seleziona l'applicazione di lettura - Cppcheck - Cppcheck + Cppcheck @@ -125,10 +124,8 @@ Parametri: -l(line) (file) File non trovato: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -159,9 +156,8 @@ Parametri: -l(line) (file) - Cppcheck - Cppcheck + Cppcheck @@ -281,11 +277,8 @@ Parametri: -l(line) (file) - - - Cppcheck - Cppcheck + Cppcheck @@ -423,23 +416,8 @@ Parametri: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -951,31 +929,6 @@ Parametri: -l(line) (file) Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1227,16 +1180,6 @@ Probabilmente ciò ĆØ avvenuto perchĆ© le impostazioni sono state modificate tra Compile database - - - Visual Studio - - - - - Borland C++ Builder 6 - - Select files to analyze @@ -1495,29 +1438,24 @@ Options: - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit, ANSI + Windows 32-bit, ANSI - Windows 32-bit Unicode - Windows 32-bit, Unicode + Windows 32-bit, Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1905,16 +1843,6 @@ Options: Bug hunting (Premium) - - - Clang analyzer - - - - - Clang-tidy - - Defines: @@ -1953,21 +1881,11 @@ Options: Clang-tidy (not found) - - - Visual Studio - - Compile database - - - Borland C++ Builder 6 - - Import Project @@ -2243,11 +2161,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2374,10 +2287,8 @@ Options: - - Cppcheck - Cppcheck + Cppcheck @@ -2469,10 +2380,8 @@ Per favore verifica che il percorso dell'applicazione e i parametri siano c %p% (%1 su %2 file scansionati) - - Cppcheck - Cppcheck + Cppcheck @@ -3145,9 +3054,8 @@ The user interface language has been reset to English. Open the Preferences-dial L'interfaccia utente ĆØ stata risettata in Inglese. Apri la finestra di dialogo Preferenze per selezionare una qualunque lingua a disposizione. - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_ja.ts b/gui/cppcheck_ja.ts index 6c8269b4143..eedad8e9515 100644 --- a/gui/cppcheck_ja.ts +++ b/gui/cppcheck_ja.ts @@ -106,9 +106,8 @@ Parameters: -l(line) (file) č”Øē¤ŗć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®éøęŠž - Cppcheck - Cppcheck + Cppcheck @@ -179,10 +178,8 @@ Parameters: -l(line) (file) ćƒ•ć‚”ć‚¤ćƒ«ļ¼š%1 ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ - - Cppcheck - Cppcheck + Cppcheck @@ -213,9 +210,8 @@ Parameters: -l(line) (file) ćƒ˜ćƒ«ćƒ—ćƒ•ć‚”ć‚¤ćƒ« '%1' ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ - Cppcheck - Cppcheck + Cppcheck @@ -335,11 +331,8 @@ Parameters: -l(line) (file) ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖćƒ•ć‚”ć‚¤ćƒ«ć‚’é–‹ć - - - Cppcheck - Cppcheck + Cppcheck @@ -488,23 +481,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -1048,29 +1026,24 @@ Parameters: -l(line) (file) ćƒŽćƒ¼ćƒžćƒ« - Misra C - MISRA C + MISRA C - Misra C++ 2008 - MISRA C++ 2008 + MISRA C++ 2008 - Cert C - CERT C + CERT C - Cert C++ - Cert C++ + Cert C++ - Misra C++ 2023 - MISRA C++ 2023 + MISRA C++ 2023 @@ -1309,14 +1282,12 @@ Analysis is stopped. ć‚³ćƒ³ćƒ‘ć‚¤ćƒ«ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ - Visual Studio - Visual Studio + Visual Studio - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -1594,29 +1565,24 @@ Options: ćƒć‚¤ćƒ†ć‚£ćƒ– - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit ANSIć‚Øćƒ³ć‚³ćƒ¼ćƒ‰ + Windows 32-bit ANSIć‚Øćƒ³ć‚³ćƒ¼ćƒ‰ - Windows 32-bit Unicode - Windows 32-bit Unicode + Windows 32-bit Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -2021,14 +1987,12 @@ Options: ćƒć‚°ćƒćƒ³ćƒˆ - Clang analyzer - Clang Analyzer + Clang Analyzer - Clang-tidy - Clang-tidy + Clang-tidy @@ -2069,9 +2033,8 @@ Options: Clang-tidy (ćæć¤ć‹ć‚Šć¾ć›ć‚“) - Visual Studio - Visual Studio + Visual Studio @@ -2079,9 +2042,8 @@ Options: ć‚³ćƒ³ćƒ‘ć‚¤ćƒ«ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -2367,9 +2329,8 @@ Options: タグ - CWE - CWE + CWE @@ -2501,10 +2462,8 @@ Options: タグなし - - Cppcheck - Cppcheck + Cppcheck @@ -2631,10 +2590,8 @@ Please check the application path and parameters are correct. %p% (%1 / %2 :ćƒ•ć‚”ć‚¤ćƒ«ę•°) - - Cppcheck - Cppcheck + Cppcheck @@ -3283,9 +3240,8 @@ The user interface language has been reset to English. Open the Preferences-dial ćć®ćŸć‚čØ€čŖžć‚’ č‹±čŖžć«ćƒŖć‚»ćƒƒćƒˆć—ć¾ć™ć€‚čØ­å®šćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‹ć‚‰åˆ©ē”ØåÆčƒ½ćŖčØ€čŖžć‚’éøęŠžć—ć¦ćć ć•ć„ć€‚ - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_ka.ts b/gui/cppcheck_ka.ts index 52c0657f646..00239743df0 100644 --- a/gui/cppcheck_ka.ts +++ b/gui/cppcheck_ka.ts @@ -96,9 +96,8 @@ Parameters: -l(line) (file) įƒįƒ˜įƒ įƒ©įƒ˜įƒ”įƒ— įƒįƒžįƒšįƒ˜įƒ™įƒįƒŖįƒ˜įƒ - Cppcheck - Cppcheck + Cppcheck @@ -167,10 +166,8 @@ Parameters: -l(line) (file) įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ” ფაილი: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -201,9 +198,8 @@ Parameters: -l(line) (file) įƒ“įƒįƒ®įƒ›įƒįƒ įƒ”įƒ‘įƒ˜įƒ” ფაილი '%1' įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ” - Cppcheck - Cppcheck + Cppcheck @@ -323,11 +319,8 @@ Parameters: -l(line) (file) įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ˜įƒ” ფაილიე įƒ’įƒįƒ®įƒ”įƒœįƒ - - - Cppcheck - Cppcheck + Cppcheck @@ -464,23 +457,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -993,29 +971,16 @@ Parameters: -l(line) (file) įƒœįƒįƒ įƒ›įƒįƒšįƒ£įƒ įƒ˜ - Misra C - Misra C + Misra C - - Misra C++ 2008 - - - - Cert C - Cert C + Cert C - Cert C++ - Cert C++ - - - - Misra C++ 2023 - + Cert C++ @@ -1273,14 +1238,12 @@ This is probably because the settings were changed between the Cppcheck versions įƒ›įƒįƒœįƒįƒŖįƒ”įƒ›įƒ—įƒ įƒ‘įƒįƒ–įƒ˜įƒ” įƒ™įƒįƒ›įƒžįƒ˜įƒšįƒįƒŖįƒ˜įƒ - Visual Studio - Visual Studio + Visual Studio - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -1566,29 +1529,24 @@ Options: įƒ”įƒįƒ™įƒ£įƒ—įƒįƒ įƒ˜ - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit ANSI + Windows 32-bit ANSI - Windows 32-bit Unicode - Windows 32-bit Unicode + Windows 32-bit Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1977,14 +1935,12 @@ Options: įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ”įƒ‘įƒ–įƒ” įƒœįƒįƒ“įƒ˜įƒ įƒįƒ‘įƒ (ფაეიანი) - Clang analyzer - Clang-იე įƒįƒœįƒįƒšįƒ˜įƒ–įƒįƒ¢įƒįƒ įƒ˜ + Clang-იე įƒįƒœįƒįƒšįƒ˜įƒ–įƒįƒ¢įƒįƒ įƒ˜ - Clang-tidy - Clang-tidy + Clang-tidy @@ -2025,9 +1981,8 @@ Options: Clang-tidy (įƒ•įƒ”įƒ  įƒ•įƒ˜įƒžįƒįƒ•įƒ”) - Visual Studio - Visual Studio + Visual Studio @@ -2035,9 +1990,8 @@ Options: įƒ›įƒįƒœįƒįƒŖįƒ”įƒ›įƒ—įƒ įƒ‘įƒįƒ–įƒ˜įƒ” įƒ™įƒįƒ›įƒžįƒ˜įƒšįƒįƒŖįƒ˜įƒ - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -2316,11 +2270,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2451,10 +2400,8 @@ Options: įƒ­įƒ“įƒ˜įƒ” įƒ’įƒįƒ įƒ”įƒØįƒ” - - Cppcheck - Cppcheck + Cppcheck @@ -2555,10 +2502,8 @@ Please check the application path and parameters are correct. %p% (įƒØįƒ”įƒ›įƒįƒ¬įƒ›įƒ”įƒ‘įƒ£įƒšįƒ˜įƒ %1 ფაილი %2-įƒ“įƒįƒœ) - - Cppcheck - Cppcheck + Cppcheck @@ -3236,9 +3181,8 @@ The user interface language has been reset to English. Open the Preferences-dial įƒ›įƒįƒ›įƒ®įƒ›įƒįƒ įƒ”įƒ‘įƒšįƒ˜įƒ” įƒ˜įƒœįƒ¢įƒ”įƒ įƒ¤įƒ”įƒ˜įƒ”įƒ˜ įƒ˜įƒœįƒ’įƒšįƒ˜įƒ”įƒ£įƒ įƒ–įƒ” įƒ’įƒįƒ“įƒįƒ˜įƒ įƒ—įƒ. įƒ’įƒįƒ®įƒ”įƒ”įƒœįƒ˜įƒ— įƒ›įƒįƒ įƒ’įƒ”įƒ‘įƒ˜įƒ” įƒ“įƒ˜įƒįƒšįƒįƒ’įƒ˜, įƒ įƒįƒ› įƒ®įƒ”įƒšįƒ›įƒ˜įƒ”įƒįƒ¬įƒ•įƒ“įƒįƒ›įƒ˜ įƒ”įƒœįƒ”įƒ‘įƒ˜įƒ“įƒįƒœ įƒ”įƒįƒ”įƒ£įƒ įƒ•įƒ”įƒšįƒ˜ įƒįƒ˜įƒ įƒ©įƒ˜įƒįƒ—. - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_ko.ts b/gui/cppcheck_ko.ts index 611eede0491..eef9ffac818 100644 --- a/gui/cppcheck_ko.ts +++ b/gui/cppcheck_ko.ts @@ -106,9 +106,8 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: ė·°ģ–“ ķ”„ė”œź·øėžØ ģ„ ķƒ - Cppcheck - Cppcheck + Cppcheck @@ -124,10 +123,8 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: ķŒŒģ¼ 찾기 ģ‹¤ķŒØ: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -158,9 +155,8 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - Cppcheck - Cppcheck + Cppcheck @@ -280,11 +276,8 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: - - - Cppcheck - Cppcheck + Cppcheck @@ -420,23 +413,8 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -710,31 +688,6 @@ Kate딜 ķŒŒģ¼ģ„ ģ—“ź³ , 핓당 ķ–‰ģœ¼ė”œ ģ“ė™ķ•˜ėŠ” 예제: Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1415,16 +1368,6 @@ Do you want to stop the analysis and exit Cppcheck? Compile database - - - Visual Studio - - - - - Borland C++ Builder 6 - - Current results will be cleared. @@ -1470,29 +1413,24 @@ Do you want to proceed? Platforms - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit ANSI + Windows 32-bit ANSI - Windows 32-bit Unicode - Windows 32-bit Unicode + Windows 32-bit Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1699,16 +1637,6 @@ Do you want to proceed? Bug hunting - - - Clang analyzer - - - - - Clang-tidy - - @@ -1977,21 +1905,11 @@ Do you want to proceed? MISRA rule texts file (%1) - - - Visual Studio - - Compile database - - - Borland C++ Builder 6 - - QObject @@ -2220,11 +2138,6 @@ Do you want to proceed? Tags - - - CWE - - QPlatformTheme @@ -2316,10 +2229,8 @@ Do you want to proceed? 숨기기 - - Cppcheck - Cppcheck + Cppcheck @@ -2443,10 +2354,8 @@ Please check the application path and parameters are correct. %p% (%2 중 %1 ķŒŒģ¼ 검사됨) - - Cppcheck - Cppcheck + Cppcheck @@ -3118,9 +3027,8 @@ The user interface language has been reset to English. Open the Preferences-dial ģ–øģ–“ź°€ ģ˜ģ–“ė”œ ģ“ˆźø°ķ™” ėģŠµė‹ˆė‹¤. ģ„¤ģ •ģ°½ģ„ ģ—“ģ–“ģ„œ 설정 ź°€ėŠ„ķ•œ 언얓넼 ģ„ ķƒķ•˜ģ„øģš”. - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_nl.ts b/gui/cppcheck_nl.ts index 7c58587662b..6a877a34909 100644 --- a/gui/cppcheck_nl.ts +++ b/gui/cppcheck_nl.ts @@ -106,9 +106,8 @@ Parameters: -l(lijn) (bestand) Selecteer applicatie - Cppcheck - Cppcheck + Cppcheck @@ -126,10 +125,8 @@ Parameters: -l(lijn) (bestand) Kon het bestand niet vinden: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -160,9 +157,8 @@ Parameters: -l(lijn) (bestand) - Cppcheck - Cppcheck + Cppcheck @@ -282,11 +278,8 @@ Parameters: -l(lijn) (bestand) - - - Cppcheck - Cppcheck + Cppcheck @@ -424,23 +417,8 @@ Parameters: -l(lijn) (bestand) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -952,31 +930,6 @@ Parameters: -l(lijn) (bestand) Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1227,16 +1180,6 @@ Dit is waarschijnlijk omdat de instellingen zijn gewijzigd tussen de versies van Compile database - - - Visual Studio - - - - - Borland C++ Builder 6 - - Select files to analyze @@ -1493,31 +1436,6 @@ Options: Native - - - Unix 32-bit - - - - - Unix 64-bit - - - - - Windows 32-bit ANSI - - - - - Windows 32-bit Unicode - - - - - Windows 64-bit - - ProjectFile @@ -1904,16 +1822,6 @@ Options: Bug hunting (Premium) - - - Clang analyzer - - - - - Clang-tidy - - Defines: @@ -1952,21 +1860,11 @@ Options: Clang-tidy (not found) - - - Visual Studio - - Compile database - - - Borland C++ Builder 6 - - Import Project @@ -2244,11 +2142,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2375,10 +2268,8 @@ Options: - - Cppcheck - Cppcheck + Cppcheck @@ -2470,10 +2361,8 @@ Gelieve te controleren of de het pad en de parameters correct zijn.%p% (%1 van %2 bestanden gecontroleerd) - - Cppcheck - Cppcheck + Cppcheck @@ -3143,9 +3032,8 @@ The user interface language has been reset to English. Open the Preferences-dial De gebruikerstaal is gereset naar Engels. Open het dialoogvenster om een van de beschikbare talen te selecteren. - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_ru.ts b/gui/cppcheck_ru.ts index a6608d90f7d..cd1a4c4d0ce 100644 --- a/gui/cppcheck_ru.ts +++ b/gui/cppcheck_ru.ts @@ -106,9 +106,8 @@ Parameters: -l(line) (file) Выберите приложение - Cppcheck - Cppcheck + Cppcheck @@ -126,10 +125,8 @@ Parameters: -l(line) (file) ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ найти файл: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -160,9 +157,8 @@ Parameters: -l(line) (file) - Cppcheck - Cppcheck + Cppcheck @@ -282,11 +278,8 @@ Parameters: -l(line) (file) ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ файл библиотеки - - - Cppcheck - Cppcheck + Cppcheck @@ -424,23 +417,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -952,31 +930,6 @@ Parameters: -l(line) (file) Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1235,14 +1188,12 @@ This is probably because the settings were changed between the Cppcheck versions - Visual Studio - Visual Studio + Visual Studio - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -1525,29 +1476,24 @@ Options: - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit ANSI + Windows 32-bit ANSI - Windows 32-bit Unicode - Windows 32-bit Unicode + Windows 32-bit Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1939,16 +1885,6 @@ Options: Bug hunting (Premium) - - - Clang analyzer - - - - - Clang-tidy - - Defines: @@ -1988,9 +1924,8 @@ Options: Clang-tidy (не найГен) - Visual Studio - Visual Studio + Visual Studio @@ -1998,9 +1933,8 @@ Options: - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -2279,11 +2213,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2414,10 +2343,8 @@ Options: Тег Š¾Ń‚ŃŃƒŃ‚ŃŃ‚Š²ŃƒŠµŃ‚ - - Cppcheck - Cppcheck + Cppcheck @@ -2515,10 +2442,8 @@ Please check the application path and parameters are correct. %p% (%1 ŠøŠ· %2 файлов проверено) - - Cppcheck - Cppcheck + Cppcheck @@ -3192,9 +3117,8 @@ The user interface language has been reset to English. Open the Preferences-dial Язык ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»ŃŒŃŠŗŠ¾Š³Š¾ интерфейса был ŃŠ±Ń€Š¾ŃˆŠµŠ½ на английский. ŠžŃ‚ŠŗŃ€Š¾Š¹Ń‚Šµ ŠŠ°ŃŃ‚Ń€Š¾Š¹ŠŗŠø-Гиалог Š“Š»Ń выбора Š»ŃŽŠ±Š¾Š³Š¾ ŠøŠ· Š“Š¾ŃŃ‚ŃƒŠæŠ½Ń‹Ń… ŃŠ·Ń‹ŠŗŠ¾Š². - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_sr.ts b/gui/cppcheck_sr.ts index 07e8059f724..ebfe46f5ced 100644 --- a/gui/cppcheck_sr.ts +++ b/gui/cppcheck_sr.ts @@ -96,9 +96,8 @@ Parameters: -l(line) (file) Select viewer application - Cppcheck - Cppcheck + Cppcheck @@ -114,10 +113,8 @@ Parameters: -l(line) (file) Could not find the file: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -148,9 +145,8 @@ Parameters: -l(line) (file) - Cppcheck - Cppcheck + Cppcheck @@ -270,11 +266,8 @@ Parameters: -l(line) (file) - - - Cppcheck - Cppcheck + Cppcheck @@ -412,23 +405,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -940,31 +918,6 @@ Parameters: -l(line) (file) Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1212,16 +1165,6 @@ This is probably because the settings were changed between the Cppcheck versions Compile database - - - Visual Studio - - - - - Borland C++ Builder 6 - - Select files to analyze @@ -1474,29 +1417,24 @@ Options: - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit ANSI + Windows 32-bit ANSI - Windows 32-bit Unicode - Windows 32-bit Unicode + Windows 32-bit Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1884,16 +1822,6 @@ Options: Bug hunting (Premium) - - - Clang analyzer - - - - - Clang-tidy - - Defines: @@ -1932,21 +1860,11 @@ Options: Clang-tidy (not found) - - - Visual Studio - - Compile database - - - Borland C++ Builder 6 - - Import Project @@ -2222,11 +2140,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2345,10 +2258,8 @@ Options: - - Cppcheck - Cppcheck + Cppcheck @@ -2432,10 +2343,8 @@ Please check the application path and parameters are correct. - - Cppcheck - Cppcheck + Cppcheck @@ -3096,9 +3005,8 @@ The user interface language has been reset to English. Open the Preferences-dial - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_sv.ts b/gui/cppcheck_sv.ts index 4b8164d7775..43d6886afc0 100644 --- a/gui/cppcheck_sv.ts +++ b/gui/cppcheck_sv.ts @@ -106,9 +106,8 @@ Parametrar: -l(line) (file) VƤlj program - Cppcheck - Cppcheck + Cppcheck @@ -126,10 +125,8 @@ Parametrar: -l(line) (file) Kunde inte hitta filen: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -160,9 +157,8 @@ Parametrar: -l(line) (file) - Cppcheck - Cppcheck + Cppcheck @@ -282,11 +278,8 @@ Parametrar: -l(line) (file) Ɩppna Library fil - - - Cppcheck - Cppcheck + Cppcheck @@ -430,23 +423,8 @@ Exempel: MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -959,31 +937,6 @@ Exempel: Normal - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1242,14 +1195,8 @@ En trolig orsak Ƥr att instƤllningarna Ƥndrats fƶr olika Cppcheck versioner. - Visual Studio - Visual Studio - - - - Borland C++ Builder 6 - + Visual Studio @@ -1530,29 +1477,24 @@ Options: Native - Unix 32-bit - Unix 32-bit + Unix 32-bit - Unix 64-bit - Unix 64-bit + Unix 64-bit - Windows 32-bit ANSI - Windows 32-bit ANSI + Windows 32-bit ANSI - Windows 32-bit Unicode - Windows 32-bit Unicode + Windows 32-bit Unicode - Windows 64-bit - Windows 64-bit + Windows 64-bit @@ -1941,14 +1883,12 @@ Options: - Clang analyzer - Clang analyzer + Clang analyzer - Clang-tidy - Clang-tidy + Clang-tidy @@ -2025,20 +1965,14 @@ Options: VƤlj mapp att analysera - Visual Studio - Visual Studio + Visual Studio Compile database - - - Borland C++ Builder 6 - - Import Project @@ -2280,11 +2214,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2415,10 +2344,8 @@ Options: Ingen tag - - Cppcheck - Cppcheck + Cppcheck @@ -2519,10 +2446,8 @@ Kontrollera att sƶkvƤgen och parametrarna Ƥr korrekta. %p% (%1 av %2 filer analyserade) - - Cppcheck - Cppcheck + Cppcheck @@ -3196,9 +3121,8 @@ The user interface language has been reset to English. Open the Preferences-dial SprĆ„ket har nollstƤllts till Engelska. Ɩppna Preferences och vƤlj nĆ„got av de tillgƤngliga sprĆ„ken. - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_zh_CN.ts b/gui/cppcheck_zh_CN.ts index 5860c842a16..5ecaa17a91b 100644 --- a/gui/cppcheck_zh_CN.ts +++ b/gui/cppcheck_zh_CN.ts @@ -105,9 +105,8 @@ Parameters: -l(line) (file) é€‰ę‹©ęŸ„ēœ‹åŗ”ē”ØēØ‹åŗ - Cppcheck - Cppcheck + Cppcheck @@ -123,10 +122,8 @@ Parameters: -l(line) (file) ę— ę³•ę‰¾åˆ°ę–‡ä»¶: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -157,9 +154,8 @@ Parameters: -l(line) (file) åø®åŠ©ę–‡ä»¶ '%1' ęœŖę‰¾åˆ° - Cppcheck - Cppcheck + Cppcheck @@ -279,11 +275,8 @@ Parameters: -l(line) (file) 打开库文件 - - - Cppcheck - Cppcheck + Cppcheck @@ -431,23 +424,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -990,31 +968,6 @@ Parameters: -l(line) (file) Normal åøøč§„ - - - Misra C - - - - - Misra C++ 2008 - - - - - Cert C - - - - - Cert C++ - - - - - Misra C++ 2023 - - Autosar @@ -1242,14 +1195,12 @@ Analysis is stopped. Compile database - Visual Studio - Visual Studio + Visual Studio - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -1531,31 +1482,6 @@ Options: Native 本地 - - - Unix 32-bit - - - - - Unix 64-bit - - - - - Windows 32-bit ANSI - - - - - Windows 32-bit Unicode - - - - - Windows 64-bit - - ProjectFile @@ -1947,14 +1873,12 @@ Options: - Clang analyzer - Clang analyzer + Clang analyzer - Clang-tidy - Clang-tidy + Clang-tidy @@ -1995,9 +1919,8 @@ Options: Clang-tidy (ęœŖę‰¾åˆ°) - Visual Studio - Visual Studio + Visual Studio @@ -2005,9 +1928,8 @@ Options: Compile database - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -2284,11 +2206,6 @@ Options: Tags - - - CWE - - QPlatformTheme @@ -2419,10 +2336,8 @@ Options: å–ę¶ˆę ‡č®° - - Cppcheck - Cppcheck + Cppcheck @@ -2549,10 +2464,8 @@ Please check the application path and parameters are correct. %p% (%2 äøŖę–‡ä»¶å·²ę£€ęŸ„ %1 äøŖ) - - Cppcheck - Cppcheck + Cppcheck @@ -3204,9 +3117,8 @@ The user interface language has been reset to English. Open the Preferences-dial ē”Øęˆ·ē•Œé¢čÆ­čØ€å·²č¢«é‡ē½®äøŗč‹±čÆ­ć€‚ę‰“å¼€ā€œé¦–é€‰é”¹ā€åÆ¹čÆę”†ļ¼Œé€‰ę‹©ä»»ä½•åÆē”Øēš„čÆ­čØ€ć€‚ - Cppcheck - Cppcheck + Cppcheck diff --git a/gui/cppcheck_zh_TW.ts b/gui/cppcheck_zh_TW.ts index 841650ba5b1..3c25925c207 100644 --- a/gui/cppcheck_zh_TW.ts +++ b/gui/cppcheck_zh_TW.ts @@ -95,9 +95,8 @@ Parameters: -l(line) (file) éøå–ęŖ¢č¦–å™Øę‡‰ē”ØēØ‹å¼ - Cppcheck - Cppcheck + Cppcheck @@ -128,10 +127,8 @@ Parameters: -l(line) (file) ē„”ę³•ę‰¾åˆ°ęŖ”ę”ˆ: %1 - - Cppcheck - Cppcheck + Cppcheck @@ -162,9 +159,8 @@ Parameters: -l(line) (file) ę‰¾äøåˆ°å¹«åŠ©ęŖ” '%1' - Cppcheck - Cppcheck + Cppcheck @@ -284,11 +280,8 @@ Parameters: -l(line) (file) é–‹å•ŸēØ‹å¼åŗ«ęŖ”ę”ˆ - - - Cppcheck - Cppcheck + Cppcheck @@ -424,23 +417,8 @@ Parameters: -l(line) (file) MainWindow - - - - - - - - - - - - - - - Cppcheck - Cppcheck + Cppcheck @@ -974,29 +952,12 @@ Parameters: -l(line) (file) - - Misra C - - - - Misra C++ 2008 - Misra C++ 2008 - - - - Cert C - - - - - Cert C++ - + Misra C++ 2008 - Misra C++ 2023 - Misra C++ 2023 + Misra C++ 2023 @@ -1083,14 +1044,12 @@ This is probably because the settings were changed between the Cppcheck versions 編譯資料庫 - Visual Studio - Visual Studio + Visual Studio - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -1485,29 +1444,24 @@ Do you want to remove the file from the recently used projects -list? åŽŸē”Ÿ - Unix 32-bit - Unix 32 位元 + Unix 32 位元 - Unix 64-bit - Unix 64 位元 + Unix 64 位元 - Windows 32-bit ANSI - Windows 32 位元 ANSI + Windows 32 位元 ANSI - Windows 32-bit Unicode - Windows 32 位元 Unicode + Windows 32 位元 Unicode - Windows 64-bit - Windows 64 位元 + Windows 64 位元 @@ -1906,14 +1860,12 @@ Do you want to remove the file from the recently used projects -list? å¤–éƒØå·„å…· - Clang-tidy - Clang-tidy + Clang-tidy - Clang analyzer - Clang åˆ†ęžå™Ø + Clang åˆ†ęžå™Ø @@ -1939,9 +1891,8 @@ Do you want to remove the file from the recently used projects -list? éøå– Cppcheck å»ŗē½®ē›®éŒ„ - Visual Studio - Visual Studio + Visual Studio @@ -1949,9 +1900,8 @@ Do you want to remove the file from the recently used projects -list? 編譯資料庫 - Borland C++ Builder 6 - Borland C++ Builder 6 + Borland C++ Builder 6 @@ -2237,11 +2187,6 @@ Do you want to remove the file from the recently used projects -list? Tags - - - CWE - - QPlatformTheme @@ -2362,10 +2307,8 @@ Do you want to remove the file from the recently used projects -list? å–ę¶ˆęØ™čØ˜ - - Cppcheck - Cppcheck + Cppcheck @@ -2479,10 +2422,8 @@ Please check the application path and parameters are correct. - - Cppcheck - Cppcheck + Cppcheck @@ -3115,11 +3056,6 @@ To toggle what kind of errors are shown, open view menu. The user interface language has been reset to English. Open the Preferences-dialog to select any of the available languages. - - - Cppcheck - - TxtReport diff --git a/gui/fileviewdialog.cpp b/gui/fileviewdialog.cpp index 3f66f008678..9d453519450 100644 --- a/gui/fileviewdialog.cpp +++ b/gui/fileviewdialog.cpp @@ -54,7 +54,7 @@ void FileViewDialog::loadTextFile(const QString &filename, QTextEdit *edit) msg = msg.arg(filename); QMessageBox msgbox(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", msg, QMessageBox::Ok, this); @@ -68,7 +68,7 @@ void FileViewDialog::loadTextFile(const QString &filename, QTextEdit *edit) msg = msg.arg(filename); QMessageBox msgbox(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", msg, QMessageBox::Ok, this); diff --git a/gui/helpdialog.cpp b/gui/helpdialog.cpp index 78ac1e0e635..bef304c5471 100644 --- a/gui/helpdialog.cpp +++ b/gui/helpdialog.cpp @@ -84,7 +84,7 @@ HelpDialog::HelpDialog(QWidget *parent) : if (helpFile.isEmpty()) { const QString msg = tr("Helpfile '%1' was not found").arg("online-help.qhc"); QMessageBox msgBox(QMessageBox::Warning, - tr("Cppcheck"), + "Cppcheck", msg, QMessageBox::Ok, this); diff --git a/gui/librarydialog.cpp b/gui/librarydialog.cpp index 3199af9a975..147363a3a25 100644 --- a/gui/librarydialog.cpp +++ b/gui/librarydialog.cpp @@ -107,7 +107,7 @@ void LibraryDialog::openCfg() QFile file(selectedFile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("Cannot open file %1.").arg(selectedFile), QMessageBox::Ok, this); @@ -119,7 +119,7 @@ void LibraryDialog::openCfg() const QString errmsg = tempdata.open(file); if (!errmsg.isNull()) { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("Failed to load %1. %2.").arg(selectedFile).arg(errmsg), QMessageBox::Ok, this); @@ -156,7 +156,7 @@ void LibraryDialog::saveCfg() mUi->buttonSave->setEnabled(false); } else { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("Cannot save file %1.").arg(mFileName), QMessageBox::Ok, this); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index bf73828bed4..31f124bc5b0 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -456,7 +456,7 @@ void MainWindow::loadSettings() "Please check (and fix) the editor application settings, otherwise the editor " "program might not start correctly."); QMessageBox msgBox(QMessageBox::Warning, - tr("Cppcheck"), + "Cppcheck", msg, QMessageBox::Ok, this); @@ -666,7 +666,7 @@ void MainWindow::doAnalyzeFiles(const QStringList &files, const bool checkLib, c if (fileNames.isEmpty()) { QMessageBox msg(QMessageBox::Warning, - tr("Cppcheck"), + "Cppcheck", tr("No suitable files found to analyze!"), QMessageBox::Ok, this); @@ -751,7 +751,7 @@ QStringList MainWindow::selectFilesToAnalyze(QFileDialog::FileMode mode) { if (mProjectFile) { QMessageBox msgBox(this); - msgBox.setWindowTitle(tr("Cppcheck")); + msgBox.setWindowTitle("Cppcheck"); const QString msg(tr("You must close the project file before selecting new files or directories!")); msgBox.setText(msg); msgBox.setIcon(QMessageBox::Critical); @@ -768,8 +768,8 @@ QStringList MainWindow::selectFilesToAnalyze(QFileDialog::FileMode mode) QMap filters; filters[tr("C/C++ Source")] = FileList::getDefaultFilters().join(" "); filters[tr("Compile database")] = compile_commands_json; - filters[tr("Visual Studio")] = "*.sln *.slnx *.vcxproj"; - filters[tr("Borland C++ Builder 6")] = "*.bpr"; + filters["Visual Studio"] = "*.sln *.slnx *.vcxproj"; + filters["Borland C++ Builder 6"] = "*.bpr"; QString lastFilter = mSettings->value(SETTINGS_LAST_ANALYZE_FILES_FILTER).toString(); selected = QFileDialog::getOpenFileNames(this, tr("Select files to analyze"), @@ -857,7 +857,7 @@ void MainWindow::analyzeDirectory() if (projFiles.size() == 1) { // If one project file found, suggest loading it QMessageBox msgBox(this); - msgBox.setWindowTitle(tr("Cppcheck")); + msgBox.setWindowTitle("Cppcheck"); const QString msg(tr("Found project file: %1\n\nDo you want to " "load this project file instead?").arg(projFiles[0])); msgBox.setText(msg); @@ -879,7 +879,7 @@ void MainWindow::analyzeDirectory() // If multiple project files found inform that there are project // files also available. QMessageBox msgBox(this); - msgBox.setWindowTitle(tr("Cppcheck")); + msgBox.setWindowTitle("Cppcheck"); const QString msg(tr("Found project files from the directory.\n\n" "Do you want to proceed analysis without " "using any of these project files?")); @@ -1466,7 +1466,7 @@ void MainWindow::openResults() { if (mUI->mResults->hasResults()) { QMessageBox msgBox(this); - msgBox.setWindowTitle(tr("Cppcheck")); + msgBox.setWindowTitle("Cppcheck"); const QString msg(tr("Current results will be cleared.\n\n" "Opening a new XML file will clear current results.\n" "Do you want to proceed?")); @@ -1591,7 +1591,7 @@ void MainWindow::closeEvent(QCloseEvent *event) "Do you want to stop the analysis and exit Cppcheck?")); QMessageBox msg(QMessageBox::Warning, - tr("Cppcheck"), + "Cppcheck", text, QMessageBox::Yes | QMessageBox::No, this); @@ -1886,7 +1886,7 @@ void MainWindow::analyzeProject(const ProjectFile *projectFile, const QStringLis buildDir = inf.canonicalPath() + '/' + buildDir; if (!QDir(buildDir).exists()) { QMessageBox msg(QMessageBox::Question, - tr("Cppcheck"), + "Cppcheck", tr("Build dir '%1' does not exist, create it?").arg(buildDir), QMessageBox::Yes | QMessageBox::No, this); @@ -1894,7 +1894,7 @@ void MainWindow::analyzeProject(const ProjectFile *projectFile, const QStringLis QDir().mkpath(buildDir); } else if (!projectFile->getAddons().isEmpty()) { QMessageBox m(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("To check the project using addons, you need a build directory."), QMessageBox::Ok, this); @@ -1949,7 +1949,7 @@ void MainWindow::analyzeProject(const ProjectFile *projectFile, const QStringLis if (!errorMessage.isEmpty()) { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("Failed to import '%1': %2\n\nAnalysis is stopped.").arg(prjfile).arg(errorMessage), QMessageBox::Ok, this); @@ -1958,7 +1958,7 @@ void MainWindow::analyzeProject(const ProjectFile *projectFile, const QStringLis } } catch (InternalError &e) { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("Failed to import '%1' (%2), analysis is stopped").arg(prjfile).arg(QString::fromStdString(e.errorMessage)), QMessageBox::Ok, this); @@ -2030,7 +2030,7 @@ void MainWindow::editProjectFile() { if (!mProjectFile) { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("No project file loaded"), QMessageBox::Ok, this); @@ -2118,7 +2118,7 @@ void MainWindow::openRecentProject() "used projects -list?").arg(project)); QMessageBox msg(QMessageBox::Warning, - tr("Cppcheck"), + "Cppcheck", text, QMessageBox::Yes | QMessageBox::No, this); diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui index 1f66d1a582a..16577224874 100644 --- a/gui/mainwindow.ui +++ b/gui/mainwindow.ui @@ -23,7 +23,7 @@ - Cppcheck + Cppcheck @@ -684,7 +684,7 @@ :/cppcheck-gui.png:/cppcheck-gui.png - Cppcheck + Cppcheck Show Cppcheck results @@ -992,7 +992,7 @@ true - Misra C + Misra C @@ -1000,7 +1000,7 @@ true - Misra C++ 2008 + Misra C++ 2008 @@ -1008,7 +1008,7 @@ true - Cert C + Cert C @@ -1016,7 +1016,7 @@ true - Cert C++ + Cert C++ @@ -1024,7 +1024,7 @@ true - Misra C++ 2023 + Misra C++ 2023 diff --git a/gui/platforms.cpp b/gui/platforms.cpp index 77683a6ea09..27504006477 100644 --- a/gui/platforms.cpp +++ b/gui/platforms.cpp @@ -36,11 +36,11 @@ void Platforms::add(const QString &title, Platform::Type platform) void Platforms::init() { add(tr("Native"), Platform::Type::Native); - add(tr("Unix 32-bit"), Platform::Type::Unix32); - add(tr("Unix 64-bit"), Platform::Type::Unix64); - add(tr("Windows 32-bit ANSI"), Platform::Type::Win32A); - add(tr("Windows 32-bit Unicode"), Platform::Type::Win32W); - add(tr("Windows 64-bit"), Platform::Type::Win64); + add("Unix 32-bit", Platform::Type::Unix32); + add("Unix 64-bit", Platform::Type::Unix64); + add("Windows 32-bit ANSI", Platform::Type::Win32A); + add("Windows 32-bit Unicode", Platform::Type::Win32W); + add("Windows 64-bit", Platform::Type::Win64); } int Platforms::getCount() const diff --git a/gui/projectfile.ui b/gui/projectfile.ui index 84a1d6e40ec..9f7ad91fa8f 100644 --- a/gui/projectfile.ui +++ b/gui/projectfile.ui @@ -1010,14 +1010,14 @@ - Clang-tidy + Clang-Tidy - Clang analyzer + Clang Static Analyzer diff --git a/gui/projectfiledialog.cpp b/gui/projectfiledialog.cpp index e156f3dfe3b..72e3d651471 100644 --- a/gui/projectfiledialog.cpp +++ b/gui/projectfiledialog.cpp @@ -624,9 +624,9 @@ void ProjectFileDialog::browseImportProject() const QFileInfo inf(mProjectFile->getFilename()); const QDir &dir = inf.absoluteDir(); QMap filters; - filters[tr("Visual Studio")] = "*.sln *.slnx *.vcxproj"; + filters["Visual Studio"] = "*.sln *.slnx *.vcxproj"; filters[tr("Compile database")] = "compile_commands.json"; - filters[tr("Borland C++ Builder 6")] = "*.bpr"; + filters["Borland C++ Builder 6"] = "*.bpr"; QString fileName = QFileDialog::getOpenFileName(this, tr("Import Project"), dir.canonicalPath(), toFilterString(filters)); diff --git a/gui/resultstree.cpp b/gui/resultstree.cpp index fc70fdb84af..ed8b3c7412e 100644 --- a/gui/resultstree.cpp +++ b/gui/resultstree.cpp @@ -122,7 +122,7 @@ static QStringList getLabels() { QObject::tr("Rule"), QObject::tr("Since date"), QObject::tr("Tags"), - QObject::tr("CWE")}; + "CWE"}; } static Severity getSeverity(ReportType reportType, const ErrorItem& errorItem) { @@ -741,7 +741,7 @@ void ResultsTree::startApplication(const ResultItem *target, int application) //If there are no applications specified, tell the user about it if (mApplications->getApplicationCount() == 0) { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("No editor application configured.\n\n" "Configure the editor application for Cppcheck in preferences/Applications."), QMessageBox::Ok, @@ -755,7 +755,7 @@ void ResultsTree::startApplication(const ResultItem *target, int application) if (application == -1) { QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), + "Cppcheck", tr("No default editor application selected.\n\n" "Please select the default editor application in preferences/Applications."), QMessageBox::Ok, diff --git a/gui/resultsview.cpp b/gui/resultsview.cpp index 496c0793157..55f673ab80c 100644 --- a/gui/resultsview.cpp +++ b/gui/resultsview.cpp @@ -345,7 +345,7 @@ void ResultsView::checkingFinished() //Tell user that we found no errors if (!hasResults()) { QMessageBox msg(QMessageBox::Information, - tr("Cppcheck"), + "Cppcheck", tr("No errors found."), QMessageBox::Ok, this); @@ -356,7 +356,7 @@ void ResultsView::checkingFinished() QString text = tr("Errors were found, but they are configured to be hidden.\n" \ "To toggle what kind of errors are shown, open view menu."); QMessageBox msg(QMessageBox::Information, - tr("Cppcheck"), + "Cppcheck", text, QMessageBox::Ok, this); diff --git a/gui/translationhandler.cpp b/gui/translationhandler.cpp index d8160525856..14faedc04a2 100644 --- a/gui/translationhandler.cpp +++ b/gui/translationhandler.cpp @@ -133,7 +133,7 @@ bool TranslationHandler::setLanguage(const QString &code) "the Preferences-dialog to select any of the available " "languages.").arg(error)); QMessageBox msgBox(QMessageBox::Warning, - tr("Cppcheck"), + "Cppcheck", msg, QMessageBox::Ok); msgBox.exec(); From 37b5e958a2bc9380594c9270620ee38adde1b0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Wed, 17 Jun 2026 10:28:29 +0200 Subject: [PATCH 078/171] removed usage of `#file`/`#endfile` (#7951) --- lib/cppcheck.cpp | 8 --- test/cli/other_test.py | 111 ++++++++++++++++++++++++++++++++++++ test/testpreprocessor.cpp | 91 +++++++++++++---------------- test/testtokenize.cpp | 35 ++++++------ test/testunusedprivfunc.cpp | 39 ------------- 5 files changed, 168 insertions(+), 116 deletions(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index da078e5eb20..b7ab1f99039 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1136,15 +1136,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str codeWithoutCfg = preprocessor.getcode(currentConfig, files, true); }); - if (startsWith(codeWithoutCfg,"#file")) - codeWithoutCfg.insert(0U, "//"); std::string::size_type pos = 0; - while ((pos = codeWithoutCfg.find("\n#file",pos)) != std::string::npos) - codeWithoutCfg.insert(pos+1U, "//"); - pos = 0; - while ((pos = codeWithoutCfg.find("\n#endfile",pos)) != std::string::npos) - codeWithoutCfg.insert(pos+1U, "//"); - pos = 0; while ((pos = codeWithoutCfg.find(Preprocessor::macroChar,pos)) != std::string::npos) codeWithoutCfg[pos] = ' '; mErrorLogger.reportOut(codeWithoutCfg, Color::Reset); diff --git a/test/cli/other_test.py b/test/cli/other_test.py index f788a7d21c8..c79fd0c8e50 100644 --- a/test/cli/other_test.py +++ b/test/cli/other_test.py @@ -4240,6 +4240,117 @@ def test_no_valid_configuration(tmp_path): ] +# The implementation for "A::a" is missing - so don't check if "A::b" is used or not +def test_unused_private_function_incomplete_impl(tmpdir): + test_inc = os.path.join(tmpdir, 'test.h') + with open(test_inc, 'wt') as f: + f.write( +""" +class A +{ +public: + A(); + void a(); +private: + void b(); +}; +""") + + test_file = os.path.join(tmpdir, 'test.cpp') + with open(test_file, 'wt') as f: + f.write( +""" +#include "test.h" + +A::A() { } +void A::b() { } +""") + + args = [ + '-q', + '--template=simple', + '--enable=style', + '--suppress=functionStatic', # we do not care about this - this was converted from TestUnusedPrivateFunction + test_file + ] + + ret, stdout, stderr = cppcheck(args) + assert stdout == '' + assert stderr.splitlines() == [] + assert ret == 0, stdout + + +def test_unused_private_function_multi_file(tmpdir): # ticket #2567 + test_inc = os.path.join(tmpdir, 'test.h') + with open(test_inc, 'wt') as f: + f.write( +""" +struct Fred +{ + Fred() + { + Init(); + } +private: + void Init(); +}; +""") + + test_file = os.path.join(tmpdir, 'test.cpp') + with open(test_file, 'wt') as f: + f.write( +""" +#include "test.h" + +void Fred::Init() +{ +} +""") + + args = [ + '-q', + '--template=simple', + '--enable=style', + '--suppress=functionStatic', # we do not care about this - this was converted from TestUnusedPrivateFunction + test_file + ] + + ret, stdout, stderr = cppcheck(args) + assert stdout == '' + assert stderr.splitlines() == [] + assert ret == 0, stdout + + +def test_missing_doublequote_include(tmpdir): + test_inc = os.path.join(tmpdir, 'abc.h') + with open(test_inc, 'wt') as f: + f.write( +''' +#define a +" +''') + + test_file = os.path.join(tmpdir, 'test.cpp') + with open(test_file, 'wt') as f: + f.write( +""" +#include "abc.h" +""") + + args = [ + '-q', + '--template=simple', + test_file + ] + + ret, stdout, stderr = cppcheck(args) + assert stdout == '' + assert stderr.splitlines() == [ + f"{test_inc}:3:1: error: No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported. [syntaxError]" + ] + assert ret == 0, stdout + + def test_no_valid_configuration_check_config(tmp_path): test_file = tmp_path / 'test.c' with open(test_file, "w") as f: diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 7e01f6f233b..b90a879738d 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -50,13 +50,14 @@ class TestPreprocessor : public TestFixture { TestPreprocessor() : TestFixture("TestPreprocessor") {} private: + #define expandMacros(...) expandMacros_(__FILE__, __LINE__, __VA_ARGS__) template - std::string expandMacros(const char (&code)[size], ErrorLogger &errorLogger) const { + std::string expandMacros_(const char* file, int line, const char (&code)[size], ErrorLogger &errorLogger) const { simplecpp::OutputList outputList; std::vector files; simplecpp::TokenList tokens1 = simplecpp::TokenList(code, files, "file.cpp", &outputList); Preprocessor p(tokens1, settingsDefault, errorLogger, Path::identify(tokens1.getFiles()[0], false)); - ASSERT(p.loadFiles(files)); + ASSERT_LOC(p.loadFiles(files), file, line); simplecpp::TokenList tokens2 = p.preprocess("", files, outputList); (void)p.reportOutput(outputList, true); return tokens2.stringify(); @@ -140,7 +141,7 @@ class TestPreprocessor : public TestFixture { cfgs = preprocessor.getConfigs(); for (const std::string & config : cfgs) { try { - const bool writeLocations = (strstr(code, "#file") != nullptr) || (strstr(code, "#include") != nullptr); + const bool writeLocations = (strstr(code, "#include") != nullptr); cfgcode[config] = preprocessor.getcode(config, files, writeLocations); } catch (const simplecpp::Output &) { cfgcode[config] = ""; @@ -392,7 +393,7 @@ class TestPreprocessor : public TestFixture { std::vector files; simplecpp::OutputList outputList; simplecpp::TokenList tokens(code,files,"test.c",&outputList); - Preprocessor preprocessor(tokens, settings, *this, Standards::Language::C); // TODO: do we need to consider #file? + Preprocessor preprocessor(tokens, settings, *this, Standards::Language::C); ASSERT(preprocessor.loadFiles(files)); ASSERT(!preprocessor.reportOutput(outputList, true)); preprocessor.removeComments(); @@ -407,7 +408,7 @@ class TestPreprocessor : public TestFixture { std::size_t getHash(const char (&code)[size]) { std::vector files; simplecpp::TokenList tokens(code,files,"test.c"); - Preprocessor preprocessor(tokens, settingsDefault, *this, Standards::Language::C); // TODO: do we need to consider #file? + Preprocessor preprocessor(tokens, settingsDefault, *this, Standards::Language::C); ASSERT(preprocessor.loadFiles(files)); preprocessor.removeComments(); return preprocessor.calculateHash(""); @@ -472,16 +473,19 @@ class TestPreprocessor : public TestFixture { void error4() { // In included file { + ScopedFile header("ab.h", "#error hello world!\n"); const auto settings = dinit(Settings, $.userDefines = "TEST"); - const char code[] = "#file \"ab.h\"\n#error hello world!\n#endfile"; + const char code[] = "#include \"ab.h\""; (void)getcodeforcfg(settings, *this, code, "TEST", "test.c"); ASSERT_EQUALS("[ab.h:1:2]: (error) #error hello world! [preprocessorErrorDirective]\n", errout_str()); } // After including a file { + ScopedFile header("ab.h", ""); const auto settings = dinit(Settings, $.userDefines = "TEST"); - const char code[] = "#file \"ab.h\"\n\n#endfile\n#error aaa"; + const char code[] = "#include \"ab.h\"\n" + "#error aaa"; (void)getcodeforcfg(settings, *this, code, "TEST", "test.c"); ASSERT_EQUALS("[test.c:2:2]: (error) #error aaa [preprocessorErrorDirective]\n", errout_str()); } @@ -584,35 +588,35 @@ class TestPreprocessor : public TestFixture { } void includeguard1() { + ScopedFile header("abc.h", + "#ifndef abcH\n" + "#define abcH\n" + "#endif\n"); // Handling include guards.. - const char filedata[] = "#file \"abc.h\"\n" - "#ifndef abcH\n" - "#define abcH\n" - "#endif\n" - "#endfile\n" + const char filedata[] = "#include \"abc.h\"\n" "#ifdef ABC\n" "#endif"; ASSERT_EQUALS("\nABC=ABC\n", getConfigsStr(filedata)); } void includeguard2() { + ScopedFile header("abc.h", + "foo\n" + "#ifdef ABC\n" + "\n" + "#endif\n"); // Handling include guards.. - const char filedata[] = "#file \"abc.h\"\n" - "foo\n" - "#ifdef ABC\n" - "\n" - "#endif\n" - "#endfile\n"; + const char filedata[] = "#include \"abc.h\"\n"; ASSERT_EQUALS("\nABC=ABC\n", getConfigsStr(filedata)); } void ifdefwithfile() { + ScopedFile header("abc.h", "class A{};/*\n\n\n\n\n\n\n*/\n"); + // Handling include guards.. const char filedata[] = "#ifdef ABC\n" - "#file \"abc.h\"\n" - "class A{};/*\n\n\n\n\n\n\n*/\n" - "#endfile\n" + "#include \"abc.h\"\n" "#endif\n" "int main() {}\n"; @@ -1576,22 +1580,9 @@ class TestPreprocessor : public TestFixture { } { - const char filedata[] = "#file \"abc.h\"\n" - "#define a\n" - "\"\n" - "#endfile\n"; - - // expand macros.. - const std::string actual(expandMacros(filedata, *this)); - - ASSERT_EQUALS("", actual); - ASSERT_EQUALS("[abc.h:2:1]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported. [syntaxError]\n", errout_str()); - } - - { - const char filedata[] = "#file \"abc.h\"\n" - "#define a\n" - "#endfile\n" + ScopedFile header("abc.h", + "#define a\n"); + const char filedata[] = "#include \"abc.h\"\n" "\"\n"; // expand macros.. @@ -2286,14 +2277,14 @@ class TestPreprocessor : public TestFixture { } void getConfigs7e() { + ScopedFile header("test.h", + "#ifndef test_h\n" + "#define test_h\n" + "#ifdef ABC\n" + "#endif\n" + "#endif\n"); const char filedata[] = "#ifdef ABC\n" - "#file \"test.h\"\n" - "#ifndef test_h\n" - "#define test_h\n" - "#ifdef ABC\n" - "#endif\n" - "#endif\n" - "#endfile\n" + "#include \"test.h\"\n" "#endif\n"; ASSERT_EQUALS("\nABC=ABC\n", getConfigsStr(filedata)); } @@ -2315,12 +2306,12 @@ class TestPreprocessor : public TestFixture { } void getConfigs11() { // #9832 - include guards - const char filedata[] = "#file \"test.h\"\n" - "#if !defined(test_h)\n" - "#define test_h\n" - "123\n" - "#endif\n" - "#endfile\n"; + ScopedFile header("test.h", + "#if !defined(test_h)\n" + "#define test_h\n" + "123\n" + "#endif\n"); + const char filedata[] = "#include \"test.h\"\n"; ASSERT_EQUALS("\n", getConfigsStr(filedata)); } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index b1e3e87cdcf..6e5ea0f785f 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -8848,14 +8848,11 @@ class TestTokenizer : public TestFixture { } void testDirectiveIncludeLocations() { + ScopedFile inc1("inc1.h", "#define macro2 val\n#include \"inc2.h\"\n#define macro4 val\n"); + ScopedFile inc2("inc2.h", "#define macro3 val\n"); + // TODO: preprocess? const char filedata[] = "#define macro1 val\n" - "#file \"inc1.h\"\n" - "#define macro2 val\n" - "#file \"inc2.h\"\n" - "#define macro3 val\n" - "#endfile\n" - "#define macro4 val\n" - "#endfile\n" + "#include \"inc1.h\"\n" "#define macro5 val\n"; const char dumpdata[] = " \n" " \n" @@ -8866,8 +8863,14 @@ class TestTokenizer : public TestFixture { " \n" " \n" " \n" - " \n" - " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" " \n" " \n" @@ -8877,14 +8880,8 @@ class TestTokenizer : public TestFixture { " \n" " \n" " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" + " \n" + " \n" " \n" " \n" " \n" @@ -8892,10 +8889,10 @@ class TestTokenizer : public TestFixture { " \n" " \n" " \n" - " \n" + " \n" " \n" " \n" - " \n" + " \n" " \n" " \n" " \n" diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index 4a2a6ca1894..09f8c21d102 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -58,7 +58,6 @@ class TestUnusedPrivateFunction : public TestFixture { TEST_CASE(classInClass); TEST_CASE(sameFunctionNames); - TEST_CASE(incompleteImplementation); TEST_CASE(derivedClass); // skip warning for derived classes. It might be a virtual function. @@ -76,7 +75,6 @@ class TestUnusedPrivateFunction : public TestFixture { TEST_CASE(testDoesNotIdentifyMethodAsMiddleFunctionArgument); TEST_CASE(testDoesNotIdentifyMethodAsLastFunctionArgument); - TEST_CASE(multiFile); TEST_CASE(unknownBaseTemplate); // ticket #2580 TEST_CASE(hierarchy_loop); // ticket 5590 @@ -482,24 +480,6 @@ class TestUnusedPrivateFunction : public TestFixture { ASSERT_EQUALS("", errout_str()); } - void incompleteImplementation() { - // The implementation for "A::a" is missing - so don't check if - // "A::b" is used or not - check("#file \"test.h\"\n" - "class A\n" - "{\n" - "public:\n" - " A();\n" - " void a();\n" - "private:\n" - " void b();\n" - "};\n" - "#endfile\n" - "A::A() { }\n" - "void A::b() { }"); - ASSERT_EQUALS("", errout_str()); - } - void derivedClass() { // skip warning in derived classes in case the base class is invisible check("class derived : public base\n" @@ -780,25 +760,6 @@ class TestUnusedPrivateFunction : public TestFixture { ASSERT_EQUALS("", errout_str()); } - void multiFile() { // ticket #2567 - check("#file \"test.h\"\n" - "struct Fred\n" - "{\n" - " Fred()\n" - " {\n" - " Init();\n" - " }\n" - "private:\n" - " void Init();\n" - "};\n" - "#endfile\n" - "void Fred::Init()\n" - "{\n" - "}"); - - ASSERT_EQUALS("", errout_str()); - } - void unknownBaseTemplate() { // ticket #2580 check("class Bla : public Base2 {\n" "public:\n" From 54b482c09bb9848343f6e30f6b0bd3814f9bcfcc Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 17 Jun 2026 11:24:55 +0200 Subject: [PATCH 079/171] Fix #14374 FP missingReturn with std::throw_with_nested() (#8638) --- cfg/std.cfg | 6 ++++++ test/cfg/std.cpp | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/cfg/std.cfg b/cfg/std.cfg index 245142c091d..4662d0a4632 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -8814,6 +8814,12 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
+ + + + true + + malloc,std::malloc calloc,std::calloc diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index 77c9d99cd5d..850dd74b997 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -5379,3 +5379,13 @@ int containerOutOfBounds_std_initializer_list() { // #14340 int i = *x.end(); return i + containerOutOfBounds_std_initializer_list_access(x); } + +int* missingReturn_std_throw_with_nested() { // #14374 + try { + int* p = new int(); + return p; + } + catch (...) { + std::throw_with_nested(std::runtime_error("xyz")); + } +} From c903d68fdc7ca57da42ad0d0c1d33293f7d2d84b Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:20:02 +0200 Subject: [PATCH 080/171] Fix #13855 useStlAlgorithm might lack column information (#8627) --- lib/tokenize.cpp | 1 + test/teststl.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 59da46a0b28..f97057ddb0f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7003,6 +7003,7 @@ Token *Tokenizer::simplifyAddBracesPair(Token *tok, bool commandWithCondition) tokAfterCondition->previous()->insertToken("{"); Token * tokOpenBrace=tokAfterCondition->previous(); + tokOpenBrace->column(tokAfterCondition->column()); tokEnd->insertToken("}"); Token * tokCloseBrace=tokEnd->next(); diff --git a/test/teststl.cpp b/test/teststl.cpp index 51fab0e6021..2060a5cfd2b 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -613,7 +613,7 @@ class TestStl : public TestFixture { " return i;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8:0]: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:8:13]: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); checkNormal("bool g();\n" "int f(int x) {\n" @@ -626,7 +626,7 @@ class TestStl : public TestFixture { " return i;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8:0]: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:8:13]: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); checkNormal("bool g();\n" "void f(int x) {\n" @@ -5260,7 +5260,7 @@ class TestStl : public TestFixture { " return s.erase(it);\n" " return s.end();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3:0]: (style) Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:3:9]: (style) Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); // #11381 check("int f(std::map& map) {\n" @@ -5953,7 +5953,7 @@ class TestStl : public TestFixture { " v1.erase(it1);\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:9:0]: (style) Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:9:17]: (style) Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); check("bool f(const std::set& set, const std::string& f) {\n" // #11595 " for (const std::string& s : set) {\n" From 717566c1e2f262ddf266d54d3afaa42aed3a1022 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:21:05 +0200 Subject: [PATCH 081/171] Partial fix for #14810 FN constVariablePointer (cbegin() called on container) (#8619) Co-authored-by: chrchr-github --- lib/library.cpp | 2 ++ test/testother.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/lib/library.cpp b/lib/library.cpp index 7520944d8ad..2a198001d3c 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1781,6 +1781,8 @@ bool Library::isFunctionConst(const Token *ftok) const const Yield yield = astContainerYield(ftok->astParent()->astOperand1(), *this); if (yield == Yield::EMPTY || yield == Yield::SIZE || yield == Yield::BUFFER_NT) return true; + if ((yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR) && ftok->str()[0] == 'c') + return true; } return false; } diff --git a/test/testother.cpp b/test/testother.cpp index c8a95c9882b..eb8f9dfe8ef 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -4867,6 +4867,11 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:1:12]: (style) Parameter 'p' can be declared as pointer to const [constParameterPointer]\n" "[test.cpp:1:20]: (style) Parameter 'q' can be declared as pointer to const [constParameterPointer]\n", errout_str()); + + check("int f(std::vector* p) {\n" // #14810 + " return *p->cbegin();\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:1:25]: (style) Parameter 'p' can be declared as pointer to const [constParameterPointer]\n", errout_str()); } void constArray() { From af63e5fbad20993997279a9b73256c9dc2f3095d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 17 Jun 2026 13:42:54 +0200 Subject: [PATCH 082/171] Fix #14783 / #14784 FN unusedVariable with templated type (default constructor, regression) (#8574) Co-authored-by: chrchr-github --- lib/checkunusedvar.cpp | 4 ---- test/testunusedvar.cpp | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index fcc8746c30e..8ed249f05e2 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1155,10 +1155,6 @@ void CheckUnusedVarImpl::checkFunctionVariableUsage_iterateScopes(const Scope* c variables.read(tok2->varId(), tok); } } - } else if (tok->variable() && tok->variable()->isClass() && tok->variable()->type() && - (tok->variable()->type()->needInitialization == Type::NeedInitialization::False) && - tok->strAt(1) == ";") { - variables.write(tok->varId(), tok); } } } diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 2efe658b52e..03ef0a14a83 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -7083,6 +7083,24 @@ class TestUnusedVar : public TestFixture { " S<0> s;\n" "}\n"); ASSERT_EQUALS("[test.cpp:6:10]: (style) Unused variable: s [unusedVariable]\n", errout_str()); + + functionVariableUsage("template \n" // #14783 + "struct A {\n" + " A() = default;\n" + "};\n" + "void f() {\n" + " A a;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6:12]: (style) Unused variable: a [unusedVariable]\n", errout_str()); + + functionVariableUsage("template \n" // #14784 + "struct A {\n" + " A() {}\n" + "};\n" + "void f() {\n" + " A a;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6:12]: (style) Unused variable: a [unusedVariable]\n", errout_str()); } void localvarFuncPtr() { @@ -7171,6 +7189,7 @@ class TestUnusedVar : public TestFixture { "void f() {\n" " Y y;\n" "}"); // #4695 + ASSERT_EQUALS("[test.cpp:6:7]: (style) Unused variable: y [unusedVariable]\n", errout_str()); } void crash3() { From 2538dcde482f91719b2c3e3ea7db508d6d3bf5a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ramner=C3=B6?= Date: Wed, 17 Jun 2026 18:43:39 +0200 Subject: [PATCH 083/171] updated readme to direct vs code users to cppcheck official extension [skip ci] (#8657) --- readme.md | 66 ++----------------------------------------------------- 1 file changed, 2 insertions(+), 64 deletions(-) diff --git a/readme.md b/readme.md index 512a1ec1110..6671fdd4827 100644 --- a/readme.md +++ b/readme.md @@ -108,71 +108,9 @@ If you do not wish to use the Visual Studio IDE, you can compile Cppcheck from t msbuild cppcheck.sln ``` -### VS Code (on Windows) - -Install MSYS2 to get GNU toolchain with g++ and gdb (). -Create a `settings.json` file in the `.vscode` folder with the following content (adjust path as necessary): - -```json -{ - "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe", - "terminal.integrated.shellArgs.windows": [ - "--login", - ], - "terminal.integrated.env.windows": { - "CHERE_INVOKING": "1", - "MSYSTEM": "MINGW64", - } -} -``` +### VS Code -Run `make` in the terminal to build Cppcheck. - -For debugging create a `launch.json` file in the `.vscode` folder with the following content, which covers configuration for debugging Cppcheck and `misra.py`: - -```json -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "cppcheck", - "type": "cppdbg", - "request": "launch", - "program": "${workspaceFolder}/cppcheck.exe", - "args": [ - "--dump", - "${workspaceFolder}/addons/test/misra/misra-test.c" - ], - "stopAtEntry": false, - "cwd": "${workspaceFolder}", - "environment": [], - "externalConsole": true, - "MIMode": "gdb", - "miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ] - }, - { - "name": "misra.py", - "type": "python", - "request": "launch", - "program": "${workspaceFolder}/addons/misra.py", - "console": "integratedTerminal", - "args": [ - "${workspaceFolder}/addons/test/misra/misra-test.c.dump" - ] - } - ] -} -``` +Cppcheck Official is an extension officially supported by the cppcheck team allowing you to easily use cppcheck in VS Code. You can find it in VS Code Marketplace through the extension tab in your IDE. For instructions on how to set it up and use it, see the readme on the github page: ### Qt Creator + MinGW From 93bc25196f2b296b976bdf9a5ca1540ea97179b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Berder?= <18538310+francois-berder@users.noreply.github.com> Date: Thu, 18 Jun 2026 19:24:38 +0200 Subject: [PATCH 084/171] Fix #13628 FP: accessMoved with ternary (#8645) When std::move(x) is only in the true branch of a ternary operator, endOfFunctionCall was left pointing at the first token of the false branch, causing valueFlowForward to tag it as always-moved and report a spurious warning on the ? token. Fix by advancing past the entire false-branch subtree using nextAfterAstRightmostLeaf before starting propagation. --------- Signed-off-by: Francois Berder --- lib/valueflow.cpp | 7 +++++-- test/testother.cpp | 12 ++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 68e989c0738..fb9f6dda7a1 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3296,8 +3296,11 @@ static void valueFlowAfterMove(const TokenList& tokenlist, const SymbolDatabase& ternaryColon = ternaryColon->astParent(); if (Token::simpleMatch(ternaryColon, ":")) { endOfFunctionCall = ternaryColon->astOperand2(); - if (Token::simpleMatch(endOfFunctionCall, "(")) - endOfFunctionCall = endOfFunctionCall->link(); + Token* next = nextAfterAstRightmostLeaf(endOfFunctionCall); + if (next) + endOfFunctionCall = next; + else + endOfFunctionCall = endOfFunctionCall->next(); } } ValueFlow::Value value; diff --git a/test/testother.cpp b/test/testother.cpp index eb8f9dfe8ef..a24209fd4f1 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -12866,6 +12866,18 @@ class TestOther : public TestFixture { " h(b ? h(gA(5, std::move(s))) : h(gB(7, std::move(s))));\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("int cb(std::string);\n" // #13628 + "void f(bool b, std::string s1) {\n" + " std::string s2 = b ? cb(std::move(s1)) : s1;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("int cb(std::string);\n" + "void f(bool b, std::string s1) {\n" + " std::string s2 = b ? cb(std::move(s1)) : s1 + s1;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void movePointerAlias() From 3be9d35fb5d79c10cd0b591020e4f4f29dc9ee50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 19 Jun 2026 14:56:41 +0200 Subject: [PATCH 085/171] Fix #14863 (tokenizer: add token flag when braces are inserted during simplifications and publish in dumpfile) (#8664) --- lib/checkother.cpp | 4 ++-- lib/token.h | 19 ++++++++++++++----- lib/tokenize.cpp | 11 ++++++++--- test/testtokenize.cpp | 12 ++++++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 551c3a47543..9b9d40a777e 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1289,7 +1289,7 @@ void CheckOtherImpl::checkVariableScope() tok = tok->link(); // parse else if blocks.. - } else if (Token::simpleMatch(tok, "else { if (") && tok->next()->isSimplifiedScope() && Token::simpleMatch(tok->linkAt(3), ") {")) { + } else if (Token::simpleMatch(tok, "else { if (") && tok->next()->isInsertedBrace() && Token::simpleMatch(tok->linkAt(3), ") {")) { tok = tok->next(); } else if (tok->varId() == var->declarationId() || tok->str() == "goto") { reduce = false; @@ -1415,7 +1415,7 @@ bool CheckOtherImpl::checkInnerScope(const Token *tok, const Variable* var, bool if (scope->type == ScopeType::eSwitch) return false; // Used in outer switch scope - unsafe or impossible to reduce scope - if (scope->bodyStart && scope->bodyStart->isSimplifiedScope()) + if (scope->bodyStart && scope->bodyStart->isSimplifiedIfInitStmt()) return false; // simplified if/for/switch init statement } if (var->isArrayOrPointer()) { diff --git a/lib/token.h b/lib/token.h index ca945fcab22..3328af31fa0 100644 --- a/lib/token.h +++ b/lib/token.h @@ -732,11 +732,11 @@ class CPPCHECKLIB Token { setFlag(fIsTemplate, b); } - bool isSimplifiedScope() const { - return getFlag(fIsSimplifedScope); + bool isSimplifiedIfInitStmt() const { + return getFlag(fIsSimplifiedIfInitStmt); } - void isSimplifiedScope(bool b) { - setFlag(fIsSimplifedScope, b); + void isSimplifiedIfInitStmt(bool b) { + setFlag(fIsSimplifiedIfInitStmt, b); } bool isFinalType() const { @@ -767,6 +767,14 @@ class CPPCHECKLIB Token { setFlag(fIsAnonymous, b); } + bool isInsertedBrace() const { + return getFlag(fIsInsertedBrace); + } + Token* isInsertedBrace(bool b) { + setFlag(fIsInsertedBrace, b); + return this; + } + // cppcheck-suppress unusedFunction bool isBitfield() const { return mImpl->mBits >= 0; @@ -1498,7 +1506,7 @@ class CPPCHECKLIB Token { fIsImplicitInt = (1ULL << 33), // Is "int" token implicitly added? fIsInline = (1ULL << 34), // Is this a inline type fIsTemplate = (1ULL << 35), - fIsSimplifedScope = (1ULL << 36), // scope added when simplifying e.g. if (int i = ...; ...) + fIsSimplifiedIfInitStmt = (1ULL << 36), // simplified if/switch/while init statement e.g. if (int i = ...; ...) => { int i = ...; if (..) .. } fIsRemovedVoidParameter = (1ULL << 37), // A void function parameter has been removed fIsIncompleteConstant = (1ULL << 38), fIsRestrict = (1ULL << 39), // Is this a restrict pointer type @@ -1508,6 +1516,7 @@ class CPPCHECKLIB Token { fIsInitComma = (1ULL << 43), // Is this comma located inside some {..}. i.e: {1,2,3,4} fIsInitBracket = (1ULL << 44), // Is this bracket used as a part of variable initialization i.e: int a{5}, b(2); fIsAnonymous = (1ULL << 45), // Is this a token added for an unnamed member + fIsInsertedBrace = (1ULL << 46), // brace added when simplifying e.g. if (x) f(); => if (x) { f(); } }; enum : std::uint8_t { diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index f97057ddb0f..a8f675bbc97 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -6218,6 +6218,8 @@ void Tokenizer::dump(std::ostream &out) const } if (tok->isRemovedVoidParameter()) outs += " isRemovedVoidParameter=\"true\""; + if (tok->isInsertedBrace()) + outs += " isInsertedBrace=\"true\""; if (tok->isSplittedVarDeclComma()) outs += " isSplittedVarDeclComma=\"true\""; if (tok->isSplittedVarDeclEq()) @@ -7004,10 +7006,12 @@ Token *Tokenizer::simplifyAddBracesPair(Token *tok, bool commandWithCondition) tokAfterCondition->previous()->insertToken("{"); Token * tokOpenBrace=tokAfterCondition->previous(); tokOpenBrace->column(tokAfterCondition->column()); + tokOpenBrace->isInsertedBrace(true); tokEnd->insertToken("}"); Token * tokCloseBrace=tokEnd->next(); tokCloseBrace->column(tokEnd->column()); + tokCloseBrace->isInsertedBrace(true); Token::createMutualLinks(tokOpenBrace,tokCloseBrace); tokBracesEnd=tokCloseBrace; @@ -8038,8 +8042,8 @@ void Tokenizer::elseif() if (Token::Match(tok2, "}|;")) { if (tok2->next() && tok2->strAt(1) != "else") { - tok->insertToken("{")->isSimplifiedScope(true); - tok2->insertToken("}")->isSimplifiedScope(true); + tok->insertToken("{")->isInsertedBrace(true); + tok2->insertToken("}")->isInsertedBrace(true); Token::createMutualLinks(tok->next(), tok2->next()); break; } @@ -8105,7 +8109,8 @@ void Tokenizer::simplifyIfSwitchForInit() tok->str("{"); endscope->insertToken("}"); Token::createMutualLinks(tok, endscope->next()); - tok->isSimplifiedScope(true); + tok->isInsertedBrace(true); + tok->isSimplifiedIfInitStmt(true); } } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 6e5ea0f785f..e56ffa3d8bb 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -140,6 +140,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(whileAddBraces); TEST_CASE(whileAddBracesLabels); + TEST_CASE(whileAddBracesDump); TEST_CASE(doWhileAddBraces); TEST_CASE(doWhileAddBracesLabels); @@ -1532,6 +1533,17 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS("", filter_valueflow(errout_str())); } + void whileAddBracesDump() { + const char code[] = "void f(){while(a);}"; + SimpleTokenizer tokenizer(settingsDefault, *this, false); + ASSERT(tokenizer.tokenize(code)); + ASSERT(Token::simpleMatch(tokenizer.tokens(), "void f ( ) { while ( a ) { ; } }")); + std::ostringstream ostr; + tokenizer.dump(ostr); + const std::string dump = ostr.str(); + ASSERT(dump.find("isInsertedBrace=\"true\"") != std::string::npos); + } + void doWhileAddBraces() { { const char code[] = "{do ; while (0);}"; From d45d90792b2414ff7e3ec0a3069fac1d6bd3c89f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:15:05 +0200 Subject: [PATCH 086/171] Fix #14853 FP funcArgNamesDifferentUnnamed with function pointer argument (#8655) Co-authored-by: chrchr-github --- lib/checkother.cpp | 2 +- test/testother.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 9b9d40a777e..d69cfa7830a 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -4052,7 +4052,7 @@ void CheckOtherImpl::checkFuncArgNamesDifferent() break; } // skip over templates and arrays - if (decl->link() && !Token::Match(decl, "[()]")) + if (decl->link() && precedes(decl, decl->link()) && !Token::Match(decl, "( [*&]")) decl = decl->link(); else if (decl->varId()) declarations[j] = decl; diff --git a/test/testother.cpp b/test/testother.cpp index a24209fd4f1..4215a3b3449 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -12976,6 +12976,10 @@ class TestOther : public TestFixture { check("void f(void (*fp)(), int x);\n" // #14847 "void f(void (*fp)(), int x) {}\n"); ASSERT_EQUALS("", errout_str()); + + check("void f(void (*fp)(int a, int b), int b);\n" // #14853 + "void f(void (*fp)(int a, int b), int b) {}\n"); + ASSERT_EQUALS("", errout_str()); } void funcArgOrderDifferent() { From fb388e69bcfd9117e77289e8386daaaab9be9fea Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:39:29 +0200 Subject: [PATCH 087/171] Fix #14812 FN useStlAlgorithm with std::set (#8629) Co-authored-by: chrchr-github --- gui/checkstatistics.cpp | 10 +++++----- lib/checkother.cpp | 1 + lib/checkstl.cpp | 9 ++++----- lib/symboldatabase.cpp | 4 ++-- lib/templatesimplifier.cpp | 1 + test/cfg/boost.cpp | 1 + test/teststl.cpp | 8 ++++++++ tools/dmake/dmake.cpp | 1 + 8 files changed, 23 insertions(+), 12 deletions(-) diff --git a/gui/checkstatistics.cpp b/gui/checkstatistics.cpp index 612e79da63b..830f5eb6b4e 100644 --- a/gui/checkstatistics.cpp +++ b/gui/checkstatistics.cpp @@ -109,10 +109,10 @@ unsigned CheckStatistics::getCount(const QString &tool, ShowTypes::ShowType type QStringList CheckStatistics::getTools() const { QSet ret; - for (const QString& tool: mStyle.keys()) ret.insert(tool); - for (const QString& tool: mWarning.keys()) ret.insert(tool); - for (const QString& tool: mPerformance.keys()) ret.insert(tool); - for (const QString& tool: mPortability.keys()) ret.insert(tool); - for (const QString& tool: mError.keys()) ret.insert(tool); + std::copy(mStyle.keyBegin(), mStyle.keyEnd(), std::inserter(ret, ret.end())); + std::copy(mWarning.keyBegin(), mWarning.keyEnd(), std::inserter(ret, ret.end())); + std::copy(mPerformance.keyBegin(), mPerformance.keyEnd(), std::inserter(ret, ret.end())); + std::copy(mPortability.keyBegin(), mPortability.keyEnd(), std::inserter(ret, ret.end())); + std::copy(mError.keyBegin(), mError.keyEnd(), std::inserter(ret, ret.end())); return ret.values(); } diff --git a/lib/checkother.cpp b/lib/checkother.cpp index d69cfa7830a..a45dfdf672e 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -4586,6 +4586,7 @@ void CheckOtherImpl::checkUnionZeroInit() std::unordered_map unionsByScopeId; const std::vector unions = parseUnions(*symbolDatabase, mSettings); for (const Union &u : unions) { + // cppcheck-suppress useStlAlgorithm - std::transform is cumbersome unionsByScopeId.emplace(u.scope, u); } diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index c8fcca48f1a..f499bb03b91 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -3116,19 +3116,18 @@ void CheckStlImpl::useStlAlgorithm() bool useLoopVarInMemCall; const Token *memberAccessTok = singleMemberCallInScope(bodyTok, loopVar->varId(), useLoopVarInMemCall, mSettings); if (memberAccessTok && loopType == LoopType::RANGE) { - const Token *memberCallTok = memberAccessTok->astOperand2(); const int contVarId = memberAccessTok->astOperand1()->varId(); if (contVarId == loopVar->varId()) continue; - if (memberCallTok->str() == "push_back" || - memberCallTok->str() == "push_front" || - memberCallTok->str() == "emplace_back") { + using Action = Library::Container::Action; + const auto action = astContainerAction(memberAccessTok->astOperand1(), mSettings.library); + if (contains({Action::PUSH, Action::INSERT}, action)) { std::string algo; if (useLoopVarInMemCall) algo = "std::copy"; else algo = "std::transform"; - useStlAlgorithmError(memberCallTok, algo); + useStlAlgorithmError(memberAccessTok->astOperand2(), algo); } continue; } diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 4b923a328ca..ba5c31d1f47 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1246,6 +1246,7 @@ void SymbolDatabase::createSymbolDatabaseSetTypePointers() { std::unordered_set typenames; for (const Type &t : typeList) { + // cppcheck-suppress useStlAlgorithm - std::transform is cumbersome typenames.insert(t.name()); } @@ -4599,8 +4600,7 @@ void SymbolDatabase::printXml(std::ostream &out) const } // Variables.. - for (const Variable *var : mVariableList) - variables.insert(var); + std::copy(mVariableList.begin(), mVariableList.end(), std::inserter(variables, variables.end())); outs += " \n"; for (const Variable *var : variables) { if (!var) diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 9c8c8fdde9a..2672e66c263 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -3916,6 +3916,7 @@ void TemplateSimplifier::simplifyTemplates(const std::time_t maxtime) std::unordered_map nameOrdinal; int ordinal = 0; for (const auto& decl : mTemplateDeclarations) { + // cppcheck-suppress useStlAlgorithm - std::transform is cumbersome nameOrdinal.emplace(decl.fullName(), ordinal++); } diff --git a/test/cfg/boost.cpp b/test/cfg/boost.cpp index 2cc4b288cce..27fae71b499 100644 --- a/test/cfg/boost.cpp +++ b/test/cfg/boost.cpp @@ -157,6 +157,7 @@ void test_BOOST_FOREACH_5() { std::set data; BOOST_FOREACH(const int& i, get_data()) + // cppcheck-suppress useStlAlgorithm data.insert(i); } diff --git a/test/teststl.cpp b/test/teststl.cpp index 2060a5cfd2b..b7a29b2a11a 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -5661,6 +5661,14 @@ class TestStl : public TestFixture { "}\n", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("", errout_str()); + + check("void f(const std::vector& v) {\n" // #14812 + " std::set s;\n" + " for (const std::string& a : v) {\n" + " s.insert(a);\n" + " }\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4:11]: (style) Consider using std::copy algorithm instead of a raw loop. [useStlAlgorithm]\n", errout_str()); } void loopAlgoIncrement() { diff --git a/tools/dmake/dmake.cpp b/tools/dmake/dmake.cpp index a434c710631..eaf0a727646 100644 --- a/tools/dmake/dmake.cpp +++ b/tools/dmake/dmake.cpp @@ -297,6 +297,7 @@ static std::vector prioritizelib(const std::vector& li std::map priorities; std::size_t prio = libfiles.size(); for (const auto &l : libfiles) { + // cppcheck-suppress useStlAlgorithm - std::transform is cumbersome priorities.emplace(l, prio--); } priorities["lib/valueflow.cpp"] = 1000; From 731ef86c9e1034336854ab858986c400941a9f0f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:46:54 +0200 Subject: [PATCH 088/171] Fix #11861 Syntax Error: AST broken for C++20 ranges (#8644) Co-authored-by: chrchr-github --- lib/tokenlist.cpp | 2 ++ test/testtokenize.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index f98335badb7..5921621fed2 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -1696,6 +1696,8 @@ static Token * createAstAtToken(Token *tok) tok->next()->astOperand1(tok); tok->next()->astOperand2(colon); + createAstAtTokenInner(colon, tok->linkAt(1), cpp); + return decl; } } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index e56ffa3d8bb..8a6a9353707 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -6701,6 +6701,7 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS("foria:( asize.(", testAst("for(decltype(a.size()) i:a);")); ASSERT_EQUALS("forec0{([,(:( fb.return", testAst("for (auto e : c(0, [](auto f) { return f->b; }));")); // #10802 ASSERT_EQUALS("forvar1{;;(", testAst("for(int var{1};;)")); // #12867 + ASSERT_EQUALS("forxg{([(:( si.return", testAst("for (auto [x] : g([](S s) { return s.i; })) {}")); // #11861 // for with initializer (c++20) ASSERT_EQUALS("forab=ca:;(", testAst("for(a=b;int c:a)")); From bf099d1d152456e3372e9301e2d4a821689b0ff3 Mon Sep 17 00:00:00 2001 From: Jonny Date: Sat, 20 Jun 2026 15:00:03 +0100 Subject: [PATCH 089/171] Fix #14854 (import project: Handle forced include files from compilation database projects) (#8641) --- .github/workflows/selfcheck.yml | 2 +- lib/cppcheck.cpp | 1 + lib/filesettings.h | 1 + lib/importproject.cpp | 5 +++++ test/testimportproject.cpp | 19 +++++++++++++++++++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/workflows/selfcheck.yml b/.github/workflows/selfcheck.yml index 6bd87f9243f..6d100c4ddc8 100644 --- a/.github/workflows/selfcheck.yml +++ b/.github/workflows/selfcheck.yml @@ -121,7 +121,7 @@ jobs: - name: Self check (unusedFunction / no test / no gui) run: | - supprs="--suppress=unusedFunction:lib/errorlogger.h:197 --suppress=unusedFunction:lib/importproject.cpp:1666 --suppress=unusedFunction:lib/importproject.cpp:1690" + supprs="--suppress=unusedFunction:lib/errorlogger.h:197 --suppress=unusedFunction:lib/importproject.cpp:1671 --suppress=unusedFunction:lib/importproject.cpp:1695" ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib -D__CPPCHECK__ -D__GNUC__ --enable=unusedFunction,information --exception-handling -rp=. --project=cmake.output.notest_nogui/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr $supprs env: DISABLE_VALUEFLOW: 1 diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index b7ab1f99039..9a3e2e2a053 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -825,6 +825,7 @@ unsigned int CppCheck::check(const FileSettings &fs) else tempSettings.userDefines += fs.cppcheckDefines(); tempSettings.includePaths = fs.includePaths; + tempSettings.userIncludes.insert(tempSettings.userIncludes.end(), fs.forcedIncludes.cbegin(), fs.forcedIncludes.cend()); tempSettings.userUndefs.insert(fs.undefs.cbegin(), fs.undefs.cend()); if (fs.standard.find("++") != std::string::npos) tempSettings.standards.setCPP(fs.standard); diff --git a/lib/filesettings.h b/lib/filesettings.h index 183e38708fd..0b4f15dd7e1 100644 --- a/lib/filesettings.h +++ b/lib/filesettings.h @@ -148,6 +148,7 @@ struct CPPCHECKLIB FileSettings { } std::set undefs; std::list includePaths; + std::list forcedIncludes; // only used by clang mode std::list systemIncludePaths; std::string standard; diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 0bcda5a43bf..2d63fa8bbb7 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -149,6 +149,11 @@ void ImportProject::parseArgs(FileSettings &fs, const std::vector & continue; } + if (!(optArg = getOptArg({ "-include", "/FI", "-FI" }, i)).empty()) { + fs.forcedIncludes.push_back(std::move(optArg)); + continue; + } + if (!(optArg = getOptArg({ "-D", "/D" }, i)).empty()) { defs += optArg + ";"; continue; diff --git a/test/testimportproject.cpp b/test/testimportproject.cpp index 88ca2fe75b7..c9889445c3c 100644 --- a/test/testimportproject.cpp +++ b/test/testimportproject.cpp @@ -73,6 +73,7 @@ class TestImportProject : public TestFixture { TEST_CASE(importCompileCommands13); // #13333: duplicate file entries TEST_CASE(importCompileCommands14); // #14156 TEST_CASE(importCompileCommands15); // #14306 + TEST_CASE(importCompileCommandsForcedInclude); // -include / /FI force-include TEST_CASE(importCompileCommandsArgumentsSection); // Handle arguments section TEST_CASE(importCompileCommandsNoCommandSection); // gracefully handles malformed json TEST_CASE(importCompileCommandsDirectoryMissing); // 'directory' field missing @@ -436,6 +437,24 @@ class TestImportProject : public TestFixture { ASSERT_EQUALS("C:/Users/abcd/efg/hijk/path/123/", fs.includePaths.front()); } + void importCompileCommandsForcedInclude() const { // -include / /FI force-include + REDIRECT; + constexpr char json[] = + R"([{ + "file": "/x/a.c", + "directory": "/x", + "command": "cc -include prefix.h /FIplatform.h -c a.c" + }])"; + std::istringstream istr(json); + TestImporter importer; + ASSERT_EQUALS(true, importer.importCompileCommands(istr)); + ASSERT_EQUALS(1, importer.fileSettings.size()); + const FileSettings &fs = importer.fileSettings.front(); + ASSERT_EQUALS(2, fs.forcedIncludes.size()); + ASSERT_EQUALS("prefix.h", fs.forcedIncludes.front()); // gcc/clang -include + ASSERT_EQUALS("platform.h", fs.forcedIncludes.back()); // MSVC/clang-cl /FI + } + void importCompileCommandsArgumentsSection() const { REDIRECT; constexpr char json[] = "[ { \"directory\": \"/tmp/\"," From 30ec6e1970b3f113de2bc95865cf02ba5c2d8535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 20 Jun 2026 16:02:10 +0200 Subject: [PATCH 090/171] AUTHORS: Add JonnyPtn [skip ci] (#8666) --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 874ff59748b..b505b682708 100644 --- a/AUTHORS +++ b/AUTHORS @@ -206,6 +206,7 @@ Jonathan Clohessy Jonathan Haehne Jonathan NeuschƤfer Jonathan Thackray +Jonny Paton JosĆ© Martins Jose Roquette Joshua Beck From 907f9a46060151139eb909abf1bc414a336390cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 20 Jun 2026 18:44:08 +0200 Subject: [PATCH 091/171] Fix #14850 (Compilation fails on oraclelinux:8 (g++ 8.5.0 released in 2021)) (#8654) --- lib/checks.h | 2 +- lib/settings.cpp | 4 ++-- lib/settings.h | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/checks.h b/lib/checks.h index ec4a78c2008..9c053b81405 100644 --- a/lib/checks.h +++ b/lib/checks.h @@ -29,6 +29,6 @@ namespace CheckInstances { /** List of registered check classes. This is used by Cppcheck to run checks and generate documentation */ CPPCHECKLIB const std::list& get(); -}; +} #endif // checksH diff --git a/lib/settings.cpp b/lib/settings.cpp index 95d4c4e953b..c0539bbeaba 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -79,8 +79,8 @@ Settings::~Settings() = default; Settings::Settings(const Settings&) = default; Settings & Settings::operator=(const Settings &) = default; -Settings::Settings(Settings&&) noexcept = default; -Settings & Settings::operator=(Settings &&) noexcept = default; +Settings::Settings(Settings&&) CPPCHECK_NOEXCEPT = default; +Settings & Settings::operator=(Settings &&) CPPCHECK_NOEXCEPT = default; std::string Settings::loadCppcheckCfg(Settings& settings, Suppressions& suppressions, bool debug) { diff --git a/lib/settings.h b/lib/settings.h index 04ddb9adb9a..4a73f35039b 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -94,6 +94,16 @@ class SimpleEnableGroup { }; +#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 9 +// Hack to workaround GCC bug. +// Details: https://trac.cppcheck.net/ticket/14850 +// seen on g++ before 10.x +#define CPPCHECK_NOEXCEPT +#else +#define CPPCHECK_NOEXCEPT noexcept +#endif + + /** * @brief This is just a container for general settings so that we don't need * to pass individual values to functions or constructors now or in the @@ -113,8 +123,8 @@ class CPPCHECKLIB WARN_UNUSED Settings { Settings(const Settings&); Settings& operator=(const Settings&); - Settings(Settings&&) noexcept; - Settings& operator=(Settings&&) noexcept; + Settings(Settings&&) CPPCHECK_NOEXCEPT; + Settings& operator=(Settings&&) CPPCHECK_NOEXCEPT; static std::string loadCppcheckCfg(Settings& settings, Suppressions& suppressions, bool debug = false); From 31222058d3a70f824c08f3b9f92381874800ffd8 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 20 Jun 2026 19:25:43 +0200 Subject: [PATCH 092/171] Refs #9173: Fix FN bufferAccessOutOfBounds (memset on array, &a[0]) (#8656) --- lib/checkbufferoverrun.cpp | 10 +++++++++- test/testbufferoverrun.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index d278208fcc3..8be9b508849 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -556,8 +556,16 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok) cons { if (!bufTok->valueType()) return ValueFlow::Value(-1); - if (bufTok->isUnaryOp("&")) + + if (bufTok->isUnaryOp("&")) { bufTok = bufTok->astOperand1(); + if (Token::simpleMatch(bufTok, "[")) { + const Token* index = bufTok->astOperand2(); + if (!(index && index->hasKnownIntValue() && index->getKnownIntValue() == 0)) + return ValueFlow::Value(-1); + bufTok = bufTok->astOperand1(); + } + } const Variable *var = bufTok->variable(); if (!var || var->dimensions().empty()) { diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 23e55748ce6..1a03ca336f8 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -227,6 +227,7 @@ class TestBufferOverrun : public TestFixture { TEST_CASE(buffer_overrun_35); //#2304 TEST_CASE(buffer_overrun_36); TEST_CASE(buffer_overrun_37); + TEST_CASE(buffer_overrun_38); TEST_CASE(buffer_overrun_errorpath); TEST_CASE(buffer_overrun_bailoutIfSwitch); // ticket #2378 : bailoutIfSwitch TEST_CASE(buffer_overrun_function_array_argument); @@ -3507,6 +3508,39 @@ class TestBufferOverrun : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void buffer_overrun_38() { // #9173 + check("void f() {\n" + " int a[10];\n" + " memset(&a[0], 0, 20 * sizeof(int));\n" + "}\n" + "void g() {\n" + " int a[10];\n" + " memset(&a[0], 0, 10 * sizeof(int));\n" + "}\n" + "void h() {\n" + " int a[10];\n" + " memset(&a[5], 0, 5 * sizeof(int));\n" + "}\n" + "void i() {\n" + " int a[10][10];\n" + " memset(&a[0][0], 0, 100 * sizeof(int));\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:3:12]: (error) Buffer is accessed out of bounds: &a[0] [bufferAccessOutOfBounds]\n", errout_str()); + + check("void f() {\n" + " int a[10];\n" + " memset(&a[5], 0, 10 * sizeof(int));\n" + "}\n" + "void g() {\n" + " int a[1][1];\n" + " memset(&a[0][0], 0, 10 * sizeof(int));\n" + "}\n"); + TODO_ASSERT_EQUALS("[test.cpp:3:12]: (error) Buffer is accessed out of bounds: &a[5] [bufferAccessOutOfBounds]\n" + "[test.cpp:7:12]: (error) Buffer is accessed out of bounds: &a[0][0] [bufferAccessOutOfBounds]\n", + "", + errout_str()); + } + void buffer_overrun_errorpath() { setMultiline(); Settings s = settings0; From 49f7cd2853f9bc2f1d2c964a4c19addfdb776bf9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 20 Jun 2026 19:26:39 +0200 Subject: [PATCH 093/171] Fix #14848 FP compareValueOutOfTypeRangeError and knownConditionTrueFalse with unsigned arithmetic (#8658) Co-authored-by: chrchr-github --- lib/vf_settokenvalue.cpp | 2 +- test/testvalueflow.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/vf_settokenvalue.cpp b/lib/vf_settokenvalue.cpp index fe94225083b..315f4a40129 100644 --- a/lib/vf_settokenvalue.cpp +++ b/lib/vf_settokenvalue.cpp @@ -613,7 +613,7 @@ namespace ValueFlow } // unary minus - else if (parent->isUnaryOp("-")) { + else if (parent->isUnaryOp("-") && !astIsUnsigned(parent)) { for (const Value &val : tok->values()) { if (!val.isIntValue() && !val.isFloatValue()) continue; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 247d2ae6012..8305a63bc56 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1269,6 +1269,12 @@ class TestValueFlow : public TestFixture { ASSERT_EQUALS(1U, values.size()); ASSERT_EQUALS(-10, values.back().intvalue); + code = "bool f(unsigned a) {\n" // #14848 + " bool x = -a < 1;\n" + " return x;\n" + "}"; + ASSERT_EQUALS(false, testValueOfXKnown(code, 3U, 1)); + // Logical and code = "void f(bool b) {\n" " bool x = false && b;\n" From d7bcdb595797b6f31504ad805a7dd795b6e52bb4 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 22 Jun 2026 12:53:33 +0200 Subject: [PATCH 094/171] Fix #14809 FP syntaxError for typedef involving std::size_t (#8618) `size_t` is a platform type and will be simplified anyway, this is tested here: https://github.com/cppcheck-opensource/cppcheck/blob/e1053dba3b0988dc828d7a9c4b2a8f6c9866035b/test/testtokenize.cpp#L9012 --------- Co-authored-by: chrchr-github --- lib/token.cpp | 1 - test/testtoken.cpp | 17 ----------------- test/testtokenize.cpp | 2 ++ test/testvarid.cpp | 2 +- 4 files changed, 3 insertions(+), 19 deletions(-) diff --git a/lib/token.cpp b/lib/token.cpp index 2b30419b9df..7e19106e1b0 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -204,7 +204,6 @@ static const std::unordered_set stdTypes = { "bool" , "int" , "long" , "short" - , "size_t" , "void" , "wchar_t" , "signed" diff --git a/test/testtoken.cpp b/test/testtoken.cpp index 83a514eb963..92c111c810c 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -1059,7 +1059,6 @@ class TestToken : public TestFixture { standard_types.emplace_back("long"); standard_types.emplace_back("float"); standard_types.emplace_back("double"); - standard_types.emplace_back("size_t"); for (auto test_op = standard_types.cbegin(); test_op != standard_types.cend(); ++test_op) { auto tokensFrontBack = std::make_shared(); @@ -1484,13 +1483,6 @@ class TestToken : public TestFixture { tok.str("char"); // not treated as keyword in TokenList::isKeyword() assert_tok(&tok, Token::Type::eType, /*l=*/ false, /*std=*/ true); } - { - TokenList list_c{settingsDefault, Standards::Language::C}; - auto tokensFrontBack = std::make_shared(); - Token tok(list_c, std::move(tokensFrontBack)); - tok.str("size_t"); // not treated as keyword in TokenList::isKeyword() - assert_tok(&tok, Token::Type::eType, /*l=*/ false, /*std=*/ true); - } } void update_property_info_etype_cpp() const @@ -1502,21 +1494,12 @@ class TestToken : public TestFixture { tok.str("bool"); // not treated as keyword in TokenList::isKeyword() assert_tok(&tok, Token::Type::eType, /*l=*/ false, /*std=*/ true); } - { - TokenList list_cpp{settingsDefault, Standards::Language::CPP}; - auto tokensFrontBack = std::make_shared(); - Token tok(list_cpp, std::move(tokensFrontBack)); - tok.str("size_t"); - assert_tok(&tok, Token::Type::eType, /*l=*/ false, /*std=*/ true); - } } void update_property_info_replace() const // #13743 { auto tokensFrontBack = std::make_shared(); Token tok(list, std::move(tokensFrontBack)); - tok.str("size_t"); - assert_tok(&tok, Token::Type::eType, false, true); tok.str("long"); assert_tok(&tok, Token::Type::eType, false, true); } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 8a6a9353707..167d5411553 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -7893,6 +7893,8 @@ class TestTokenizer : public TestFixture { "}\n")); ignore_errout(); + + ASSERT_EQUALS(";", tokenizeAndStringify("typedef std::size_t size_t;\n")); // #14809 } diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 941b5812678..c8d16bc89a5 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -2841,7 +2841,7 @@ class TestVarID : public TestFixture { void varid_using() { // #3648 const char code[] = "using std::size_t;"; - const char expected[] = "1: using unsigned long ;\n"; + const char expected[] = "1: ;\n"; ASSERT_EQUALS(expected, tokenize(code)); } From d833b6b276af306ffdef18eda4199589ac26bb10 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:44:36 +0200 Subject: [PATCH 095/171] Fix #12520 FN mismatchingContainers/iterators3 with temporary containers and erase (#8665) --- lib/checkstl.cpp | 6 ++++-- test/teststl.cpp | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index f499bb03b91..3e08fe04ed6 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -637,12 +637,14 @@ void CheckStlImpl::iterators() void CheckStlImpl::mismatchingContainerIteratorError(const Token* containerTok, const Token* iterTok, const Token* containerTok2) { const std::string container(containerTok ? containerTok->expressionString() : std::string("v1")); + const std::string containerTemp(isTemporary(containerTok, &mSettings.library) ? " temporary " : " "); const std::string container2(containerTok2 ? containerTok2->expressionString() : std::string("v2")); + const std::string containerTemp2(isTemporary(containerTok2, &mSettings.library) ? " temporary " : " "); const std::string iter(iterTok ? iterTok->expressionString() : std::string("it")); reportError(containerTok, Severity::error, "mismatchingContainerIterator", - "Iterator '" + iter + "' referring to container '" + container2 + "' is used with container '" + container + "'.", + "Iterator '" + iter + "' referring to" + containerTemp2 + "container '" + container2 + "' is used with" + containerTemp + "container '" + container + "'.", CWE664, Certainty::normal); } @@ -884,7 +886,7 @@ void CheckStlImpl::mismatchingContainerIterator() const std::vector args = getArguments(ftok); const Library::Container * c = tok->valueType()->container; - const Library::Container::Action action = c->getAction(tok->strAt(2)); + const Library::Container::Action action = c->getAction(ftok->str()); const Token* iterTok = nullptr; if (action == Library::Container::Action::INSERT && args.size() == 2) { // Skip if iterator pair diff --git a/test/teststl.cpp b/test/teststl.cpp index b7a29b2a11a..35941f6422c 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -2345,6 +2345,15 @@ class TestStl : public TestFixture { " } \n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("std::string g1();\n" // #12520 + "const std::string& g2();\n" + "void f() {\n" + " g1().erase(g1().begin());\n" + " g2().erase(g2().begin());\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4:7]: (error) Iterator 'g1().begin()' referring to temporary container 'g1()' is used with temporary container 'g1()'. [mismatchingContainerIterator]\n", + errout_str()); } void eraseIteratorOutOfBounds() { From ed596da1dc32b29d19573cae722e8fcb730c56c6 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:19:55 +0200 Subject: [PATCH 096/171] Fix #14817 FN constParameterPointer for constructor initializing array (regression) , add test for #11471 (#8637) Co-authored-by: chrchr-github --- lib/astutils.cpp | 2 ++ test/testother.cpp | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 8dfd03596d3..7af806508fd 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2592,6 +2592,8 @@ bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Setti if (const Variable* var = tok->variable()) { if (tok == var->nameToken() && (!var->isReference() || (var->isConst() && var->type() == tok1->type())) && (!var->isClass() || (var->valueType() && var->valueType()->container))) // const ref or passed to (copy) ctor return false; + if (var->isArray() && var->valueType() && var->valueType()->pointer == 0 && var->valueType()->isPrimitive()) + return false; } std::vector args = getArgumentVars(tok, argnr); diff --git a/test/testother.cpp b/test/testother.cpp index 4215a3b3449..1d69cf6763e 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -4872,6 +4872,28 @@ class TestOther : public TestFixture { " return *p->cbegin();\n" "}\n"); ASSERT_EQUALS("[test.cpp:1:25]: (style) Parameter 'p' can be declared as pointer to const [constParameterPointer]\n", errout_str()); + + check("struct S {\n" // #14817 + " explicit S(int *a) : m{ a[0], a[1] } {}\n" + " int m[2];\n" + "}" + "struct T {\n" + " explicit T(int *a) : m{ &a[0], &a[1] } {}\n" + " int* m[2];\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:2:21]: (style) Parameter 'a' can be declared as pointer to const [constParameterPointer]\n", + errout_str()); + + check("class A {\n" // #11471 + "public:\n" + " A(const int& i, int) : m_i(&i) {}\n" + " const int* m_i;\n" + "};\n" + "A f(int& s) {\n" + " return A(s, 0);\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6:10]: (style) Parameter 's' can be declared as reference to const [constParameterReference]\n", + errout_str()); } void constArray() { From a709c8664ee156fd0f3c5b286cc0eb58a3c15de9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:39:23 +0200 Subject: [PATCH 097/171] Fix #14860 FP sizeofwithsilentarraypointer with std::array (#8661) --- lib/checksizeof.cpp | 2 +- test/testsizeof.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index b9c495733e0..2d9012078a6 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -87,7 +87,7 @@ void CheckSizeofImpl::checkSizeofForArrayParameter() } const Variable *var = varTok->variable(); - if (var && var->isArray() && var->isArgument() && !var->isReference()) + if (var && var->isArray() && var->isArgument() && !var->isReference() && !(var->isStlType() && var->getTypeName() == "std::array")) sizeofForArrayParameterError(tok); } } diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index 9337252f92c..f955242019f 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -334,6 +334,14 @@ class TestSizeof : public TestFixture { "}"); ASSERT_EQUALS("", errout_str()); + check("int f(std::array a) {\n" // #14860 + " return sizeof(a);\n" + "}\n" + "int g(std::string a[2]) {\n" + " return sizeof(a);\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:12]: (warning) Using 'sizeof' on array given as function argument returns size of a pointer. [sizeofwithsilentarraypointer]\n", + errout_str()); } void sizeofForNumericParameter() { From e0014e1b023442e9c0e15609658a910c41436356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 23 Jun 2026 08:58:20 +0200 Subject: [PATCH 098/171] fixed some `-Wsign-compare` compiler warnings (#8280) --- lib/analyzerinfo.cpp | 2 +- lib/analyzerinfo.h | 2 +- lib/check64bit.cpp | 12 ++++++------ lib/checkbufferoverrun.cpp | 4 ++-- lib/checkclass.cpp | 6 +++--- lib/checkfunctions.cpp | 2 +- lib/checkleakautovar.cpp | 2 +- lib/checknullpointer.cpp | 6 +++--- lib/checkother.cpp | 12 ++++++------ lib/checkother.h | 2 +- lib/checkstl.cpp | 8 ++++---- lib/clangimport.cpp | 10 +++++----- lib/ctu.cpp | 18 +++++++++--------- lib/ctu.h | 10 +++++----- lib/errorlogger.h | 2 +- lib/fwdanalysis.cpp | 4 ++-- lib/programmemory.cpp | 2 +- lib/reverseanalyzer.cpp | 2 +- lib/symboldatabase.cpp | 18 +++++++++--------- lib/symboldatabase.h | 12 ++++++------ lib/templatesimplifier.cpp | 6 +++--- lib/token.cpp | 6 +++--- lib/valueflow.cpp | 4 ++-- 23 files changed, 76 insertions(+), 76 deletions(-) diff --git a/lib/analyzerinfo.cpp b/lib/analyzerinfo.cpp index 6f919ec3651..36803b897b1 100644 --- a/lib/analyzerinfo.cpp +++ b/lib/analyzerinfo.cpp @@ -126,7 +126,7 @@ std::string AnalyzerInformation::skipAnalysis(const tinyxml2::XMLDocument &analy return ""; } -std::string AnalyzerInformation::getAnalyzerInfoFileFromFilesTxt(std::istream& filesTxt, const std::string &sourcefile, const std::string &cfg, int fsFileId) +std::string AnalyzerInformation::getAnalyzerInfoFileFromFilesTxt(std::istream& filesTxt, const std::string &sourcefile, const std::string &cfg, size_t fsFileId) { std::string line; while (std::getline(filesTxt,line)) { diff --git a/lib/analyzerinfo.h b/lib/analyzerinfo.h index d2a83c747c3..75674a22f82 100644 --- a/lib/analyzerinfo.h +++ b/lib/analyzerinfo.h @@ -87,7 +87,7 @@ class CPPCHECKLIB AnalyzerInformation { protected: static std::string getFilesTxt(const std::list &sourcefiles, const std::list &fileSettings); - static std::string getAnalyzerInfoFileFromFilesTxt(std::istream& filesTxt, const std::string &sourcefile, const std::string &cfg, int fsFileId); + static std::string getAnalyzerInfoFileFromFilesTxt(std::istream& filesTxt, const std::string &sourcefile, const std::string &cfg, size_t fsFileId); static std::string skipAnalysis(const tinyxml2::XMLDocument &analyzerInfoDoc, std::size_t hash, std::list &errors); diff --git a/lib/check64bit.cpp b/lib/check64bit.cpp index 345d66d9846..174237eef5a 100644 --- a/lib/check64bit.cpp +++ b/lib/check64bit.cpp @@ -90,11 +90,11 @@ void Check64BitPortabilityImpl::pointerassignment() if (!returnType) continue; - if (retPointer && !returnType->typeScope && returnType->pointer == 0U) + if (retPointer && !returnType->typeScope && returnType->pointer == 0) returnIntegerError(tok); if (!retPointer) { - bool warn = returnType->pointer >= 1U; + bool warn = returnType->pointer >= 1; if (!warn) { const Token* tok2 = tok->astOperand1(); while (tok2 && tok2->isCast()) @@ -119,17 +119,17 @@ void Check64BitPortabilityImpl::pointerassignment() continue; // Assign integer to pointer.. - if (lhstype->pointer >= 1U && + if (lhstype->pointer >= 1 && !tok->astOperand2()->isNumber() && - rhstype->pointer == 0U && + rhstype->pointer == 0 && rhstype->originalTypeName.empty() && rhstype->type == ValueType::Type::INT && !isFunctionPointer(tok->astOperand1())) assignmentIntegerToAddressError(tok); // Assign pointer to integer.. - if (rhstype->pointer >= 1U && - lhstype->pointer == 0U && + if (rhstype->pointer >= 1 && + lhstype->pointer == 0 && lhstype->originalTypeName.empty() && lhstype->isIntegral() && lhstype->type >= ValueType::Type::CHAR && diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 8be9b508849..879ade5f21f 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -654,7 +654,7 @@ void CheckBufferOverrunImpl::bufferOverflow() if (!mSettings.library.hasminsize(tok)) continue; const std::vector args = getArguments(tok); - for (int argnr = 0; argnr < args.size(); ++argnr) { + for (size_t argnr = 0; argnr < args.size(); ++argnr) { if (!args[argnr]->valueType() || args[argnr]->valueType()->pointer == 0) continue; const std::vector *minsizes = mSettings.library.argminsizes(tok, argnr + 1); @@ -846,7 +846,7 @@ void CheckBufferOverrunImpl::argumentSize() // If argument is '%type% a[num]' then check bounds against num const Function *callfunc = tok->function(); const std::vector callargs = getArguments(tok); - for (nonneg int paramIndex = 0; paramIndex < callargs.size() && paramIndex < callfunc->argCount(); ++paramIndex) { + for (size_t paramIndex = 0; paramIndex < callargs.size() && paramIndex < callfunc->argCount(); ++paramIndex) { const Variable* const argument = callfunc->getArgumentVar(paramIndex); if (!argument || !argument->nameToken() || !argument->isArray()) continue; diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 7d3fa5c51ec..ce96849ca27 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -2414,7 +2414,7 @@ bool CheckClassImpl::isMemberFunc(const Scope *scope, const Token *tok) for (const Function &func : scope->functionList) { if (func.name() == tok->str()) { const Token* tok2 = tok->tokAt(2); - int argsPassed = tok2->str() == ")" ? 0 : 1; + size_t argsPassed = tok2->str() == ")" ? 0 : 1; for (;;) { tok2 = tok2->nextArgument(); if (tok2) @@ -2511,9 +2511,9 @@ bool CheckClassImpl::checkConstFunc(const Scope *scope, const Function *func, Me if (const Function* f = funcTok->function()) { // check known function const std::vector args = getArguments(funcTok); - const auto argMax = std::min(args.size(), f->argCount()); + const auto argMax = std::min(args.size(), f->argCount()); - for (nonneg int argIndex = 0; argIndex < argMax; ++argIndex) { + for (size_t argIndex = 0; argIndex < argMax; ++argIndex) { const Variable* const argVar = f->getArgumentVar(argIndex); if (!argVar || ((argVar->isArrayOrPointer() || argVar->isReference()) && !(argVar->valueType() && argVar->valueType()->isConst(argVar->valueType()->pointer)))) { // argument might be modified diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index d04f9d9cc1d..23db248816d 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -116,7 +116,7 @@ void CheckFunctionsImpl::invalidFunctionUsage() continue; const Token * const functionToken = tok; const std::vector arguments = getArguments(tok); - for (int argnr = 1; argnr <= arguments.size(); ++argnr) { + for (size_t argnr = 1; argnr <= arguments.size(); ++argnr) { const Token * const argtok = arguments[argnr-1]; // check ... diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 2fd16e85eaa..9049d56e7ff 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -392,7 +392,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, }); }); if (hasOutParam) { - for (int i = 0; i < args.size(); i++) { + for (size_t i = 0; i < args.size(); i++) { if (!argChecks.count(i + 1)) continue; const ArgumentChecks argCheck = argChecks.at(i + 1); diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 9790f7f2724..ac56f19eb09 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -49,7 +49,7 @@ static const CWE CWE_INCORRECT_CALCULATION(682U); //--------------------------------------------------------------------------- -static bool checkNullpointerFunctionCallPlausibility(const Function* func, unsigned int arg) +static bool checkNullpointerFunctionCallPlausibility(const Function* func, size_t arg) { return !func || (func->argCount() >= arg && func->getArgumentVar(arg - 1) && func->getArgumentVar(arg - 1)->isPointer()); } @@ -61,7 +61,7 @@ std::list CheckNullPointerImpl::parseFunctionCall(const Token &tok const std::vector args = getArguments(&tok); std::list var; - for (int argnr = 1; argnr <= args.size(); ++argnr) { + for (size_t argnr = 1; argnr <= args.size(); ++argnr) { const Token *param = args[argnr - 1]; if ((!checkNullArg || library.isnullargbad(&tok, argnr)) && checkNullpointerFunctionCallPlausibility(tok.function(), argnr)) var.push_back(param); @@ -370,7 +370,7 @@ void CheckNullPointerImpl::nullConstantDereference() else if (Token::Match(tok->previous(), "::|. %name% (")) { const std::vector &args = getArguments(tok); - for (int argnr = 0; argnr < args.size(); ++argnr) { + for (size_t argnr = 0; argnr < args.size(); ++argnr) { const Token *argtok = args[argnr]; if (!argtok->hasKnownIntValue()) continue; diff --git a/lib/checkother.cpp b/lib/checkother.cpp index a45dfdf672e..5ed3473c8a7 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -3313,7 +3313,7 @@ static bool constructorTakesReference(const Scope * const classScope) { return std::any_of(classScope->functionList.begin(), classScope->functionList.end(), [&](const Function& constructor) { if (constructor.isConstructor()) { - for (int argnr = 0U; argnr < constructor.argCount(); argnr++) { + for (size_t argnr = 0U; argnr < constructor.argCount(); argnr++) { const Variable * const argVar = constructor.getArgumentVar(argnr); if (argVar && argVar->isReference()) { return true; @@ -4036,7 +4036,7 @@ void CheckOtherImpl::checkFuncArgNamesDifferent() std::vector declarations(function->argCount()); std::vector definitions(function->argCount()); const Token * decl = function->argDef->next(); - for (int j = 0; j < function->argCount(); ++j) { + for (size_t j = 0; j < function->argCount(); ++j) { // get the definition const Variable * variable = function->getArgumentVar(j); if (variable) { @@ -4064,11 +4064,11 @@ void CheckOtherImpl::checkFuncArgNamesDifferent() // check for different argument order if (warning) { bool order_different = false; - for (int j = 0; j < function->argCount(); ++j) { + for (size_t j = 0; j < function->argCount(); ++j) { if (!declarations[j] || !definitions[j] || declarations[j]->str() == definitions[j]->str()) continue; - for (int k = 0; k < function->argCount(); ++k) { + for (size_t k = 0; k < function->argCount(); ++k) { if (j != k && definitions[k] && declarations[j]->str() == definitions[k]->str()) { order_different = true; break; @@ -4082,7 +4082,7 @@ void CheckOtherImpl::checkFuncArgNamesDifferent() } // check for different argument names if (style && inconclusive) { - for (int j = 0; j < function->argCount(); ++j) { + for (size_t j = 0; j < function->argCount(); ++j) { const bool warn = (declarations[j] != nullptr) != (definitions[j] != nullptr) || (declarations[j] && definitions[j] && declarations[j]->str() != definitions[j]->str()); if (warn) @@ -4092,7 +4092,7 @@ void CheckOtherImpl::checkFuncArgNamesDifferent() } } -void CheckOtherImpl::funcArgNamesDifferent(const std::string & functionName, nonneg int index, +void CheckOtherImpl::funcArgNamesDifferent(const std::string & functionName, size_t index, const Token* declaration, const Token* definition) { std::list tokens = { declaration,definition }; diff --git a/lib/checkother.h b/lib/checkother.h index 7f21ffc00f8..759a4d23e7b 100644 --- a/lib/checkother.h +++ b/lib/checkother.h @@ -316,7 +316,7 @@ class CPPCHECKLIB CheckOtherImpl : public CheckImpl { void unusedLabelError(const Token* tok, bool inSwitch, bool hasIfdef); void unknownEvaluationOrder(const Token* tok, bool isUnspecifiedBehavior = false); void accessMovedError(const Token *tok, const std::string &varname, const ValueFlow::Value *value, bool inconclusive); - void funcArgNamesDifferent(const std::string & functionName, nonneg int index, const Token* declaration, const Token* definition); + void funcArgNamesDifferent(const std::string & functionName, size_t index, const Token* declaration, const Token* definition); void funcArgOrderDifferent(const std::string & functionName, const Token * declaration, const Token * definition, const std::vector & declarations, const std::vector & definitions); void shadowError(const Token *shadows, const std::string &shadowsType, const Token *shadowed, const std::string &shadowedType); void knownArgumentError(const Token *tok, const Token *ftok, const ValueFlow::Value *value, const std::string &varexpr, bool isVariableExpressionHidden); diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 3e08fe04ed6..6c4e5a7a22c 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -830,7 +830,7 @@ void CheckStlImpl::mismatchingContainers() // Group args together by container std::map> containers; - for (int argnr = 1; argnr <= args.size(); ++argnr) { + for (size_t argnr = 1; argnr <= args.size(); ++argnr) { const Library::ArgumentChecks::IteratorInfo *i = mSettings.library.getArgIteratorInfo(ftok, argnr); if (!i) continue; @@ -1435,7 +1435,7 @@ void CheckStlImpl::eraseCheckLoopVar(const Scope &scope, const Variable *var) if (Token::Match(tok->astParent(), "=|return")) continue; // Iterator is invalid.. - int indentlevel = 0U; + int indentlevel = 0; const Token *tok2 = tok->link(); for (; tok2 != scope.bodyEnd; tok2 = tok2->next()) { if (tok2->str() == "{") { @@ -1443,7 +1443,7 @@ void CheckStlImpl::eraseCheckLoopVar(const Scope &scope, const Variable *var) continue; } if (tok2->str() == "}") { - if (indentlevel > 0U) + if (indentlevel > 0) --indentlevel; else if (Token::simpleMatch(tok2, "} else {")) tok2 = tok2->linkAt(2); @@ -3295,7 +3295,7 @@ void CheckStlImpl::knownEmptyContainer() if (args.empty()) continue; - for (int argnr = 1; argnr <= args.size(); ++argnr) { + for (size_t argnr = 1; argnr <= args.size(); ++argnr) { const Library::ArgumentChecks::IteratorInfo *i = mSettings.library.getArgIteratorInfo(tok, argnr); if (!i) continue; diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index 417e94e8798..98c0e700d83 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -140,7 +140,7 @@ static std::vector splitString(const std::string &line) pos2 = line.find('\"', pos1+1); else if (line[pos1] == '\'') { pos2 = line.find('\'', pos1+1); - if (pos2 < static_cast(line.size()) - 3 && line.compare(pos2, 3, "\':\'", 0, 3) == 0) + if (pos2 < line.size() - 3 && line.compare(pos2, 3, "\':\'", 0, 3) == 0) pos2 = line.find('\'', pos2 + 3); } else { pos2 = pos1; @@ -357,7 +357,7 @@ namespace clangimport { /** * @throws InternalError thrown if index is out of bounds */ - AstNodePtr getChild(int c) { + AstNodePtr getChild(size_t c) { if (c >= children.size()) { std::ostringstream err; err << "ClangImport: AstNodePtr::getChild(" << c << ") out of bounds. children.size=" << children.size() << " " << nodeType; @@ -509,7 +509,7 @@ void clangimport::AstNode::dumpAst(int num, int indent) const for (const auto& tok: mExtTokens) std::cout << " " << tok; std::cout << std::endl; - for (int c = 0; c < children.size(); ++c) { + for (size_t c = 0; c < children.size(); ++c) { if (children[c]) children[c]->dumpAst(c, indent + 2); else @@ -1432,7 +1432,7 @@ void clangimport::AstNode::createTokensFunctionDecl(TokenList &tokenList) function->nestedIn = nestedIn; function->argDef = par1; // Function arguments - for (int i = 0; i < children.size(); ++i) { + for (size_t i = 0; i < children.size(); ++i) { AstNodePtr child = children[i]; if (child->nodeType != ParmVarDecl) continue; @@ -1657,7 +1657,7 @@ void clangimport::parseClangAstDump(Tokenizer &tokenizer, std::istream &f) continue; } - const int level = (pos1 - 1) / 2; + const size_t level = (pos1 - 1) / 2; if (level == 0 || level > tree.size()) continue; diff --git a/lib/ctu.cpp b/lib/ctu.cpp index fee3acb85ae..feef065d3ac 100644 --- a/lib/ctu.cpp +++ b/lib/ctu.cpp @@ -280,11 +280,11 @@ std::list CTU::loadUnsafeUsageListFromXml(const tiny return ret; } -static int isCallFunction(const Scope *scope, int argnr, const Token *&tok) +static size_t isCallFunction(const Scope *scope, size_t argnr, const Token *&tok) { const Variable * const argvar = scope->function->getArgumentVar(argnr); if (!argvar->isPointer()) - return -1; + return 0; for (const Token *tok2 = scope->bodyStart; tok2 != scope->bodyEnd; tok2 = tok2->next()) { if (tok2->variable() != argvar) continue; @@ -306,7 +306,7 @@ static int isCallFunction(const Scope *scope, int argnr, const Token *&tok) tok = prev->previous(); return argnr2; } - return -1; + return 0; } @@ -330,7 +330,7 @@ const CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer) if (!tokFunction) continue; const std::vector args(getArguments(tok->previous())); - for (int argnr = 0; argnr < args.size(); ++argnr) { + for (size_t argnr = 0; argnr < args.size(); ++argnr) { const Token *argtok = args[argnr]; if (!argtok) continue; @@ -427,9 +427,9 @@ const CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer) } // Nested function calls - for (int argnr = 0; argnr < scopeFunction->argCount(); ++argnr) { + for (size_t argnr = 0; argnr < scopeFunction->argCount(); ++argnr) { const Token *tok; - const int argnr2 = isCallFunction(&scope, argnr, tok); + const size_t argnr2 = isCallFunction(&scope, argnr, tok); if (argnr2 > 0) { FileInfo::NestedCall nestedCall(tokenizer, scopeFunction, tok); nestedCall.myArgNr = argnr + 1; @@ -442,7 +442,7 @@ const CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer) return fileInfo; } -static std::vector> getUnsafeFunction(const Settings &settings, const Scope *scope, int argnr, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *value)) +static std::vector> getUnsafeFunction(const Settings &settings, const Scope *scope, size_t argnr, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *value)) { std::vector> ret; const Variable * const argvar = scope->function->getArgumentVar(argnr); @@ -487,7 +487,7 @@ std::list CTU::getUnsafeUsage(const Tokenizer &token const Function *const function = scope.function; // "Unsafe" functions unconditionally reads data before it is written.. - for (int argnr = 0; argnr < function->argCount(); ++argnr) { + for (size_t argnr = 0; argnr < function->argCount(); ++argnr) { for (const std::pair &v : getUnsafeFunction(settings, &scope, argnr, isUnsafeUsage)) { const Token *tok = v.first; const MathLib::bigint val = v.second.value; @@ -500,7 +500,7 @@ std::list CTU::getUnsafeUsage(const Tokenizer &token } static bool findPath(const std::string &callId, - nonneg int callArgNr, + size_t callArgNr, MathLib::bigint unsafeValue, CTU::FileInfo::InvalidValueType invalidValue, const std::map> &callsMap, diff --git a/lib/ctu.h b/lib/ctu.h index 60120064284..76baff21b9f 100644 --- a/lib/ctu.h +++ b/lib/ctu.h @@ -79,14 +79,14 @@ namespace CTU { struct UnsafeUsage { UnsafeUsage() = default; - UnsafeUsage(std::string myId, nonneg int myArgNr, std::string myArgumentName, Location location, MathLib::bigint value) + UnsafeUsage(std::string myId, size_t myArgNr, std::string myArgumentName, Location location, MathLib::bigint value) : myId(std::move(myId)) , myArgNr(myArgNr) , myArgumentName(std::move(myArgumentName)) , location(std::move(location)) , value(value) {} std::string myId; - nonneg int myArgNr{}; + size_t myArgNr{}; std::string myArgumentName; Location location; MathLib::bigint value{}; @@ -96,14 +96,14 @@ namespace CTU { class CallBase { public: CallBase() = default; - CallBase(std::string callId, int callArgNr, std::string callFunctionName, Location loc) + CallBase(std::string callId, size_t callArgNr, std::string callFunctionName, Location loc) : callId(std::move(callId)), callArgNr(callArgNr), callFunctionName(std::move(callFunctionName)), location(std::move(loc)) {} CallBase(const Tokenizer &tokenizer, const Token *callToken); virtual ~CallBase() = default; CallBase(const CallBase&) = default; std::string callId; - int callArgNr{}; + size_t callArgNr{}; std::string callFunctionName; Location location; protected: @@ -138,7 +138,7 @@ namespace CTU { bool loadFromXml(const tinyxml2::XMLElement *xmlElement); std::string myId; - nonneg int myArgNr{}; + size_t myArgNr{}; }; std::list functionCalls; diff --git a/lib/errorlogger.h b/lib/errorlogger.h index d739cb3fbf9..daf683bd0a3 100644 --- a/lib/errorlogger.h +++ b/lib/errorlogger.h @@ -88,7 +88,7 @@ class CPPCHECKLIB ErrorMessage { std::string stringify(bool addcolumn = false) const; unsigned int fileIndex; - int line; // negative value means "no line" + int line; // negative value means "no line" - TODO: actually 0 means no line - lines from simplecpp are unsigned unsigned int column; const std::string& getinfo() const { diff --git a/lib/fwdanalysis.cpp b/lib/fwdanalysis.cpp index ddcbbbd1fa9..07ba7cc2e59 100644 --- a/lib/fwdanalysis.cpp +++ b/lib/fwdanalysis.cpp @@ -289,7 +289,7 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token * ftok = ftok->astParent(); if (ftok && Token::Match(ftok->previous(), "%name% (")) { const std::vector args = getArguments(ftok); - int argnr = 0; + size_t argnr = 0; while (argnr < args.size() && args[argnr] != parent) argnr++; if (argnr < args.size()) { @@ -469,7 +469,7 @@ bool FwdAnalysis::possiblyAliased(const Token *expr, const Token *startToken) co if (Token::Match(tok, "%name% (") && !Token::Match(tok, "if|while|for")) { // Is argument passed by reference? const std::vector args = getArguments(tok); - for (int argnr = 0; argnr < args.size(); ++argnr) { + for (size_t argnr = 0; argnr < args.size(); ++argnr) { if (!Token::Match(args[argnr], "%name%|.|::")) continue; if (tok->function() && tok->function()->getArgumentVar(argnr) && !tok->function()->getArgumentVar(argnr)->isReference() && !tok->function()->isConst()) diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index e1f40de277e..b86ca2d8812 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -1552,7 +1552,7 @@ namespace { return unknown(); const MathLib::bigint index = rhs.intvalue; if (index >= 0 && index < strValue.size()) - return ValueFlow::Value{strValue[static_cast(index)]}; + return ValueFlow::Value{strValue[index]}; if (index == strValue.size()) return ValueFlow::Value{}; } else if (Token::Match(expr, "%cop%") && expr->astOperand1() && expr->astOperand2()) { diff --git a/lib/reverseanalyzer.cpp b/lib/reverseanalyzer.cpp index 4afd2556a24..38aea656bf0 100644 --- a/lib/reverseanalyzer.cpp +++ b/lib/reverseanalyzer.cpp @@ -204,7 +204,7 @@ namespace { void traverse(Token* start, const Token* end = nullptr) { if (start == end) return; - std::size_t i = start->index(); + nonneg int i = start->index(); for (Token* tok = start->previous(); succeeds(tok, end); tok = tok->previous()) { if (tok->index() >= i) throw InternalError(tok, "Cyclic reverse analysis."); diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index ba5c31d1f47..14fc1b7cdf2 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -2174,7 +2174,7 @@ namespace { { if (const Scope* scope = var->nameToken()->scope()) { auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [&](const Function& function) { - for (nonneg int arg = 0; arg < function.argCount(); ++arg) { + for (size_t arg = 0; arg < function.argCount(); ++arg) { if (var == function.getArgumentVar(arg)) return true; } @@ -4537,7 +4537,7 @@ void SymbolDatabase::printXml(std::ostream &out) const outs += "/>\n"; else { outs += ">\n"; - for (unsigned int argnr = 0; argnr < function->argCount(); ++argnr) { + for (size_t argnr = 0; argnr < function->argCount(); ++argnr) { const Variable *arg = function->getArgumentVar(argnr); outs += " & matches) const +void Scope::findFunctionInBase(const Token* tok, size_t args, std::vector & matches) const { if (isClassOrStruct() && definedType && !definedType->derivedFrom.empty()) { const std::vector &derivedFrom = definedType->derivedFrom; @@ -7049,7 +7049,7 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, const return; } - if (parent->str() == "[" && (!parent->isCpp() || parent->astOperand1() == tok) && valuetype.pointer > 0U && !Token::Match(parent->previous(), "[{,]")) { + if (parent->str() == "[" && (!parent->isCpp() || parent->astOperand1() == tok) && valuetype.pointer > 0 && !Token::Match(parent->previous(), "[{,]")) { const Token *op1 = parent->astOperand1(); while (op1 && op1->str() == "[") op1 = op1->astOperand1(); @@ -7061,7 +7061,7 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, const setValueType(parent, vt); return; } - if (Token::Match(parent->tokAt(-1), "%name% (") && !parent->tokAt(-1)->isKeyword() && parent->astOperand1() == tok && valuetype.pointer > 0U) { + if (Token::Match(parent->tokAt(-1), "%name% (") && !parent->tokAt(-1)->isKeyword() && parent->astOperand1() == tok && valuetype.pointer > 0) { ValueType vt(valuetype); vt.pointer -= 1U; setValueType(parent, vt); @@ -7074,7 +7074,7 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, const setValueType(parent, vt); return; } - if (parent->str() == "*" && !parent->astOperand2() && valuetype.pointer > 0U) { + if (parent->str() == "*" && !parent->astOperand2() && valuetype.pointer > 0) { ValueType vt(valuetype); vt.pointer -= 1U; setValueType(parent, vt); @@ -7107,7 +7107,7 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, const return; } } - if (parent->str() == "*" && Token::simpleMatch(parent->astOperand2(), "[") && valuetype.pointer > 0U) { + if (parent->str() == "*" && Token::simpleMatch(parent->astOperand2(), "[") && valuetype.pointer > 0) { const Token *op1 = parent->astOperand2()->astOperand1(); while (op1 && op1->str() == "[") op1 = op1->astOperand1(); @@ -8714,7 +8714,7 @@ std::string ValueType::str() const } else if (type == ValueType::Type::SMART_POINTER && smartPointer) { ret += " smart-pointer(" + smartPointer->name + ")"; } - for (unsigned int p = 0; p < pointer; p++) { + for (nonneg int p = 0; p < pointer; p++) { ret += " *"; if (constness & (2 << p)) ret += " const"; diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index a4a07fd2083..166f228ad99 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -767,14 +767,14 @@ class CPPCHECKLIB Function { std::string fullName() const; - nonneg int argCount() const { + size_t argCount() const { return argumentList.size(); } - nonneg int minArgCount() const { + size_t minArgCount() const { return argumentList.size() - initArgCount; } - const Variable* getArgumentVar(nonneg int num) const; - nonneg int initializedArgCount() const { + const Variable* getArgumentVar(size_t num) const; + size_t initializedArgCount() const { return initArgCount; } /** @@ -928,7 +928,7 @@ class CPPCHECKLIB Function { const Scope* functionScope{}; ///< scope of function body const Scope* nestedIn{}; ///< Scope the function is declared in std::list argumentList; ///< argument list, must remain list due to clangimport usage! - nonneg int initArgCount{}; ///< number of args with default values + size_t initArgCount{}; ///< number of args with default values FunctionType type = FunctionType::eFunction; ///< constructor, destructor, ... const Token* noexceptArg{}; ///< noexcept token const Token* throwArg{}; ///< throw token @@ -1209,7 +1209,7 @@ class CPPCHECKLIB Scope { */ bool isVariableDeclaration(const Token* tok, const Token*& vartok, const Token*& typetok) const; - void findFunctionInBase(const Token* tok, nonneg int args, std::vector & matches) const; + void findFunctionInBase(const Token* tok, size_t args, std::vector & matches) const; /** @brief initialize varlist */ void getVariableList(const Token *start, const Token *end); diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 2672e66c263..4051b05c204 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -2258,7 +2258,7 @@ void TemplateSimplifier::expandTemplate( Token::Match(tok3->next()->findClosingBracket(), ">|>>")) { const Token *closingBracket = tok3->next()->findClosingBracket(); if (Token::simpleMatch(closingBracket->next(), "&")) { - int num = 0; + size_t num = 0; const Token *par = tok3->next(); while (num < typeParametersInDeclaration.size() && par != closingBracket) { const std::string pattern("[<,] " + typeParametersInDeclaration[num]->str() + " [,>]"); @@ -3041,7 +3041,7 @@ bool TemplateSimplifier::matchSpecialization( declToken->isSigned() != instToken->isSigned() || declToken->isUnsigned() != instToken->isUnsigned() || declToken->isLong() != instToken->isLong()) { - int nr = 0; + size_t nr = 0; while (nr < templateParameters.size() && templateParameters[nr]->str() != declToken->str()) ++nr; @@ -3139,7 +3139,7 @@ bool TemplateSimplifier::simplifyTemplateInstantiations( // locate template usage.. std::string::size_type numberOfTemplateInstantiations = mTemplateInstantiations.size(); - unsigned int recursiveCount = 0; + int recursiveCount = 0; bool instantiated = false; diff --git a/lib/token.cpp b/lib/token.cpp index 7e19106e1b0..d8b438c5073 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -1330,10 +1330,10 @@ std::string Token::stringifyList(const stringifyOptions& options, const std::vec std::string ret; - unsigned int lineNumber = mImpl->mLineNumber - (options.linenumbers ? 1U : 0U); + nonneg int lineNumber = mImpl->mLineNumber - (options.linenumbers ? 1 : 0); // cppcheck-suppress shadowFunction - TODO: fix this - unsigned int fileIndex = options.files ? ~0U : mImpl->mFileIndex; - std::map lineNumbers; + nonneg int fileIndex = options.files ? ~0U : mImpl->mFileIndex; + std::map lineNumbers; for (const Token *tok = this; tok != end; tok = tok->next()) { assert(tok && "end precedes token"); if (!tok) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index fb9f6dda7a1..9ff54a5c244 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -2459,7 +2459,7 @@ static void valueFlowLifetimeFunction(Token *tok, const TokenList &tokenlist, Er const int returnContainer = settings.library.returnValueContainer(tok); if (returnContainer >= 0) { std::vector args = getArguments(tok); - for (int argnr = 1; argnr <= args.size(); ++argnr) { + for (size_t argnr = 1; argnr <= args.size(); ++argnr) { const Library::ArgumentChecks::IteratorInfo *i = settings.library.getArgIteratorInfo(tok, argnr); if (!i) continue; @@ -5758,7 +5758,7 @@ static void valueFlowFunctionDefaultParameter(const TokenList& tokenlist, const const Function* function = scope->function; if (!function) continue; - for (nonneg int arg = function->minArgCount(); arg < function->argCount(); arg++) { + for (size_t arg = function->minArgCount(); arg < function->argCount(); arg++) { const Variable* var = function->getArgumentVar(arg); if (var && var->hasDefault() && Token::Match(var->nameToken(), "%var% = %num%|%str%|%char%|%name% [,)]")) { const std::list &values = var->nameToken()->tokAt(2)->values(); From b587c7cf10ca5c1de8cdc00b8a55495fac1bda98 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 24 Jun 2026 08:19:23 +0200 Subject: [PATCH 099/171] Fix #14866 FP bufferAccessOutOfBounds with vector and gethostname() (#8667) Co-authored-by: chrchr-github --- lib/checkbufferoverrun.cpp | 2 +- test/testbufferoverrun.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 879ade5f21f..a98ba73429c 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -574,7 +574,7 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok) cons return *value; } - if (!var || var->isPointer()) + if (!var || var->isPointer() || (astIsContainer(bufTok) && var->getTypeName() != "std::array")) return ValueFlow::Value(-1); const MathLib::bigint dim = std::accumulate(var->dimensions().cbegin(), var->dimensions().cend(), MathLib::bigint(1), [](MathLib::bigint i1, const Dimension &dim) { diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 1a03ca336f8..e1da77ccbfb 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -3539,6 +3539,12 @@ class TestBufferOverrun : public TestFixture { "[test.cpp:7:12]: (error) Buffer is accessed out of bounds: &a[0][0] [bufferAccessOutOfBounds]\n", "", errout_str()); + + check("void f() {\n" // #14866 + " std::vector buf(25);\n" + " std::memset(&buf[0], 0, 25);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_errorpath() { From 6640a7ce56cd57a046907360fbbe320d2b1f5704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Wed, 24 Jun 2026 10:35:13 +0200 Subject: [PATCH 100/171] enabled `-Wshorten-64-to-32` Clang compiler warning (#8670) --- cmake/compileroptions.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/compileroptions.cmake b/cmake/compileroptions.cmake index aa7deb8552c..6343a8a5102 100644 --- a/cmake/compileroptions.cmake +++ b/cmake/compileroptions.cmake @@ -134,7 +134,6 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # TODO: fix and enable these warnings - or move to suppression list below add_compile_options_safe(-Wno-sign-conversion) add_compile_options_safe(-Wno-shadow-field-in-constructor) - add_compile_options_safe(-Wno-shorten-64-to-32) add_compile_options_safe(-Wno-implicit-int-conversion) add_compile_options_safe(-Wno-double-promotion) add_compile_options_safe(-Wno-shadow-field) From 887b5d2ff53031cc53ec76881caf27a6c74da005 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Thu, 25 Jun 2026 01:18:17 -0500 Subject: [PATCH 101/171] Fix issue 13682: false negative: nullPointerRedundantCheck (multiple conditions, regression) (#8669) Co-authored-by: Your Name --- .selfcheck_suppressions | 1 + lib/astutils.cpp | 4 -- lib/checkclass.cpp | 11 +++- lib/checkcondition.cpp | 2 +- lib/checkstl.cpp | 2 +- lib/forwardanalyzer.cpp | 2 +- lib/reverseanalyzer.cpp | 3 - lib/symboldatabase.cpp | 6 +- lib/tokenize.cpp | 2 +- lib/vf_analyzers.cpp | 30 +++++++-- test/testnullpointer.cpp | 134 +++++++++++++++++++++++++++++++++++++++ 11 files changed, 175 insertions(+), 22 deletions(-) diff --git a/.selfcheck_suppressions b/.selfcheck_suppressions index f21492e783a..402fdbeb75d 100644 --- a/.selfcheck_suppressions +++ b/.selfcheck_suppressions @@ -79,3 +79,4 @@ useStlAlgorithm:externals/simplecpp/simplecpp.cpp funcArgNamesDifferentUnnamed:externals/simplecpp/simplecpp.h missingMemberCopy:externals/simplecpp/simplecpp.h shadowFunction:externals/simplecpp/simplecpp.h +knownConditionTrueFalse:externals/simplecpp/simplecpp.cpp \ No newline at end of file diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 7af806508fd..8700d2d2cd9 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -495,8 +495,6 @@ bool isTemporary(const Token* tok, const Library* library, bool unknown) } return unknown; } - if (tok->isCast()) - return false; // Currying a function is unknown in cppcheck if (Token::simpleMatch(tok, "(") && Token::simpleMatch(tok->astOperand1(), "(")) return unknown; @@ -1543,8 +1541,6 @@ bool isUsedAsBool(const Token* const tok, const Settings& settings) return true; if (parent->isCast()) return !Token::simpleMatch(parent->astOperand1(), "dynamic_cast") && isUsedAsBool(parent, settings); - if (parent->isUnaryOp("*")) - return isUsedAsBool(parent, settings); if (Token::Match(parent, "==|!=") && tok->valueType() && tok->valueType()->pointer && tok->astSibling()->hasKnownIntValue() && tok->astSibling()->getKnownIntValue() == 0) return true; diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index ce96849ca27..b610e963d76 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -3452,9 +3452,14 @@ void CheckClassImpl::checkUselessOverride() if (isSameCode) { // bailout for shadowed members - if (!classScope->definedType || - !getDuplInheritedMembersRecursive(classScope->definedType, classScope->definedType, /*skipPrivate*/ false).empty() || - !getDuplInheritedMemberFunctionsRecursive(classScope->definedType, classScope->definedType, /*skipPrivate*/ false).empty()) + if (!getDuplInheritedMembersRecursive(classScope->definedType, + classScope->definedType, + /*skipPrivate*/ false) + .empty() || + !getDuplInheritedMemberFunctionsRecursive(classScope->definedType, + classScope->definedType, + /*skipPrivate*/ false) + .empty()) continue; uselessOverrideError(baseFunc, &func, true); continue; diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 72b61fd68b9..e77641f89e7 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -455,7 +455,7 @@ bool CheckConditionImpl::isOverlappingCond(const Token * const cond1, const Toke if (!num1->isNumber() || MathLib::isNegative(num1->str())) return false; - if (!Token::Match(cond2, "&|==") || !cond2->astOperand1() || !cond2->astOperand2()) + if (!Token::Match(cond2, "&|==") || !cond2->astOperand1()) return false; const Token *expr2 = cond2->astOperand1(); const Token *num2 = cond2->astOperand2(); diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 6c4e5a7a22c..6d97dffe3d2 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -549,7 +549,7 @@ void CheckStlImpl::iterators() } // Not different containers if a reference is used.. - if (containerToken && containerToken->variable() && containerToken->variable()->isReference()) { + if (containerToken->variable() && containerToken->variable()->isReference()) { const Token *nameToken = containerToken->variable()->nameToken(); if (Token::Match(nameToken, "%name% =")) { const Token *name1 = nameToken->tokAt(2); diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 0999a08d908..670db0b1090 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -782,7 +782,7 @@ namespace { } else if (thenBranch.check) { return Break(); } else { - if (analyzer->isConditional() && stopUpdates()) + if (stopOnCondition(condTok) && stopUpdates()) return Break(Analyzer::Terminate::Conditional); analyzer->assume(condTok, false); } diff --git a/lib/reverseanalyzer.cpp b/lib/reverseanalyzer.cpp index 38aea656bf0..0c3c966f2b2 100644 --- a/lib/reverseanalyzer.cpp +++ b/lib/reverseanalyzer.cpp @@ -340,9 +340,6 @@ namespace { valueFlowGenericForward(condTok, analyzer, tokenlist, errorLogger, settings); else if (condAction.isRead()) break; - // If the condition modifies the variable then bail - if (condAction.isModified()) - break; tok = jumpToStart(tok->link()); continue; } diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 14fc1b7cdf2..231a8ce009c 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1043,10 +1043,8 @@ void SymbolDatabase::createSymbolDatabaseNeedInitialization() scope.definedType->needInitialization = Type::NeedInitialization::True; else if (!unknown) scope.definedType->needInitialization = Type::NeedInitialization::False; - else { - if (scope.definedType->needInitialization == Type::NeedInitialization::Unknown) - unknowns++; - } + else + unknowns++; } } else if (scope.type == ScopeType::eUnion && scope.definedType->needInitialization == Type::NeedInitialization::Unknown) scope.definedType->needInitialization = Type::NeedInitialization::True; diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index a8f675bbc97..7379957804f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2711,7 +2711,7 @@ namespace { { Token *tok1 = tok; - if (tok1 && tok1->str() != nameToken->str()) + if (!tok1 || tok1->str() != nameToken->str()) return false; // skip this using diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index a50a3b1d4a4..10efc6d6f39 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -1198,18 +1198,40 @@ struct SingleValueFlowAnalyzer : ValueFlowAnalyzer { bool stopOnCondition(const Token* condTok) const override { - if (value.isNonValue()) - return false; if (value.isImpossible()) return false; - if (isConditional() && !value.isKnown()) + // lifetime values must keep flowing to properly track aliases + if (value.isLifetimeValue()) + return false; + // 'conditional' flag (uninit, or lowered after a modifying branch): may depend on a + // condition that doesn't mention the variable -> stop + if (value.conditional && !value.isKnown()) return true; - if (value.isSymbolicValue()) + if (value.isNonValue()) return false; + if (value.isSymbolicValue()) + return isConditional() && !value.isKnown(); + // conditional via the originating 'condition' (e.g. possible null after 'if (p && ...)'): only flow + // if the condition references the value, else a correlation we can't follow (e.g. + // 'bool ok = (p != nullptr); if (!ok)') could make a later deref safe -> stop + if (value.condition && !value.isKnown() && !conditionReferencesValue(condTok)) + return true; ConditionState cs = analyzeCondition(condTok); return cs.isUnknownDependent(); } + // Does the condition mention the tracked value, either directly or through a symbolic alias? + bool conditionReferencesValue(const Token* condTok) const + { + return findAstNode(condTok, [&](const Token* tok) { + if (match(tok)) + return true; + return std::any_of(tok->values().cbegin(), tok->values().cend(), [&](const ValueFlow::Value& v) { + return v.isSymbolicValue() && !v.isImpossible() && v.tokvalue && match(v.tokvalue); + }); + }) != nullptr; + } + bool updateScope(const Token* endBlock, bool /*modified*/) const override { const Scope* scope = endBlock->scope(); if (!scope) diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 99ece1c57fc..369c04a2101 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -143,6 +143,8 @@ class TestNullPointer : public TestFixture { TEST_CASE(nullpointer103); TEST_CASE(nullpointer104); // #13881 TEST_CASE(nullpointer105); // #13861 + TEST_CASE(nullpointer106); // #13682 + TEST_CASE(nullpointer107); // #13682 (FP/FN cases around guards that depend on the pointer indirectly) TEST_CASE(nullpointer_addressOf); // address of TEST_CASE(nullpointerSwitch); // #2626 TEST_CASE(nullpointer_cast); // #4692 @@ -2966,6 +2968,138 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void nullpointer106() // #13682 + { + // An unrelated condition between the null check and the dereference must not stop the analysis + check("struct S {\n" + " bool b;\n" + " bool f() const;\n" + "};\n" + "void f(const S* p, const S* o) {\n" + " const S* p1 = p;\n" + " if (p1 && p1->f())\n" + " return;\n" + " if (p == o)\n" + " return;\n" + " if (p1->b) {}\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:7:9] -> [test.cpp:11:9]: (warning) Either the condition 'p1' is redundant or there is possible null pointer dereference: p1. [nullPointerRedundantCheck]\n", + errout_str()); + } + + void nullpointer107() // #13682 - guards that depend on the pointer indirectly + { + // cached null-check 'ok'; guard 'if (!ok)' is safe -> no FP + check("struct S { void g(); bool f() const; };\n" + "void f(S* p) {\n" + " bool ok = (p != nullptr);\n" + " if (p && p->f())\n" + " return;\n" + " if (!ok)\n" + " return;\n" + " p->g();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // unrelated bool guard -> conservative, no FP + check("struct S { void g(); bool f() const; };\n" + "void f(S* p, bool valid) {\n" + " S* p1 = p;\n" + " if (p1 && p1->f())\n" + " return;\n" + " if (!valid)\n" + " return;\n" + " p1->g();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // guard on a different pointer -> no FP + check("struct S { void g(); bool f() const; };\n" + "void f(S* p, S* q) {\n" + " S* p1 = p;\n" + " if (p1 && p1->f())\n" + " return;\n" + " if (!q)\n" + " return;\n" + " p1->g();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // direct null guard on the alias -> no FP + check("struct S { void g(); bool f() const; };\n" + "void f(S* p) {\n" + " S* p1 = p;\n" + " if (p1 && p1->f())\n" + " return;\n" + " if (!p)\n" + " return;\n" + " p1->g();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // FN: 'if (ok)' => survivor has p==nullptr, but the cached 'ok' is not followed -> should warn + check("struct S { void g(); bool f() const; };\n" + "void f(S* p) {\n" + " bool ok = (p != nullptr);\n" + " if (p && p->f())\n" + " return;\n" + " if (ok)\n" + " return;\n" + " p->g();\n" + "}\n"); + TODO_ASSERT_EQUALS( + "[test.cpp:4:9] -> [test.cpp:8:5]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p. [nullPointerRedundantCheck]\n", + "", + errout_str()); + + // FN: sink(q) drops the q==p symbolic, so guard 'if (q)' is no longer seen to relate to p -> should warn + check("struct S { void g(); bool f() const; };\n" + "void sink(S*&);\n" + "void f(S* p) {\n" + " S* q = p;\n" + " if (p && p->f())\n" + " return;\n" + " sink(q);\n" + " if (q)\n" + " return;\n" + " p->g();\n" + "}\n"); + TODO_ASSERT_EQUALS( + "[test.cpp:5:9] -> [test.cpp:10:5]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p. [nullPointerRedundantCheck]\n", + "", + errout_str()); + + // a conditional modification makes ProgramMemory drop the guard (FP-prone) -> must stay quiet: + // alias 'q==p' re-assigned to p under a condition + check("struct S { void g(); bool f() const; };\n" + "void f(S* p, bool c) {\n" + " S* q = p;\n" + " if (p && p->f())\n" + " return;\n" + " if (c)\n" + " q = p;\n" + " if (!q)\n" + " return;\n" + " p->g();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // cached 'ok' refreshed under a condition + check("struct S { void g(); bool f() const; };\n" + "void f(S* p, bool c) {\n" + " bool ok = (p != nullptr);\n" + " if (p && p->f())\n" + " return;\n" + " if (c)\n" + " ok = (p != nullptr);\n" + " if (!ok)\n" + " return;\n" + " p->g();\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void nullpointer_addressOf() { // address of check("void f() {\n" " struct X *x = 0;\n" From d8eaa524f24c9269bab520ad187decdc6a58c5a9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 25 Jun 2026 13:15:49 +0200 Subject: [PATCH 102/171] Fix #13678 FN constParameterPointer (calling const function on struct member) (#8624) --- lib/checkother.cpp | 13 ++++++++----- lib/checkunusedvar.cpp | 4 ++-- test/testother.cpp | 12 ++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 5ed3473c8a7..21657cfd9fd 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1945,13 +1945,16 @@ void CheckOtherImpl::checkConstPointer() if (deref == MEMBER) { if (!gparent) continue; - if (parent->astOperand2()) { - if (parent->astOperand2()->function() && parent->astOperand2()->function()->isConst()) + const Token* funcParent = parent; + while (Token::simpleMatch(funcParent->astParent(), ".")) + funcParent = funcParent->astParent(); + if (funcParent->astOperand2()) { + if (funcParent->astOperand2()->function() && funcParent->astOperand2()->function()->isConst()) continue; - if (mSettings.library.isFunctionConst(parent->astOperand2())) + if (mSettings.library.isFunctionConst(funcParent->astOperand2())) continue; - if (parent->astOperand2()->varId()) { - if (gparent->str() == "?" && astIsLHS(parent)) + if (funcParent->astOperand2()->varId()) { + if (gparent->str() == "?" && astIsLHS(funcParent)) continue; } } diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 8ed249f05e2..fe85260fc8d 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -249,7 +249,7 @@ void Variables::clearAliases(nonneg int varid) void Variables::eraseAliases(nonneg int varid) { - VariableUsage *usage = find(varid); + const VariableUsage *usage = find(varid); if (usage) { for (auto aliases = usage->_aliases.cbegin(); aliases != usage->_aliases.cend(); ++aliases) @@ -329,7 +329,7 @@ void Variables::write(nonneg int varid, const Token* tok) void Variables::writeAliases(nonneg int varid, const Token* tok) { - VariableUsage *usage = find(varid); + const VariableUsage *usage = find(varid); if (usage) { for (auto aliases = usage->_aliases.cbegin(); aliases != usage->_aliases.cend(); ++aliases) { diff --git a/test/testother.cpp b/test/testother.cpp index 1d69cf6763e..b8134623a37 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -4894,6 +4894,18 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:6:10]: (style) Parameter 's' can be declared as reference to const [constParameterReference]\n", errout_str()); + + check("struct S { std::string a; };\n" // #13678 + "struct T { S s; };\n" + "bool f(S* s) {\n" + " return s->a.empty();\n" + "}\n" + "bool g(T* t) {\n" + " return t->s.a.empty();\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:3:11]: (style) Parameter 's' can be declared as pointer to const [constParameterPointer]\n" + "[test.cpp:6:11]: (style) Parameter 't' can be declared as pointer to const [constParameterPointer]\n", + errout_str()); } void constArray() { From b37e6b85e5b1655a6b379d0f76446fd940be4371 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 25 Jun 2026 16:49:13 +0200 Subject: [PATCH 103/171] Add test for #13099 (#8674) --- test/testother.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/testother.cpp b/test/testother.cpp index b8134623a37..60323b3395b 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -4906,6 +4906,14 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:3:11]: (style) Parameter 's' can be declared as pointer to const [constParameterPointer]\n" "[test.cpp:6:11]: (style) Parameter 't' can be declared as pointer to const [constParameterPointer]\n", errout_str()); + + check("struct S { int i; };\n" // #13099 + "double f(S * s, int n, int a, int b, double* p) {\n" + " return (s + (n * (a + 1) + b))->i / *(p + b);\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:14]: (style) Parameter 's' can be declared as pointer to const [constParameterPointer]\n" + "[test.cpp:2:46]: (style) Parameter 'p' can be declared as pointer to const [constParameterPointer]\n", + errout_str()); } void constArray() { From 86f4c91741690386cd5917ccd8120624d9473ad5 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 26 Jun 2026 08:32:09 +0200 Subject: [PATCH 104/171] Fix #14864 FN knownConditionTrueFalse with default initialized user type pointer (#8672) --- lib/valueflow.cpp | 2 ++ test/testvalueflow.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 9ff54a5c244..f934d8496d6 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -4099,6 +4099,8 @@ static bool isVariableInit(const Token *tok) return false; if (var->nameToken() != tok->astOperand1()) return false; + if (var->isPointer()) + return true; const ValueType* vt = var->valueType(); if (!vt) return false; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 8305a63bc56..7fa28855eb1 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -3188,6 +3188,18 @@ class TestValueFlow : public TestFixture { " return x;\n" "}\n"; ASSERT_EQUALS(true, testValueOfXKnown(code, 3U, -1)); + + code = "A* f() {\n" // #14864 + " A* x{};\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXKnown(code, 3U, 0)); + + code = "A* f() {\n" + " A* x{ nullptr };\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXKnown(code, 3U, 0)); } void valueFlowAfterSwap() From 7d5a54cc6e62c86fc38ae57e1834f45cce9709a3 Mon Sep 17 00:00:00 2001 From: Gilmar Santos Jr Date: Tue, 30 Jun 2026 13:30:12 -0300 Subject: [PATCH 105/171] Fix #14877: heap-use-after-free in Tokenizer::simplifyUsing() (#8679) In a large codebase, constructs like `using C = struct C { C() {} };` lead to errors such as `Code.cpp:0:0: error: Bailing out from analysis: Checking file failed: out of memory [internalError]`. When compiling cppcheck using clang 22's address sanitizer, the analysis terminates with the following messages: ``` ================================================================= ==1390963==ERROR: AddressSanitizer: heap-use-after-free on address 0x7c985f8ff900 at pc 0x55dcbe530972 bp 0x7ffd79cf5010 sp 0x7ffd79cf5008 READ of size 8 at 0x7c985f8ff900 thread T0 #0 0x55dcbe530971 in std::__cxx11::basic_string, std::allocator>::size() const /usr/include/c++/bits/basic_string.h:1165:19 #1 0x55dcbe53c624 in std::__cxx11::basic_string, std::allocator>::length() const /usr/include/c++/bits/basic_string.h:1176:16 #2 0x55dcbe54f8d6 in std::__cxx11::basic_string, std::allocator>::_M_assign(std::__cxx11::basic_string, std::allocator> const&) /usr/include/c++/bits/basic_string.tcc:313:36 #3 0x55dcbe54f7f0 in std::__cxx11::basic_string, std::allocator>::assign(std::__cxx11::basic_string, std::allocator> const&) /usr/include/c++/bits/basic_string.h:1771:8 #4 0x55dcbe54f7bc in std::__cxx11::basic_string, std::allocator>::operator=(std::__cxx11::basic_string, std::allocator> const&) /usr/include/c++/bits/basic_string.h:906:15 #5 0x55dcbe635d19 in Tokenizer::simplifyUsing() ./src/cppcheck/lib/tokenize.cpp:3214:32 #6 0x55dcbe6470b3 in Tokenizer::simplifyTokenList1(char const*) ./src/cppcheck/lib/tokenize.cpp:5910:12 #7 0x55dcbe643cb8 in Tokenizer::simplifyTokens1(std::__cxx11::basic_string, std::allocator> const&, int) ./src/cppcheck/lib/tokenize.cpp:3527:14 #8 0x55dcbedb37e7 in CppCheck::checkInternal(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&, std::function, std::allocator>, std::allocator, std::allocator>>>&, std::__cxx11::list>*)> const&) ./src/cppcheck/lib/cppcheck.cpp:1203:32 #9 0x55dcbeda7bf4 in CppCheck::checkFile(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&) ./src/cppcheck/lib/cppcheck.cpp:898:12 #10 0x55dcbeda7862 in CppCheck::check(FileWithDetails const&) ./src/cppcheck/lib/cppcheck.cpp:802:23 #11 0x55dcbf294ce0 in SingleExecutor::check() ./src/cppcheck/cli/singleexecutor.cpp:52:29 #12 0x55dcbf23cf66 in CppCheckExecutor::check_internal(Settings const&, Suppressions&) const ./src/cppcheck/cli/cppcheckexecutor.cpp:453:32 #13 0x55dcbf23c4fc in CppCheckExecutor::check_wrapper(Settings const&, Suppressions&) ./src/cppcheck/cli/cppcheckexecutor.cpp:295:12 #14 0x55dcbf23c1af in CppCheckExecutor::check(int, char const* const*) ./src/cppcheck/cli/cppcheckexecutor.cpp:280:21 #15 0x55dcbf23b67d in main ./src/cppcheck/cli/main.cpp:71:17 #16 0x7fe8606517e4 in __libc_start_main (/lib64/libc.so.6+0x3a7e4) (BuildId: b81415c1738806b536fb1599d7af2d15bf6a86b7) #17 0x55dcbe317bed in _start (./src/cppcheck/build/bin/cppcheck+0x4bbbed) 0x7c985f8ff900 is located 32 bytes inside of 112-byte region [0x7c985f8ff8e0,0x7c985f8ff950) freed by thread T0 here: #0 0x55dcbe4642ba in operator delete(void*) /usr/local/src/conda/compiler-rt-packages-22.1.8/compiler-rt/lib/asan/asan_new_delete.cpp:177:44 #1 0x55dcbf144bd0 in Token::deleteNext(int) ./src/cppcheck/lib/token.cpp:281:9 #2 0x55dcbf145e2d in Token::deleteThis() ./src/cppcheck/lib/token.cpp:360:9 #3 0x55dcbe634c84 in Tokenizer::simplifyUsing() ./src/cppcheck/lib/tokenize.cpp:3086:18 #4 0x55dcbe6470b3 in Tokenizer::simplifyTokenList1(char const*) ./src/cppcheck/lib/tokenize.cpp:5910:12 #5 0x55dcbe643cb8 in Tokenizer::simplifyTokens1(std::__cxx11::basic_string, std::allocator> const&, int) ./src/cppcheck/lib/tokenize.cpp:3527:14 #6 0x55dcbedb37e7 in CppCheck::checkInternal(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&, std::function, std::allocator>, std::allocator, std::allocator>>>&, std::__cxx11::list>*)> const&) ./src/cppcheck/lib/cppcheck.cpp:1203:32 #7 0x55dcbeda7bf4 in CppCheck::checkFile(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&) ./src/cppcheck/lib/cppcheck.cpp:898:12 #8 0x55dcbeda7862 in CppCheck::check(FileWithDetails const&) ./src/cppcheck/lib/cppcheck.cpp:802:23 #9 0x55dcbf294ce0 in SingleExecutor::check() ./src/cppcheck/cli/singleexecutor.cpp:52:29 #10 0x55dcbf23cf66 in CppCheckExecutor::check_internal(Settings const&, Suppressions&) const ./src/cppcheck/cli/cppcheckexecutor.cpp:453:32 #11 0x55dcbf23c4fc in CppCheckExecutor::check_wrapper(Settings const&, Suppressions&) ./src/cppcheck/cli/cppcheckexecutor.cpp:295:12 #12 0x55dcbf23c1af in CppCheckExecutor::check(int, char const* const*) ./src/cppcheck/cli/cppcheckexecutor.cpp:280:21 #13 0x55dcbf23b67d in main ./src/cppcheck/cli/main.cpp:71:17 #14 0x7fe8606517e4 in __libc_start_main (/lib64/libc.so.6+0x3a7e4) (BuildId: b81415c1738806b536fb1599d7af2d15bf6a86b7) previously allocated by thread T0 here: #0 0x55dcbe4638aa in operator new(unsigned long) /usr/local/src/conda/compiler-rt-packages-22.1.8/compiler-rt/lib/asan/asan_new_delete.cpp:109:35 #1 0x55dcbf14fb4a in Token::insertToken(std::__cxx11::basic_string, std::allocator> const&, bool) ./src/cppcheck/lib/token.cpp:1069:20 #2 0x55dcbe758b2e in Token::insertToken(std::__cxx11::basic_string, std::allocator> const&) ./src/cppcheck/lib/token.h:991:16 #3 0x55dcbf18de6e in TokenList::createTokens(simplecpp::TokenList&&) ./src/cppcheck/lib/tokenlist.cpp:392:37 #4 0x55dcbedc8c03 in CppCheck::checkInternal(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&, std::function, std::allocator>, std::allocator, std::allocator>>>&, std::__cxx11::list>*)> const&)::$_2::operator()() const ./src/cppcheck/lib/cppcheck.cpp:1157:35 #5 0x55dcbedb9322 in void Timer::run, std::allocator> const&, std::function, std::allocator>, std::allocator, std::allocator>>>&, std::__cxx11::list>*)> const&)::$_2>(std::__cxx11::basic_string, std::allocator>, TimerResultsIntf*, CppCheck::checkInternal(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&, std::function, std::allocator>, std::allocator, std::allocator>>>&, std::__cxx11::list>*)> const&)::$_2 const&) ./src/cppcheck/lib/timer.h:77:9 #6 0x55dcbedb2f65 in CppCheck::checkInternal(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&, std::function, std::allocator>, std::allocator, std::allocator>>>&, std::__cxx11::list>*)> const&) ./src/cppcheck/lib/cppcheck.cpp:1152:17 #7 0x55dcbeda7bf4 in CppCheck::checkFile(FileWithDetails const&, std::__cxx11::basic_string, std::allocator> const&) ./src/cppcheck/lib/cppcheck.cpp:898:12 #8 0x55dcbeda7862 in CppCheck::check(FileWithDetails const&) ./src/cppcheck/lib/cppcheck.cpp:802:23 #9 0x55dcbf294ce0 in SingleExecutor::check() ./src/cppcheck/cli/singleexecutor.cpp:52:29 #10 0x55dcbf23cf66 in CppCheckExecutor::check_internal(Settings const&, Suppressions&) const ./src/cppcheck/cli/cppcheckexecutor.cpp:453:32 #11 0x55dcbf23c4fc in CppCheckExecutor::check_wrapper(Settings const&, Suppressions&) ./src/cppcheck/cli/cppcheckexecutor.cpp:295:12 #12 0x55dcbf23c1af in CppCheckExecutor::check(int, char const* const*) ./src/cppcheck/cli/cppcheckexecutor.cpp:280:21 #13 0x55dcbf23b67d in main ./src/cppcheck/cli/main.cpp:71:17 #14 0x7fe8606517e4 in __libc_start_main (/lib64/libc.so.6+0x3a7e4) (BuildId: b81415c1738806b536fb1599d7af2d15bf6a86b7) SUMMARY: AddressSanitizer: heap-use-after-free ./src/cppcheck/lib/tokenize.cpp:3214:32 in Tokenizer::simplifyUsing() Shadow bytes around the buggy address: 0x7c985f8ff680: fd fa fa fa fa fa fa fa fa fa fd fd fd fd fd fd 0x7c985f8ff700: fd fd fd fd fd fd fd fa fa fa fa fa fa fa fa fa 0x7c985f8ff780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fa fa 0x7c985f8ff800: fa fa fa fa fa fa 00 00 00 00 00 00 00 00 00 00 0x7c985f8ff880: 00 00 00 fa fa fa fa fa fa fa fa fa fd fd fd fd =>0x7c985f8ff900:[fd]fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa 0x7c985f8ff980: fa fa fd fd fd fd fd fd fd fd fd fd fd fd fd fd 0x7c985f8ffa00: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd 0x7c985f8ffa80: fd fd fd fd fd fd fa fa fa fa fa fa fa fa 00 00 0x7c985f8ffb00: 00 00 00 00 00 00 00 00 00 00 00 00 fa fa fa fa 0x7c985f8ffb80: fa fa fa fa 00 00 00 00 00 00 00 00 00 00 00 00 Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb ==1390963==ABORTING ``` The proposed fix avoids storing a reference to a memory area that will eventually be deallocated before the reference is used. --- AUTHORS | 1 + lib/tokenize.cpp | 5 ++--- test/testsimplifyusing.cpp | 7 +++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index b505b682708..19cbe734d2e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -156,6 +156,7 @@ Gerhard Zlabinger Gerik Rhoden Gianfranco Costamagna Gianluca Scacco +Gilmar Santos Jr Gleydson Soares Goncalo Mao-Cheia Goran Džaferi diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 7379957804f..2d248f2cbd2 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3015,7 +3015,6 @@ bool Tokenizer::simplifyUsing() Token::Match(tok->linkAt(2), "] ] = ::| %name%"))))) continue; - const std::string& name = tok->strAt(1); const Token *nameToken = tok->next(); std::string scope = currentScope->fullName; Token *usingStart = tok; @@ -3064,7 +3063,7 @@ bool Tokenizer::simplifyUsing() if (!hasName) { std::string newName; if (structEnd->strAt(2) == ";") - newName = name; + newName = nameToken->str(); else newName = "Unnamed" + std::to_string(mUnnamedCount++); TokenList::copyTokens(structEnd->next(), tok, start); @@ -3211,7 +3210,7 @@ bool Tokenizer::simplifyUsing() if (!isTypedefInfoAdded && Token::Match(tok1, "%name% (")) { isTypedefInfoAdded = true; TypedefInfo usingInfo; - usingInfo.name = name; + usingInfo.name = nameToken->str(); usingInfo.filename = list.file(nameToken); usingInfo.lineNumber = nameToken->linenr(); usingInfo.column = nameToken->column(); diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 7359613510f..0d09fa37b12 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -98,6 +98,7 @@ class TestSimplifyUsing : public TestFixture { TEST_CASE(simplifyUsing10335); TEST_CASE(simplifyUsing10720); TEST_CASE(simplifyUsing13873); // function declaration + TEST_CASE(simplifyUsing14877); TEST_CASE(scopeInfo1); TEST_CASE(scopeInfo2); @@ -1667,6 +1668,12 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS("namespace NS1 { void * f ( ) ; }", tok(code3)); } + void simplifyUsing14877() { + const char code[] = "using C = struct C { C() {} };"; + const char expected[] = "struct C { C ( ) { } } ;"; + ASSERT_EQUALS(expected, tok(code)); + } + void scopeInfo1() { const char code[] = "struct A {\n" " enum class Mode { UNKNOWN, ENABLED, NONE, };\n" From 7d0d721d489d0380ce5aefd67f3e64f5af8d9e2a Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 1 Jul 2026 08:25:30 +0200 Subject: [PATCH 106/171] Fix #14876 Nullptr dereference in usingMatch() (#8678) Root cause is here: https://github.com/cppcheck-opensource/cppcheck/blob/86f4c91741690386cd5917ccd8120624d9473ad5/lib/tokenize.cpp#L3108 Co-authored-by: chrchr-github --- lib/tokenize.cpp | 3 +++ test/testsimplifyusing.cpp | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 2d248f2cbd2..b29e807b8b5 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2720,6 +2720,9 @@ namespace { return false; } + if (!tok->tokAt(-1)) + return false; + // skip other using with this name if (tok1->strAt(-1) == "using") { // fixme: this is wrong diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 0d09fa37b12..160f80762a8 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -77,6 +77,7 @@ class TestSimplifyUsing : public TestFixture { TEST_CASE(simplifyUsing37); TEST_CASE(simplifyUsing38); TEST_CASE(simplifyUsing39); + TEST_CASE(simplifyUsing40); TEST_CASE(simplifyUsing8970); TEST_CASE(simplifyUsing8971); @@ -940,6 +941,13 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void simplifyUsing40() { + const char code[] = "uint8_t f();\n" // #14876 + "using ::std::uint8_t;"; + const char expected[] = "uint8_t f ( ) ;"; + ASSERT_EQUALS(expected, tok(code)); + } + void simplifyUsing8970() { const char code[] = "using V = std::vector;\n" "struct A {\n" From 186a7a9eeccc2968d9730aa0b5bc2d189b9b953d Mon Sep 17 00:00:00 2001 From: William Jakobsson <50847546+wjakobsson@users.noreply.github.com> Date: Wed, 1 Jul 2026 15:01:54 +0200 Subject: [PATCH 107/171] Fix --premium-license CLI parsing problem with space in path (#8683) --- cli/cmdlineparser.cpp | 5 ++++- test/testcmdlineparser.cpp | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 1ad0863d96d..f2d2254f833 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -1159,7 +1159,10 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a if (!parseNumberArg(argv[i], 31, tmp, true)) return Result::Fail; } - mSettings.premiumArgs += "--" + p; + if (p.find(' ') != std::string::npos) + mSettings.premiumArgs += "\"--" + p + "\""; + else + mSettings.premiumArgs += "--" + p; if (isCodingStandard) { // All checkers related to the coding standard should be enabled. The coding standards // do not all undefined behavior or portability issues. diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 3b88e050f82..326b7ad613d 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -262,6 +262,7 @@ class TestCmdlineParser : public TestFixture { TEST_CASE(premiumOptionsMetrics); TEST_CASE(premiumOptionsCertCIntPrecision); TEST_CASE(premiumOptionsLicenseFile); + TEST_CASE(premiumOptionsLicenseFilePathWithSpace); TEST_CASE(premiumOptionsInvalid1); TEST_CASE(premiumOptionsInvalid2); TEST_CASE(premiumSafety); @@ -1642,6 +1643,14 @@ class TestCmdlineParser : public TestFixture { ASSERT_EQUALS("--license-file=file.lic", settings->premiumArgs); } + void premiumOptionsLicenseFilePathWithSpace() { + REDIRECT; + asPremium(); + const char * const argv[] = {"cppcheck", "--premium-license-file=license folder/file.lic", "file.c"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); + ASSERT_EQUALS("\"--license-file=license folder/file.lic\"", settings->premiumArgs); + } + void premiumOptionsInvalid1() { REDIRECT; asPremium(); From 47d4f68f5e9a1c2c86f48f9f06b430233cb9476f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:21:59 +0200 Subject: [PATCH 108/171] Fix #12428 FN objectIndex when accessing struct member (#8676) --- lib/checkbufferoverrun.cpp | 6 ++++-- test/testbufferoverrun.cpp | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index a98ba73429c..496ca6905a1 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -1086,9 +1086,11 @@ void CheckBufferOverrunImpl::objectIndex() std::vector values = ValueFlow::getLifetimeObjValues(obj, false, -1); for (const ValueFlow::Value& v:values) { - if (v.lifetimeKind != ValueFlow::Value::LifetimeKind::Address) + if (v.lifetimeKind != ValueFlow::Value::LifetimeKind::Address && v.lifetimeKind != ValueFlow::Value::LifetimeKind::Object) continue; - const Variable *var = v.tokvalue->variable(); + const Token* varTok = nextAfterAstRightmostLeaf(v.tokvalue->astParent()); + varTok = varTok ? varTok->previous() : nullptr; + const Variable *var = varTok ? varTok->variable() : nullptr; if (!var) continue; if (var->isReference()) diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index e1da77ccbfb..e51a1708389 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -5857,7 +5857,9 @@ class TestBufferOverrun : public TestFixture { " (void)y[1];\n" " (void)y[2];\n" "}\n"); - TODO_ASSERT_EQUALS("error", "", errout_str()); + ASSERT_EQUALS("[test.cpp:7:20] -> [test.cpp:9:12]: (error) The address of variable 's.a' is accessed at non-zero index. [objectIndex]\n" + "[test.cpp:7:20] -> [test.cpp:10:12]: (error) The address of variable 's.a' is accessed at non-zero index. [objectIndex]\n", + errout_str()); } void checkPipeParameterSize() { // #3521 From 56a055d5ab0d28a47f65bd14893f8155f2735fa4 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:26:45 +0200 Subject: [PATCH 109/171] Refs #14859: Fix sizeof calculation for std::array (#8671) Co-authored-by: chrchr-github --- lib/symboldatabase.cpp | 14 +++++++++----- lib/vf_common.cpp | 10 ++++++++-- test/testvalueflow.cpp | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 231a8ce009c..bbf6cc8ce52 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -8476,7 +8476,7 @@ namespace { } template -static Result accumulateStructMembers(const Scope* scope, F f, ValueType::Accuracy accuracy) +static Result accumulateStructMembers(const Scope* scope, F f, ValueType::Accuracy accuracy, const Settings& settings) { size_t total = 0; std::set anonScopes; @@ -8495,6 +8495,10 @@ static Result accumulateStructMembers(const Scope* scope, F f, ValueType::Accura if (ret.second) total = f(total, *vt, dim, bits); } + else if (vt->container && vt->container->startPattern == "std :: array <") { + const ValueType vtElement = ValueType::parseDecl(vt->containerTypeToken, settings); + total = f(total, vtElement, dim, bits); + } else total = f(total, *vt, dim, bits); } @@ -8534,12 +8538,12 @@ static size_t getAlignOf(const ValueType& vt, const Settings& settings, ValueTyp size_t a = getAlignOf(vt2, settings, accuracy, ValueType::SizeOf::Pointer, ++maxRecursion); return std::max(max, a); }; - Result result = accumulateStructMembers(vt.typeScope, accHelper, accuracy); + Result result = accumulateStructMembers(vt.typeScope, accHelper, accuracy, settings); size_t total = result.total; if (const Type* dt = vt.typeScope->definedType) { total = std::accumulate(dt->derivedFrom.begin(), dt->derivedFrom.end(), total, [&](size_t v, const Type::BaseInfo& bi) { if (bi.type && bi.type->classScope) - v += accumulateStructMembers(bi.type->classScope, accHelper, accuracy).total; + v += accumulateStructMembers(bi.type->classScope, accHelper, accuracy, settings).total; return v; }); } @@ -8627,14 +8631,14 @@ size_t ValueType::getSizeOf( const Settings& settings, Accuracy accuracy, SizeOf } return typeScope->type == ScopeType::eUnion ? std::max(total, n) : total + padding + n; }; - Result result = accumulateStructMembers(typeScope, accHelper, accuracy); + Result result = accumulateStructMembers(typeScope, accHelper, accuracy, settings); size_t total = result.total; if (currentBitCount > 0) total += currentBitfieldAlloc; if (const ::Type* dt = typeScope->definedType) { total = std::accumulate(dt->derivedFrom.begin(), dt->derivedFrom.end(), total, [&](size_t v, const ::Type::BaseInfo& bi) { if (bi.type && bi.type->classScope) - v += accumulateStructMembers(bi.type->classScope, accHelper, accuracy).total; + v += accumulateStructMembers(bi.type->classScope, accHelper, accuracy, settings).total; return v; }); } diff --git a/lib/vf_common.cpp b/lib/vf_common.cpp index 56f928bcbd8..b4bd756d05e 100644 --- a/lib/vf_common.cpp +++ b/lib/vf_common.cpp @@ -165,7 +165,8 @@ namespace ValueFlow if (obj && !obj->isLiteral() && obj->valueType() && (obj->valueType()->pointer == 0 || // <- TODO this is a bailout, abort when there are array->pointer conversions (obj->variable() && !obj->variable()->isArray())) && - !obj->valueType()->isEnum()) { // <- TODO this is a bailout, handle enum with non-int types + !obj->valueType()->isEnum() && // <- TODO this is a bailout, handle enum with non-int types + !(obj->valueType()->container && obj->valueType()->container->startPattern == "std :: array <")) { const auto ptrPointee = obj->valueType()->pointer > 0 ? ValueType::SizeOf::Pointer : ValueType::SizeOf::Pointee; const size_t sz = obj->valueType()->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ptrPointee); if (sz) { @@ -246,7 +247,12 @@ namespace ValueFlow if (var->type()->classScope && var->type()->classScope->enumType) size = getSizeOfType(var->type()->classScope->enumType, settings); } else if (var->valueType()) { - size = var->valueType()->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); + if (var->valueType()->container && var->valueType()->container->startPattern == "std :: array <") { + const ValueType vtElement = ValueType::parseDecl(var->valueType()->containerTypeToken, settings); + size = vtElement.getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); + } + else + size = var->valueType()->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); } else if (!var->type()) { size = getSizeOfType(var->typeStartToken(), settings); } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 7fa28855eb1..c015664554a 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1812,6 +1812,20 @@ class TestValueFlow : public TestFixture { ASSERT_EQUALS(1U, values.size()); ASSERT_EQUALS(2 * settings.platform.sizeof_pointer, values.back().intvalue); ASSERT_EQUALS_ENUM(ValueFlow::Value::ValueKind::Known, values.back().valueKind); + + code = "struct S { std::array a; };\n" + "x = sizeof(S);\n"; + values = tokenValues(code, "( S"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(3 * settings.platform.sizeof_int, values.back().intvalue); + ASSERT_EQUALS_ENUM(ValueFlow::Value::ValueKind::Known, values.back().valueKind); + + code = "std::array a;\n" + "x = sizeof(a);\n"; + values = tokenValues(code, "( a"); + ASSERT_EQUALS(1U, values.size()); + ASSERT_EQUALS(3 * settings.platform.sizeof_int, values.back().intvalue); + ASSERT_EQUALS_ENUM(ValueFlow::Value::ValueKind::Known, values.back().valueKind); } void valueFlowComma() From 9162aa7fb9d54b79e5abc0f3ebd441a2dfa7e7e5 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 2 Jul 2026 08:25:18 +0200 Subject: [PATCH 110/171] Fix #14878 fuzzing crash (null-pointer-use) in Tokenizer::simplifyUsing() (#8682) --- lib/tokenize.cpp | 2 ++ .../fuzz-crash/crash-42dad53b40278386e4ebd224813e26541cc725f1 | 1 + 2 files changed, 3 insertions(+) create mode 100644 test/cli/fuzz-crash/crash-42dad53b40278386e4ebd224813e26541cc725f1 diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index b29e807b8b5..61719f5291d 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3470,6 +3470,8 @@ bool Tokenizer::simplifyUsing() skip = true; simplifyUsingError(usingStart, usingEnd); } + if (!after) + syntaxError(tok1); tok1 = after->previous(); } diff --git a/test/cli/fuzz-crash/crash-42dad53b40278386e4ebd224813e26541cc725f1 b/test/cli/fuzz-crash/crash-42dad53b40278386e4ebd224813e26541cc725f1 new file mode 100644 index 00000000000..3a9abbf229f --- /dev/null +++ b/test/cli/fuzz-crash/crash-42dad53b40278386e4ebd224813e26541cc725f1 @@ -0,0 +1 @@ +using C=C*;C{{}} From 449ee2413ae26b1c31c28752efa7b2e1636ac8a5 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 2 Jul 2026 08:28:11 +0200 Subject: [PATCH 111/171] Fix #13944 FN constParameterPointer in method in derived class (#8673) https://github.com/cppcheck-opensource/cppcheck/pull/8240 seems to have stalled. Co-authored-by: ceJce --------- Co-authored-by: chrchr-github --- lib/checkother.cpp | 18 +++++++++++++----- lib/checkother.h | 2 +- test/testother.cpp | 12 ++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 21657cfd9fd..9dee8df7810 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -2033,8 +2033,11 @@ void CheckOtherImpl::checkConstPointer() nonConstPointers.emplace(var); } for (const Variable *p: pointers) { + bool foundAllBaseClasses = true; if (p->isArgument()) { - if (!p->scope() || !p->scope()->function || p->scope()->function->isImplicitlyVirtual(true) || p->scope()->function->hasVirtualSpecifier()) + if (!p->scope() || !p->scope()->function || p->scope()->function->hasVirtualSpecifier()) + continue; + if (p->scope()->function->isImplicitlyVirtual(true, &foundAllBaseClasses) && foundAllBaseClasses) continue; if (p->isMaybeUnused()) continue; @@ -2051,12 +2054,12 @@ void CheckOtherImpl::checkConstPointer() continue; if (p->typeStartToken() && p->typeStartToken()->isSimplifiedTypedef() && !(Token::simpleMatch(p->typeEndToken(), "*") && !p->typeEndToken()->isSimplifiedTypedef())) continue; - constVariableError(p, p->isArgument() ? p->scope()->function : nullptr); + constVariableError(p, p->isArgument() ? p->scope()->function : nullptr, foundAllBaseClasses); } } } -void CheckOtherImpl::constVariableError(const Variable *var, const Function *function) +void CheckOtherImpl::constVariableError(const Variable *var, const Function *function, bool foundAllBaseClasses) { if (!var) { reportError(nullptr, Severity::style, "constParameter", "Parameter 'x' can be declared with const"); @@ -2069,13 +2072,18 @@ void CheckOtherImpl::constVariableError(const Variable *var, const Function *fun return; } - const std::string vartype(var->isArgument() ? "Parameter" : "Variable"); + std::string vartype(var->isArgument() ? "Parameter" : "Variable"); const std::string& varname(var->name()); const std::string ptrRefArray = var->isArray() ? "const array" : (var->isPointer() ? "pointer to const" : "reference to const"); ErrorPath errorPath; std::string id = "const" + vartype; - std::string message = "$symbol:" + varname + "\n" + vartype + " '$symbol' can be declared as " + ptrRefArray; + std::string message = "$symbol:" + varname + "\n"; + if (!foundAllBaseClasses) { + message += "Either there is a missing override/final keyword, or the "; + vartype[0] = std::tolower(vartype[0]); + } + message += vartype + " '$symbol' can be declared as " + ptrRefArray; errorPath.emplace_back(var->nameToken(), message); if (var->isArgument() && function && function->functionPointerUsage) { errorPath.emplace_front(function->functionPointerUsage, "You might need to cast the function pointer here"); diff --git a/lib/checkother.h b/lib/checkother.h index 759a4d23e7b..caf9f4a9e57 100644 --- a/lib/checkother.h +++ b/lib/checkother.h @@ -275,7 +275,7 @@ class CPPCHECKLIB CheckOtherImpl : public CheckImpl { void suspiciousFloatingPointCastError(const Token *tok); void invalidPointerCastError(const Token* tok, const std::string& from, const std::string& to, bool inconclusive, bool toIsInt); void passedByValueError(const Variable* var, bool inconclusive, bool isRangeBasedFor = false); - void constVariableError(const Variable *var, const Function *function); + void constVariableError(const Variable *var, const Function *function, bool foundAllBaseClasses = true); void constStatementError(const Token *tok, const std::string &type, bool inconclusive); void signedCharArrayIndexError(const Token *tok); void unknownSignCharArrayIndexError(const Token *tok); diff --git a/test/testother.cpp b/test/testother.cpp index 60323b3395b..fa6899cf543 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -4914,6 +4914,18 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:2:14]: (style) Parameter 's' can be declared as pointer to const [constParameterPointer]\n" "[test.cpp:2:46]: (style) Parameter 'p' can be declared as pointer to const [constParameterPointer]\n", errout_str()); + + check("struct S : U {\n" // #13944 + " void f(int* p) const {\n" + " if (m == p) {}\n" + " }\n" + " void g(int* p) final {\n" + " if (m == p) {}\n" + " }\n" + " int* m;\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:2:17]: (style) Either there is a missing override/final keyword, or the parameter 'p' can be declared as pointer to const [constParameterPointer]\n", + errout_str()); } void constArray() { From 161dcc1bb1161d28884ad054819cc79f9bdb5d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Thu, 2 Jul 2026 08:57:39 +0200 Subject: [PATCH 112/171] checkstl.cpp: small `LoopAnalyzer` cleanup (#8659) - pass `Settings` by reference - cleaned up `LoopAnalyzer` access - removed unnessary condition from `LoopAnalyzer::findAlgo()` - small `LoopAnalyzer::findAlgo()` cleanup --- lib/checkstl.cpp | 97 +++++++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 6d97dffe3d2..4c3b51ac5db 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2869,26 +2869,25 @@ static bool isTernaryAssignment(const Token* assignTok, nonneg int loopVarId, no namespace { struct LoopAnalyzer { - const Token* bodyTok = nullptr; - const Token* loopVar = nullptr; - const Settings* settings = nullptr; - std::set varsChanged; - - explicit LoopAnalyzer(const Token* tok, const Settings* psettings) - : bodyTok(tok->linkAt(1)->next()), settings(psettings) + private: + const Token* mBodyTok; + const Token* mLoopVar{}; + const Settings& mSettings; + std::set mVarsChanged; + + public: + explicit LoopAnalyzer(const Token* tok, const Settings& settings) + : mBodyTok(tok->linkAt(1)->next()), mSettings(settings) { const Token* splitTok = tok->next()->astOperand2(); if (Token::simpleMatch(splitTok, ":") && splitTok->previous()->varId() != 0) { - loopVar = splitTok->previous(); + mLoopVar = splitTok->previous(); } if (valid()) { findChangedVariables(); } } - bool isLoopVarChanged() const { - return varsChanged.count(loopVar->varId()) > 0; - } - + private: bool isModified(const Token* tok) const { if (tok->variable() && tok->variable()->isConst()) @@ -2896,11 +2895,11 @@ namespace { int n = 1 + (astIsPointer(tok) ? 1 : 0); for (int i = 0; i < n; i++) { bool inconclusive = false; - if (isVariableChangedByFunctionCall(tok, i, *settings, &inconclusive)) + if (isVariableChangedByFunctionCall(tok, i, mSettings, &inconclusive)) return true; if (inconclusive) return true; - if (isVariableChanged(tok, i, *settings)) + if (isVariableChanged(tok, i, mSettings)) return true; } return false; @@ -2909,7 +2908,7 @@ namespace { template void findTokens(Predicate pred, F f) const { - for (const Token* tok = bodyTok; precedes(tok, bodyTok->link()); tok = tok->next()) { + for (const Token* tok = mBodyTok; precedes(tok, mBodyTok->link()); tok = tok->next()) { if (pred(tok)) f(tok); } @@ -2918,7 +2917,7 @@ namespace { template const Token* findToken(Predicate pred) const { - for (const Token* tok = bodyTok; precedes(tok, bodyTok->link()); tok = tok->next()) { + for (const Token* tok = mBodyTok; precedes(tok, mBodyTok->link()); tok = tok->next()) { if (pred(tok)) return tok; } @@ -2933,58 +2932,56 @@ namespace { } bool valid() const { - return bodyTok && loopVar; + return mBodyTok && mLoopVar; } + public: std::string findAlgo() const { if (!valid()) return ""; - bool loopVarChanged = isLoopVarChanged(); - if (!loopVarChanged && varsChanged.empty()) { - if (hasGotoOrBreak()) - return ""; - bool alwaysTrue = true; - bool alwaysFalse = true; - auto hasReturn = [](const Token* tok) { - return Token::simpleMatch(tok, "return"); - }; - findTokens(hasReturn, [&](const Token* tok) { - const Token* returnTok = tok->astOperand1(); - if (!returnTok || !returnTok->hasKnownIntValue() || !astIsBool(returnTok)) { - alwaysTrue = false; - alwaysFalse = false; - return; - } - (returnTok->getKnownIntValue() ? alwaysTrue : alwaysFalse) &= true; - (returnTok->getKnownIntValue() ? alwaysFalse : alwaysTrue) &= false; - }); - if (alwaysTrue == alwaysFalse) - return ""; - if (alwaysTrue) - return "std::any_of"; - return "std::all_of or std::none_of"; - } - return ""; + if (!mVarsChanged.empty()) + return ""; + if (hasGotoOrBreak()) + return ""; + bool alwaysTrue = true; + bool alwaysFalse = true; + const auto hasReturn = [](const Token* tok) { + return Token::simpleMatch(tok, "return"); + }; + findTokens(hasReturn, [&](const Token* tok) { + const Token* returnTok = tok->astOperand1(); + if (!returnTok || !returnTok->hasKnownIntValue() || !astIsBool(returnTok)) { + alwaysTrue = false; + alwaysFalse = false; + return; + } + (returnTok->getKnownIntValue() ? alwaysTrue : alwaysFalse) &= true; + (returnTok->getKnownIntValue() ? alwaysFalse : alwaysTrue) &= false; + }); + if (alwaysTrue == alwaysFalse) + return ""; + if (alwaysTrue) + return "std::any_of"; + return "std::all_of or std::none_of"; } - + private: bool isLocalVar(const Variable* var) const { if (!var) return false; if (var->isPointer() || var->isReference()) return false; - if (var->declarationId() == loopVar->varId()) + if (var->declarationId() == mLoopVar->varId()) return false; const Scope* scope = var->scope(); - return scope && scope->isNestedIn(bodyTok->scope()); + return scope && scope->isNestedIn(mBodyTok->scope()); } - private: void findChangedVariables() { std::set vars; - for (const Token* tok = bodyTok; precedes(tok, bodyTok->link()); tok = tok->next()) { + for (const Token* tok = mBodyTok; precedes(tok, mBodyTok->link()); tok = tok->next()) { if (tok->varId() == 0) continue; if (vars.count(tok->varId()) > 0) @@ -2995,7 +2992,7 @@ namespace { } if (!isModified(tok)) continue; - varsChanged.insert(tok->varId()); + mVarsChanged.insert(tok->varId()); vars.insert(tok->varId()); } } @@ -3046,7 +3043,7 @@ void CheckStlImpl::useStlAlgorithm() continue; if (!Token::simpleMatch(tok->linkAt(1), ") {")) continue; - LoopAnalyzer a{tok, &mSettings}; + LoopAnalyzer a{tok, mSettings}; std::string algoName = a.findAlgo(); if (!algoName.empty()) { useStlAlgorithmError(tok, algoName); From ac061dac8a68c811300cf3c5201886a3c085e15f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 2 Jul 2026 14:36:20 +0200 Subject: [PATCH 113/171] Fix #14886 fuzzing crash (null-pointer-use) in SymbolDatabase::createSymbolDatabaseIncompleteVars() (#8685) --- lib/symboldatabase.cpp | 2 +- .../fuzz-crash/crash-60d6b7bc43d21f6a8ad8eb8cca551e45c31c6a32 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 test/cli/fuzz-crash/crash-60d6b7bc43d21f6a8ad8eb8cca551e45c31c6a32 diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index bbf6cc8ce52..b687c9f77a4 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1491,7 +1491,7 @@ void SymbolDatabase::createSymbolDatabaseEnums() void SymbolDatabase::createSymbolDatabaseIncompleteVars() { - for (Token* tok = mTokenizer.list.front(); tok != mTokenizer.list.back(); tok = tok->next()) { + for (Token* tok = mTokenizer.list.front(); precedes(tok, mTokenizer.list.back()); tok = tok->next()) { const Scope * scope = tok->scope(); if (!scope) continue; diff --git a/test/cli/fuzz-crash/crash-60d6b7bc43d21f6a8ad8eb8cca551e45c31c6a32 b/test/cli/fuzz-crash/crash-60d6b7bc43d21f6a8ad8eb8cca551e45c31c6a32 new file mode 100644 index 00000000000..4a60eb05b88 --- /dev/null +++ b/test/cli/fuzz-crash/crash-60d6b7bc43d21f6a8ad8eb8cca551e45c31c6a32 @@ -0,0 +1 @@ +ti(){using S}; From 3f2d60c4b72b5ab28ded6fc980341348643cc817 Mon Sep 17 00:00:00 2001 From: metsw24-max Date: Fri, 3 Jul 2026 12:52:50 +0530 Subject: [PATCH 114/171] Fix #14885 Shift by negative value in TemplateSimplifier::simplifyNumericalCalculations() (#8639) the value shift operators only reject a count >= bigint_bits, so MathLib::value::shiftLeft still left-shifts a negative value and both shiftLeft and shiftRight still shift by a negative count, which is undefined behaviour. it is reachable when folding a template argument like 0x8000000000000000 << 1 in simplifyNumericCalculations, since MathLib::isNegative only checks for a leading minus while a large hex literal parses to a negative bigint and the guard there lets it through. mirror the negative-operand check calculate.h already uses and return the operand unchanged, as is already done for oversized counts. ubsan flags the left shift at mathlib.cpp:272 on that input. --- AUTHORS | 1 + lib/mathlib.cpp | 4 ++-- test/testsimplifytemplate.cpp | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 19cbe734d2e..1a7543b0d93 100644 --- a/AUTHORS +++ b/AUTHORS @@ -369,6 +369,7 @@ Samuel Degrande Samuel PolĆ”Äek Sandeep Dutta Savvas Etairidis +Sayed Kaif Scott Ehlert Scott Furry Seafarix Ltd. diff --git a/lib/mathlib.cpp b/lib/mathlib.cpp index 403662f4df2..c7c055899fd 100644 --- a/lib/mathlib.cpp +++ b/lib/mathlib.cpp @@ -266,7 +266,7 @@ MathLib::value MathLib::value::shiftLeft(const MathLib::value &v) const if (!isInt() || !v.isInt()) throw InternalError(nullptr, "Shift operand is not integer"); MathLib::value ret(*this); - if (v.mIntValue >= MathLib::bigint_bits) { + if (v.mIntValue < 0 || v.mIntValue >= MathLib::bigint_bits || ret.mIntValue < 0) { return ret; } ret.mIntValue <<= v.mIntValue; @@ -278,7 +278,7 @@ MathLib::value MathLib::value::shiftRight(const MathLib::value &v) const if (!isInt() || !v.isInt()) throw InternalError(nullptr, "Shift operand is not integer"); MathLib::value ret(*this); - if (v.mIntValue >= MathLib::bigint_bits) { + if (v.mIntValue < 0 || v.mIntValue >= MathLib::bigint_bits) { return ret; } ret.mIntValue >>= v.mIntValue; diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp index b28bc503869..6960b791426 100644 --- a/test/testsimplifytemplate.cpp +++ b/test/testsimplifytemplate.cpp @@ -320,6 +320,8 @@ class TestSimplifyTemplate : public TestFixture { TEST_CASE(templateArgPreserveType); // #13882 - type of template argument + TEST_CASE(template_shift_negative); // shift folding with a negative operand + TEST_CASE(dumpTemplateArgFrom); } @@ -6715,6 +6717,21 @@ class TestSimplifyTemplate : public TestFixture { tok(code)); } + void template_shift_negative() { + // a large hex literal is not negative as a string but parses to a negative + // bigint, so folding the shift in simplifyNumericCalculations would left-shift + // a negative value / shift by a negative count, both UB. the operand must be + // returned unchanged. parentheses are needed so the numeric folding is reached. + const char code[] = "template struct S { };\n" + "S<(0x8000000000000000 << 1)> s1;\n" + "S<(1 << 0x8000000000000000)> s2;\n" + "S<(1 >> 0x8000000000000000)> s3;"; + const char expected[] = "struct S<9223372036854775808U> ; struct S<1> ; " + "S<9223372036854775808U> s1 ; S<1> s2 ; S<1> s3 ; " + "struct S<9223372036854775808U> { } ; struct S<1> { } ;"; + ASSERT_EQUALS(expected, tok(code)); + } + void dumpTemplateArgFrom() { const char code[] = "template void foo(T t) {}\n" "foo(23);"; From ddab07631d6ef3ccff5dc4c93ae5ba8d3dd57c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Berder?= <18538310+francois-berder@users.noreply.github.com> Date: Fri, 3 Jul 2026 11:42:45 +0200 Subject: [PATCH 115/171] Fix #14826 valueflow: forward lifetimes through array and member subobjects (#8636) Signed-off-by: Francois Berder --- lib/valueflow.cpp | 39 ++++++++++++---- test/testautovariables.cpp | 93 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 8 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index f934d8496d6..7d25166bf99 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1952,6 +1952,35 @@ const Token* ValueFlow::getEndOfExprScope(const Token* tok, const Scope* default return end; } +static void getLhsLifetimeParentsImpl(const Token* lhs, const Library& library, std::vector& result) +{ + if (!lhs) + return; + + if (Token::simpleMatch(lhs, "[")) { + getLhsLifetimeParentsImpl(lhs->astOperand1(), library, result); + } else if (Token::simpleMatch(lhs, ".") && lhs->originalName() != "->") { + const Token* obj = lhs->astOperand1(); + if (Token::simpleMatch(obj, "[") && obj->exprId() > 0) + result.push_back(obj); + getLhsLifetimeParentsImpl(obj, library, result); + } else { + const Token* tok = getParentLifetime(lhs, library); + if (tok && tok->exprId() > 0) { + const Variable* var = tok->variable(); + if (!var || var->isLocal() || var->isArgument()) + result.push_back(tok); + } + } +} + +static std::vector getLhsLifetimeParents(const Token* lhs, const Library& library) +{ + std::vector result; + getLhsLifetimeParentsImpl(lhs, library, result); + return result; +} + static void valueFlowForwardLifetime(Token * tok, const TokenList &tokenlist, ErrorLogger &errorLogger, const Settings &settings) { // Forward lifetimes to constructed variable @@ -2004,14 +2033,8 @@ static void valueFlowForwardLifetime(Token * tok, const TokenList &tokenlist, Er if (val.lifetimeKind == ValueFlow::Value::LifetimeKind::Address) val.lifetimeKind = ValueFlow::Value::LifetimeKind::SubObject; } - // TODO: handle `[` - if (Token::simpleMatch(parent->astOperand1(), ".")) { - const Token* parentLifetime = - getParentLifetime(parent->astOperand1()->astOperand2(), settings.library); - if (parentLifetime && parentLifetime->exprId() > 0) { - valueFlowForward(nextExpression, endOfVarScope, parentLifetime, std::move(values), tokenlist, errorLogger, settings); - } - } + for (const Token *p : getLhsLifetimeParents(parent->astOperand1(), settings.library)) + valueFlowForward(nextExpression, endOfVarScope, p, values, tokenlist, errorLogger, settings); } // Constructor } else if (Token::simpleMatch(parent, "{") && !isScopeBracket(parent)) { diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 9fe3e126660..2867f147d81 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -4452,6 +4452,99 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:5:14] -> [test.cpp:5:18] -> [test.cpp:6:7]: (error) Using pointer that is a temporary. [danglingTemporaryLifetime]\n", errout_str()); + + check("struct A { const int* data[2]; };\n" + "A g() {\n" + " int x = 0;\n" + " A a;\n" + " a.data[0] = &x;\n" + " return a;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:17] -> [test.cpp:3:9] -> [test.cpp:6:12]: (error) Returning object that points to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); + + check("struct A { const int* data[2]; };\n" + "A g() {\n" + " int x = 0;\n" + " A a[2];\n" + " a[0].data[0] = &x;\n" + " return a[0];\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:20] -> [test.cpp:3:9] -> [test.cpp:6:13]: (error) Returning object that points to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); + + check("struct A { const int* data[2]; };\n" + "A* g() {\n" + " int x = 0;\n" + " static A arr[2];\n" + " arr[0].data[0] = &x;\n" + " return arr;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:22] -> [test.cpp:3:9] -> [test.cpp:6:12]: (error) Returning pointer to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); + + check("struct A { const int* p; };\n" + "A g(int i) {\n" + " int x = 0;\n" + " A arr[2];\n" + " arr[i].p = &x;\n" + " return arr[i];\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:16] -> [test.cpp:3:9] -> [test.cpp:6:15]: (error) Returning object that points to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); + + check("struct A { const int* p; };\n" + "A* g(int i) {\n" + " int x = 0;\n" + " static A arr[2];\n" + " arr[i].p = &x;\n" + " return arr;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:16] -> [test.cpp:3:9] -> [test.cpp:6:12]: (error) Returning pointer to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); + + check("struct A { const int* p; };\n" + "struct B { A arr[2]; };\n" + "B g(int i) {\n" + " int x = 0;\n" + " B b;\n" + " b.arr[i].p = &x;\n" + " return b;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6:18] -> [test.cpp:4:9] -> [test.cpp:7:12]: (error) Returning object that points to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); + + check("struct A { const int* p; };\n" + "A* g() {\n" + " int x = 0;\n" + " static A a;\n" + " A* ap = &a;\n" + " ap->p = &x;\n" + " (*ap).p = &x;\n" + " return ap;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("struct A { int* a; int* b; };\n" + "static A g;\n" + "int* f() {\n" + " int x = 0;\n" + " g.a = &x;\n" + " return g.b;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:11] -> [test.cpp:4:9] -> [test.cpp:5:6]: (error) Non-local variable 'g.a' will use pointer to local variable 'x'. [danglingLifetime]\n", + errout_str()); + + check("struct A { int* a; int* b; };\n" + "static A g;\n" + "int* f() {\n" + " int x = 0;\n" + " g.a = &x;\n" + " return g.a;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:11] -> [test.cpp:4:9] -> [test.cpp:5:6]: (error) Non-local variable 'g.a' will use pointer to local variable 'x'. [danglingLifetime]\n" + "[test.cpp:5:11] -> [test.cpp:4:9] -> [test.cpp:6:13]: (error) Returning pointer to local variable 'x' that will be invalid when returning. [returnDanglingLifetime]\n", + errout_str()); } void danglingLifetimeClassMemberFunctions() From 04091bd597b5ec8bd2ee56f018cd628f9885d7c9 Mon Sep 17 00:00:00 2001 From: Robert Morin Date: Fri, 3 Jul 2026 05:48:23 -0400 Subject: [PATCH 116/171] Fix #14743 (New check: ftell() result is unspecified when file is opened in mode "t") (#8360) --- .gitignore | 1 + lib/checkio.cpp | 20 +++++++++++ lib/checkio.h | 1 + man/checkers/ftellTextModeFile.md | 56 +++++++++++++++++++++++++++++++ releasenotes.txt | 1 + test/testio.cpp | 17 ++++++++++ 6 files changed, 96 insertions(+) create mode 100644 man/checkers/ftellTextModeFile.md diff --git a/.gitignore b/.gitignore index 434203fe2a9..a821204bf2d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.gcno *.gch *.o +*.a *.pyc /cppcheck /cppcheck.exe diff --git a/lib/checkio.cpp b/lib/checkio.cpp index f632ca99e9e..c753dd80739 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -48,6 +48,7 @@ // CVE ID used: static const CWE CWE119(119U); // Improper Restriction of Operations within the Bounds of a Memory Buffer static const CWE CWE398(398U); // Indicator of Poor Code Quality +static const CWE CWE474(474U); // Use of Function with Inconsistent Implementations static const CWE CWE664(664U); // Improper Control of a Resource Through its Lifetime static const CWE CWE685(685U); // Function Call With Incorrect Number of Arguments static const CWE CWE686(686U); // Function Call With Incorrect Argument Type @@ -111,6 +112,8 @@ namespace { nonneg int op_indent{}; enum class AppendMode : std::uint8_t { UNKNOWN_AM, APPEND, APPEND_EX }; AppendMode append_mode = AppendMode::UNKNOWN_AM; + enum class ReadMode : std::uint8_t { READ_TEXT, READ_BIN }; + ReadMode read_mode = ReadMode::READ_BIN; std::string filename; explicit Filepointer(OpenMode mode_ = OpenMode::UNKNOWN_OM) : mode(mode_) {} @@ -183,6 +186,7 @@ void CheckIOImpl::checkFileUsage() } } else if (Token::Match(tok, "%name% (") && tok->previous() && (!tok->previous()->isName() || Token::Match(tok->previous(), "return|throw"))) { std::string mode; + bool isftell = false; const Token* fileTok = nullptr; const Token* fileNameTok = nullptr; Filepointer::Operation operation = Filepointer::Operation::NONE; @@ -266,6 +270,9 @@ void CheckIOImpl::checkFileUsage() fileTok = tok->tokAt(2); if ((tok->str() == "ungetc" || tok->str() == "ungetwc") && fileTok) fileTok = fileTok->nextArgument(); + else if (tok->str() == "ftell") { + isftell = true; + } operation = Filepointer::Operation::UNIMPORTANT; } else if (!Token::Match(tok, "if|for|while|catch|switch") && !mSettings.library.isFunctionConst(tok->str(), true)) { const Token* const end2 = tok->linkAt(1); @@ -321,10 +328,15 @@ void CheckIOImpl::checkFileUsage() f.append_mode = Filepointer::AppendMode::APPEND_EX; else f.append_mode = Filepointer::AppendMode::APPEND; + } + else if (mode.find('r') != std::string::npos && + mode.find('t') != std::string::npos) { + f.read_mode = Filepointer::ReadMode::READ_TEXT; } else f.append_mode = Filepointer::AppendMode::UNKNOWN_AM; f.mode_indent = indent; break; + case Filepointer::Operation::POSITIONING: if (f.mode == OpenMode::CLOSED) useClosedFileError(tok); @@ -357,6 +369,8 @@ void CheckIOImpl::checkFileUsage() case Filepointer::Operation::UNIMPORTANT: if (f.mode == OpenMode::CLOSED) useClosedFileError(tok); + if (isftell && f.read_mode == Filepointer::ReadMode::READ_TEXT && printPortability) + ftellFileError(tok); break; case Filepointer::Operation::UNKNOWN_OP: f.mode = OpenMode::UNKNOWN_OM; @@ -424,6 +438,12 @@ void CheckIOImpl::seekOnAppendedFileError(const Token *tok) "seekOnAppendedFile", "Repositioning operation performed on a file opened in append mode has no effect.", CWE398, Certainty::normal); } +void CheckIOImpl::ftellFileError(const Token *tok) +{ + reportError(tok, Severity::portability, + "ftellTextModeFile", "ftell() result is unspecified when file is opened in mode \"t\"", CWE474, Certainty::normal); +} + void CheckIOImpl::incompatibleFileOpenError(const Token *tok, const std::string &filename) { reportError(tok, Severity::warning, diff --git a/lib/checkio.h b/lib/checkio.h index dff49006bab..ae0ea242dab 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -128,6 +128,7 @@ class CPPCHECKLIB CheckIOImpl : public CheckImpl { void useClosedFileError(const Token *tok); void fcloseInLoopConditionError(const Token *tok, const std::string &varname); void seekOnAppendedFileError(const Token *tok); + void ftellFileError(const Token *tok); void incompatibleFileOpenError(const Token *tok, const std::string &filename); void invalidScanfError(const Token *tok); void wrongfeofUsage(const Token *tok); diff --git a/man/checkers/ftellTextModeFile.md b/man/checkers/ftellTextModeFile.md new file mode 100644 index 00000000000..6ca6653a6f2 --- /dev/null +++ b/man/checkers/ftellTextModeFile.md @@ -0,0 +1,56 @@ +# ftellModeTextFile + +**Message**: ftell() result is unspecified when file is opened in mode "t".
+**Category**: Portability
+**Severity**: Style
+**Language**: C/C++ + +## Description + +This checker detects the use of ftell() on a file open in text (or translate) mode. The text mode is not consistent + in between Linux and Windows system and may cause ftell() to return the wrong offset inside a text file. + +See section 7.21.9.4p2 of the C11 standard regarding the ftell function states for a text stream: + +- For a text stream, its file position indicator contains unspecified information, usable by the fseek function for returning the file position indicator for the stream to its position at the time of the ftell call; the difference between two such return values is not necessarily a meaningful measure of the number of characters written or read. + +This warning helps improve code quality by: +- Making the intent clear that the use of ftell() in "t" mode may cause portability problem. + +## Motivation + +This checker improves portability accross system. + +## How to fix + +According to C11, the file must be opened in binary mode 'b' to prevent this problem. + +Before: +```cpp + FILE *f = fopen("Example.txt", "rt"); + if (f) + { + fseek(f, 0, SEEK_END); + printf( "File size %d\n", ftell(f)); + fclose(f); + } + +``` + +After: +```cpp + + FILE *f = fopen("Example.txt", "rb"); + if (f) + { + fseek(f, 0, SEEK_END); + printf( "File size %d\n", ftell(f)); + fclose(f); + } + +``` + +## Notes + +See https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen?view=msvc-170 + diff --git a/releasenotes.txt b/releasenotes.txt index 2141c34f001..0ca26f2374a 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -6,6 +6,7 @@ Major bug fixes & crashes: New checks: - Warn when feof() is used as a while loop condition (wrongfeofUsage). +- ftell() result is unspecified when file is opened in mode "t". C/C++ support: - diff --git a/test/testio.cpp b/test/testio.cpp index adfb6e31daf..f90773d4cf4 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -44,6 +44,7 @@ class TestIO : public TestFixture { TEST_CASE(fileIOwithoutPositioning); TEST_CASE(seekOnAppendedFile); TEST_CASE(fflushOnInputStream); + TEST_CASE(ftellCompatibility); TEST_CASE(incompatibleFileOpen); TEST_CASE(testWrongfeofUsage); // #958 @@ -728,6 +729,22 @@ class TestIO : public TestFixture { ASSERT_EQUALS("", errout_str()); // #6566 } + void ftellCompatibility() { + + check("void foo() {\n" + " FILE *f = fopen(\"\", \"rt\");\n" + " if (f)\n" + " {\n" + " extern long position;\n" + " fseek(f, 0, SEEK_END);\n" + " position = ftell(f);\n" + " fclose(f);\n" + " }\n" + "}\n", dinit(CheckOptions, $.portability = true)); + ASSERT_EQUALS("[test.cpp:7:21]: (portability) ftell() result is unspecified when file is opened in mode \"t\" [ftellTextModeFile]\n", errout_str()); + } + + void fflushOnInputStream() { check("void foo()\n" "{\n" From c1644448468b6e406b3c2c6c7864a105e7aeae54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 3 Jul 2026 13:44:08 +0200 Subject: [PATCH 117/171] pass `Library` instead of `Settings` (#8660) --- lib/astutils.cpp | 26 +++++++++++++------------- lib/astutils.h | 10 +++++----- lib/checkautovariables.cpp | 22 +++++++++++----------- lib/checkbufferoverrun.cpp | 2 +- lib/checkclass.cpp | 2 +- lib/checkio.cpp | 6 +++--- lib/checkio.h | 3 ++- lib/checkleakautovar.cpp | 14 +++++++------- lib/checknullpointer.cpp | 12 ++++++------ lib/checknullpointer.h | 2 +- lib/checkother.cpp | 8 ++++---- lib/checkstl.cpp | 4 ++-- lib/checkuninitvar.cpp | 4 ++-- lib/checkunusedfunctions.cpp | 30 +++++++++++++++--------------- lib/checkunusedfunctions.h | 5 +++-- lib/cppcheck.cpp | 10 +++++----- lib/valueflow.cpp | 8 ++++---- lib/vf_analyzers.cpp | 4 ++-- lib/vf_common.cpp | 8 ++++---- lib/vf_common.h | 3 ++- test/testastutils.cpp | 2 +- test/testunusedfunctions.cpp | 12 ++++++------ 22 files changed, 100 insertions(+), 97 deletions(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 8700d2d2cd9..a6fe2573f08 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2334,14 +2334,14 @@ bool isWithinScope(const Token* tok, const Variable* var, ScopeType type) return false; } -bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Settings &settings, bool *inconclusive) +bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Library &library, bool *inconclusive) { if (!tok) return false; if (tok->varId() == varid) - return isVariableChangedByFunctionCall(tok, indirect, settings, inconclusive); - return isVariableChangedByFunctionCall(tok->astOperand1(), indirect, varid, settings, inconclusive) || - isVariableChangedByFunctionCall(tok->astOperand2(), indirect, varid, settings, inconclusive); + return isVariableChangedByFunctionCall(tok, indirect, library, inconclusive); + return isVariableChangedByFunctionCall(tok->astOperand1(), indirect, varid, library, inconclusive) || + isVariableChangedByFunctionCall(tok->astOperand2(), indirect, varid, library, inconclusive); } bool isScopeBracket(const Token* tok) @@ -2522,7 +2522,7 @@ bool isMutableExpression(const Token* tok) return true; } -bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Settings &settings, bool *inconclusive) +bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Library &library, bool *inconclusive) { if (!tok) return false; @@ -2562,13 +2562,13 @@ bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Setti if (!tok->function() && !tok->variable() && tok->isName()) { // Check if direction (in, out, inout) is specified in the library configuration and use that - const Library::ArgumentChecks::Direction argDirection = settings.library.getArgDirection(tok, 1 + argnr, indirect); + const Library::ArgumentChecks::Direction argDirection = library.getArgDirection(tok, 1 + argnr, indirect); if (argDirection == Library::ArgumentChecks::Direction::DIR_IN) return false; if (argDirection == Library::ArgumentChecks::Direction::DIR_OUT || argDirection == Library::ArgumentChecks::Direction::DIR_INOUT) return true; - const bool requireNonNull = settings.library.isnullargbad(tok, 1 + argnr); + const bool requireNonNull = library.isnullargbad(tok, 1 + argnr); if (Token::simpleMatch(tok->tokAt(-2), "std :: tie")) return true; // if the library says 0 is invalid @@ -2796,7 +2796,7 @@ bool isVariableChanged(const Token *tok, int indirect, const Settings &settings, if (indirect == 0 && astIsLHS(tok2) && Token::Match(ptok, ". %var%") && astIsPointer(ptok->next())) pindirect = 1; bool inconclusive = false; - bool isChanged = isVariableChangedByFunctionCall(ptok, pindirect, settings, &inconclusive); + bool isChanged = isVariableChangedByFunctionCall(ptok, pindirect, settings.library, &inconclusive); isChanged |= inconclusive; if (isChanged) return true; @@ -3421,7 +3421,7 @@ bool isConstVarExpression(const Token *tok, const std::functionastParent() && tok->astParent()->isUnaryOp("&"); @@ -3483,14 +3483,14 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings } else if (ftok->str() == "{") { return indirect == 0 ? ExprUsage::Used : ExprUsage::Inconclusive; } else { - const bool isnullbad = settings.library.isnullargbad(ftok, argnr + 1); + const bool isnullbad = library.isnullargbad(ftok, argnr + 1); if (indirect == 0 && astIsPointer(tok) && !addressOf && isnullbad) return ExprUsage::Used; bool hasIndirect = false; - const bool isuninitbad = settings.library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect); + const bool isuninitbad = library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect); if (isuninitbad && (!addressOf || isnullbad)) return ExprUsage::Used; - const Library::ArgumentChecks::Direction argDirection = settings.library.getArgDirection(ftok, argnr + 1, indirect); + const Library::ArgumentChecks::Direction argDirection = library.getArgDirection(ftok, argnr + 1, indirect); if (argDirection == Library::ArgumentChecks::Direction::DIR_IN) // TODO: DIR_INOUT? return ExprUsage::Used; if (argDirection == Library::ArgumentChecks::Direction::DIR_OUT) @@ -3560,7 +3560,7 @@ ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings) (astIsLHS(tok) || Token::simpleMatch(parent, "( )"))) return ExprUsage::Used; } - return getFunctionUsage(tok, indirect, settings); + return getFunctionUsage(tok, indirect, settings.library); } static void getLHSVariablesRecursive(std::vector& vars, const Token* tok) diff --git a/lib/astutils.h b/lib/astutils.h index 617e01f0415..2c6650068b5 100644 --- a/lib/astutils.h +++ b/lib/astutils.h @@ -327,20 +327,20 @@ bool isMutableExpression(const Token* tok); * * @param tok ast tree * @param varid Variable Id - * @param settings program settings + * @param library library configurations * @param inconclusive pointer to output variable which indicates that the answer of the question is inconclusive */ -bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Settings &settings, bool *inconclusive); +bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Library &library, bool *inconclusive); /** Is variable changed by function call? * In case the answer of the question is inconclusive, e.g. because the function declaration is not known * the return value is false and the output parameter inconclusive is set to true * - * @param tok token of variable in function call - * @param settings program settings + * @param tok token of variable in function call + * @param library library configurations * @param inconclusive pointer to output variable which indicates that the answer of the question is inconclusive */ -CPPCHECKLIB bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Settings &settings, bool *inconclusive); +CPPCHECKLIB bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Library &library, bool *inconclusive); /** Is variable changed in block of code? */ CPPCHECKLIB bool isVariableChanged(const Token *start, const Token *end, nonneg int exprid, bool globalvar, const Settings &settings, int depth = 20); diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index b848928ebf4..de70772a279 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -139,14 +139,14 @@ static bool isAutoVarArray(const Token *tok) return false; } -static bool isLocalContainerBuffer(const Token* tok, const Settings& settings) +static bool isLocalContainerBuffer(const Token* tok, const Library& library) { if (!tok) return false; // x+y if (tok->str() == "+") - return isLocalContainerBuffer(tok->astOperand1(), settings) || isLocalContainerBuffer(tok->astOperand2(), settings); + return isLocalContainerBuffer(tok->astOperand1(), library) || isLocalContainerBuffer(tok->astOperand2(), library); if (tok->str() != "(" || !Token::simpleMatch(tok->astOperand1(), ".")) return false; @@ -157,7 +157,7 @@ static bool isLocalContainerBuffer(const Token* tok, const Settings& settings) if (!var || !var->isLocal() || var->isStatic()) return false; - const Library::Container::Yield yield = astContainerYield(tok, settings.library); + const Library::Container::Yield yield = astContainerYield(tok, library); return yield == Library::Container::Yield::BUFFER || yield == Library::Container::Yield::BUFFER_NT; } @@ -233,8 +233,8 @@ void CheckAutoVariablesImpl::assignFunctionArg() } } -static bool isAutoVariableRHS(const Token* tok, const Settings& settings) { - return isAddressOfLocalVariable(tok) || isAutoVarArray(tok) || isLocalContainerBuffer(tok, settings); +static bool isAutoVariableRHS(const Token* tok, const Library& library) { + return isAddressOfLocalVariable(tok) || isAutoVarArray(tok) || isLocalContainerBuffer(tok, library); } static bool hasOverloadedAssignment(const Token* tok, bool& inconclusive) @@ -257,7 +257,7 @@ static bool hasOverloadedAssignment(const Token* tok, bool& inconclusive) return true; } -static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Settings& settings) +static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Library& library) { const Token *endBracket = nullptr; if (!Token::Match(tok, "[;{}] %var% . %var%")) { @@ -274,7 +274,7 @@ static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Settin assign = assign->astParent(); if (!Token::simpleMatch(assign, "=")) return false; - if (!isAutoVariableRHS(assign->astOperand2(), settings)) + if (!isAutoVariableRHS(assign->astOperand2(), library)) return false; rhs = assign->astOperand2(); return true; @@ -295,15 +295,15 @@ void CheckAutoVariablesImpl::autoVariables() } // Critical assignment const Token* rhs{}; - if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2(), mSettings)) { + if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2(), mSettings.library)) { checkAutoVariableAssignment(tok->next(), false); - } else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2(), mSettings)) { + } else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2(), mSettings.library)) { const Token* lhs = tok->tokAt(2); bool inconclusive = false; if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive)) checkAutoVariableAssignment(tok->next(), inconclusive); tok = tok->tokAt(4); - } else if (isMemberAssignment(tok, rhs, mSettings)) { + } else if (isMemberAssignment(tok, rhs, mSettings.library)) { const Token* lhs = tok->tokAt(3); bool inconclusive = false; if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive)) @@ -311,7 +311,7 @@ void CheckAutoVariablesImpl::autoVariables() tok = rhs; } else if (Token::Match(tok, "[;{}] %var% [") && Token::simpleMatch(tok->linkAt(2), "] =") && (isPtrArg(tok->next()) || isArrayArg(tok->next(), mSettings)) && - isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2(), mSettings)) { + isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2(), mSettings.library)) { errorAutoVariableAssignment(tok->next(), false); } // Invalid pointer deallocation diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 496ca6905a1..81b6653d348 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -133,7 +133,7 @@ static int getMinFormatStringOutputLength(const std::vector ¶m case 's': parameterLength = 0; if (inputArgNr < parameters.size()) - parameterLength = ValueFlow::valueFlowGetStrLength(parameters[inputArgNr], settings); + parameterLength = ValueFlow::valueFlowGetStrLength(parameters[inputArgNr], settings.library); handleNextParameter = true; break; diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index b610e963d76..e04df8b5748 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1059,7 +1059,7 @@ void CheckClassImpl::initializeVarList(const Function &func, std::listnext(); if (tok2->str() == "&") tok2 = tok2->next(); - if (isVariableChangedByFunctionCall(tok2, tok2->strAt(-1) == "&", tok2->varId(), mSettings, nullptr)) + if (isVariableChangedByFunctionCall(tok2, tok2->strAt(-1) == "&", tok2->varId(), mSettings.library, nullptr)) assignVar(usage, tok2->varId()); } } diff --git a/lib/checkio.cpp b/lib/checkio.cpp index c753dd80739..3d82bdb796a 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -875,7 +875,7 @@ void CheckIOImpl::checkFormatString(const Token * const tok, // Perform type checks ArgumentInfo argInfo(argListTok, mSettings, mTokenizer->isCPP()); - if ((argInfo.typeToken && !argInfo.isLibraryType(mSettings)) || *i == ']') { + if ((argInfo.typeToken && !argInfo.isLibraryType(mSettings.library)) || *i == ']') { if (scan) { std::string specifier; bool done = false; @@ -1877,9 +1877,9 @@ bool CheckIOImpl::ArgumentInfo::isKnownType() const return typeToken->isStandardType() || Token::Match(typeToken, "std :: string|wstring"); } -bool CheckIOImpl::ArgumentInfo::isLibraryType(const Settings &settings) const +bool CheckIOImpl::ArgumentInfo::isLibraryType(const Library &library) const { - return typeToken && typeToken->isStandardType() && settings.library.podtype(typeToken->str()); + return typeToken && typeToken->isStandardType() && library.podtype(typeToken->str()); } void CheckIOImpl::wrongPrintfScanfArgumentsError(const Token* tok, diff --git a/lib/checkio.h b/lib/checkio.h index ae0ea242dab..06c6d8d973b 100644 --- a/lib/checkio.h +++ b/lib/checkio.h @@ -35,6 +35,7 @@ class Token; class Variable; class ErrorLogger; class Tokenizer; +class Library; enum class Severity : std::uint8_t; /// @addtogroup Checks @@ -101,7 +102,7 @@ class CPPCHECKLIB CheckIOImpl : public CheckImpl { bool isKnownType() const; bool isStdVectorOrString(); bool isStdContainer(const Token *tok); - bool isLibraryType(const Settings &settings) const; + bool isLibraryType(const Library &library) const; const Variable* variableInfo{}; const Token* typeToken{}; diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 9049d56e7ff..e8271f9eed0 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -267,7 +267,7 @@ static const Token * isFunctionCall(const Token * nameToken) return nullptr; } -static const Token* getOutparamAllocation(const Token* tok, const Settings& settings) +static const Token* getOutparamAllocation(const Token* tok, const Library& library) { if (!tok) return nullptr; @@ -275,16 +275,16 @@ static const Token* getOutparamAllocation(const Token* tok, const Settings& sett const Token* ftok = getTokenArgumentFunction(tok, argn); if (!ftok) return nullptr; - if (const Library::AllocFunc* allocFunc = settings.library.getAllocFuncInfo(ftok)) { + if (const Library::AllocFunc* allocFunc = library.getAllocFuncInfo(ftok)) { if (allocFunc->arg == argn + 1) return ftok; } return nullptr; } -static const Token* getReturnValueFromOutparamAlloc(const Token* alloc, const Settings& settings) +static const Token* getReturnValueFromOutparamAlloc(const Token* alloc, const Library& library) { - if (const Token* ftok = getOutparamAllocation(alloc, settings)) { + if (const Token* ftok = getOutparamAllocation(alloc, library)) { if (Token::simpleMatch(ftok->astParent()->astParent(), "=")) return ftok->next()->astParent()->astOperand1(); } @@ -623,7 +623,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken, if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair& info) { if (info.second.status != VarInfo::ALLOC) return false; - const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, mSettings); + const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, mSettings.library); return ret && vartok && ret->varId() && ret->varId() == vartok->varId(); })) { varInfo1.clear(); @@ -896,7 +896,7 @@ const Token * CheckLeakAutoVarImpl::checkTokenInsideExpression(const Token * con if (var != varInfo.alloctype.end()) { bool unknown = false; if (var->second.status == VarInfo::DEALLOC && tok->valueType() && tok->valueType()->pointer && - CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings, /*checkNullArg*/ false) && !unknown) { + CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings.library, /*checkNullArg*/ false) && !unknown) { deallocUseError(tok, tok->str()); } else if (Token::simpleMatch(tok->tokAt(-2), "= &")) { varInfo.erase(tok->varId()); @@ -1232,7 +1232,7 @@ void CheckLeakAutoVarImpl::ret(const Token *tok, VarInfo &varInfo, const bool is // don't warn when returning after checking return value of outparam allocation const Token* outparamFunc{}; if ((tok->scope()->type == ScopeType::eIf || tok->scope()->type== ScopeType::eElse) && - (outparamFunc = getOutparamAllocation(it->second.allocTok, mSettings))) { + (outparamFunc = getOutparamAllocation(it->second.allocTok, mSettings.library))) { const Scope* scope = tok->scope(); if (scope->type == ScopeType::eElse) { scope = scope->bodyStart->tokAt(-2)->scope(); diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index ac56f19eb09..5c2e64e9a6c 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -130,10 +130,10 @@ namespace { bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown) const { - return isPointerDeRef(tok, unknown, mSettings); + return isPointerDeRef(tok, unknown, mSettings.library); } -bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings, bool checkNullArg) +bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const Library &library, bool checkNullArg) { unknown = false; @@ -146,7 +146,7 @@ bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const ftok = ftok->previous(); } if (ftok && ftok->previous()) { - const std::list varlist = CheckNullPointerImpl::parseFunctionCall(*ftok->previous(), settings.library, checkNullArg); + const std::list varlist = CheckNullPointerImpl::parseFunctionCall(*ftok->previous(), library, checkNullArg); if (std::find(varlist.cbegin(), varlist.cend(), tok) != varlist.cend()) { return true; } @@ -161,7 +161,7 @@ bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const return false; const bool addressOf = parent->astParent() && parent->astParent()->str() == "&"; if (parent->str() == "." && astIsRHS(tok)) - return isPointerDeRef(parent, unknown, settings); + return isPointerDeRef(parent, unknown, library); const bool firstOperand = parent->astOperand1() == tok; parent = astParentSkipParens(tok); if (!parent) @@ -298,7 +298,7 @@ void CheckNullPointerImpl::nullPointerByDeRefAndCheck() // Pointer dereference. bool unknown = false; - if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings)) { + if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings.library)) { if (unknown) nullPointerError(tok, tok->expressionString(), value, true); continue; @@ -578,7 +578,7 @@ static bool isUnsafeUsage(const Settings &settings, const Token *vartok, CTU::Fi { (void)value; bool unknown = false; - return CheckNullPointerImpl::isPointerDeRef(vartok, unknown, settings); + return CheckNullPointerImpl::isPointerDeRef(vartok, unknown, settings.library); } // a Clang-built executable will crash when using the anonymous MyFileInfo later on - so put it in a unique namespace for now diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index bc494dad70f..ed6a617d81a 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -92,7 +92,7 @@ class CPPCHECKLIB CheckNullPointerImpl : public CheckImpl { */ bool isPointerDeRef(const Token *tok, bool &unknown) const; - static bool isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings, bool checkNullArg = true); + static bool isPointerDeRef(const Token *tok, bool &unknown, const Library &library, bool checkNullArg = true); /** * @brief parse a function call and extract information about variable usage diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 9dee8df7810..51124c45d1c 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1793,7 +1793,7 @@ void CheckOtherImpl::checkConstVariable() continue; } else if (const Token* ftok = getTokenArgumentFunction(tok, argn)) { bool inconclusive{}; - if (var->valueType() && !isVariableChangedByFunctionCall(ftok, var->valueType()->pointer, var->declarationId(), mSettings, &inconclusive) && !inconclusive) + if (var->valueType() && !isVariableChangedByFunctionCall(ftok, var->valueType()->pointer, var->declarationId(), mSettings.library, &inconclusive) && !inconclusive) continue; } usedInAssignment = true; @@ -1989,7 +1989,7 @@ void CheckOtherImpl::checkConstPointer() continue; else if (const Token* ftok = getTokenArgumentFunction(parent, argn)) { bool inconclusive{}; - if (!isVariableChangedByFunctionCall(ftok->next(), vt->pointer, var->declarationId(), mSettings, &inconclusive) && !inconclusive) + if (!isVariableChangedByFunctionCall(ftok->next(), vt->pointer, var->declarationId(), mSettings.library, &inconclusive) && !inconclusive) continue; } } else { @@ -2014,7 +2014,7 @@ void CheckOtherImpl::checkConstPointer() const Variable* argVar = ftok->function()->getArgumentVar(argn); if (argVar && argVar->valueType() && argVar->valueType()->isConst(vt->pointer)) { bool inconclusive{}; - if (!isVariableChangedByFunctionCall(ftok, vt->pointer, var->declarationId(), mSettings, &inconclusive) && !inconclusive) + if (!isVariableChangedByFunctionCall(ftok, vt->pointer, var->declarationId(), mSettings.library, &inconclusive) && !inconclusive) continue; } } @@ -3981,7 +3981,7 @@ void CheckOtherImpl::checkAccessOfMovedVariable() if (usage == ExprUsage::Used) accessOfMoved = true; if (usage == ExprUsage::PassedByReference) - accessOfMoved = !isVariableChangedByFunctionCall(tok, 0, mSettings, &inconclusive); + accessOfMoved = !isVariableChangedByFunctionCall(tok, 0, mSettings.library, &inconclusive); else if (usage == ExprUsage::Inconclusive) inconclusive = true; } diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 4c3b51ac5db..743ac8a3cb4 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2552,7 +2552,7 @@ void CheckStlImpl::checkDereferenceInvalidIterator2() emptyAdvance = tok->astParent(); } } - if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings) && !isInvalidIterator && !emptyAdvance) { + if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings.library) && !isInvalidIterator && !emptyAdvance) { if (!unknown) continue; inconclusive = true; @@ -2895,7 +2895,7 @@ namespace { int n = 1 + (astIsPointer(tok) ? 1 : 0); for (int i = 0; i < n; i++) { bool inconclusive = false; - if (isVariableChangedByFunctionCall(tok, i, mSettings, &inconclusive)) + if (isVariableChangedByFunctionCall(tok, i, mSettings.library, &inconclusive)) return true; if (inconclusive) return true; diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 6bc2a86b8a5..d05ea3fbd28 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1664,7 +1664,7 @@ void CheckUninitVarImpl::valueFlowUninit() if (yield != Library::Container::Yield::AT_INDEX && yield != Library::Container::Yield::ITEM) continue; } - const bool deref = CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings); + const bool deref = CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings.library); uninitderef = deref && v->indirect == 0; const bool isleaf = isLeafDot(tok) || uninitderef; if (!isleaf && Token::Match(tok->astParent(), ". %name%") && @@ -1681,7 +1681,7 @@ void CheckUninitVarImpl::valueFlowUninit() isVariableChanged(tok, v->indirect, mSettings)) continue; bool inconclusive = false; - if (isVariableChangedByFunctionCall(tok, v->indirect, mSettings, &inconclusive) || inconclusive) + if (isVariableChangedByFunctionCall(tok, v->indirect, mSettings.library, &inconclusive) || inconclusive) continue; } uninitvarError(tok, *v); diff --git a/lib/checkunusedfunctions.cpp b/lib/checkunusedfunctions.cpp index 5965de1aada..4177a13a013 100644 --- a/lib/checkunusedfunctions.cpp +++ b/lib/checkunusedfunctions.cpp @@ -65,11 +65,11 @@ static bool isRecursiveCall(const Token* ftok) return ftok->function() && ftok->function() == Scope::nestedInFunction(ftok->scope()); } -void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Settings &settings) +void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Library &library) { const char * const FileName = tokenizer.list.getFiles().front().c_str(); - const bool doMarkup = settings.library.markupFile(FileName); + const bool doMarkup = library.markupFile(FileName); // Function declarations.. if (!doMarkup) { @@ -139,8 +139,8 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Setting lambdaEndToken = findLambdaEndToken(tok); // parsing of library code to find called functions - if (settings.library.isexecutableblock(FileName, tok->str())) { - const Token * markupVarToken = tok->tokAt(settings.library.blockstartoffset(FileName)); + if (library.isexecutableblock(FileName, tok->str())) { + const Token * markupVarToken = tok->tokAt(library.blockstartoffset(FileName)); // not found if (!markupVarToken) continue; @@ -148,12 +148,12 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Setting bool start = true; // find all function calls in library code (starts with '(', not if or while etc) while ((scope || start) && markupVarToken) { - if (markupVarToken->str() == settings.library.blockstart(FileName)) { + if (markupVarToken->str() == library.blockstart(FileName)) { scope++; start = false; - } else if (markupVarToken->str() == settings.library.blockend(FileName)) + } else if (markupVarToken->str() == library.blockend(FileName)) scope--; - else if (!settings.library.iskeyword(FileName, markupVarToken->str())) { + else if (!library.iskeyword(FileName, markupVarToken->str())) { mFunctionCalls.insert(markupVarToken->str()); if (mFunctions.find(markupVarToken->str()) != mFunctions.end()) mFunctions[markupVarToken->str()].usedOtherFile = true; @@ -171,10 +171,10 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Setting } if (!doMarkup // only check source files - && settings.library.isexporter(tok->str()) && tok->next() != nullptr) { + && library.isexporter(tok->str()) && tok->next() != nullptr) { const Token * propToken = tok->next(); while (propToken && propToken->str() != ")") { - if (settings.library.isexportedprefix(tok->str(), propToken->str())) { + if (library.isexportedprefix(tok->str(), propToken->str())) { const Token* nextPropToken = propToken->next(); const std::string& value = nextPropToken->str(); if (mFunctions.find(value) != mFunctions.end()) { @@ -182,7 +182,7 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Setting } mFunctionCalls.insert(value); } - if (settings.library.isexportedsuffix(tok->str(), propToken->str())) { + if (library.isexportedsuffix(tok->str(), propToken->str())) { const Token* prevPropToken = propToken->previous(); const std::string& value = prevPropToken->str(); if (value != ")" && mFunctions.find(value) != mFunctions.end()) { @@ -194,7 +194,7 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Setting } } - if (doMarkup && settings.library.isimporter(FileName, tok->str()) && tok->next()) { + if (doMarkup && library.isimporter(FileName, tok->str()) && tok->next()) { const Token * propToken = tok->next(); if (propToken->next()) { propToken = propToken->next(); @@ -210,8 +210,8 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const Setting } } - if (settings.library.isreflection(tok->str())) { - const int argIndex = settings.library.reflectionArgument(tok->str()); + if (library.isreflection(tok->str())) { + const int argIndex = library.reflectionArgument(tok->str()); if (argIndex >= 0) { const Token * funcToken = tok->next(); int index = 0; @@ -366,7 +366,7 @@ void CheckUnusedFunctions::staticFunctionError(ErrorLogger& errorLogger, errorLogger.reportErr(errmsg); \ } while (false) -bool CheckUnusedFunctions::check(const Settings& settings, ErrorLogger& errorLogger) const +bool CheckUnusedFunctions::check(const Library& library, ErrorLogger& errorLogger) const { logChecker("CheckUnusedFunctions::check"); // unusedFunction @@ -379,7 +379,7 @@ bool CheckUnusedFunctions::check(const Settings& settings, ErrorLogger& errorLog const FunctionUsage &func = it->second; if (func.usedOtherFile || func.filename.empty()) continue; - if (settings.library.isentrypoint(it->first)) + if (library.isentrypoint(it->first)) continue; if (!func.usedSameFile) { if (isOperatorFunction(it->first)) diff --git a/lib/checkunusedfunctions.h b/lib/checkunusedfunctions.h index 5c5b369c194..1b560cfb7cb 100644 --- a/lib/checkunusedfunctions.h +++ b/lib/checkunusedfunctions.h @@ -33,6 +33,7 @@ class ErrorLogger; class Function; class Settings; class Tokenizer; +class Library; /** @brief Check for functions never called */ /// @{ @@ -44,7 +45,7 @@ class CPPCHECKLIB CheckUnusedFunctions { // Parse current tokens and determine.. // * Check what functions are used // * What functions are declared - void parseTokens(const Tokenizer &tokenizer, const Settings &settings); + void parseTokens(const Tokenizer &tokenizer, const Library &library); std::string analyzerInfo(const Tokenizer &tokenizer) const; @@ -56,7 +57,7 @@ class CPPCHECKLIB CheckUnusedFunctions { } // Return true if an error is reported. - bool check(const Settings& settings, ErrorLogger& errorLogger) const; + bool check(const Library& library, ErrorLogger& errorLogger) const; void updateFunctionData(const CheckUnusedFunctions& checkUnusedFunctions); diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 9a3e2e2a053..50f7fa36e80 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -977,7 +977,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str tokenlist.createTokens(std::move(tokens)); // this is not a real source file - we just want to tokenize it. treat it as C anyways as the language needs to be determined. Tokenizer tokenizer(std::move(tokenlist), mErrorLogger); - mUnusedFunctionsCheck->parseTokens(tokenizer, mSettings); + mUnusedFunctionsCheck->parseTokens(tokenizer, mSettings.library); if (analyzerInformation) { mLogger->setAnalyzerInfo(nullptr); @@ -1358,10 +1358,10 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation } if (mSettings.checks.isEnabled(Checks::unusedFunction) && !mSettings.buildDir.empty()) { - unusedFunctionsChecker.parseTokens(tokenizer, mSettings); + unusedFunctionsChecker.parseTokens(tokenizer, mSettings.library); } if (mUnusedFunctionsCheck && mSettings.useSingleJob() && mSettings.buildDir.empty()) { - mUnusedFunctionsCheck->parseTokens(tokenizer, mSettings); + mUnusedFunctionsCheck->parseTokens(tokenizer, mSettings.library); } if (mSettings.clang) { @@ -1830,7 +1830,7 @@ bool CppCheck::analyseWholeProgram() } if (mUnusedFunctionsCheck) - errors |= mUnusedFunctionsCheck->check(mSettings, mErrorLogger); + errors |= mUnusedFunctionsCheck->check(mSettings.library, mErrorLogger); return errors && (mLogger->exitcode() > 0); } @@ -1841,7 +1841,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st CheckUnusedFunctions::analyseWholeProgram(mSettings, mErrorLogger, buildDir); if (mUnusedFunctionsCheck) - mUnusedFunctionsCheck->check(mSettings, mErrorLogger); + mUnusedFunctionsCheck->check(mSettings.library, mErrorLogger); if (Settings::unusedFunctionOnly()) return mLogger->exitcode(); diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 7d25166bf99..ef81fc772ac 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -6183,7 +6183,7 @@ static bool isContainerSizeChangedByFunction(const Token* tok, } bool inconclusive = false; - const bool isChanged = isVariableChangedByFunctionCall(tok, indirect, settings, &inconclusive); + const bool isChanged = isVariableChangedByFunctionCall(tok, indirect, settings.library, &inconclusive); return (isChanged || inconclusive); } @@ -6850,17 +6850,17 @@ static void valueFlowContainerSize(const TokenList& tokenlist, } else if (tok->str() == "+=" && astIsContainer(tok->astOperand1())) { const Token* containerTok = tok->astOperand1(); const Token* valueTok = tok->astOperand2(); - const MathLib::bigint size = ValueFlow::valueFlowGetStrLength(valueTok, settings); + const MathLib::bigint size = ValueFlow::valueFlowGetStrLength(valueTok, settings.library); forwardMinimumContainerSize(size, tok, containerTok); } else if (tok->str() == "=" && Token::simpleMatch(tok->astOperand2(), "+") && astIsContainerString(tok)) { const Token* tok2 = tok->astOperand2(); MathLib::bigint size = 0; while (Token::simpleMatch(tok2, "+") && tok2->astOperand2()) { - size += ValueFlow::valueFlowGetStrLength(tok2->astOperand2(), settings); + size += ValueFlow::valueFlowGetStrLength(tok2->astOperand2(), settings.library); tok2 = tok2->astOperand1(); } - size += ValueFlow::valueFlowGetStrLength(tok2, settings); + size += ValueFlow::valueFlowGetStrLength(tok2, settings.library); forwardMinimumContainerSize(size, tok, tok->astOperand1()); } } diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index 10efc6d6f39..44c86cbc2b7 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -222,7 +222,7 @@ struct ValueFlowAnalyzer : Analyzer { return Action::Read; } bool inconclusive = false; - if (isVariableChangedByFunctionCall(tok, getIndirect(tok), getSettings(), &inconclusive)) + if (isVariableChangedByFunctionCall(tok, getIndirect(tok), getSettings().library, &inconclusive)) return Action::Read | Action::Invalid; if (inconclusive) return Action::Read | Action::Inconclusive; @@ -1569,7 +1569,7 @@ struct ContainerExpressionAnalyzer : ExpressionAnalyzer { case Library::Container::Action::APPEND: { std::vector args = getArguments(tok->astParent()->tokAt(2)); if (args.size() == 1) // TODO: handle overloads - n = ValueFlow::valueFlowGetStrLength(tok->astParent()->tokAt(3), settings); + n = ValueFlow::valueFlowGetStrLength(tok->astParent()->tokAt(3), settings.library); if (n == 0) // TODO: handle known empty append val->setPossible(); break; diff --git a/lib/vf_common.cpp b/lib/vf_common.cpp index b4bd756d05e..ef48423f38a 100644 --- a/lib/vf_common.cpp +++ b/lib/vf_common.cpp @@ -398,7 +398,7 @@ namespace ValueFlow v.debugPath.emplace_back(tok, std::move(s)); } - MathLib::bigint valueFlowGetStrLength(const Token* tok, const Settings& settings) + MathLib::bigint valueFlowGetStrLength(const Token* tok, const Library& library) { if (tok->tokType() == Token::eString) return Token::getStrLength(tok); @@ -408,10 +408,10 @@ namespace ValueFlow return v->intvalue; if (const Value* v = tok->getKnownValue(Value::ValueType::TOK)) { if (v->tokvalue != tok) - return valueFlowGetStrLength(v->tokvalue, settings); + return valueFlowGetStrLength(v->tokvalue, library); } - if (const Token* cont = settings.library.getContainerFromYield(tok, Library::Container::Yield::BUFFER_NT)) - return valueFlowGetStrLength(cont, settings); + if (const Token* cont = library.getContainerFromYield(tok, Library::Container::Yield::BUFFER_NT)) + return valueFlowGetStrLength(cont, library); return 0; } } diff --git a/lib/vf_common.h b/lib/vf_common.h index 9859955cbfe..aca438a0dff 100644 --- a/lib/vf_common.h +++ b/lib/vf_common.h @@ -30,6 +30,7 @@ class Token; class Settings; class Platform; +class Library; namespace ValueFlow { @@ -53,7 +54,7 @@ namespace ValueFlow const Token* tok, SourceLocation local = SourceLocation::current()); - MathLib::bigint valueFlowGetStrLength(const Token* tok, const Settings& settings); + MathLib::bigint valueFlowGetStrLength(const Token* tok, const Library& library); } #endif // vfCommonH diff --git a/test/testastutils.cpp b/test/testastutils.cpp index 904ea92b466..6a6e0624587 100644 --- a/test/testastutils.cpp +++ b/test/testastutils.cpp @@ -259,7 +259,7 @@ class TestAstUtils : public TestFixture { const Token * const argtok = Token::findmatch(tokenizer.tokens(), pattern); ASSERT_LOC(argtok, file, line); int indirect = (argtok->variable() && argtok->variable()->isArray()); - return (isVariableChangedByFunctionCall)(argtok, indirect, settingsDefault, inconclusive); + return (isVariableChangedByFunctionCall)(argtok, indirect, settingsDefault.library, inconclusive); } void isVariableChangedByFunctionCallTest() { diff --git a/test/testunusedfunctions.cpp b/test/testunusedfunctions.cpp index 3e78b119012..938a1394394 100644 --- a/test/testunusedfunctions.cpp +++ b/test/testunusedfunctions.cpp @@ -111,8 +111,8 @@ class TestUnusedFunctions : public TestFixture { // Check for unused functions.. CheckUnusedFunctions checkUnusedFunctions; - checkUnusedFunctions.parseTokens(tokenizer, settings1); - (checkUnusedFunctions.check)(settings1, *this); // TODO: check result + checkUnusedFunctions.parseTokens(tokenizer, settings1.library); + (checkUnusedFunctions.check)(settings1.library, *this); // TODO: check result } // TODO: get rid of this @@ -123,8 +123,8 @@ class TestUnusedFunctions : public TestFixture { // Check for unused functions.. CheckUnusedFunctions checkUnusedFunctions; - checkUnusedFunctions.parseTokens(tokenizer, settings); - (checkUnusedFunctions.check)(settings, *this); // TODO: check result + checkUnusedFunctions.parseTokens(tokenizer, settings.library); + (checkUnusedFunctions.check)(settings.library, *this); // TODO: check result } void incondition() { @@ -602,11 +602,11 @@ class TestUnusedFunctions : public TestFixture { SimpleTokenizer tokenizer{settings, *this, fname}; ASSERT(tokenizer.tokenize(code)); - c.parseTokens(tokenizer, settings); + c.parseTokens(tokenizer, settings.library); } // Check for unused functions.. - (c.check)(settings, *this); // TODO: check result + (c.check)(settings.library, *this); // TODO: check result ASSERT_EQUALS("[test1.cpp:1:13]: (style) The function 'f' is never used. [unusedFunction]\n", errout_str()); } From e039c081179b135089469c40ba78ef9d9b37c523 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 3 Jul 2026 18:45:31 +0200 Subject: [PATCH 118/171] Fix #14887 FP objectIndex with pointer to array member (#8689) --- lib/checkbufferoverrun.cpp | 8 ++++++-- test/testbufferoverrun.cpp | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 81b6653d348..c72db22a68c 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -1088,8 +1088,12 @@ void CheckBufferOverrunImpl::objectIndex() for (const ValueFlow::Value& v:values) { if (v.lifetimeKind != ValueFlow::Value::LifetimeKind::Address && v.lifetimeKind != ValueFlow::Value::LifetimeKind::Object) continue; - const Token* varTok = nextAfterAstRightmostLeaf(v.tokvalue->astParent()); - varTok = varTok ? varTok->previous() : nullptr; + const Token* varTok = v.tokvalue; + if (Token::simpleMatch(varTok->astParent(), ".")) { + varTok = varTok->astParent(); + while (Token::simpleMatch(varTok, ".")) + varTok = varTok->astOperand2(); + } const Variable *var = varTok ? varTok->variable() : nullptr; if (!var) continue; diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index e51a1708389..387a0eeea8a 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -5860,6 +5860,26 @@ class TestBufferOverrun : public TestFixture { ASSERT_EQUALS("[test.cpp:7:20] -> [test.cpp:9:12]: (error) The address of variable 's.a' is accessed at non-zero index. [objectIndex]\n" "[test.cpp:7:20] -> [test.cpp:10:12]: (error) The address of variable 's.a' is accessed at non-zero index. [objectIndex]\n", errout_str()); + + check("const int N = 12;\n" // #14887 + "struct S {\n" + " void f() const;\n" + " int a[N];\n" + "};\n" + "struct T {\n" + " void f() const;\n" + " S s;\n" + "};\n" + "int g(const int* p) { return p[5]; }\n" + "void S::f() const {\n" + " const int* q = a;\n" + " g(q);\n" + "}\n" + "void T::f() const {\n" + " const int* q = s.a;\n" + " g(q);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void checkPipeParameterSize() { // #3521 From bcd74c735e745f7b1bd8d5362e91dd748acbe2b3 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Sat, 4 Jul 2026 06:29:46 -0500 Subject: [PATCH 119/171] Partial fix for 9049: False negative: uninitialized variable with nested ifs (#8680) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes the case for this: ```cpp unsigned int g(); void f(bool a) { unsigned int dimensions = 0; bool mightBeLarger; if (a) { dimensions = g(); if (dimensions >= 1) mightBeLarger = false; } else { mightBeLarger = false; } if (dimensions == 1) return; if (!mightBeLarger) {} } ``` Which doesnt use a compund condition `dimensions >= 1 && b)` and it also requires complete variables and functions. The compund condition could be handled in the future by forking within the condition, so `if(a && b) { ... }` can be treated as `if(a) { if(b) { ... }}`. Here is a summary of the changes: 1. Fork-based condition handling — lib/forwardanalyzer.cpp (the largest change) - When a condition can't be resolved, the traversal now forks: the then-branch is walked by a separate ForwardTraversal, in analyze-only mode when the value can't actually flow into it (opaque/correlated conditions like if (f(x))), so the branch's effect is tracked but nothing is reported there. - Branch breaks are deferred: if the else kills the value on the main path, the then-fork can still carry it forward. - Escapes the traversal didn't flag (e.g. unknown noreturn calls) are detected via isEscapeScope, and exit/abort are now recognized as escape functions (lib/astutils.cpp). 2. Program-state anchoring at block boundaries — lib/vf_analyzers.cpp + lib/analyzer.h - assume() now anchors the assumed state at the block's end (not the condition) when control is leaving an already-traversed branch. This keeps an assumption on a variable modified inside the block (e.g. a nested if narrowing a value computed there) from being discarded as "modified" once control leaves the block. - New Assume::Pending flag marks the pre-traversal assume (branch walked separately) so it doesn't record premature boundary state. - ProgramMemoryState::assume gained an optional origin parameter so the anchor point can be overridden. 3. vars-aware execute — lib/programmemory.cpp / .h - execute/conditionIsTrue/conditionIsFalse now take the tracked values (vars). A tracked value is the authoritative current value of its expression (returned and written back into the program memory), and any cached compound that depends on a tracked value is re-evaluated instead of served stale (getTrackedValue / dependsOnTrackedValue). - The per-assignment substitution was removed from fillProgramMemoryFromAssignments and now lives entirely in execute so it can be used for all executions. --------- Co-authored-by: Your Name --- lib/analyzer.h | 10 +- lib/astutils.cpp | 2 + lib/forwardanalyzer.cpp | 225 ++++++++++++++++++++----------------- lib/programmemory.cpp | 209 +++++++++++++++++++++++----------- lib/programmemory.h | 38 ++++++- lib/settings.cpp | 4 + lib/settings.h | 9 ++ lib/vf_analyzers.cpp | 61 ++++++---- test/testautovariables.cpp | 4 +- test/testcondition.cpp | 24 ++++ test/testnullpointer.cpp | 5 + test/testother.cpp | 5 +- test/teststl.cpp | 4 +- test/testuninitvar.cpp | 46 +++++++- test/testvalueflow.cpp | 75 ++++++++++++- 15 files changed, 514 insertions(+), 207 deletions(-) diff --git a/lib/analyzer.h b/lib/analyzer.h index a4546eb7dc4..9b87310530f 100644 --- a/lib/analyzer.h +++ b/lib/analyzer.h @@ -153,9 +153,13 @@ struct Analyzer { struct Assume { enum Flags : std::uint8_t { None = 0, - Quiet = (1 << 0), - Absolute = (1 << 1), - ContainerEmpty = (1 << 2), + Quiet = (1u << 0), + Absolute = (1u << 1), + ContainerEmpty = (1u << 2), + // The branch this condition guards is not traversed yet (a separate path walks it), so + // the assume must not record the program state at the branch boundaries - they would be + // premature. When unset, the branch has been traversed and control is leaving it. + Pending = (1u << 3), }; }; diff --git a/lib/astutils.cpp b/lib/astutils.cpp index a6fe2573f08..c433036cfcc 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2230,6 +2230,8 @@ bool isEscapeFunction(const Token* ftok, const Library& library) { if (!Token::Match(ftok, "%name% (")) return false; + if (Token::Match(ftok, "exit|abort")) + return true; const Function* function = ftok->function(); if (function) { if (function->isEscapeFunction()) diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 670db0b1090..727c64b076d 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -59,6 +59,10 @@ namespace { Analyzer::Terminate terminate = Analyzer::Terminate::None; std::vector loopEnds; int branchCount = 0; + // Nested condition-fork depth on this lineage (copied by fork()); bounds the fan-out. + int forkDepth = 0; + // Total forks of the traversal (shared via the fork() copy); backstop past the depth bound. + std::shared_ptr forkBudget = std::make_shared(0); Progress Break(Analyzer::Terminate t = Analyzer::Terminate::None) { if ((!analyzeOnly || analyzeTerminate) && t != Analyzer::Terminate::None) @@ -73,7 +77,6 @@ namespace { bool check = false; bool escape = false; bool escapeUnknown = false; - bool active = false; bool isEscape() const { return escape || escapeUnknown; } @@ -89,6 +92,9 @@ namespace { bool isDead() const { return action.isModified() || action.isInconclusive() || isEscape(); } + bool hasGoto() const { + return endBlock ? ForwardTraversal::hasGoto(endBlock) : false; + } }; bool stopUpdates() { @@ -348,18 +354,6 @@ namespace { return Token::findmatch(endBlock->link(), "goto|break", endBlock); } - bool hasInnerReturnScope(const Token* start, const Token* end) const { - for (const Token* tok=start; tok != end; tok = tok->previous()) { - if (Token::simpleMatch(tok, "}")) { - const Token* ftok = nullptr; - const bool r = isReturnScope(tok, settings.library, &ftok); - if (r) - return true; - } - } - return false; - } - bool isEscapeScope(const Token* endBlock, bool& unknown) const { const Token* ftok = nullptr; const bool r = isReturnScope(endBlock, settings.library, &ftok); @@ -383,30 +377,34 @@ namespace { return a; } - bool checkBranch(Branch& branch) const { - Analyzer::Action a = analyzeScope(branch.endBlock); - branch.action = a; - std::vector ft1 = tryForkUpdateScope(branch.endBlock, a.isModified()); - const bool bail = hasGoto(branch.endBlock); - if (!a.isModified() && !bail) { - if (ft1.empty()) { - // Traverse into the branch to see if there is a conditional escape - if (!branch.escape && hasInnerReturnScope(branch.endBlock->previous(), branch.endBlock->link())) { - ForwardTraversal ft2 = fork(true); - ft2.updateScope(branch.endBlock); - if (ft2.terminate == Analyzer::Terminate::Escape) { - branch.escape = true; - branch.escapeUnknown = false; - } - } - } else { - if (ft1.front().terminate == Analyzer::Terminate::Escape) { - branch.escape = true; - branch.escapeUnknown = false; - } + Progress updateBranch(Branch& branch, int depth) + { + // Save and reset actions + Analyzer::Action prevActions = actions; + actions = Analyzer::Action::None; + Progress p = updateRange(branch.endBlock->link(), branch.endBlock, depth); + branch.action |= actions; + // Restore actions + actions |= prevActions; + + if (terminate == Analyzer::Terminate::Escape) { + branch.escape = true; + // The traversal followed an escaping path, but if the scope does not structurally + // always escape then another path (e.g. a modified fork) falls through, so the escape + // is only conditional - keep isModified() meaningful by not treating it as conclusive. + bool structuralUnknown = false; + const bool structuralEscape = isEscapeScope(branch.endBlock, structuralUnknown); + branch.escapeUnknown = !structuralEscape || structuralUnknown; + } else { + // Detect an escape the traversal did not flag (e.g. an unknown noreturn call); + // escapeUnknown reports a possible (unknown) escape. + branch.escape = isEscapeScope(branch.endBlock, branch.escapeUnknown); + if (terminate != Analyzer::Terminate::None && terminate != Analyzer::Terminate::Modified) { + branch.action |= analyzeScope(branch.endBlock); } } - return bail; + + return p; } bool reentersLoop(Token* endBlock, const Token* condTok, const Token* stepTok) const { @@ -529,14 +527,12 @@ namespace { forkContinue = false; } - if (allAnalysis.isModified() || !forkContinue) { - // TODO: Don't bail on missing condition - if (!condTok) - return Break(Analyzer::Terminate::Bail); - if (analyzer->isConditional() && stopUpdates()) - return Break(Analyzer::Terminate::Conditional); - analyzer->assume(condTok, false); - } + // TODO: Don't bail on missing condition + if (!condTok) + return Break(Analyzer::Terminate::Bail); + if (analyzer->isConditional() && stopUpdates()) + return Break(Analyzer::Terminate::Conditional); + analyzer->assume(condTok, false); if (forkContinue) { for (ForwardTraversal& ft : ftv) { if (!ft.actions.isIncremental()) @@ -646,11 +642,20 @@ namespace { const bool inElse = scope->type == ScopeType::eElse; const bool inDoWhile = scope->type == ScopeType::eDo; const bool inLoop = contains({ScopeType::eDo, ScopeType::eFor, ScopeType::eWhile}, scope->type); + const bool hasElse = Token::simpleMatch(tok, "} else {"); Token* condTok = getCondTokFromEnd(tok); if (!condTok) return Break(); + // When the 'else' branch escapes (e.g. returns), control can only continue + // here via the 'then' branch, so the value established there is still + // definite - keep it known instead of lowering to possible. + bool elseEscape = false; + if (!inLoop && !inElse && hasElse) { + bool unknownEscape = false; + elseEscape = isEscapeScope(tok->linkAt(2), unknownEscape); + } if (!condTok->hasKnownIntValue() || inLoop) { - if (!analyzer->lowerToPossible()) + if (!elseEscape && !analyzer->lowerToPossible()) return Break(Analyzer::Terminate::Bail); } else if (condTok->getKnownIntValue() == inElse) { return Break(); @@ -675,7 +680,7 @@ namespace { } analyzer->assume(condTok, !inElse, Analyzer::Assume::Quiet); assert(!inDoWhile || Token::simpleMatch(tok, "} while (")); - if (Token::simpleMatch(tok, "} else {") || inDoWhile) + if (hasElse || inDoWhile) tok = tok->linkAt(2); } else if (contains({ScopeType::eTry, ScopeType::eCatch}, scope->type)) { if (!analyzer->lowerToPossible()) @@ -731,71 +736,83 @@ namespace { if (!thenBranch.check && !elseBranch.check && stopOnCondition(condTok) && stopUpdates()) return Break(Analyzer::Terminate::Conditional); const bool hasElse = Token::simpleMatch(endBlock, "} else {"); - bool bail = false; - - // Traverse then block - thenBranch.escape = isEscapeScope(endBlock, thenBranch.escapeUnknown); + tok = hasElse ? endBlock->linkAt(2) : endBlock; if (thenBranch.check) { - thenBranch.active = true; - if (updateScope(endBlock, depth - 1) == Progress::Break) + // The condition is only "known" because of an earlier assumption, so the + // skipped else block could still modify the value -> lower to possible + if (!condTok->hasKnownIntValue() && hasElse && + analyzeScope(elseBranch.endBlock).isModified() && !analyzer->lowerToPossible()) + return Break(Analyzer::Terminate::Bail); + if (updateScope(thenBranch.endBlock, depth - 1) == Progress::Break) + return Break(); + } else if (elseBranch.check) { + // Likewise the skipped then block could still modify the value + if (!condTok->hasKnownIntValue() && analyzeScope(thenBranch.endBlock).isModified() && + !analyzer->lowerToPossible()) + return Break(Analyzer::Terminate::Bail); + if (elseBranch.endBlock && updateScope(elseBranch.endBlock, depth - 1) == Progress::Break) return Break(); - } else if (!elseBranch.check) { - thenBranch.active = true; - if (checkBranch(thenBranch)) - bail = true; - } - // Traverse else block - if (hasElse) { - elseBranch.escape = isEscapeScope(endBlock->linkAt(2), elseBranch.escapeUnknown); - if (elseBranch.check) { - elseBranch.active = true; - const Progress result = updateScope(endBlock->linkAt(2), depth - 1); - if (result == Progress::Break) - return Break(); - } else if (!thenBranch.check) { - elseBranch.active = true; - if (checkBranch(elseBranch)) - bail = true; - } - tok = endBlock->linkAt(2); } else { - tok = endBlock; - } - if (thenBranch.active) + const bool conditional = stopOnCondition(condTok); + // The value only flows into the then-branch when the condition can split + // it; for an opaque or correlated condition (e.g. 'if (f(x))') it does + // not, so fork in analyze-only mode: the branch's effect is still tracked + // but nothing is reported in it. + ForwardTraversal ft = fork(!analyzer->updateScope(thenBranch.endBlock, false)); + // The branch is traversed below, so don't record its boundary state here. + ft.analyzer->assume(condTok, true, Analyzer::Assume::Pending); + Progress pThen = ft.updateBranch(thenBranch, depth - 1); + // Merge the fork's actions so a modification in the then-branch bubbles up + // to the enclosing branch's isModified(). actions |= thenBranch.action; - if (elseBranch.active) - actions |= elseBranch.action; - if (bail) - return Break(Analyzer::Terminate::Bail); - if (thenBranch.isDead() && elseBranch.isDead()) { - if (thenBranch.isModified() && elseBranch.isModified()) - return Break(Analyzer::Terminate::Modified); - if (thenBranch.isConclusiveEscape() && elseBranch.isConclusiveEscape()) - return Break(Analyzer::Terminate::Escape); - return Break(Analyzer::Terminate::Bail); - } - // Conditional return - if (thenBranch.active && thenBranch.isEscape() && !hasElse) { - if (!thenBranch.isConclusiveEscape()) { - if (!analyzer->lowerToInconclusive()) - return Break(Analyzer::Terminate::Bail); - } else if (thenBranch.check) { - return Break(); - } else { - if (stopOnCondition(condTok) && stopUpdates()) - return Break(Analyzer::Terminate::Conditional); - analyzer->assume(condTok, false); + + // Commit the condition as false on the main path only when the then-branch + // is dead. The else block, if any, is traversed separately (Pending); with + // no else the false path continues past the closing brace, so record the + // assumed state there (None). + if (thenBranch.isDead()) + analyzer->assume(condTok, + false, + hasElse ? Analyzer::Assume::Pending : Analyzer::Assume::None); + // The else block is traversed on the main path. If it kills the value + // (modified) the main path stops, but the then-fork may still carry the + // value forward, so defer the break until after the fork continues. + Progress pElse = Progress::Continue; + if (hasElse) + pElse = updateBranch(elseBranch, depth - 1); + if (thenBranch.isDead() || elseBranch.isDead()) { + if (conditional && stopUpdates()) + pElse = Break(Analyzer::Terminate::Conditional); } - } - if (thenBranch.isInconclusive() || elseBranch.isInconclusive()) { - if (!analyzer->lowerToInconclusive()) - return Break(Analyzer::Terminate::Bail); - } else if (thenBranch.isModified() || elseBranch.isModified()) { - if (!hasElse && analyzer->isConditional() && stopUpdates()) - return Break(Analyzer::Terminate::Conditional); - if (!analyzer->lowerToPossible()) + if (thenBranch.isModified() || elseBranch.isModified()) { + if (!ft.analyzer->lowerToPossible()) + pThen = Progress::Break; + if (pElse != Progress::Break && !analyzer->lowerToPossible()) + pElse = Break(Analyzer::Terminate::Bail); + } + if (thenBranch.isInconclusive() || elseBranch.isInconclusive()) { + if (!ft.analyzer->lowerToInconclusive()) + pThen = Progress::Break; + if (pElse != Progress::Break && !analyzer->lowerToInconclusive()) + pElse = Break(Analyzer::Terminate::Bail); + } + if (thenBranch.hasGoto() || elseBranch.hasGoto()) { return Break(Analyzer::Terminate::Bail); - analyzer->assume(condTok, elseBranch.isModified()); + } + // Carry the then-fork forward, unless a limit is hit - then only the linear main + // path continues (no bail). forkDepth bounds nesting, forkBudget total. <0 = off. + assert(forkBudget != nullptr); + const int forkDepthLimit = settings.vfOptions.maxForwardConditionForkDepth; + const int forkBudgetLimit = settings.vfOptions.maxForwardConditionForks; + const bool depthOk = forkDepthLimit < 0 || forkDepth < forkDepthLimit; + const bool budgetOk = forkBudgetLimit < 0 || *forkBudget < forkBudgetLimit; + if (pThen != Progress::Break && !thenBranch.isEscape() && depthOk && budgetOk) { + ++(*forkBudget); + ++ft.forkDepth; + ft.updateRange(thenBranch.endBlock, end, depth - 1); + } + if (pElse == Progress::Break) + return Break(); } } } else if (Token::simpleMatch(tok, "try {")) { diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index b86ca2d8812..013906d00ae 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -262,26 +262,33 @@ ProgramMemory::Map::iterator ProgramMemory::find(nonneg int exprid) return mValues->find(ExprIdToken::create(exprid)); } -static ValueFlow::Value execute(const Token* expr, ProgramMemory& pm, const Settings& settings); - -static bool evaluateCondition(MathLib::bigint r, const Token* condition, ProgramMemory& pm, const Settings& settings) +static ValueFlow::Value execute(const Token* expr, + ProgramMemory& pm, + const Settings& settings, + const ProgramMemory::Map& vars = {}); + +static bool evaluateCondition(MathLib::bigint r, + const Token* condition, + ProgramMemory& pm, + const Settings& settings, + const ProgramMemory::Map& vars = {}) { if (!condition) return false; MathLib::bigint result = 0; bool error = false; - execute(condition, pm, &result, &error, settings); + execute(condition, pm, &result, &error, settings, vars); return !error && result == r; } -bool conditionIsFalse(const Token* condition, ProgramMemory pm, const Settings& settings) +bool conditionIsFalse(const Token* condition, ProgramMemory pm, const Settings& settings, const ProgramMemory::Map& vars) { - return evaluateCondition(0, condition, pm, settings); + return evaluateCondition(0, condition, pm, settings, vars); } -bool conditionIsTrue(const Token* condition, ProgramMemory pm, const Settings& settings) +bool conditionIsTrue(const Token* condition, ProgramMemory pm, const Settings& settings, const ProgramMemory::Map& vars) { - return evaluateCondition(1, condition, pm, settings); + return evaluateCondition(1, condition, pm, settings, vars); } static bool frontIs(const std::vector& v, bool i) @@ -337,7 +344,13 @@ static bool isBasicForLoop(const Token* tok) return true; } -static void programMemoryParseCondition(ProgramMemory& pm, const Token* tok, const Token* endTok, const Settings& settings, bool then) +// findChanged: optional cached findExpressionChanged (see ProgramMemoryState::FindChangedFn). +static void programMemoryParseCondition(ProgramMemory& pm, + const Token* tok, + const Token* endTok, + const Settings& settings, + bool then, + const ProgramMemoryState::FindChangedFn& findChanged = {}) { auto eval = [&](const Token* t) -> std::vector { if (!t) @@ -351,6 +364,10 @@ static void programMemoryParseCondition(ProgramMemory& pm, const Token* tok, con return {result}; return std::vector{}; }; + // Use the cached closure if given, else compute directly. + auto changed = [&](const Token* e, const Token* s, const Token* en) -> const Token* { + return findChanged ? findChanged(e, s, en) : findExpressionChanged(e, s, en, settings); + }; if (Token::Match(tok, "==|>=|<=|<|>|!=")) { ValueFlow::Value truevalue; ValueFlow::Value falsevalue; @@ -361,7 +378,7 @@ static void programMemoryParseCondition(ProgramMemory& pm, const Token* tok, con return; if (!truevalue.isIntValue()) return; - if (endTok && findExpressionChanged(vartok, tok->next(), endTok, settings)) + if (endTok && changed(vartok, tok->next(), endTok)) return; const bool impossible = (tok->str() == "==" && !then) || (tok->str() == "!=" && then); const ValueFlow::Value& v = then ? truevalue : falsevalue; @@ -370,26 +387,26 @@ static void programMemoryParseCondition(ProgramMemory& pm, const Token* tok, con if (containerTok) pm.setContainerSizeValue(containerTok, v.intvalue, !impossible); } else if (Token::simpleMatch(tok, "!")) { - programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, !then); + programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, !then, findChanged); } else if (then && Token::simpleMatch(tok, "&&")) { - programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, then); - programMemoryParseCondition(pm, tok->astOperand2(), endTok, settings, then); + programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, then, findChanged); + programMemoryParseCondition(pm, tok->astOperand2(), endTok, settings, then, findChanged); } else if (!then && Token::simpleMatch(tok, "||")) { - programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, then); - programMemoryParseCondition(pm, tok->astOperand2(), endTok, settings, then); + programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, then, findChanged); + programMemoryParseCondition(pm, tok->astOperand2(), endTok, settings, then, findChanged); } else if (Token::Match(tok, "&&|%oror%")) { std::vector lhs = eval(tok->astOperand1()); std::vector rhs = eval(tok->astOperand2()); if (lhs.empty() || rhs.empty()) { if (frontIs(lhs, !then)) - programMemoryParseCondition(pm, tok->astOperand2(), endTok, settings, then); + programMemoryParseCondition(pm, tok->astOperand2(), endTok, settings, then, findChanged); else if (frontIs(rhs, !then)) - programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, then); + programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, then, findChanged); else pm.setIntValue(tok, 0, then); } } else if (tok && tok->exprId() > 0) { - if (endTok && findExpressionChanged(tok, tok->next(), endTok, settings)) + if (endTok && changed(tok, tok->next(), endTok)) return; pm.setIntValue(tok, 0, then); const Token* containerTok = settings.library.getContainerFromYield(tok, Library::Container::Yield::EMPTY); @@ -398,14 +415,18 @@ static void programMemoryParseCondition(ProgramMemory& pm, const Token* tok, con } } -static void fillProgramMemoryFromConditions(ProgramMemory& pm, const Scope* scope, const Token* endTok, const Settings& settings) +static void fillProgramMemoryFromConditions(ProgramMemory& pm, + const Scope* scope, + const Token* endTok, + const Settings& settings, + const ProgramMemoryState::FindChangedFn& findChanged) { if (!scope) return; if (!scope->isLocal()) return; assert(scope != scope->nestedIn); - fillProgramMemoryFromConditions(pm, scope->nestedIn, endTok, settings); + fillProgramMemoryFromConditions(pm, scope->nestedIn, endTok, settings, findChanged); if (scope->type == ScopeType::eIf || scope->type == ScopeType::eWhile || scope->type == ScopeType::eElse || scope->type == ScopeType::eFor) { const Token* condTok = getCondTokFromEnd(scope->bodyEnd); if (!condTok) @@ -414,13 +435,16 @@ static void fillProgramMemoryFromConditions(ProgramMemory& pm, const Scope* scop bool error = false; execute(condTok, pm, &result, &error, settings); if (error) - programMemoryParseCondition(pm, condTok, endTok, settings, scope->type != ScopeType::eElse); + programMemoryParseCondition(pm, condTok, endTok, settings, scope->type != ScopeType::eElse, findChanged); } } -static void fillProgramMemoryFromConditions(ProgramMemory& pm, const Token* tok, const Settings& settings) +static void fillProgramMemoryFromConditions(ProgramMemory& pm, + const Token* tok, + const Settings& settings, + const ProgramMemoryState::FindChangedFn& findChanged = {}) { - fillProgramMemoryFromConditions(pm, tok->scope(), tok, settings); + fillProgramMemoryFromConditions(pm, tok->scope(), tok, settings, findChanged); } static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok, const Settings& settings, const ProgramMemory& state, const ProgramMemory::Map& vars) @@ -429,22 +453,12 @@ static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok for (const Token *tok2 = tok; tok2; tok2 = tok2->previous()) { if ((Token::simpleMatch(tok2, "=") || Token::Match(tok2->previous(), "%var% (|{")) && tok2->astOperand1() && tok2->astOperand2()) { - bool setvar = false; const Token* vartok = tok2->astOperand1(); - for (const auto& p:vars) { - if (p.first.getExpressionId() != vartok->exprId()) - continue; - if (vartok == tok) - continue; - pm.setValue(vartok, p.second); - setvar = true; - } - if (!setvar) { - if (!pm.hasValue(vartok->exprId())) { - const Token* valuetok = tok2->astOperand2(); - ProgramMemory local = state; - pm.setValue(vartok, execute(valuetok, local, settings)); - } + if (!pm.hasValue(vartok->exprId())) { + const Token* valuetok = tok2->astOperand2(); + ProgramMemory local = state; + // Tracked values are substituted by execute() when the expression is evaluated. + pm.setValue(vartok, execute(valuetok, local, settings, vars)); } } else if (Token::simpleMatch(tok2, ")") && tok2->link() && Token::Match(tok2->link()->previous(), "assert|ASSERT ( !!)")) { @@ -516,7 +530,7 @@ static ProgramMemory getInitialProgramState(const Token* tok, return pm; } -ProgramMemoryState::ProgramMemoryState(const Settings& s) : settings(s) +ProgramMemoryState::ProgramMemoryState(const Settings& s) : settings(s), changedCache(std::make_shared()) {} void ProgramMemoryState::replace(ProgramMemory pm, const Token* origin) @@ -539,7 +553,7 @@ void ProgramMemoryState::addState(const Token* tok, const ProgramMemory::Map& va { ProgramMemory local = state; addVars(local, vars); - fillProgramMemoryFromConditions(local, tok, settings); + fillProgramMemoryFromConditions(local, tok, settings, getCachedFindExpressionChanged(/*skipDeadCode*/ false)); ProgramMemory pm; fillProgramMemoryFromAssignments(pm, tok, settings, local, vars); local.replace(std::move(pm)); @@ -547,44 +561,73 @@ void ProgramMemoryState::addState(const Token* tok, const ProgramMemory::Map& va replace(std::move(local), tok); } -void ProgramMemoryState::assume(const Token* tok, bool b, bool isEmpty) +void ProgramMemoryState::assume(const Token* tok, bool b, bool isEmpty, const Token* origin) { ProgramMemory pm = state; if (isEmpty) pm.setContainerSizeValue(tok, 0, b); else programMemoryParseCondition(pm, tok, nullptr, settings, b); - const Token* origin = tok; - const Token* top = tok->astTop(); - if (Token::Match(top->previous(), "for|while|if (") && !Token::simpleMatch(tok->astParent(), "?")) { - origin = top->link()->next(); - if (!b && origin->link()) { - origin = origin->link(); + if (!origin) { + origin = tok; + const Token* top = tok->astTop(); + if (Token::Match(top->previous(), "for|while|if (") && !Token::simpleMatch(tok->astParent(), "?")) { + origin = top->link()->next(); + if (!b && origin->link()) { + origin = origin->link(); + } } } replace(std::move(pm), origin); } -void ProgramMemoryState::removeModifiedVars(const Token* tok) +ProgramMemoryState::FindChangedFn ProgramMemoryState::getCachedFindExpressionChanged(bool skipDeadCode) const { - const ProgramMemory& pm = state; - auto eval = [&](const Token* cond) -> std::vector { - ProgramMemory pm2 = pm; - auto result = execute(cond, pm2, settings); - if (isTrue(result)) - return {1}; - if (isFalse(result)) - return {0}; - return {}; + // Structural findExpressionChanged() is pure, so memoize it in changedCache (never invalidated). + // skipDeadCode adds the dead-code walk; it evaluates guards against a fixed state snapshot (so every + // variable follows the same path) and memoizes those evals in evalCache for the closure's lifetime. + using EvalCache = std::map>; + const std::shared_ptr cache = changedCache; + const Settings* const sp = &settings; + ProgramMemory snapshot = state; + const std::shared_ptr evalCache = skipDeadCode ? std::make_shared() : nullptr; + return [cache, sp, snapshot, skipDeadCode, evalCache](const Token* expr, + const Token* start, + const Token* end) -> const Token* { + const auto key = std::make_tuple(expr, start, end); + const auto it = cache->find(key); + const Token* modified = (it != cache->end()) + ? it->second + : cache->emplace(key, findExpressionChanged(expr, start, end, *sp)).first->second; + if (!skipDeadCode || !modified) + return modified; + auto eval = [&](const Token* cond) -> std::vector { + const auto cit = evalCache->find(cond); + if (cit != evalCache->end()) + return cit->second; + ProgramMemory pm2 = snapshot; + const auto result = execute(cond, pm2, *sp); + std::vector r; + if (isTrue(result)) + r = {1}; + else if (isFalse(result)) + r = {0}; + return evalCache->emplace(cond, std::move(r)).first->second; + }; + return findExpressionChangedSkipDeadCode(expr, start, end, *sp, eval); }; +} + +void ProgramMemoryState::removeModifiedVars(const Token* tok) +{ + const auto findChanged = getCachedFindExpressionChanged(/*skipDeadCode*/ true); state.erase_if([&](const ExprIdToken& e) { const Token* start = origins[e.getExpressionId()]; const Token* expr = e.tok; - if (!expr || findExpressionChangedSkipDeadCode(expr, start, tok, settings, eval)) { + const bool changed = !expr || findChanged(expr, start, tok); + if (changed) origins.erase(e.getExpressionId()); - return true; - } - return false; + return changed; }); } @@ -1316,6 +1359,9 @@ namespace { struct Executor { ProgramMemory* pm; const Settings& settings; + // Values tracked by the forward/reverse analysis. A tracked value is the authoritative + // current value of its expression and takes precedence over the program memory. + const ProgramMemory::Map* vars = nullptr; int fdepth = 4; int depth = 10; @@ -1324,6 +1370,26 @@ namespace { assert(pm != nullptr); } + // Is the tracked value for this expression available? + const ValueFlow::Value* getTrackedValue(const Token* expr) const + { + if (!vars || expr->exprId() == 0) + return nullptr; + const auto it = vars->find(ExprIdToken::create(expr->exprId())); + return it == vars->end() ? nullptr : &it->second; + } + + // Does the expression read a tracked value? If so, any value cached for it may be stale + // (the tracked value may have changed since), so it must be re-evaluated, not served cached. + bool dependsOnTrackedValue(const Token* expr) const + { + if (!vars || vars->empty()) + return false; + return findAstNode(expr, [&](const Token* tok) { + return getTrackedValue(tok) != nullptr; + }) != nullptr; + } + static ValueFlow::Value unknown() { return ValueFlow::Value::unknown(); } @@ -1622,7 +1688,15 @@ namespace { } return execute(expr->astOperand1()); } - if (expr->exprId() > 0 && pm->hasValue(expr->exprId())) { + // Return the tracked value and write it back when it differs, so later reads see the + // same value (as fillProgramMemoryFromAssignments used to do). + if (const ValueFlow::Value* tracked = getTrackedValue(expr)) { + const ValueFlow::Value* stored = pm->getValue(expr->exprId(), /*impossible*/ true); + if (!stored || *stored != *tracked) + pm->setValue(expr, *tracked); + return *tracked; + } + if (expr->exprId() > 0 && pm->hasValue(expr->exprId()) && !dependsOnTrackedValue(expr)) { ValueFlow::Value result = utils::as_const(*pm).at(expr->exprId()); if (result.isImpossible() && result.isIntValue() && result.intvalue == 0 && isUsedAsBool(expr, settings)) { result.intvalue = !result.intvalue; @@ -1815,9 +1889,13 @@ namespace { }; } // namespace -static ValueFlow::Value execute(const Token* expr, ProgramMemory& pm, const Settings& settings) +static ValueFlow::Value execute(const Token* expr, + ProgramMemory& pm, + const Settings& settings, + const ProgramMemory::Map& vars) { Executor ex{&pm, settings}; + ex.vars = &vars; return ex.execute(expr); } @@ -1907,9 +1985,10 @@ void execute(const Token* expr, ProgramMemory& programMemory, MathLib::bigint* result, bool* error, - const Settings& settings) + const Settings& settings, + const ProgramMemory::Map& vars) { - ValueFlow::Value v = execute(expr, programMemory, settings); + ValueFlow::Value v = execute(expr, programMemory, settings, vars); if (!v.isIntValue() || v.isImpossible()) { if (error) *error = true; diff --git a/lib/programmemory.h b/lib/programmemory.h index ec24c0df59f..de81d0bc901 100644 --- a/lib/programmemory.h +++ b/lib/programmemory.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -161,9 +162,26 @@ struct CPPCHECKLIB ProgramMemory { }; struct ProgramMemoryState { + struct ChangedKeyHash { + std::size_t operator()(const std::tuple& t) const + { + const std::hash h; + std::size_t seed = h(std::get<0>(t)); + seed ^= h(std::get<1>(t)) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= h(std::get<2>(t)) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + return seed; + } + }; + using ChangedCache = + std::unordered_map, const Token*, ChangedKeyHash>; + // The token modifying expr between start and end, or nullptr. + using FindChangedFn = std::function; + ProgramMemory state; std::map origins; const Settings& settings; + // Memoized findExpressionChanged() pre-filter; structural, so never invalidated. + std::shared_ptr changedCache; explicit ProgramMemoryState(const Settings& s); @@ -171,10 +189,13 @@ struct ProgramMemoryState { void addState(const Token* tok, const ProgramMemory::Map& vars); - void assume(const Token* tok, bool b, bool isEmpty = false); + void assume(const Token* tok, bool b, bool isEmpty = false, const Token* origin = nullptr); void removeModifiedVars(const Token* tok); + // A findExpressionChanged() closure memoized in changedCache + FindChangedFn getCachedFindExpressionChanged(bool skipDeadCode) const; + ProgramMemory get(const Token* tok, const Token* ctx, const ProgramMemory::Map& vars) const; }; @@ -184,21 +205,30 @@ void execute(const Token* expr, ProgramMemory& programMemory, MathLib::bigint* result, bool* error, - const Settings& settings); + const Settings& settings, + const ProgramMemory::Map& vars = {}); /** * Is condition always false when variable has given value? * \param condition top ast token in condition * \param pm program memory + * \param vars optional tracked values that take precedence over the program memory */ -bool conditionIsFalse(const Token* condition, ProgramMemory pm, const Settings& settings); +bool conditionIsFalse(const Token* condition, + ProgramMemory pm, + const Settings& settings, + const ProgramMemory::Map& vars = {}); /** * Is condition always true when variable has given value? * \param condition top ast token in condition * \param pm program memory + * \param vars optional tracked values that take precedence over the program memory */ -bool conditionIsTrue(const Token* condition, ProgramMemory pm, const Settings& settings); +bool conditionIsTrue(const Token* condition, + ProgramMemory pm, + const Settings& settings, + const ProgramMemory::Map& vars = {}); /** * Get program memory by looking backwards from given token. diff --git a/lib/settings.cpp b/lib/settings.cpp index c0539bbeaba..479346208e3 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -335,6 +335,7 @@ void Settings::setCheckLevel(CheckLevel level) vfOptions.maxIfCount = 100; vfOptions.doConditionExpressionAnalysis = false; vfOptions.maxForwardBranches = 4; + vfOptions.maxForwardConditionForkDepth = 0; vfOptions.maxIterations = 1; } else if (level == CheckLevel::normal) { @@ -344,6 +345,7 @@ void Settings::setCheckLevel(CheckLevel level) vfOptions.maxIfCount = 100; vfOptions.doConditionExpressionAnalysis = false; vfOptions.maxForwardBranches = 4; + vfOptions.maxForwardConditionForkDepth = 1; } else if (level == CheckLevel::exhaustive) { // Checking can take a little while. ~ 10 times slower than normal analysis is OK. @@ -352,6 +354,8 @@ void Settings::setCheckLevel(CheckLevel level) vfOptions.maxSubFunctionArgs = 256; vfOptions.doConditionExpressionAnalysis = true; vfOptions.maxForwardBranches = -1; + vfOptions.maxForwardConditionForkDepth = 4; + vfOptions.maxForwardConditionForks = 256; } } diff --git a/lib/settings.h b/lib/settings.h index 4a73f35039b..ce4a32e1690 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -512,6 +512,15 @@ class CPPCHECKLIB WARN_UNUSED Settings { /** @brief Maximum performed forward branches */ int maxForwardBranches = -1; + /** @brief Maximum depth of nested condition-fork continuations in the forward analyzer. + Bounds the exponential fan-out of carrying condition state forward at exhaustive level (where + maxForwardBranches is unlimited); past it the forward analysis continues on a single linear path + without skipping any branch. 0 disables forking (linear); a negative value means unlimited. */ + int maxForwardConditionForkDepth = 4; + + /** @brief Maximum total condition-fork continuations in one forward traversal. */ + int maxForwardConditionForks = 256; + /** @brief Maximum performed alignof recursion */ int maxAlignOfRecursion = 100; diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index 44c86cbc2b7..cfba7d5f970 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -678,16 +678,20 @@ struct ValueFlowAnalyzer : Analyzer { if (const ValueFlow::Value* v = tok->getKnownValue(ValueFlow::Value::ValueType::INT)) return {v->intvalue}; std::vector result; - ProgramMemory pm = getProgramMemoryFunc(); + // Pass the tracked values so a cached program-memory value that depends on one (e.g. 'h(p)' + // after 'p' was reassigned) is re-evaluated rather than served stale. The memory is built + // from the same state, so compute it once and hand it to the builder. + const ProgramState vars = getProgramState(); + ProgramMemory pm = getProgramMemoryFunc(vars); if (Token::Match(tok, "&&|%oror%")) { - if (conditionIsTrue(tok, pm, getSettings())) + if (conditionIsTrue(tok, pm, getSettings(), vars)) result.push_back(1); - if (conditionIsFalse(tok, std::move(pm), getSettings())) + if (conditionIsFalse(tok, std::move(pm), getSettings(), vars)) result.push_back(0); } else { MathLib::bigint out = 0; bool error = false; - execute(tok, pm, &out, &error, getSettings()); + execute(tok, pm, &out, &error, getSettings(), vars); if (!error) result.push_back(out); } @@ -696,16 +700,16 @@ struct ValueFlowAnalyzer : Analyzer { std::vector evaluateInt(const Token* tok) const { - return evaluateInt(tok, [&] { - return ProgramMemory{getProgramState()}; + return evaluateInt(tok, [](const ProgramState& vars) { + return ProgramMemory{vars}; }); } std::vector evaluate(Evaluate e, const Token* tok, const Token* ctx = nullptr) const override { if (e == Evaluate::Integral) { - return evaluateInt(tok, [&] { - return pms.get(tok, ctx, getProgramState()); + return evaluateInt(tok, [&](const ProgramState& vars) { + return pms.get(tok, ctx, vars); }); } if (e == Evaluate::ContainerEmpty) { @@ -723,30 +727,43 @@ struct ValueFlowAnalyzer : Analyzer { return {}; } - void assume(const Token* tok, bool state, unsigned int flags) override { - // Update program state - pms.removeModifiedVars(tok); - pms.addState(tok, getProgramState()); - pms.assume(tok, state, flags & Assume::ContainerEmpty); - + void assume(const Token* tok, bool state, unsigned int flags) override + { bool isCondBlock = false; const Token* parent = tok->astParent(); if (parent) { isCondBlock = Token::Match(parent->previous(), "if|while ("); } + const Token* endBlock = nullptr; if (isCondBlock) { const Token* startBlock = parent->link()->next(); if (Token::simpleMatch(startBlock, ";") && Token::simpleMatch(parent->tokAt(-2), "} while (")) startBlock = parent->linkAt(-2); - const Token* endBlock = startBlock->link(); - if (state) { - pms.removeModifiedVars(endBlock); - pms.addState(endBlock->previous(), getProgramState()); - } else { - if (Token::simpleMatch(endBlock, "} else {")) - pms.addState(endBlock->linkAt(2)->previous(), getProgramState()); - } + endBlock = startBlock->link(); + } + + // Without Pending the 'then' block has been traversed and control is leaving it, so anchor + // the assumed state at the block end instead of the condition. That keeps assumptions on + // variables modified inside the block (e.g. an 'if' narrowing a value computed there) from + // being discarded as "modified" once control leaves the block. + const bool scopeEnd = !(flags & Assume::Pending) && state && endBlock; + const Token* anchor = scopeEnd ? endBlock : tok; + const Token* origin = scopeEnd ? endBlock : nullptr; + + // Update program state + pms.removeModifiedVars(anchor); + pms.addState(anchor, getProgramState()); + pms.assume(tok, state, flags & Assume::ContainerEmpty, origin); + + // The false path (the true path uses scopeEnd above): record the assumed state where control + // continues - the end of the else block, or the closing brace when there is no else - so it + // reaches the enclosing scope. + if (isCondBlock && !(flags & Assume::Pending) && !state) { + if (Token::simpleMatch(endBlock, "} else {")) + pms.addState(endBlock->linkAt(2)->previous(), getProgramState()); + else + pms.addState(endBlock, getProgramState()); } if (!(flags & Assume::Quiet)) { diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 2867f147d81..df421d6879c 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -4941,7 +4941,9 @@ class TestAutoVariables : public TestFixture { " return *iPtr;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5:16] -> [test.cpp:4:13] -> [test.cpp:8:17]: (error) Using pointer to local variable 'x' that is out of scope. [invalidLifetime]\n", errout_str()); + ASSERT_EQUALS( + "[test.cpp:5:16] -> [test.cpp:7:10] -> [test.cpp:4:13] -> [test.cpp:8:17]: (error) Using pointer to local variable 'x' that is out of scope. [invalidLifetime]\n", + errout_str()); // #11753 check("int main(int argc, const char *argv[]) {\n" diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 3143b6eb201..837cd4e78ba 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4911,6 +4911,30 @@ class TestCondition : public TestFixture { ASSERT_EQUALS("[test.cpp:3:10]: (style) Condition 'b()' is always false [knownConditionTrueFalse]\n" "[test.cpp:4:9]: (style) Condition '!b()' is always true [knownConditionTrueFalse]\n", errout_str()); + + check("int g();\n" // a value modified inside a nested branch must be lowered to possible + "void f(int outer, int inner) {\n" + " int bits = 0;\n" + " if (outer) {\n" + " if (inner == 1)\n" + " bits = g();\n" + " }\n" + " if (bits > 0) {}\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("int g();\n" // the modifying branch has an escaping sibling - still must be lowered + "void f(int t, int u) {\n" + " int v = 0;\n" + " if (t) {\n" + " if (u == 2)\n" + " v = g();\n" + " else\n" + " return;\n" + " }\n" + " if (v > 0) {}\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void alwaysTrueSymbolic() diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 369c04a2101..2483a967947 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -2450,6 +2450,9 @@ class TestNullPointer : public TestFixture { void nullpointer77() { + // No warning: 'i' is passed to the unknown function 'h' in the same condition that guards the + // dereference. 'h' may validate the pointer (e.g. return false for null), so '*i' can be safe + // - this is the common "if (check(p) && p->...)" pattern, so we must not assume 'i' is null. check("bool h(int*);\n" "void f(int* i) {\n" " int* i = nullptr;\n" @@ -2465,6 +2468,8 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS("", errout_str()); + // Likewise here, even though 'i' is null when the first 'h(i)' was true: the second 'h(i)' is an + // independent call that may validate 'i', so '*i' is not necessarily a null dereference. check("bool h(int*);\n" "void f(int* x) {\n" " int* i = x;\n" diff --git a/test/testother.cpp b/test/testother.cpp index fa6899cf543..02418df5627 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -11511,8 +11511,9 @@ class TestOther : public TestFixture { " x = a + b;\n" " return x;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2:11] -> [test.cpp:4:9]: (style) Variable 'x' is assigned an expression that holds the same value. [redundantAssignment]\n", - errout_str()); + ASSERT_EQUALS( + "[test.cpp:2:11] -> [test.cpp:3:9] -> [test.cpp:4:9]: (style) Variable 'x' is assigned an expression that holds the same value. [redundantAssignment]\n", + errout_str()); } void varFuncNullUB() { // #4482 diff --git a/test/teststl.cpp b/test/teststl.cpp index 35941f6422c..93b53b43671 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -368,7 +368,9 @@ class TestStl : public TestFixture { " if(b) ++x;\n" " return s[x];\n" "}"); - ASSERT_EQUALS("[test.cpp:5:13]: error: Out of bounds access in 's[x]', if 's' size is 6 and 'x' is 6 [containerOutOfBounds]\n", errout_str()); + ASSERT_EQUALS( + "[test.cpp:5:13]: error: Out of bounds access in 's[x]', if 's' size is 6 and 'x' is 7 [containerOutOfBounds]\n", + errout_str()); checkNormal("void f() {\n" " static const int N = 4;\n" diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index e0c5512f1fd..6a43493cd0d 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -4265,7 +4265,7 @@ class TestUninitVar : public TestFixture { " else {}\n" " return y;\n" "}"); - TODO_ASSERT_EQUALS("", "[test.cpp:5:9] -> [test.cpp:7:12]: (warning) Uninitialized variable: y [uninitvar]\n", errout_str()); + ASSERT_EQUALS("", errout_str()); // #4560: escaping else keeps x known, so x is true and y is initialized valueFlowUninit("int f(int a) {\n" // #6583 " int x;\n" @@ -4284,7 +4284,8 @@ class TestUninitVar : public TestFixture { " else y = 123;\n" // <- y is always initialized " return y;\n" "}"); - TODO_ASSERT_EQUALS("", "[test.cpp:5:9] -> [test.cpp:7:12]: (warning) Uninitialized variable: y [uninitvar]\n", errout_str()); + ASSERT_EQUALS("", + errout_str()); // #4560: fork-based condition analysis tracks x==0 -> else branch -> y initialized valueFlowUninit("void f(int x) {\n" // #3948 " int value;\n" @@ -5614,6 +5615,47 @@ class TestUninitVar : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:18:9] -> [test.cpp:12:13] -> [test.cpp:8:15]: (warning) Uninitialized variable: s->flag [uninitvar]\n", errout_str()); + // A value narrowed by a nested condition (dimensions < 1 here) must survive the enclosing + // 'if' so a later correlated condition can be resolved: dimensions == 1 is then false, the + // function does not return, and the uninitialized read is reached. + valueFlowUninit("unsigned int g();\n" + "void f(bool a) {\n" + " unsigned int dimensions = 0;\n" + " bool mightBeLarger;\n" + " if (a) {\n" + " dimensions = g();\n" + " if (dimensions >= 1)\n" + " mightBeLarger = false;\n" + " } else {\n" + " mightBeLarger = false;\n" + " }\n" + " if (dimensions == 1)\n" + " return;\n" + " if (!mightBeLarger) {}\n" + "}"); + ASSERT_EQUALS( + "[test.cpp:5:9] -> [test.cpp:7:24] -> [test.cpp:14:10]: (warning) Uninitialized variable: mightBeLarger [uninitvar]\n", + errout_str()); + + // Same shape, but the later condition (dimensions == 0) is implied by the narrowing, so the + // early return fires on the uninitialized path and there must be no warning. + valueFlowUninit("unsigned int g();\n" + "void f(bool a) {\n" + " unsigned int dimensions = 0;\n" + " bool mightBeLarger;\n" + " if (a) {\n" + " dimensions = g();\n" + " if (dimensions >= 1)\n" + " mightBeLarger = false;\n" + " } else {\n" + " mightBeLarger = false;\n" + " }\n" + " if (dimensions == 0)\n" + " return;\n" + " if (!mightBeLarger) {}\n" + "}"); + ASSERT_EQUALS("", errout_str()); + // Ticket #2207 - False negative valueFlowUninit("void foo() {\n" " int a;\n" diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index c015664554a..888710ce57d 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -6123,9 +6123,9 @@ class TestValueFlow : public TestFixture { " c++;\n" "}\n"; values = tokenValues(code, "c ++ ; }"); - TODO_ASSERT_EQUALS(true, false, values.size() == 2); - // ASSERT_EQUALS(true, values.front().isUninitValue() || values.back().isUninitValue()); - // ASSERT_EQUALS(true, values.front().isPossible() || values.back().isPossible()); + ASSERT_EQUALS(true, values.size() == 2); + ASSERT_EQUALS(true, values.front().isUninitValue() || values.back().isUninitValue()); + ASSERT_EQUALS(true, values.front().isPossible() || values.back().isPossible()); // ASSERT_EQUALS(true, values.front().intvalue == 0 || values.back().intvalue == 0); code = "void b(bool d, bool e) {\n" @@ -8446,6 +8446,75 @@ class TestValueFlow : public TestFixture { " static T f[64];\n" "};\n"; (void)valueOfTok(code, "("); + + // fork explosion on many opaque conditions; bounded by maxForwardConditionForks + code = "int g(int);\n" + "bool h(int);\n" + "void f() {\n" + " int x = 0;\n" + " if (h(0)) g(x);\n" + " if (h(1)) g(x);\n" + " if (h(2)) g(x);\n" + " if (h(3)) g(x);\n" + " if (h(4)) g(x);\n" + " if (h(5)) g(x);\n" + " if (h(6)) g(x);\n" + " if (h(7)) g(x);\n" + " if (h(8)) g(x);\n" + " if (h(9)) g(x);\n" + " if (h(10)) g(x);\n" + " if (h(11)) g(x);\n" + " if (h(12)) g(x);\n" + " if (h(13)) g(x);\n" + " if (h(14)) g(x);\n" + " if (h(15)) g(x);\n" + " if (h(16)) g(x);\n" + " if (h(17)) g(x);\n" + " if (h(18)) g(x);\n" + " if (h(19)) g(x);\n" + " if (h(20)) g(x);\n" + " if (h(21)) g(x);\n" + " if (h(22)) g(x);\n" + " if (h(23)) g(x);\n" + " if (h(24)) g(x);\n" + " if (h(25)) g(x);\n" + " if (h(26)) g(x);\n" + " if (h(27)) g(x);\n" + " if (h(28)) g(x);\n" + " if (h(29)) g(x);\n" + " if (h(30)) g(x);\n" + " if (h(31)) g(x);\n" + " if (h(32)) g(x);\n" + " if (h(33)) g(x);\n" + " if (h(34)) g(x);\n" + " if (h(35)) g(x);\n" + " if (h(36)) g(x);\n" + " if (h(37)) g(x);\n" + " if (h(38)) g(x);\n" + " if (h(39)) g(x);\n" + " if (h(40)) g(x);\n" + " if (h(41)) g(x);\n" + " if (h(42)) g(x);\n" + " if (h(43)) g(x);\n" + " if (h(44)) g(x);\n" + " if (h(45)) g(x);\n" + " if (h(46)) g(x);\n" + " if (h(47)) g(x);\n" + " if (h(48)) g(x);\n" + " if (h(49)) g(x);\n" + " if (h(50)) g(x);\n" + " if (h(51)) g(x);\n" + " if (h(52)) g(x);\n" + " if (h(53)) g(x);\n" + " if (h(54)) g(x);\n" + " if (h(55)) g(x);\n" + " if (h(56)) g(x);\n" + " if (h(57)) g(x);\n" + " if (h(58)) g(x);\n" + " if (h(59)) g(x);\n" + " (void)x;\n" + "}\n"; + (void)valueOfTok(code, "x"); } void valueFlowCrashConstructorInitialization() { // #9577 From 1e1bc87e2b424512af04e071840f59512c3453f9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 6 Jul 2026 08:34:42 +0200 Subject: [PATCH 120/171] Fix #14884 fuzzing timeout (hang) in TemplateSimplifier::expandTemplate() (#8691) --- lib/templatesimplifier.cpp | 8 ++++++-- .../timeout-5225c0e6e895cdd05a15c388547d13a78a2574e2 | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 test/cli/fuzz-timeout/timeout-5225c0e6e895cdd05a15c388547d13a78a2574e2 diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 4051b05c204..6fdd423628b 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -170,8 +170,12 @@ TemplateSimplifier::TokenAndName::TokenAndName(Token *token, std::string scope, if (isFunction()) tok1 = tok1->link()->next(); while (tok1 && !Token::Match(tok1, ";|{")) { - if (tok1->str() == "<") - tok1 = tok1->findClosingBracket(); + if (tok1->str() == "<") { + if (const Token* closing = tok1->findClosingBracket()) + tok1 = closing; + else + syntaxError(tok1); + } else if (Token::Match(tok1, "(|[") && tok1->link()) tok1 = tok1->link(); if (tok1) diff --git a/test/cli/fuzz-timeout/timeout-5225c0e6e895cdd05a15c388547d13a78a2574e2 b/test/cli/fuzz-timeout/timeout-5225c0e6e895cdd05a15c388547d13a78a2574e2 new file mode 100644 index 00000000000..71e751bb201 --- /dev/null +++ b/test/cli/fuzz-timeout/timeout-5225c0e6e895cdd05a15c388547d13a78a2574e2 @@ -0,0 +1 @@ +templatestruct e<; From 08db3048d54dcf6a3cc3b19613f286e30268cc9e Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 6 Jul 2026 09:11:57 +0200 Subject: [PATCH 121/171] Fix #14883 fuzzing crash (null-pointer-use) in Tokenizer::findGarbageCode() (#8692) --- lib/tokenize.cpp | 2 ++ .../fuzz-crash/crash-17be2b85446aeb0c7722bedfad4b0e4af27fae3d | 1 + 2 files changed, 3 insertions(+) create mode 100644 test/cli/fuzz-crash/crash-17be2b85446aeb0c7722bedfad4b0e4af27fae3d diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 61719f5291d..3046bea69cc 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -8962,6 +8962,8 @@ void Tokenizer::findGarbageCode() const const Token* const endTok = tok->linkAt(1); for (tok = tok->tokAt(2); tok != endTok; tok = tok->next()) { if (const Token* lam = findLambdaEndTokenWithoutAST(tok)) { + if (lam == endTok) + break; tok = lam; continue; } diff --git a/test/cli/fuzz-crash/crash-17be2b85446aeb0c7722bedfad4b0e4af27fae3d b/test/cli/fuzz-crash/crash-17be2b85446aeb0c7722bedfad4b0e4af27fae3d new file mode 100644 index 00000000000..0f06807b7ba --- /dev/null +++ b/test/cli/fuzz-crash/crash-17be2b85446aeb0c7722bedfad4b0e4af27fae3d @@ -0,0 +1 @@ +{for([]{});} From 42a08059f71f3952f7f992dfe82828e2af495c6e Mon Sep 17 00:00:00 2001 From: glankk Date: Tue, 7 Jul 2026 13:27:26 +0200 Subject: [PATCH 122/171] Fix #14898: Update simplecpp to 1.8.1 (#8702) --- .selfcheck_suppressions | 1 - externals/simplecpp/simplecpp.cpp | 216 +++++++++++++++++++----------- externals/simplecpp/simplecpp.h | 65 +++------ 3 files changed, 154 insertions(+), 128 deletions(-) diff --git a/.selfcheck_suppressions b/.selfcheck_suppressions index 402fdbeb75d..f21492e783a 100644 --- a/.selfcheck_suppressions +++ b/.selfcheck_suppressions @@ -79,4 +79,3 @@ useStlAlgorithm:externals/simplecpp/simplecpp.cpp funcArgNamesDifferentUnnamed:externals/simplecpp/simplecpp.h missingMemberCopy:externals/simplecpp/simplecpp.h shadowFunction:externals/simplecpp/simplecpp.h -knownConditionTrueFalse:externals/simplecpp/simplecpp.cpp \ No newline at end of file diff --git a/externals/simplecpp/simplecpp.cpp b/externals/simplecpp/simplecpp.cpp index 47e674837ba..d2c398c49e1 100644 --- a/externals/simplecpp/simplecpp.cpp +++ b/externals/simplecpp/simplecpp.cpp @@ -3,18 +3,12 @@ * Copyright (C) 2016-2023 simplecpp team */ +// needs to be specified here otherwise _mingw.h will define it as 0x0601 +// causing FileIdInfo not to be available #if defined(_WIN32) # ifndef _WIN32_WINNT # define _WIN32_WINNT 0x0602 # endif -# ifndef NOMINMAX -# define NOMINMAX -# endif -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# undef ERROR #endif #include "simplecpp.h" @@ -51,10 +45,19 @@ #include #include -#ifdef _WIN32 +#if defined(_WIN32) +# ifndef NOMINMAX +# define NOMINMAX +# endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# undef ERROR # include #else # include +# include #endif static bool isHex(const std::string &s) @@ -658,8 +661,6 @@ static const std::string COMMENT_END("*/"); void simplecpp::TokenList::readfile(Stream &stream, const std::string &filename, OutputList *outputList) { - std::stack loc; - unsigned int multiline = 0U; const Token *oldLastToken = nullptr; @@ -698,59 +699,44 @@ void simplecpp::TokenList::readfile(Stream &stream, const std::string &filename, if (oldLastToken != cback()) { oldLastToken = cback(); - const Token * const llTok = isLastLinePreprocessor(); - if (!llTok) + + // #line 3 + // #line 3 "file.c" + // #3 + // #3 "file.c" + const Token * ppTok = isLastLinePreprocessor(); + if (!ppTok) continue; - const Token * const llNextToken = llTok->next; - if (!llTok->next) + + const auto advanceAndSkipComments = [](const Token* tok) { + do { + tok = tok->next; + } while (tok && tok->comment); + return tok; + }; + + // skip # + ppTok = advanceAndSkipComments(ppTok); + if (!ppTok) continue; - if (llNextToken->next) { - // #file "file.c" - if (llNextToken->str() == "file" && - llNextToken->next->str()[0] == '\"') - { - const Token *strtok = cback(); - while (strtok->comment) - strtok = strtok->previous; - loc.push(location); - location.fileIndex = fileIndex(strtok->str().substr(1U, strtok->str().size() - 2U)); - location.line = 1U; - } - // TODO: add support for "# 3" - // #3 "file.c" - // #line 3 "file.c" - else if ((llNextToken->number && - llNextToken->next->str()[0] == '\"') || - (llNextToken->str() == "line" && - llNextToken->next->number && - llNextToken->next->next && - llNextToken->next->next->str()[0] == '\"')) - { - const Token *strtok = cback(); - while (strtok->comment) - strtok = strtok->previous; - const Token *numtok = strtok->previous; - while (numtok->comment) - numtok = numtok->previous; - lineDirective(fileIndex(replaceAll(strtok->str().substr(1U, strtok->str().size() - 2U),"\\\\","\\")), - std::atol(numtok->str().c_str()), location); - } - // #line 3 - else if (llNextToken->str() == "line" && - llNextToken->next->number) - { - const Token *numtok = cback(); - while (numtok->comment) - numtok = numtok->previous; - lineDirective(location.fileIndex, std::atol(numtok->str().c_str()), location); - } - } - // #endfile - else if (llNextToken->str() == "endfile" && !loc.empty()) - { - location = loc.top(); - loc.pop(); - } + + if (ppTok->str() == "line") + ppTok = advanceAndSkipComments(ppTok); + + if (!ppTok || !ppTok->number) + continue; + + const unsigned int line = std::atol(ppTok->str().c_str()); + ppTok = advanceAndSkipComments(ppTok); + + unsigned int fileindex; + + if (ppTok && ppTok->str()[0] == '\"') + fileindex = fileIndex(replaceAll(ppTok->str().substr(1U, ppTok->str().size() - 2U),"\\\\","\\")); + else + fileindex = location.fileIndex; + + lineDirective(fileindex, line, location); } continue; @@ -1031,8 +1017,7 @@ static bool isAlternativeAndBitandBitor(const simplecpp::Token* tok) void simplecpp::TokenList::combineOperators() { - std::stack executableScope; - executableScope.push(false); + std::stack> executableScope{{false}}; for (Token *tok = front(); tok; tok = tok->next) { if (tok->op == '{') { if (executableScope.top()) { @@ -1040,7 +1025,7 @@ void simplecpp::TokenList::combineOperators() continue; } const Token *prev = tok->previous; - while (prev && prev->isOneOf(";{}()")) + while (prev && prev->isOneOf(";{}(")) prev = prev->previous; executableScope.push(prev && prev->op == ')'); continue; @@ -2332,9 +2317,6 @@ namespace simplecpp { const Token *nextTok = B->next; if (canBeConcatenatedStringOrChar) { - if (unexpectedA) - throw invalidHashHash::unexpectedToken(tok->location, name(), A); - // It seems clearer to handle this case separately even though the code is similar-ish, but we don't want to merge here. // TODO The question is whether the ## or varargs may still apply, and how to provoke? if (expandArg(tokensB, B, parametertokens)) { @@ -3090,6 +3072,65 @@ static std::string openHeader(std::ifstream &f, const simplecpp::DUI &dui, const return ""; } +namespace { + struct FileID { +#ifdef _WIN32 + struct { + std::uint64_t VolumeSerialNumber; + struct { + std::uint64_t IdentifierHi; + std::uint64_t IdentifierLo; + } FileId; + } fileIdInfo; + + bool operator==(const FileID &that) const noexcept { + return fileIdInfo.VolumeSerialNumber == that.fileIdInfo.VolumeSerialNumber && + fileIdInfo.FileId.IdentifierHi == that.fileIdInfo.FileId.IdentifierHi && + fileIdInfo.FileId.IdentifierLo == that.fileIdInfo.FileId.IdentifierLo; + } +#else + dev_t dev; + ino_t ino; + + bool operator==(const FileID& that) const noexcept { + return dev == that.dev && ino == that.ino; + } +#endif + struct Hasher { + std::size_t operator()(const FileID &id) const { +#ifdef _WIN32 + return static_cast(id.fileIdInfo.FileId.IdentifierHi ^ id.fileIdInfo.FileId.IdentifierLo ^ + id.fileIdInfo.VolumeSerialNumber); +#else + return static_cast(id.dev) ^ static_cast(id.ino); +#endif + } + }; + }; +} + +struct simplecpp::FileDataCache::Impl +{ + void clear() + { + mIdMap.clear(); + } + + using id_map_type = std::unordered_map; + + id_map_type mIdMap; +}; + +simplecpp::FileDataCache::FileDataCache() + : mImpl(new Impl) +{} + +simplecpp::FileDataCache::~FileDataCache() = default; +simplecpp::FileDataCache::FileDataCache(FileDataCache &&) noexcept = default; +simplecpp::FileDataCache &simplecpp::FileDataCache::operator=(simplecpp::FileDataCache &&) noexcept = default; + +static bool getFileId(const std::string &path, FileID &id); + std::pair simplecpp::FileDataCache::tryload(FileDataCache::name_map_type::iterator &name_it, const simplecpp::DUI &dui, std::vector &filenames, simplecpp::OutputList *outputList) { const std::string &path = name_it->first; @@ -3098,8 +3139,8 @@ std::pair simplecpp::FileDataCache::tryload(FileDat if (!getFileId(path, fileId)) return {nullptr, false}; - const auto id_it = mIdMap.find(fileId); - if (id_it != mIdMap.end()) { + const auto id_it = mImpl->mIdMap.find(fileId); + if (id_it != mImpl->mIdMap.end()) { name_it->second = id_it->second; return {id_it->second, false}; } @@ -3110,9 +3151,12 @@ std::pair simplecpp::FileDataCache::tryload(FileDat data->tokens.removeComments(); name_it->second = data; - mIdMap.emplace(fileId, data); + mImpl->mIdMap.emplace(fileId, data); mData.emplace_back(data); + if (mLoadCallback) + mLoadCallback(*data); + return {data, true}; } @@ -3162,7 +3206,14 @@ std::pair simplecpp::FileDataCache::get(const std:: return {nullptr, false}; } -bool simplecpp::FileDataCache::getFileId(const std::string &path, FileID &id) +void simplecpp::FileDataCache::clear() +{ + mImpl->clear(); + mNameMap.clear(); + mData.clear(); +} + +static bool getFileId(const std::string &path, FileID &id) { #ifdef _WIN32 HANDLE hFile = CreateFileA(path.c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); @@ -3349,20 +3400,20 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL std::map sizeOfType(rawtokens.sizeOfType); sizeOfType.insert(std::make_pair("char", sizeof(char))); sizeOfType.insert(std::make_pair("short", sizeof(short))); - sizeOfType.insert(std::make_pair("short int", sizeOfType["short"])); + sizeOfType.insert(std::make_pair("short int", sizeof(short))); sizeOfType.insert(std::make_pair("int", sizeof(int))); sizeOfType.insert(std::make_pair("long", sizeof(long))); - sizeOfType.insert(std::make_pair("long int", sizeOfType["long"])); + sizeOfType.insert(std::make_pair("long int", sizeof(long))); sizeOfType.insert(std::make_pair("long long", sizeof(long long))); sizeOfType.insert(std::make_pair("float", sizeof(float))); sizeOfType.insert(std::make_pair("double", sizeof(double))); sizeOfType.insert(std::make_pair("long double", sizeof(long double))); sizeOfType.insert(std::make_pair("char *", sizeof(char *))); sizeOfType.insert(std::make_pair("short *", sizeof(short *))); - sizeOfType.insert(std::make_pair("short int *", sizeOfType["short *"])); + sizeOfType.insert(std::make_pair("short int *", sizeof(short *))); sizeOfType.insert(std::make_pair("int *", sizeof(int *))); sizeOfType.insert(std::make_pair("long *", sizeof(long *))); - sizeOfType.insert(std::make_pair("long int *", sizeOfType["long *"])); + sizeOfType.insert(std::make_pair("long int *", sizeof(long *))); sizeOfType.insert(std::make_pair("long long *", sizeof(long long *))); sizeOfType.insert(std::make_pair("float *", sizeof(float *))); sizeOfType.insert(std::make_pair("double *", sizeof(double *))); @@ -3466,8 +3517,19 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL includetokenstack.push(rawtokens.cfront()); for (auto it = dui.includes.cbegin(); it != dui.includes.cend(); ++it) { const FileData *const filedata = cache.get("", *it, dui, false, files, outputList).first; - if (filedata != nullptr && filedata->tokens.cfront() != nullptr) + if (filedata == nullptr) { + if (outputList) { + simplecpp::Output err{ + simplecpp::Output::EXPLICIT_INCLUDE_NOT_FOUND, + {}, + "Can not open include file '" + *it + "' that is explicitly included." + }; + outputList->emplace_back(std::move(err)); + } + } + else if (filedata->tokens.cfront() != nullptr) { includetokenstack.push(filedata->tokens.cfront()); + } } std::map> maybeUsedMacros; diff --git a/externals/simplecpp/simplecpp.h b/externals/simplecpp/simplecpp.h index f29166ff061..3d6fc5262b9 100644 --- a/externals/simplecpp/simplecpp.h +++ b/externals/simplecpp/simplecpp.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -41,10 +42,6 @@ # define SIMPLECPP_LIB #endif -#ifndef _WIN32 -# include -#endif - #if defined(_MSC_VER) # pragma warning(push) // suppress warnings about "conversion from 'type1' to 'type2', possible loss of data" @@ -452,13 +449,14 @@ namespace simplecpp { class SIMPLECPP_LIB FileDataCache { public: - FileDataCache() = default; + FileDataCache(); + ~FileDataCache(); FileDataCache(const FileDataCache &) = delete; - FileDataCache(FileDataCache &&) = default; + FileDataCache(FileDataCache &&) noexcept; FileDataCache &operator=(const FileDataCache &) = delete; - FileDataCache &operator=(FileDataCache &&) = default; + FileDataCache &operator=(FileDataCache &&) noexcept; /** Get the cached data for a file, or load and then return it if it isn't cached. * returns the file data and true if the file was loaded, false if it was cached. */ @@ -472,11 +470,7 @@ namespace simplecpp { mNameMap.emplace(newdata->filename, newdata); } - void clear() { - mNameMap.clear(); - mIdMap.clear(); - mData.clear(); - } + void clear(); using container_type = std::vector>; using iterator = container_type::iterator; @@ -505,52 +499,23 @@ namespace simplecpp { return mData.cend(); } - private: - struct FileID { -#ifdef _WIN32 - struct { - std::uint64_t VolumeSerialNumber; - struct { - std::uint64_t IdentifierHi; - std::uint64_t IdentifierLo; - } FileId; - } fileIdInfo; - - bool operator==(const FileID &that) const noexcept { - return fileIdInfo.VolumeSerialNumber == that.fileIdInfo.VolumeSerialNumber && - fileIdInfo.FileId.IdentifierHi == that.fileIdInfo.FileId.IdentifierHi && - fileIdInfo.FileId.IdentifierLo == that.fileIdInfo.FileId.IdentifierLo; - } -#else - dev_t dev; - ino_t ino; + using load_callback_type = std::function; - bool operator==(const FileID& that) const noexcept { - return dev == that.dev && ino == that.ino; - } -#endif - struct Hasher { - std::size_t operator()(const FileID &id) const { -#ifdef _WIN32 - return static_cast(id.fileIdInfo.FileId.IdentifierHi ^ id.fileIdInfo.FileId.IdentifierLo ^ - id.fileIdInfo.VolumeSerialNumber); -#else - return static_cast(id.dev) ^ static_cast(id.ino); -#endif - } - }; - }; + void set_load_callback(load_callback_type cb) { + mLoadCallback = std::move(cb); + } - using name_map_type = std::unordered_map; - using id_map_type = std::unordered_map; + private: + struct Impl; + std::unique_ptr mImpl; - static bool getFileId(const std::string &path, FileID &id); + using name_map_type = std::unordered_map; std::pair tryload(name_map_type::iterator &name_it, const DUI &dui, std::vector &filenames, OutputList *outputList); container_type mData; name_map_type mNameMap; - id_map_type mIdMap; + load_callback_type mLoadCallback; }; /** Converts character literal (including prefix, but not ud-suffix) to long long value. From e7e54f7ea596fe252f39f405f4aae0c4f45d3b76 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:09:18 +0200 Subject: [PATCH 123/171] Fix #14889 FP constStatement with GNU statement expression (#8698) --- lib/checkother.cpp | 2 +- test/testincompletestatement.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 51124c45d1c..ef6fb9003b1 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -2408,7 +2408,7 @@ void CheckOtherImpl::checkIncompleteStatement() !(tok->str() == "," && tok->astParent() && tok->astParent()->isAssignmentOp())) continue; // Skip statement expressions - if (Token::simpleMatch(rtok, "; } )")) + if (Token::simpleMatch(rtok, "; } )") || Token::simpleMatch(tok->next(), "; } )")) continue; if (!isConstStatement(tok, mSettings.library, false)) continue; diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index b72b6524872..806f734274e 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -758,6 +758,11 @@ class TestIncompleteStatement : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:4:6]: (warning) Redundant code: Found unused array access. [constStatement]\n", errout_str()); + + check("int f(int i) {\n" // #14889 + " return i ? 8 : ({ int x = 2; x; });\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void vardecl() { From 7cc7c0bb500d775d4d533ace64295c2cd0fa7134 Mon Sep 17 00:00:00 2001 From: correctmost <134317971+correctmost@users.noreply.github.com> Date: Wed, 8 Jul 2026 02:33:51 -0400 Subject: [PATCH 124/171] gtk.cfg: Add pure annotations for more GLib functions (#8687) This fixes assertWithSideEffect false positives for the following functions: g_error_matches g_list_find g_str_has_prefix g_str_has_suffix --- cfg/gtk.cfg | 3 +++ test/cfg/gtk.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/cfg/gtk.cfg b/cfg/gtk.cfg index 71d0f3dee05..e28aa2ad7a5 100644 --- a/cfg/gtk.cfg +++ b/cfg/gtk.cfg @@ -2251,6 +2251,7 @@ + false @@ -5218,6 +5219,7 @@ + false @@ -6586,6 +6588,7 @@ + false diff --git a/test/cfg/gtk.c b/test/cfg/gtk.c index 4accf7b63ec..6b48bca2f9e 100644 --- a/test/cfg/gtk.c +++ b/test/cfg/gtk.c @@ -59,6 +59,8 @@ void validCode(int argInt, GHashTableIter * hash_table_iter, GHashTable * hash_t g_string_free(pGStr1, TRUE); gchar * pGchar1 = g_strconcat("a", "b", NULL); + g_assert_true(g_str_has_prefix(pGchar1, "a")); + g_assert_true(g_str_has_suffix(pGchar1, "b")); printf("%s", pGchar1); g_free(pGchar1); @@ -406,6 +408,7 @@ void g_error_new_test() g_error_new(1, -2, "a %d", 1); const GError * pNew2 = g_error_new(1, -2, "a %d", 1); + g_assert_true(g_error_matches(pNew2, 1, -2)); printf("%p", pNew2); // cppcheck-suppress memleak } @@ -530,6 +533,16 @@ void g_variant_test() { // cppcheck-suppress memleak } +void g_list_test() { + GList *list1 = NULL; + gchar *c = "c"; + + list1 = g_list_append(list1, c); + g_assert_true(g_list_find(list1, c) != NULL); + + g_list_free(list1); +} + void g_queue_test() { // cppcheck-suppress leakReturnValNotUsed g_queue_new(); From ee22150faf8a585c0ad3406534f5159045601041 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 8 Jul 2026 08:34:13 +0200 Subject: [PATCH 125/171] Fix #13846 FP invalidFunctionArgBool with Qt SLOT() macro (#8686) `` causes a warning when passing `false`, which is rejected by a modern compiler anyway. --------- Co-authored-by: chrchr-github --- cfg/qt.cfg | 1 - test/cfg/qt.cpp | 11 +++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cfg/qt.cfg b/cfg/qt.cfg index 66f6e78b3b6..c7bf3d8779b 100644 --- a/cfg/qt.cfg +++ b/cfg/qt.cfg @@ -410,7 +410,6 @@
- diff --git a/test/cfg/qt.cpp b/test/cfg/qt.cpp index 78827d3583c..2b683648dcd 100644 --- a/test/cfg/qt.cpp +++ b/test/cfg/qt.cpp @@ -33,6 +33,7 @@ #include #include #include +#include // TODO: this is actually available via Core5Compat but I could not get it to work with pkg-config #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) @@ -892,3 +893,13 @@ int qdateIsValid() Q_ASSERT(qd.isValid()); // Should not warn here with assertWithSideEffect return qd.month(); } + +struct S_QTimer_connect : QObject { // #13846 + S_QTimer_connect() { + // cppcheck-suppress checkLibraryFunction - timeout() is a signal from QTimer + QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(update())); + } + QTimer timer; +private slots: + bool update(); +}; From a93e550d041337164dd17f15d240151010658641 Mon Sep 17 00:00:00 2001 From: glankk Date: Wed, 8 Jul 2026 11:52:51 +0200 Subject: [PATCH 126/171] Fix #14113 (Slow analysis: microchip xc16 code) (#7838) --- .github/workflows/selfcheck.yml | 2 +- .selfcheck_suppressions | 2 + lib/cppcheck.cpp | 113 ++++++++++++++++++------- lib/cppcheck.h | 5 +- lib/errorlogger.cpp | 9 +- lib/errorlogger.h | 18 ++-- lib/preprocessor.cpp | 142 +++++++++++++------------------- lib/preprocessor.h | 35 +++++--- test/cli/performance_test.py | 25 ++++++ test/helpers.cpp | 3 +- test/testcppcheck.cpp | 7 +- test/testpreprocessor.cpp | 63 ++++++++++++-- test/testtokenize.cpp | 8 +- 13 files changed, 283 insertions(+), 149 deletions(-) diff --git a/.github/workflows/selfcheck.yml b/.github/workflows/selfcheck.yml index 6d100c4ddc8..1a213039f93 100644 --- a/.github/workflows/selfcheck.yml +++ b/.github/workflows/selfcheck.yml @@ -121,7 +121,7 @@ jobs: - name: Self check (unusedFunction / no test / no gui) run: | - supprs="--suppress=unusedFunction:lib/errorlogger.h:197 --suppress=unusedFunction:lib/importproject.cpp:1671 --suppress=unusedFunction:lib/importproject.cpp:1695" + supprs="--suppress=unusedFunction:lib/errorlogger.h:198 --suppress=unusedFunction:lib/importproject.cpp:1671 --suppress=unusedFunction:lib/importproject.cpp:1695" ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib -D__CPPCHECK__ -D__GNUC__ --enable=unusedFunction,information --exception-handling -rp=. --project=cmake.output.notest_nogui/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr $supprs env: DISABLE_VALUEFLOW: 1 diff --git a/.selfcheck_suppressions b/.selfcheck_suppressions index f21492e783a..63d33fd2704 100644 --- a/.selfcheck_suppressions +++ b/.selfcheck_suppressions @@ -62,6 +62,8 @@ templateInstantiation:test/testutils.cpp naming-varname:externals/simplecpp/simplecpp.h naming-privateMemberVariable:externals/simplecpp/simplecpp.h +# false positive; lambda captures its owner +danglingLifetime:externals/simplecpp/simplecpp.h:505 # TODO: these warnings need to be addressed upstream uninitMemberVar:externals/tinyxml2/tinyxml2.h diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 50f7fa36e80..26d98c0c7b4 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -61,6 +61,7 @@ #include // IWYU pragma: keep #include #include +#include #include #include #include @@ -100,9 +101,9 @@ class CppCheck::CppCheckLogger : public ErrorLogger closePlist(); } - void setRemarkComments(std::vector remarkComments) + void addRemarkComments(const std::vector &remarkComments) { - mRemarkComments = std::move(remarkComments); + mRemarkComments.insert(mRemarkComments.end(), remarkComments.begin(), remarkComments.end()); } void setLocationMacros(const Token* startTok, const std::vector& files) @@ -124,17 +125,25 @@ class CppCheck::CppCheckLogger : public ErrorLogger mErrorList.clear(); } - void openPlist(const std::string& filename, const std::vector& files) + void openPlist(const std::string& filename) { mPlistFile.open(filename); - mPlistFile << ErrorLogger::plistHeader(version(), files); + mPlistFile << ErrorLogger::plistHeader(version()); + } + + void setPlistFilenames(std::vector files) + { + if (mPlistFile.is_open()) { + mPlistFilenames = std::move(files); + } } void closePlist() { if (mPlistFile.is_open()) { - mPlistFile << ErrorLogger::plistFooter(); + mPlistFile << ErrorLogger::plistFooter(mPlistFilenames); mPlistFile.close(); + mPlistFilenames.clear(); } } @@ -282,6 +291,7 @@ class CppCheck::CppCheckLogger : public ErrorLogger std::map> mLocationMacros; // What macros are used on a location? std::ofstream mPlistFile; + std::vector mPlistFilenames; unsigned int mExitCode{}; @@ -898,7 +908,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string return checkInternal(file, cfgname, f); } -void CppCheck::checkPlistOutput(const FileWithDetails& file, const std::vector& files) +void CppCheck::checkPlistOutput(const FileWithDetails& file) { if (!mSettings.plistOutput.empty()) { const bool slashFound = file.spath().find('/') != std::string::npos; @@ -909,7 +919,7 @@ void CppCheck::checkPlistOutput(const FileWithDetails& file, const std::vector {}(file.spath()); filename = mSettings.plistOutput + noSuffixFilename + "_" + std::to_string(fileNameHash) + ".plist"; - mLogger->openPlist(filename, files); + mLogger->openPlist(filename); } } @@ -1000,24 +1010,16 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str if (preprocessor.reportOutput(outputList, true)) return mLogger->exitcode(); - if (!preprocessor.loadFiles(files)) - return mLogger->exitcode(); - - checkPlistOutput(file, files); + checkPlistOutput(file); - std::string dumpProlog; + std::string dumpFooter; if (mSettings.dump || !mSettings.addons.empty()) { - dumpProlog += getDumpFileContentsRawTokens(files, tokens1); + dumpFooter += getDumpFileContentsRawTokensFooter(tokens1); } // Parse comments and then remove them - mLogger->setRemarkComments(preprocessor.getRemarkComments()); + mLogger->addRemarkComments(preprocessor.getRemarkComments()); preprocessor.inlineSuppressions(mSuppressions.nomsg); - if (mSettings.dump || !mSettings.addons.empty()) { - std::ostringstream oss; - mSuppressions.nomsg.dump(oss); - dumpProlog += oss.str(); - } preprocessor.removeComments(); if (!mSettings.buildDir.empty()) { @@ -1040,19 +1042,45 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str } // Get directives - std::list directives = preprocessor.createDirectives(); + std::list directives; + preprocessor.createDirectives(directives); preprocessor.simplifyPragmaAsm(); + std::set configurations; + std::set configDefines = { "__cplusplus" }; + + // Insert library defines + const auto getDefineName = [](const std::string &defineString) { + return defineString.substr(0, defineString.find_first_of("( ")); + }; + std::transform(mSettings.library.defines().begin(), + mSettings.library.defines().end(), + std::inserter(configDefines, configDefines.end()), + getDefineName); + + preprocessor.setLoadCallback([&](simplecpp::FileData &data) { + // Do preprocessing on included file + mLogger->addRemarkComments(preprocessor.getRemarkComments(data.tokens)); + preprocessor.inlineSuppressions(data.tokens, mSuppressions.nomsg); + Preprocessor::removeComments(data.tokens); + Preprocessor::createDirectives(data.tokens, directives); + Preprocessor::simplifyPragmaAsm(data.tokens); + // Discover new configurations from included file + if (configurations.size() < maxConfigs) + preprocessor.getConfigs(data.filename, data.tokens, configDefines, configurations); + }); + preprocessor.setPlatformInfo(); // Get configurations.. - std::set configurations; if (maxConfigs > 1) { Timer::run("Preprocessor::getConfigs", mTimerResults, [&]() { - configurations = preprocessor.getConfigs(); + configurations = { "" }; + preprocessor.getConfigs(configDefines, configurations); + preprocessor.loadFiles(files); }); } else { - configurations.insert(mSettings.userDefines); + configurations = { mSettings.userDefines }; } if (mSettings.checkConfiguration) { @@ -1089,7 +1117,6 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str createDumpFile(mSettings, file, fdump, dumpFile); if (fdump.is_open()) { fdump << getLibraryDumpData(); - fdump << dumpProlog; if (!mSettings.dump) filesDeleter.addFile(dumpFile); } @@ -1259,12 +1286,20 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str } // TODO: will not be closed if we encountered an exception - // dumped all configs, close root element now if (fdump.is_open()) { + // dump all filenames, raw tokens, suppressions + std::string dumpHeader = getDumpFileContentsRawTokensHeader(files); + fdump << getDumpFileContentsRawTokens(dumpHeader, dumpFooter); + mSuppressions.nomsg.dump(fdump); + // dumped all configs, close root element now fdump << "" << std::endl; fdump.close(); } + if (!mSettings.plistOutput.empty()) { + mLogger->setPlistFilenames(std::move(files)); + } + executeAddons(dumpFile, file); } catch (const TerminateException &) { // Analysis is terminated @@ -1892,9 +1927,26 @@ bool CppCheck::isPremiumCodingStandardId(const std::string& id) const { return false; } -std::string CppCheck::getDumpFileContentsRawTokens(const std::vector& files, const simplecpp::TokenList& tokens1) const { +std::string CppCheck::getDumpFileContentsRawTokens(const std::vector& files, const simplecpp::TokenList& tokens1) const +{ + std::string header = getDumpFileContentsRawTokensHeader(files); + std::string footer = getDumpFileContentsRawTokensFooter(tokens1); + return getDumpFileContentsRawTokens(header, footer); +} + +std::string CppCheck::getDumpFileContentsRawTokens(const std::string& header, const std::string& footer) +{ std::string dumpProlog; dumpProlog += " \n"; + dumpProlog += header; + dumpProlog += footer; + dumpProlog += " \n"; + return dumpProlog; +} + +std::string CppCheck::getDumpFileContentsRawTokensHeader(const std::vector& files) const +{ + std::string dumpProlog; for (unsigned int i = 0; i < files.size(); ++i) { dumpProlog += " \n"; } + return dumpProlog; +} + +std::string CppCheck::getDumpFileContentsRawTokensFooter(const simplecpp::TokenList& tokens1) +{ + std::string dumpProlog; for (const simplecpp::Token *tok = tokens1.cfront(); tok; tok = tok->next) { dumpProlog += " location.line); dumpProlog += "\" "; - dumpProlog +="column=\""; + dumpProlog += "column=\""; dumpProlog += std::to_string(tok->location.col); dumpProlog += "\" "; @@ -1923,6 +1981,5 @@ std::string CppCheck::getDumpFileContentsRawTokens(const std::vector contents, this is only public for testing purposes */ std::string getDumpFileContentsRawTokens(const std::vector& files, const simplecpp::TokenList& tokens1) const; + static std::string getDumpFileContentsRawTokens(const std::string& header, const std::string& footer); + std::string getDumpFileContentsRawTokensHeader(const std::vector& files) const; + static std::string getDumpFileContentsRawTokensFooter(const simplecpp::TokenList& tokens1); std::string getLibraryDumpData() const; @@ -183,7 +186,7 @@ class CPPCHECKLIB CppCheck { */ unsigned int checkFile(const FileWithDetails& file, const std::string &cfgname); - void checkPlistOutput(const FileWithDetails& file, const std::vector& files); + void checkPlistOutput(const FileWithDetails& file); /** * @brief Check a file using buffer diff --git a/lib/errorlogger.cpp b/lib/errorlogger.cpp index 3b05a7d5a8f..d58c5abcbba 100644 --- a/lib/errorlogger.cpp +++ b/lib/errorlogger.cpp @@ -821,7 +821,7 @@ std::string ErrorLogger::toxml(const std::string &str) return xml; } -std::string ErrorLogger::plistHeader(const std::string &version, const std::vector &files) +std::string ErrorLogger::plistHeader(const std::string &version) { std::ostringstream ostr; ostr << "\r\n" @@ -829,12 +829,7 @@ std::string ErrorLogger::plistHeader(const std::string &version, const std::vect << "\r\n" << "\r\n" << " clang_version\r\n" - << "cppcheck version " << version << "\r\n" - << " files\r\n" - << " \r\n"; - for (const std::string & file : files) - ostr << " " << ErrorLogger::toxml(file) << "\r\n"; - ostr << " \r\n" + << " cppcheck version " << version << "\r\n" << " diagnostics\r\n" << " \r\n"; return ostr.str(); diff --git a/lib/errorlogger.h b/lib/errorlogger.h index daf683bd0a3..97cc3e7f82e 100644 --- a/lib/errorlogger.h +++ b/lib/errorlogger.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -271,12 +272,19 @@ class CPPCHECKLIB ErrorLogger { */ static std::string toxml(const std::string &str); - static std::string plistHeader(const std::string &version, const std::vector &files); + static std::string plistHeader(const std::string &version); static std::string plistData(const ErrorMessage &msg); - static const char *plistFooter() { - return " \r\n" - "\r\n" - ""; + static std::string plistFooter(const std::vector& files) { + std::ostringstream ostr; + ostr << " \r\n" + << " files\r\n" + << " \r\n"; + for (const std::string& file : files) + ostr << " " << ErrorLogger::toxml(file) << "\r\n"; + ostr << " \r\n" + << "\r\n" + << ""; + return ostr.str(); } static bool isCriticalErrorId(const std::string& id) { diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index 4246da39c83..3e0b33c7f10 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -336,67 +336,49 @@ static void addInlineSuppressions(const simplecpp::TokenList &tokens, const Sett } } -void Preprocessor::inlineSuppressions(SuppressionList &suppressions) +void Preprocessor::inlineSuppressions(SuppressionList &suppressions) const +{ + inlineSuppressions(mTokens, suppressions); +} + +void Preprocessor::inlineSuppressions(const simplecpp::TokenList &tokens, SuppressionList &suppressions) const { if (!mSettings.inlineSuppressions) return; std::list err; - ::addInlineSuppressions(mTokens, mSettings, suppressions, err); - for (const auto &filedata : mFileCache) { - ::addInlineSuppressions(filedata->tokens, mSettings, suppressions, err); - } + ::addInlineSuppressions(tokens, mSettings, suppressions, err); for (const BadInlineSuppression &bad : err) { invalidSuppression(bad.location, bad.errmsg); } } -std::vector Preprocessor::getRemarkComments() const +void Preprocessor::createDirectives(std::list &directives) const { - std::vector ret; - addRemarkComments(mTokens, ret); - for (const auto &filedata : mFileCache) { - addRemarkComments(filedata->tokens, ret); - } - return ret; + createDirectives(mTokens, directives); } -std::list Preprocessor::createDirectives() const +void Preprocessor::createDirectives(const simplecpp::TokenList &tokens, std::list &directives) { - // directive list.. - std::list directives; - - std::vector list; - list.reserve(1U + mFileCache.size()); - list.push_back(&mTokens); - std::transform(mFileCache.cbegin(), mFileCache.cend(), std::back_inserter(list), - [](const std::unique_ptr &filedata) { - return &filedata->tokens; - }); - - for (const simplecpp::TokenList *tokenList : list) { - for (const simplecpp::Token *tok = tokenList->cfront(); tok; tok = tok->next) { - if ((tok->op != '#') || (tok->previous && tok->previous->location.line == tok->location.line)) - continue; - if (tok->next && tok->next->str() == "endfile") + for (const simplecpp::Token *tok = tokens.cfront(); tok; tok = tok->next) { + if ((tok->op != '#') || (tok->previous && tok->previous->location.line == tok->location.line)) + continue; + if (tok->next && tok->next->str() == "endfile") + continue; + Directive directive(tokens, tok->location, ""); + for (const simplecpp::Token *tok2 = tok; tok2 && tok2->location.line == directive.linenr; tok2 = tok2->next) { + if (tok2->comment) continue; - Directive directive(mTokens, tok->location, ""); - for (const simplecpp::Token *tok2 = tok; tok2 && tok2->location.line == directive.linenr; tok2 = tok2->next) { - if (tok2->comment) - continue; - if (!directive.str.empty() && (tok2->location.col > tok2->previous->location.col + tok2->previous->str().size())) - directive.str += ' '; - if (directive.str == "#" && tok2->str() == "file") - directive.str += "include"; - else - directive.str += tok2->str(); - - directive.strTokens.emplace_back(*tok2); - } - directives.push_back(std::move(directive)); + if (!directive.str.empty() && (tok2->location.col > tok2->previous->location.col + tok2->previous->str().size())) + directive.str += ' '; + if (directive.str == "#" && tok2->str() == "file") + directive.str += "include"; + else + directive.str += tok2->str(); + + directive.strTokens.emplace_back(*tok2); } + directives.push_back(std::move(directive)); } - - return directives; } static std::string readcondition(const simplecpp::Token *iftok, const std::set &defined, const std::set &undefined) @@ -769,36 +751,21 @@ static void getConfigs(const simplecpp::TokenList &tokens, std::set ret.insert(std::move(elseError)); } - -std::set Preprocessor::getConfigs() const +void Preprocessor::getConfigs(std::set &defined, std::set &configs) const { - std::set ret = { "" }; if (!mTokens.cfront()) - return ret; - - std::set defined = { "__cplusplus" }; - - // Insert library defines - for (const auto &define : mSettings.library.defines()) { - - const std::string::size_type paren = define.find("("); - const std::string::size_type space = define.find(" "); - std::string::size_type end = space; - - if (paren != std::string::npos && paren < space) - end = paren; - - defined.insert(define.substr(0, end)); - } + return; - ::getConfigs(mTokens, defined, mSettings.userDefines, mSettings.userUndefs, ret); + ::getConfigs(mTokens, defined, mSettings.userDefines, mSettings.userUndefs, configs); +} - for (const auto &filedata : mFileCache) { - if (!mSettings.configurationExcluded(filedata->filename)) - ::getConfigs(filedata->tokens, defined, mSettings.userDefines, mSettings.userUndefs, ret); - } +void Preprocessor::getConfigs(const std::string &filename, const simplecpp::TokenList &tokens, std::set &defined, std::set &configs) const +{ + if (!tokens.cfront()) + return; - return ret; + if (!mSettings.configurationExcluded(filename)) + ::getConfigs(tokens, defined, mSettings.userDefines, mSettings.userUndefs, configs); } static void splitcfg(const std::string &cfgStr, std::list &defines, const std::string &defaultValue) @@ -871,16 +838,18 @@ bool Preprocessor::loadFiles(std::vector &files) const simplecpp::DUI dui = createDUI(mSettings, "", mLang); simplecpp::OutputList outputList; - mFileCache = simplecpp::load(mTokens, files, dui, &outputList); + mFileCache = simplecpp::load(mTokens, files, dui, &outputList, std::move(mFileCache)); return !handleErrors(outputList); } void Preprocessor::removeComments() { - mTokens.removeComments(); - for (const auto &filedata : mFileCache) { - filedata->tokens.removeComments(); - } + removeComments(mTokens); +} + +void Preprocessor::removeComments(simplecpp::TokenList &tokens) +{ + tokens.removeComments(); } void Preprocessor::setPlatformInfo() @@ -1016,12 +985,12 @@ static std::string simplecppErrToId(simplecpp::Output::Type type) cppcheck::unreachable(); } -void Preprocessor::error(const simplecpp::Location& loc, const std::string &msg, simplecpp::Output::Type type) +void Preprocessor::error(const simplecpp::Location& loc, const std::string &msg, simplecpp::Output::Type type) const { error(loc, msg, simplecppErrToId(type)); } -void Preprocessor::error(const simplecpp::Location& loc, const std::string &msg, const std::string& id) +void Preprocessor::error(const simplecpp::Location& loc, const std::string &msg, const std::string& id) const { std::list locationList; if (!mTokens.file(loc).empty()) { @@ -1059,7 +1028,7 @@ void Preprocessor::missingInclude(const simplecpp::Location& loc, const std::str mErrorLogger.reportErr(errmsg); } -void Preprocessor::invalidSuppression(const simplecpp::Location& loc, const std::string &msg) +void Preprocessor::invalidSuppression(const simplecpp::Location& loc, const std::string &msg) const { error(loc, msg, "invalidSuppression"); } @@ -1143,13 +1112,10 @@ std::size_t Preprocessor::calculateHash(const std::string &toolinfo) const void Preprocessor::simplifyPragmaAsm() { - Preprocessor::simplifyPragmaAsmPrivate(mTokens); - for (const auto &filedata : mFileCache) { - Preprocessor::simplifyPragmaAsmPrivate(filedata->tokens); - } + simplifyPragmaAsm(mTokens); } -void Preprocessor::simplifyPragmaAsmPrivate(simplecpp::TokenList &tokenList) +void Preprocessor::simplifyPragmaAsm(simplecpp::TokenList &tokenList) { // assembler code.. for (simplecpp::Token *tok = tokenList.front(); tok; tok = tok->next) { @@ -1196,9 +1162,15 @@ void Preprocessor::simplifyPragmaAsmPrivate(simplecpp::TokenList &tokenList) } } +std::vector Preprocessor::getRemarkComments() const +{ + return getRemarkComments(mTokens); +} -void Preprocessor::addRemarkComments(const simplecpp::TokenList &tokens, std::vector &remarkComments) const +std::vector Preprocessor::getRemarkComments(const simplecpp::TokenList &tokens) const { + std::vector remarkComments; + for (const simplecpp::Token *tok = tokens.cfront(); tok; tok = tok->next) { if (!tok->comment) continue; @@ -1245,4 +1217,6 @@ void Preprocessor::addRemarkComments(const simplecpp::TokenList &tokens, std::ve // Add the suppressions. remarkComments.emplace_back(relativeFilename, remarkedToken->location.line, remarkText); } + + return remarkComments; } diff --git a/lib/preprocessor.h b/lib/preprocessor.h index ba4d55a1e60..3a5a8393a3e 100644 --- a/lib/preprocessor.h +++ b/lib/preprocessor.h @@ -98,24 +98,36 @@ class CPPCHECKLIB RemarkComment { * configurations that exist in a source file. */ class CPPCHECKLIB WARN_UNUSED Preprocessor { + friend class TestPreprocessor; + public: /** character that is inserted in expanded macros */ static char macroChar; Preprocessor(simplecpp::TokenList& tokens, const Settings& settings, ErrorLogger &errorLogger, Standards::Language lang); - void inlineSuppressions(SuppressionList &suppressions); + void inlineSuppressions(SuppressionList &suppressions) const; + + void inlineSuppressions(const simplecpp::TokenList &tokens, SuppressionList &suppressions) const; + + void createDirectives(std::list &directives) const; - std::list createDirectives() const; + static void createDirectives(const simplecpp::TokenList &tokens, std::list &directives); - std::set getConfigs() const; + void getConfigs(std::set &defined, std::set &configs) const; + + void getConfigs(const std::string &filename, const simplecpp::TokenList &tokens, std::set &defined, std::set &configs) const; std::vector getRemarkComments() const; + std::vector getRemarkComments(const simplecpp::TokenList &tokens) const; + bool loadFiles(std::vector &files); void removeComments(); + static void removeComments(simplecpp::TokenList &tokens); + void setPlatformInfo(); simplecpp::TokenList preprocess(const std::string &cfgStr, std::vector &files, simplecpp::OutputList& outputList); @@ -132,6 +144,8 @@ class CPPCHECKLIB WARN_UNUSED Preprocessor { void simplifyPragmaAsm(); + static void simplifyPragmaAsm(simplecpp::TokenList &tokenList); + static void getErrorMessages(ErrorLogger &errorLogger, const Settings &settings); /** @@ -141,12 +155,15 @@ class CPPCHECKLIB WARN_UNUSED Preprocessor { const simplecpp::Output* reportOutput(const simplecpp::OutputList &outputList, bool showerror); - void error(const simplecpp::Location& loc, const std::string &msg, simplecpp::Output::Type type); + void error(const simplecpp::Location& loc, const std::string &msg, simplecpp::Output::Type type) const; const simplecpp::Output* handleErrors(const simplecpp::OutputList &outputList); + void setLoadCallback(simplecpp::FileDataCache::load_callback_type cb) { + mFileCache.set_load_callback(std::move(cb)); + } + private: - static void simplifyPragmaAsmPrivate(simplecpp::TokenList &tokenList); /** * Include file types. @@ -157,18 +174,14 @@ class CPPCHECKLIB WARN_UNUSED Preprocessor { }; void missingInclude(const simplecpp::Location& loc, const std::string &header, HeaderTypes headerType); - void invalidSuppression(const simplecpp::Location& loc, const std::string &msg); - void error(const simplecpp::Location& loc, const std::string &msg, const std::string& id); - - void addRemarkComments(const simplecpp::TokenList &tokens, std::vector &remarkComments) const; + void invalidSuppression(const simplecpp::Location& loc, const std::string &msg) const; + void error(const simplecpp::Location& loc, const std::string &msg, const std::string& id) const; simplecpp::TokenList& mTokens; const Settings& mSettings; ErrorLogger &mErrorLogger; - /** list of all directives met while preprocessing file */ - simplecpp::FileDataCache mFileCache; /** filename for cpp/c file - useful when reporting errors */ diff --git a/test/cli/performance_test.py b/test/cli/performance_test.py index 55da3b3b04e..5be958619fc 100644 --- a/test/cli/performance_test.py +++ b/test/cli/performance_test.py @@ -3,6 +3,7 @@ import os import sys +import time import pytest @@ -413,3 +414,27 @@ class C { } }""") cppcheck([filename]) # should not take more than ~1 second + + +@pytest.mark.timeout(60) +def test_slow_many_headers(tmpdir): + # 14113 + c_file = os.path.join(tmpdir, 'source.c') + h_file = os.path.join(tmpdir, 'header.h') + n_hdr = 128 + with open(c_file, 'wt') as f: + f.write('#include "header.h"\n') + with open(h_file, 'wt') as f: + for i in range(n_hdr): + f.write(f'#ifdef CONFIG{i}\n#include "header{i}.h"\n#endif\n') + for i in range(n_hdr): + h_file_i = os.path.join(tmpdir, f"header{i}.h") + with open(h_file_i, 'wt') as f: + for j in range(2048): + f.write(f'#define MACRO{j}{(" "+str(j))*128}\n') + f.write(f'MACRO{i}\n') + # creating the files used for testing can be slow, so we use perf counter here instead + start = time.perf_counter_ns() + cppcheck(['-DCONFIG0', c_file]) + end = time.perf_counter_ns() + assert end - start < 2 * 10**9 # max 2 sec diff --git a/test/helpers.cpp b/test/helpers.cpp index 252658cc531..70437207a84 100644 --- a/test/helpers.cpp +++ b/test/helpers.cpp @@ -124,7 +124,8 @@ void SimpleTokenizer2::preprocess(const char* code, std::size_t size, std::vecto // Tokenizer.. tokenizer.list.createTokens(std::move(tokens2)); - std::list directives = preprocessor.createDirectives(); + std::list directives; + preprocessor.createDirectives(directives); tokenizer.setDirectives(std::move(directives)); } diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index 84db6db6c28..17c5b8eff3c 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -527,7 +527,6 @@ class TestCppcheck : public TestFixture { void checkPlistOutput() const { Suppressions supprs; ErrorLogger2 errorLogger; - std::vector files = {"textfile.txt"}; { const auto s = dinit(Settings, $.templateFormat = templateFormat, $.plistOutput = "output"); @@ -535,7 +534,7 @@ class TestCppcheck : public TestFixture { CppCheck cppcheck(s, supprs, errorLogger, nullptr, false, {}); const FileWithDetails fileWithDetails {file.path(), Path::identify(file.path(), false), 0}; - cppcheck.checkPlistOutput(fileWithDetails, files); + cppcheck.checkPlistOutput(fileWithDetails); const std::string outputFile {"outputfile_" + std::to_string(std::hash {}(fileWithDetails.spath())) + ".plist"}; ASSERT(Path::exists(outputFile)); std::remove(outputFile.c_str()); @@ -547,7 +546,7 @@ class TestCppcheck : public TestFixture { CppCheck cppcheck(s, supprs, errorLogger, nullptr, false, {}); const FileWithDetails fileWithDetails {file.path(), Path::identify(file.path(), false), 0}; - cppcheck.checkPlistOutput(fileWithDetails, files); + cppcheck.checkPlistOutput(fileWithDetails); const std::string outputFile {"outputfile_" + std::to_string(std::hash {}(fileWithDetails.spath())) + ".plist"}; ASSERT(Path::exists(outputFile)); std::remove(outputFile.c_str()); @@ -557,7 +556,7 @@ class TestCppcheck : public TestFixture { Settings s; const ScopedFile file("file.c", ""); CppCheck cppcheck(s, supprs, errorLogger, nullptr, false, {}); - cppcheck.checkPlistOutput(FileWithDetails(file.path(), Path::identify(file.path(), false), 0), files); + cppcheck.checkPlistOutput(FileWithDetails(file.path(), Path::identify(file.path(), false), 0)); } } diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index b90a879738d..5da298a2714 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -32,7 +32,9 @@ #include "fixture.h" #include "helpers.h" +#include #include +#include #include #include #include @@ -137,8 +139,11 @@ class TestPreprocessor : public TestFixture { preprocessor.simplifyPragmaAsm(); std::map cfgcode; - if (cfgs.empty()) - cfgs = preprocessor.getConfigs(); + if (cfgs.empty()) { + cfgs.insert(""); + std::set configDefines = { "__cplusplus" }; + preprocessor.getConfigs(configDefines, cfgs); + } for (const std::string & config : cfgs) { try { const bool writeLocations = (strstr(code, "#include") != nullptr); @@ -368,6 +373,8 @@ class TestPreprocessor : public TestFixture { TEST_CASE(testMissingIncludeMixed); TEST_CASE(testMissingIncludeCheckConfig); + TEST_CASE(testLazyInclude); + TEST_CASE(hasInclude); TEST_CASE(limitsDefines); @@ -394,10 +401,23 @@ class TestPreprocessor : public TestFixture { simplecpp::OutputList outputList; simplecpp::TokenList tokens(code,files,"test.c",&outputList); Preprocessor preprocessor(tokens, settings, *this, Standards::Language::C); + std::set configs = { "" }; + std::set configDefines = { "__cplusplus" }; + const auto getDefineName = [](const std::string &defineString) { + return defineString.substr(0, defineString.find_first_of("( ")); + }; + std::transform(settings.library.defines().begin(), + settings.library.defines().end(), + std::inserter(configDefines, configDefines.end()), + getDefineName); + preprocessor.setLoadCallback([&](simplecpp::FileData &data) { + Preprocessor::removeComments(data.tokens); + preprocessor.getConfigs(data.filename, data.tokens, configDefines, configs); + }); + preprocessor.removeComments(); + preprocessor.getConfigs(configDefines, configs); ASSERT(preprocessor.loadFiles(files)); ASSERT(!preprocessor.reportOutput(outputList, true)); - preprocessor.removeComments(); - const std::set configs = preprocessor.getConfigs(); std::string ret; for (const std::string & config : configs) ret += config + '\n'; @@ -409,8 +429,11 @@ class TestPreprocessor : public TestFixture { std::vector files; simplecpp::TokenList tokens(code,files,"test.c"); Preprocessor preprocessor(tokens, settingsDefault, *this, Standards::Language::C); - ASSERT(preprocessor.loadFiles(files)); + preprocessor.setLoadCallback([](simplecpp::FileData &data) { + Preprocessor::removeComments(data.tokens); + }); preprocessor.removeComments(); + ASSERT(preprocessor.loadFiles(files)); return preprocessor.calculateHash(""); } @@ -3033,6 +3056,36 @@ class TestPreprocessor : public TestFixture { "test.c:11:2: information: Include file: <" + missing4 + "> not found. Please note: Standard library headers do not need to be provided to get proper results. [missingIncludeSystem]\n", errout_str()); } + void testLazyInclude() { + const char *code = "#ifdef CONFIG1\n" + "#include \"header1.h\"\n" + "#include \"missing1.h\"\n" + "#else\n" + "#include \"header2.h\"\n" + "#include \"missing2.h\"\n" + "#endif\n"; + + std::vector files; + simplecpp::TokenList tokens(code, files, "test.c"); + + ScopedFile header1("header1.h", "1"); + ScopedFile header2("header2.h", "2"); + + Settings settings; + Preprocessor preprocessor(tokens, settings, *this, Standards::Language::CPP); + + simplecpp::OutputList outputList; + simplecpp::TokenList tokens2 = preprocessor.preprocess("CONFIG1", files, outputList); + std::string out = tokens2.stringify(); + + const simplecpp::FileDataCache &cache = preprocessor.mFileCache; + + ASSERT_EQUALS("\n#line 1 \"header1.h\"\n1", out); + ASSERT_EQUALS(1, outputList.size()); + ASSERT_EQUALS("Header not found: \"missing1.h\"", outputList.begin()->msg); + ASSERT_EQUALS(1, cache.size()); + } + void hasInclude() { const char code[] = "#if __has_include()\n123\n#endif"; Settings settings; diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 167d5411553..0617007744a 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -603,9 +603,13 @@ class TestTokenizer : public TestFixture { std::vector files; simplecpp::TokenList tokens1(code, files, filename, &outputList); Preprocessor preprocessor(tokens1, settings, *this, Path::identify(tokens1.getFiles()[0], false)); - (void)preprocessor.reportOutput(outputList, true); + std::list directives; + preprocessor.setLoadCallback([&](const simplecpp::FileData &data) { + Preprocessor::createDirectives(data.tokens, directives); + }); + preprocessor.createDirectives(directives); ASSERT(preprocessor.loadFiles(files)); - std::list directives = preprocessor.createDirectives(); + (void)preprocessor.reportOutput(outputList, true); TokenList tokenlist{settings, Path::identify(filename, false)}; Tokenizer tokenizer(std::move(tokenlist), *this); From 4517bc76720511a5e832803931fa4b1ce2ee8917 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:27:36 +0200 Subject: [PATCH 127/171] Fix #14888 FP functionConst with array to pointer decay (#8696) Co-authored-by: chrchr-github --- lib/checkclass.cpp | 9 ++++++--- test/testclass.cpp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index e04df8b5748..51d5718159f 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -2608,9 +2608,12 @@ bool CheckClassImpl::checkConstFunc(const Scope *scope, const Function *func, Me return false; } else { if (lhs->isAssignmentOp()) { - const Variable* lhsVar = lhs->previous()->variable(); - if (lhsVar && !lhsVar->isConst() && lhsVar->isReference() && lhs == lhsVar->nameToken()->next()) - return false; + if (const Variable* lhsVar = lhs->previous()->variable()) { + if (!lhsVar->isConst() && lhsVar->isReference() && lhs == lhsVar->nameToken()->next()) + return false; + if (lhsVar->isPointer() && v && v->isArray() && !(lhsVar->valueType() && lhsVar->valueType()->isConst(/*indirect*/ 1))) + return false; + } } } diff --git a/test/testclass.cpp b/test/testclass.cpp index ae5068dcb9d..1d647eb33a1 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -196,6 +196,7 @@ class TestClass : public TestFixture { TEST_CASE(const99); TEST_CASE(const100); TEST_CASE(const101); + TEST_CASE(const102); TEST_CASE(const_handleDefaultParameters); TEST_CASE(const_passThisToMemberOfOtherClass); @@ -6998,6 +6999,22 @@ class TestClass : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void const102() { + checkConst("struct S {\n" // #14888 + " void f() {\n" + " int *p = a;\n" + " *p = 0;\n" + " }\n" + " void g() {\n" + " const int *p = a;\n" + " if (*p) {}\n" + " }\n" + " int a[3];\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:6:10]: (style, inconclusive) Technically the member function 'S::g' can be const. [functionConst]\n", + errout_str()); + } + void const_handleDefaultParameters() { checkConst("struct Foo {\n" " void foo1(int i, int j = 0) {\n" From b555588b969640a77c655fbdb177dd9c763ebf62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 Jul 2026 08:38:33 +0200 Subject: [PATCH 128/171] implement Path::getCurrentExecutablePath for Haiku (#8677) --- lib/path.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/path.cpp b/lib/path.cpp index c4758dfeae9..fc059cdea4e 100644 --- a/lib/path.cpp +++ b/lib/path.cpp @@ -51,6 +51,8 @@ #endif #if defined(__APPLE__) #include +#elif defined(__HAIKU__) +#include #endif @@ -158,6 +160,17 @@ std::string Path::getCurrentExecutablePath(const char* fallback) #elif defined(__APPLE__) uint32_t size = sizeof(buf); success = (_NSGetExecutablePath(buf, &size) == 0); +#elif defined(__HAIKU__) + int32 cookie = 0; + image_info info; + while (get_next_image_info(B_CURRENT_TEAM, &cookie, &info) == B_OK) + { + if (info.type == B_APP_IMAGE) + { + break; + } + } + return std::string(info.name); #else const char* procPath = #ifdef __SVR4 // Solaris From 592e7b7c29eee72ec0882fe9867b51d3de44fe46 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 9 Jul 2026 08:49:30 +0200 Subject: [PATCH 129/171] Fix #14890 fuzzing timeout (hang) in Tokenizer::simplifyTypedef() (#8706) Co-authored-by: chrchr-github --- lib/tokenize.cpp | 20 +++++++++++-------- ...t-5e798df7f1bc86caef9901d6662319a4d636f269 | 1 + 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 test/cli/fuzz-timeout/timeout-5e798df7f1bc86caef9901d6662319a4d636f269 diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 3046bea69cc..d2ad6f581e7 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9145,14 +9145,18 @@ void Tokenizer::findGarbageCode() const } if (!tok2->next() || tok2->isControlFlowKeyword() || Token::Match(tok2, "typedef|static|.")) syntaxError(tok); - if (Token::Match(tok2, "%name% %name%") && tok2->str() == tok2->strAt(1)) { - if (Token::simpleMatch(tok2->tokAt(2), ";")) - continue; - if (tok2->isStandardType() && tok2->str() == "long") - continue; - if (Token::Match(tok2->tokAt(-1), "enum|struct|union") || (isCPP() && Token::Match(tok2->tokAt(-1), "class|::"))) - continue; - syntaxError(tok2); + if (Token::Match(tok2, "%name% %name%")) { + if (tok2->str() == tok2->strAt(1)) { + if (Token::simpleMatch(tok2->tokAt(2), ";")) + continue; + if (tok2->isStandardType() && tok2->str() == "long") + continue; + if (Token::Match(tok2->tokAt(-1), "enum|struct|union") || (isCPP() && Token::Match(tok2->tokAt(-1), "class|::"))) + continue; + syntaxError(tok2); + } + if (Token::Match(tok2->tokAt(2), "%name%") && tok2->isNameOnly() && tok2->tokAt(1)->isNameOnly() && tok2->tokAt(2)->isNameOnly()) + syntaxError(tok2); } } } diff --git a/test/cli/fuzz-timeout/timeout-5e798df7f1bc86caef9901d6662319a4d636f269 b/test/cli/fuzz-timeout/timeout-5e798df7f1bc86caef9901d6662319a4d636f269 new file mode 100644 index 00000000000..35e56badcc8 --- /dev/null +++ b/test/cli/fuzz-timeout/timeout-5e798df7f1bc86caef9901d6662319a4d636f269 @@ -0,0 +1 @@ +typedef consted e,{} From a05554448f3724b7e4f33a5a727b23f74702b951 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Thu, 9 Jul 2026 01:50:44 -0500 Subject: [PATCH 130/171] Fix 14895: FP knownConditionTrueFalse: regression related to ' Partial fix for 9049: False negative: uninitialized variable with nested ifs (#8680)' (#8701) Co-authored-by: Your Name --- lib/forwardanalyzer.cpp | 5 +++++ test/testvalueflow.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 727c64b076d..ced1cfbda8d 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -395,6 +395,11 @@ namespace { bool structuralUnknown = false; const bool structuralEscape = isEscapeScope(branch.endBlock, structuralUnknown); branch.escapeUnknown = !structuralEscape || structuralUnknown; + // The traversal stopped at the escape, so the rest of the scope was not walked; a + // fall-through path could still modify the value there - include the whole scope's + // actions so isModified() sees it. + if (branch.escapeUnknown) + branch.action |= analyzeScope(branch.endBlock); } else { // Detect an escape the traversal did not flag (e.g. an unknown noreturn call); // escapeUnknown reports a possible (unknown) escape. diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 888710ce57d..8a0d181900d 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -3214,6 +3214,38 @@ class TestValueFlow : public TestFixture { " return x;\n" "}\n"; ASSERT_EQUALS(true, testValueOfXKnown(code, 3U, 0)); + + code = "bool f();\n" // a modification after a conditional escape must still be seen + "void g() {\n" + " bool x = false;\n" + " if (f()) {\n" + " if (f()) return;\n" + " if (f()) x = true;\n" + " }\n" + " if (x) {}\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfX(code, 8U, 0)); + ASSERT_EQUALS(false, testValueOfXKnown(code, 8U, 0)); + + code = "bool f();\n" + "void g() {\n" + " bool x = false;\n" + " if (f()) {\n" + " if (f()) return;\n" + " x = true;\n" + " }\n" + " if (x) {}\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfX(code, 8U, 0)); + ASSERT_EQUALS(false, testValueOfXKnown(code, 8U, 0)); + + code = "bool f();\n" // the branch always escapes - keep the known value + "void g() {\n" + " bool x = false;\n" + " if (f()) { x = true; return; }\n" + " if (x) {}\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXKnown(code, 5U, 0)); } void valueFlowAfterSwap() From 376b31e0fac39db72295171d8b386c48daf6e2e8 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 9 Jul 2026 08:51:19 +0200 Subject: [PATCH 131/171] Partial fix for #14859 FN bufferAccessOutOfBounds (memset on std::vector) (#8690) --- lib/checkbufferoverrun.cpp | 28 +++++++++++++++++++++------- lib/checkbufferoverrun.h | 2 +- test/testbufferoverrun.cpp | 6 ++++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index c72db22a68c..d28ac7c64f7 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -65,7 +65,10 @@ static const CWE CWE_BUFFER_OVERRUN(788U); // Access of Memory Location After static const ValueFlow::Value *getBufferSizeValue(const Token *tok) { const std::list &tokenValues = tok->values(); - const auto it = std::find_if(tokenValues.cbegin(), tokenValues.cend(), std::mem_fn(&ValueFlow::Value::isBufferSizeValue)); + auto it = std::find_if(tokenValues.cbegin(), tokenValues.cend(), std::mem_fn(&ValueFlow::Value::isBufferSizeValue)); + if (it != tokenValues.cend()) + return &*it; + it = std::find_if(tokenValues.cbegin(), tokenValues.cend(), std::mem_fn(&ValueFlow::Value::isContainerSizeValue)); return it == tokenValues.cend() ? nullptr : &*it; } @@ -552,7 +555,7 @@ void CheckBufferOverrunImpl::pointerArithmeticError(const Token *tok, const Toke //--------------------------------------------------------------------------- -ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok) const +ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok, const Settings& settings) const { if (!bufTok->valueType()) return ValueFlow::Value(-1); @@ -569,9 +572,20 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok) cons const Variable *var = bufTok->variable(); if (!var || var->dimensions().empty()) { - const ValueFlow::Value *value = getBufferSizeValue(bufTok); - if (value) - return *value; + if (const ValueFlow::Value *value = getBufferSizeValue(bufTok)) { + if (value->isBufferSizeValue()) + return *value; + if (value->isContainerSizeValue() && bufTok->valueType() && bufTok->valueType()->container) { + const ValueType vtElement = ValueType::parseDecl(bufTok->valueType()->containerTypeToken, settings); + const size_t elementSize = vtElement.getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); + if (elementSize > 0) { + ValueFlow::Value bufSizeVal; + bufSizeVal.valueType = ValueFlow::Value::ValueType::BUFFER_SIZE; + bufSizeVal.intvalue = value->intvalue * elementSize; + return bufSizeVal; + } + } + } } if (!var || var->isPointer() || (astIsContainer(bufTok) && var->getTypeName() != "std::array")) @@ -671,7 +685,7 @@ void CheckBufferOverrunImpl::bufferOverflow() if (argtok->valueType() && argtok->valueType()->pointer == 0) continue; // TODO: strcpy(buf+10, "hello"); - const ValueFlow::Value bufferSize = getBufferSize(argtok); + const ValueFlow::Value bufferSize = getBufferSize(argtok, mSettings); if (bufferSize.intvalue <= 0) continue; // buffer size == 1 => do not warn for dynamic memory @@ -782,7 +796,7 @@ void CheckBufferOverrunImpl::stringNotZeroTerminated() const Token *sizeToken = args[2]; if (!sizeToken->hasKnownIntValue()) continue; - const ValueFlow::Value &bufferSize = getBufferSize(args[0]); + const ValueFlow::Value &bufferSize = getBufferSize(args[0], mSettings); if (bufferSize.intvalue < 0 || sizeToken->getKnownIntValue() < bufferSize.intvalue) continue; if (Token::simpleMatch(args[1], "(") && Token::simpleMatch(args[1]->astOperand1(), ". c_str") && args[1]->astOperand1()->astOperand1()) { diff --git a/lib/checkbufferoverrun.h b/lib/checkbufferoverrun.h index b0e8b28eba0..b9b82c897e0 100644 --- a/lib/checkbufferoverrun.h +++ b/lib/checkbufferoverrun.h @@ -129,7 +129,7 @@ class CPPCHECKLIB CheckBufferOverrunImpl : public CheckImpl void objectIndex(); void objectIndexError(const Token *tok, const ValueFlow::Value *v, bool known); - ValueFlow::Value getBufferSize(const Token *bufTok) const; + ValueFlow::Value getBufferSize(const Token *bufTok, const Settings& settings) const; // CTU static bool isCtuUnsafeBufferUsage(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *offset, int type); diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 387a0eeea8a..f9e55910c01 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -3545,6 +3545,12 @@ class TestBufferOverrun : public TestFixture { " std::memset(&buf[0], 0, 25);\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("void f() {\n" // #14859 + " std::vector buf(25);\n" + " std::memset(&buf[0], 0, 26);\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:3:17]: (error) Buffer is accessed out of bounds: &buf[0] [bufferAccessOutOfBounds]\n", errout_str()); } void buffer_overrun_errorpath() { From 41e87ac9fd291442b9e39958e4c19558c1e7a07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 10 Jul 2026 16:03:06 +0200 Subject: [PATCH 132/171] compilerDefinitions.cmake: fixed typo in if condition (#8709) fixes compiler error with libc++ on recent clang versions: ``` /usr/bin/../include/c++/v1/__configuration/hardening.h:25:4: error: "_LIBCPP_ENABLE_ASSERTIONS has been removed, please use _LIBCPP_HARDENING_MODE= instead (see docs)" 25 | # error "_LIBCPP_ENABLE_ASSERTIONS has been removed, please use _LIBCPP_HARDENING_MODE= instead (see docs)" | ^ ``` --- cmake/compilerDefinitions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/compilerDefinitions.cmake b/cmake/compilerDefinitions.cmake index 5f03b83dcee..3daf0e7ba87 100644 --- a/cmake/compilerDefinitions.cmake +++ b/cmake/compilerDefinitions.cmake @@ -20,7 +20,7 @@ endif() if ((USE_LIBCXX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") if(CPPCHK_GLIBCXX_DEBUG AND CMAKE_BUILD_TYPE STREQUAL "Debug") # TODO: determine proper version for AppleClang - current value is based on the oldest version avaialble in CI - if((CMAKE_CXX_COMPILER_ID STREQUALS "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 18) OR + if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 18) OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17)) add_definitions(-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG) else() From b839fa5a914e1ecf7db0195ae34559ecfe867acc Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Fri, 10 Jul 2026 15:55:28 -0500 Subject: [PATCH 133/171] Fix issue 14892: Inconsistent nullPointerOutOfResources after possible noreturn function (#8700) Co-authored-by: Your Name --- lib/forwardanalyzer.cpp | 48 ++++++++++++++++++++++++------------ lib/valueflow.cpp | 23 ++++++++++++++--- test/testnullpointer.cpp | 53 ++++++++++++++++++++++++++++++++++++++++ test/testvalueflow.cpp | 38 ++++++++++++++++++++++++++++ 4 files changed, 143 insertions(+), 19 deletions(-) diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index ced1cfbda8d..368ac761a53 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -412,6 +412,27 @@ namespace { return p; } + // Update the branch that the evaluated condition takes + Progress updateTakenBranch(Branch& branch, const Token* skippedBlock, const Token* condTok, int depth) + { + // The condition is only "known" because of an earlier assumption, so the + // skipped block could still modify the value -> lower to possible + if (!condTok->hasKnownIntValue() && skippedBlock && analyzeScope(skippedBlock).isModified() && + !analyzer->lowerToPossible()) + return Break(Analyzer::Terminate::Bail); + if (!branch.endBlock) + return Progress::Continue; + updateScopeState(branch.endBlock); + if (updateBranch(branch, depth - 1) == Progress::Break) + return Progress::Break; + // The branch was entered because of the tracked value; if it might not + // return (it ends in a call to an unknown, possibly noreturn function) + // then the value might not flow past the branch. + if (!condTok->hasKnownIntValue() && !branch.escape && branch.escapeUnknown && !analyzer->lowerToInconclusive()) + return Break(Analyzer::Terminate::Bail); + return Progress::Continue; + } + bool reentersLoop(Token* endBlock, const Token* condTok, const Token* stepTok) const { if (!condTok) return true; @@ -563,16 +584,21 @@ namespace { return updateLoop(endToken, endBlock, condTok, initTok, stepTok, true); } - Progress updateScope(Token* endBlock, int depth = 20) + void updateScopeState(const Token* endBlock) { - if (!endBlock) - return Break(); assert(endBlock->link()); - Token* ctx = endBlock->link()->previous(); + const Token* ctx = endBlock->link()->previous(); if (Token::simpleMatch(ctx, ")")) ctx = ctx->link()->previous(); if (ctx) analyzer->updateState(ctx); + } + + Progress updateScope(Token* endBlock, int depth = 20) + { + if (!endBlock) + return Break(); + updateScopeState(endBlock); return updateRange(endBlock->link(), endBlock, depth); } @@ -743,19 +769,11 @@ namespace { const bool hasElse = Token::simpleMatch(endBlock, "} else {"); tok = hasElse ? endBlock->linkAt(2) : endBlock; if (thenBranch.check) { - // The condition is only "known" because of an earlier assumption, so the - // skipped else block could still modify the value -> lower to possible - if (!condTok->hasKnownIntValue() && hasElse && - analyzeScope(elseBranch.endBlock).isModified() && !analyzer->lowerToPossible()) - return Break(Analyzer::Terminate::Bail); - if (updateScope(thenBranch.endBlock, depth - 1) == Progress::Break) + if (updateTakenBranch(thenBranch, hasElse ? elseBranch.endBlock : nullptr, condTok, depth) == + Progress::Break) return Break(); } else if (elseBranch.check) { - // Likewise the skipped then block could still modify the value - if (!condTok->hasKnownIntValue() && analyzeScope(thenBranch.endBlock).isModified() && - !analyzer->lowerToPossible()) - return Break(Analyzer::Terminate::Bail); - if (elseBranch.endBlock && updateScope(elseBranch.endBlock, depth - 1) == Progress::Break) + if (updateTakenBranch(elseBranch, thenBranch.endBlock, condTok, depth) == Progress::Break) return Break(); } else { const bool conditional = stopOnCondition(condTok); diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index ef81fc772ac..8c77b17cf94 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -4650,6 +4650,14 @@ struct ConditionHandler { }); } + static void lowerToInconclusive(std::list& values) + { + for (ValueFlow::Value& v : values) { + if (!v.isImpossible()) + v.setInconclusive(); + } + } + void afterCondition(TokenList& tokenlist, const SymbolDatabase& symboldatabase, ErrorLogger& errorLogger, @@ -4882,10 +4890,13 @@ struct ConditionHandler { else if (!dead_if) dead_if = isReturnScope(after, settings.library, &unknownFunction); + // If the taken branch might not return (it ends in a call to an unknown, + // possibly noreturn function) then its values might not flow past the + // conditional code -> lower them to inconclusive. if (!dead_if && unknownFunction) { if (settings.debugwarnings) bailout(tokenlist, errorLogger, unknownFunction, "possible noreturn scope"); - return; + lowerToInconclusive(thenValues); } if (Token::simpleMatch(after, "} else {")) { @@ -4896,7 +4907,7 @@ struct ConditionHandler { if (!dead_else && unknownFunction) { if (settings.debugwarnings) bailout(tokenlist, errorLogger, unknownFunction, "possible noreturn scope"); - return; + lowerToInconclusive(elseValues); } } @@ -4912,11 +4923,15 @@ struct ConditionHandler { std::copy_if(thenValues.cbegin(), thenValues.cend(), std::back_inserter(values), - std::mem_fn(&ValueFlow::Value::isPossible)); + [](const ValueFlow::Value& v) { + return v.isPossible() || v.isInconclusive(); + }); std::copy_if(elseValues.cbegin(), elseValues.cend(), std::back_inserter(values), - std::mem_fn(&ValueFlow::Value::isPossible)); + [](const ValueFlow::Value& v) { + return v.isPossible() || v.isInconclusive(); + }); } if (values.empty()) diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 2483a967947..02810906fb2 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -4468,6 +4468,59 @@ class TestNullPointer : public TestFixture { "[test.cpp:3:13]: (warning) If resource allocation fails, then there is a possible null pointer dereference: fid [nullPointerOutOfResources]\n" "[test.cpp:4:12]: (warning) If resource allocation fails, then there is a possible null pointer dereference: fid [nullPointerOutOfResources]\n", errout_str()); + + // the guard might call an unknown, possibly noreturn function -> no warning + check("void f() {\n" + " FILE* fid = fopen(\"x.txt\", \"w\");\n" + " if (fid == NULL)\n" + " g();\n" + " fclose(fid);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // .. but an inconclusive warning is reported with --inconclusive + check("void f() {\n" + " FILE* fid = fopen(\"x.txt\", \"w\");\n" + " if (fid == NULL)\n" + " g();\n" + " fclose(fid);\n" + "}\n", + dinit(CheckOptions, $.inconclusive = true)); + ASSERT_EQUALS( + "[test.cpp:5:12]: (warning, inconclusive) If resource allocation fails, then there is a possible null pointer dereference: fid [nullPointerOutOfResources]\n", + errout_str()); + + check("int f(const int* p) {\n" + " if (p == nullptr)\n" + " g();\n" + " return *p;\n" + "}\n", + dinit(CheckOptions, $.inconclusive = true)); + ASSERT_EQUALS( + "[test.cpp:2:11] -> [test.cpp:4:13]: (warning, inconclusive) Either the condition 'p==nullptr' is redundant or there is possible null pointer dereference: p. [nullPointerRedundantCheck]\n", + errout_str()); + + check("void f() {\n" + " FILE* fid = fopen(\"x.txt\", \"w\");\n" + " if (fid != NULL)\n" + " ;\n" + " else\n" + " g();\n" + " fclose(fid);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // guard function is known to return -> warning + check("void g() {}\n" + "void f() {\n" + " FILE* fid = fopen(\"x.txt\", \"w\");\n" + " if (fid == NULL)\n" + " g();\n" + " fclose(fid);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:6:12]: (warning) If resource allocation fails, then there is a possible null pointer dereference: fid [nullPointerOutOfResources]\n", + errout_str()); } void functioncalllibrary() { diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 8a0d181900d..1f144900c4d 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -3866,6 +3866,44 @@ class TestValueFlow : public TestFixture { " return x;\n" "}\n"; ASSERT_EQUALS(true, testValueOfX(code, 4U, 0)); + + // if the guarded block calls an unknown, possibly noreturn function + // then the condition value is lowered to inconclusive after the block + code = "int f(int x) {\n" + " if (x == 0)\n" + " g();\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXInconclusive(code, 4U, 0)); + + // .. also when the guard is in the else branch + code = "int f(int x) {\n" + " if (x != 0)\n" + " ;\n" + " else\n" + " g();\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXInconclusive(code, 6U, 0)); + + // a declared function is assumed to return + code = "void g();\n" + "int f(int x) {\n" + " if (x == 0)\n" + " g();\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfX(code, 5U, 0)); + ASSERT_EQUALS(false, testValueOfXInconclusive(code, 5U, 0)); + + // a noreturn function conclusively escapes + code = "int f(int x) {\n" + " if (x == 0)\n" + " abort();\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(false, testValueOfX(code, 4U, 0)); + ASSERT_EQUALS(true, testValueOfXImpossible(code, 4U, 0)); } void valueFlowAfterConditionTernary() From c9cb62fc1e6026533245e53f16f5011cb14f5cf4 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 11 Jul 2026 14:30:26 +0200 Subject: [PATCH 134/171] Fix #14897 fuzzing crash (null-pointer-use) in SymbolDatabase::createSymbolDatabaseSetScopePointers() (#8703) --- lib/symboldatabase.cpp | 8 +++++++- .../crash-def181ea7bf444e7a9d0f85b3ad264c31a0b90e4 | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 test/cli/fuzz-crash/crash-def181ea7bf444e7a9d0f85b3ad264c31a0b90e4 diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index b687c9f77a4..6e6a98ee81e 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -138,8 +138,14 @@ const Token* SymbolDatabase::isEnumDefinition(const Token* tok) if (tok->str() == "{") return tok; tok = tok->next(); // skip ':' - while (Token::Match(tok, "%name%|::")) + bool hasType = false; + while (Token::Match(tok, "%name%|::")) { + if (tok->isName()) + hasType = true; tok = tok->next(); + } + if (!hasType) + throw InternalError(tok, "SymbolDatabase bailout; invalid enum", InternalError::SYNTAX); return Token::simpleMatch(tok, "{") ? tok : nullptr; } diff --git a/test/cli/fuzz-crash/crash-def181ea7bf444e7a9d0f85b3ad264c31a0b90e4 b/test/cli/fuzz-crash/crash-def181ea7bf444e7a9d0f85b3ad264c31a0b90e4 new file mode 100644 index 00000000000..3b609c62362 --- /dev/null +++ b/test/cli/fuzz-crash/crash-def181ea7bf444e7a9d0f85b3ad264c31a0b90e4 @@ -0,0 +1 @@ +enumf:{}; From cad91dab8e98ec3506269eaa36128446ce7d3406 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 11 Jul 2026 14:31:25 +0200 Subject: [PATCH 135/171] Fix #14742 fuzzing crash (stack-overflow) in CheckNullPointer::nullPointerByDeRefAndCheck() (#8693) --- lib/tokenlist.cpp | 5 ++++- test/cli/fuzz-crash_c/14742 | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 test/cli/fuzz-crash_c/14742 diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 5921621fed2..c28075fcec7 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -1951,8 +1951,11 @@ void TokenList::validateAst(bool print) const if (tok->str() == "?") { if (!tok->astOperand1() || !tok->astOperand2()) throw InternalError(tok, "AST broken, ternary operator missing operand(s)", InternalError::AST); - if (tok->astOperand2()->str() != ":") + const Token* colon = tok->astOperand2(); + if (colon->str() != ":") throw InternalError(tok, "Syntax Error: AST broken, ternary operator lacks ':'.", InternalError::AST); + if ((colon->astOperand1() && !precedes(colon->astOperand1(), colon)) || !succeeds(colon->astOperand2(), colon)) + throw InternalError(tok, "AST broken, ternary operator has bad operand(s)", InternalError::AST); } // Check for endless recursion diff --git a/test/cli/fuzz-crash_c/14742 b/test/cli/fuzz-crash_c/14742 new file mode 100644 index 00000000000..a645277c405 --- /dev/null +++ b/test/cli/fuzz-crash_c/14742 @@ -0,0 +1 @@ +i(){b?8:{}!$} From 0a43e46cb526163f4aa9fd6f15e3e0cc6e35d577 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 11 Jul 2026 14:33:29 +0200 Subject: [PATCH 136/171] Fix #14436 fuzzing crash (null-pointer-use) in getEnumType() (#8711) --- lib/tokenlist.cpp | 2 +- .../fuzz-crash/crash-793c09dbb007b0e1a295f592813f40f8d6d449d1 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 test/cli/fuzz-crash/crash-793c09dbb007b0e1a295f592813f40f8d6d449d1 diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index c28075fcec7..594de5c0295 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -2005,7 +2005,7 @@ void TokenList::validateAst(bool print) const if (Token::simpleMatch(tok->previous(), "operator")) continue; // Skip incomplete code - if (!tok->astOperand1() && !tok->astOperand2() && !tok->astParent()) + if (!tok->astOperand1() && !tok->astOperand2() && !tok->astParent() && !(tok->str().size() == 2 && tok->str()[1] == '=')) continue; // Skip lambda assignment and/or initializer if (Token::Match(tok, "= {|^|[")) diff --git a/test/cli/fuzz-crash/crash-793c09dbb007b0e1a295f592813f40f8d6d449d1 b/test/cli/fuzz-crash/crash-793c09dbb007b0e1a295f592813f40f8d6d449d1 new file mode 100644 index 00000000000..706fe52b407 --- /dev/null +++ b/test/cli/fuzz-crash/crash-793c09dbb007b0e1a295f592813f40f8d6d449d1 @@ -0,0 +1 @@ +enum{A=s(u)0&=s}; From dd04e094b5e8e1b1c5fce7df4f26898c5260998d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 11 Jul 2026 21:11:34 +0200 Subject: [PATCH 137/171] [Refactor] Redundant checks for noreturn functions (#8712) --- lib/astutils.cpp | 34 ++++++++++------------------------ lib/checkother.cpp | 2 +- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index c433036cfcc..27a01ab0382 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2226,23 +2226,18 @@ static bool isEscapedOrJump(const Token* tok, bool functionsScope, const Library return Token::Match(tok, "return|goto|throw|continue|break"); } +static bool isNoreturnFunction(const Token* ftok, const Library& library) +{ + if (const Function* function = ftok->function()) + return function->isEscapeFunction() || function->isAttributeNoreturn(); + return library.isnoreturn(ftok); +} + bool isEscapeFunction(const Token* ftok, const Library& library) { if (!Token::Match(ftok, "%name% (")) return false; - if (Token::Match(ftok, "exit|abort")) - return true; - const Function* function = ftok->function(); - if (function) { - if (function->isEscapeFunction()) - return true; - if (function->isAttributeNoreturn()) - return true; - } else { - if (library.isnoreturn(ftok)) - return true; - } - return false; + return isNoreturnFunction(ftok, library); } static bool hasNoreturnFunction(const Token* tok, const Library& library, const Token** unknownFunc) @@ -2253,18 +2248,9 @@ static bool hasNoreturnFunction(const Token* tok, const Library& library, const while (Token::simpleMatch(ftok, "(")) ftok = ftok->astOperand1(); if (ftok) { - const Function * function = ftok->function(); - if (function) { - if (function->isEscapeFunction()) - return true; - if (function->isAttributeNoreturn()) - return true; - } else if (library.isnoreturn(ftok)) { - return true; - } else if (Token::Match(ftok, "exit|abort")) { + if (isNoreturnFunction(ftok, library)) return true; - } - if (unknownFunc && !function && library.functions().count(library.getFunctionName(ftok)) == 0) + if (unknownFunc && !ftok->function() && library.functions().count(library.getFunctionName(ftok)) == 0) *unknownFunc = ftok; return false; } diff --git a/lib/checkother.cpp b/lib/checkother.cpp index ef6fb9003b1..5ea199f38e8 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -791,7 +791,7 @@ void CheckOtherImpl::redundantAssignmentSameValueError(const Token *tok, const V //--------------------------------------------------------------------------- static inline bool isFunctionOrBreakPattern(const Token *tok) { - return Token::Match(tok, "%name% (") || Token::Match(tok, "break|continue|return|exit|goto|throw"); + return Token::Match(tok, "%name% (") || (tok->isKeyword() && Token::Match(tok, "break|continue|return|goto|throw")); } void CheckOtherImpl::redundantBitwiseOperationInSwitchError() From 168777d93257e5bb0372df1e6663fc120371b946 Mon Sep 17 00:00:00 2001 From: correctmost <134317971+correctmost@users.noreply.github.com> Date: Sun, 12 Jul 2026 04:09:48 -0400 Subject: [PATCH 138/171] gtk.cfg: Add G_DEPRECATED_FOR and G_ENCODE_VERSION (#8708) `G_DEPRECATED_FOR` is defined in [glib/gmacros.h](https://github.com/GNOME/glib/blob/2.89.1/glib/gmacros.h#L1313). `G_ENCODE_VERSION` is defined in [glib/gversionmacros.h](https://github.com/GNOME/glib/blob/2.89.1/glib/gversionmacros.h.in#L49). --- cfg/gtk.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cfg/gtk.cfg b/cfg/gtk.cfg index e28aa2ad7a5..5e94a0bbb5c 100644 --- a/cfg/gtk.cfg +++ b/cfg/gtk.cfg @@ -92,6 +92,7 @@ + @@ -126,6 +127,7 @@ + From ef5c1f02530b77a52f40f3ebda73dfb203b5b035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 13 Jul 2026 08:09:54 +0200 Subject: [PATCH 139/171] Fix #14869: Attribute [[maybe_unused]] used after variable (#8713) --- lib/tokenize.cpp | 2 +- test/testtokenize.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index d2ad6f581e7..4475bfcb44f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9780,7 +9780,7 @@ void Tokenizer::simplifyCPPAttribute() if (!head) syntaxError(tok); - if (Token::simpleMatch(head, ";")) { + if (Token::Match(head, ";|,|)")) { Token *backTok = tok; while (Token::Match(backTok, "]|[|)")) { if (Token::Match(backTok, "]|)")) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 0617007744a..e33c98861c7 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -290,6 +290,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(cppMaybeUnusedBefore); TEST_CASE(cppMaybeUnusedAfter1); TEST_CASE(cppMaybeUnusedAfter2); + TEST_CASE(cppMaybeUnusedAfter3); TEST_CASE(cppMaybeUnusedStructuredBinding); TEST_CASE(attributeAlignasBefore); @@ -4381,6 +4382,19 @@ class TestTokenizer : public TestFixture { ASSERT(var && var->isAttributeMaybeUnused()); } + void cppMaybeUnusedAfter3() { + const char code[] = "void foo(int x [[maybe_unused]]) {}"; + const char expected[] = "void foo ( int x ) { }"; + + SimpleTokenizer tokenizer(settingsDefault, *this); + ASSERT(tokenizer.tokenize(code)); + + ASSERT_EQUALS(expected, tokenizer.tokens()->stringifyList(nullptr, false)); + + const Token *x = Token::findsimplematch(tokenizer.tokens(), "x"); + ASSERT(x && x->isAttributeMaybeUnused()); + } + void cppMaybeUnusedStructuredBinding() { const char code[] = "[[maybe_unused]] auto [var1, var2] = f();"; const char expected[] = "auto [ var1 , var2 ] = f ( ) ;"; From 4e3063edf0e9d4736c7a8b98867d7806585807ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 13 Jul 2026 08:10:40 +0200 Subject: [PATCH 140/171] Fix #14791: FN shadowFunction depending on order of declaration of member functions (#8609) --- lib/checkother.cpp | 3 ++- lib/filesettings.h | 8 ++++---- lib/token.h | 42 +++++++++++++++++++-------------------- lib/tokenize.cpp | 18 ++++++++--------- test/testother.cpp | 3 +++ test/testpreprocessor.cpp | 4 ++-- 6 files changed, 41 insertions(+), 37 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 5ea199f38e8..f0d7fbd91f1 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -4153,7 +4153,8 @@ static const Token *findShadowed(const Scope *scope, const Variable& var, int li return v.nameToken(); } auto it = std::find_if(scope->functionList.cbegin(), scope->functionList.cend(), [&](const Function& f) { - return f.type == FunctionType::eFunction && f.name() == var.name() && precedes(f.tokenDef, var.nameToken()); + return f.type == FunctionType::eFunction && f.name() == var.name() + && (scope->isClassOrStructOrUnion() || precedes(f.tokenDef, var.nameToken())); }); if (it != scope->functionList.end()) return it->tokenDef; diff --git a/lib/filesettings.h b/lib/filesettings.h index 0b4f15dd7e1..0ef53db85c5 100644 --- a/lib/filesettings.h +++ b/lib/filesettings.h @@ -46,9 +46,9 @@ class FileWithDetails throw std::runtime_error("empty path specified"); } - void setPath(std::string path) + void setPath(std::string p) { - mPath = std::move(path); + mPath = std::move(p); mPathSimplified = Path::simplifyPath(mPath); mPathAbsolute.clear(); } @@ -76,9 +76,9 @@ class FileWithDetails return mSize; } - void setLang(Standards::Language lang) + void setLang(Standards::Language language) { - mLang = lang; + mLang = language; } Standards::Language lang() const diff --git a/lib/token.h b/lib/token.h index 3328af31fa0..fd4804ec980 100644 --- a/lib/token.h +++ b/lib/token.h @@ -249,35 +249,35 @@ class CPPCHECKLIB Token { * For example index 1 would return next token, and 2 * would return next from that one. */ - const Token *tokAt(int index) const + const Token *tokAt(int idx) const { - return tokAtImpl(this, index); + return tokAtImpl(this, idx); } - Token *tokAt(int index) + Token *tokAt(int idx) { - return tokAtImpl(this, index); + return tokAtImpl(this, idx); } /** * @return the link to the token in given index, related to this token. * For example index 1 would return the link to next token. */ - const Token *linkAt(int index) const + const Token *linkAt(int idx) const { - return linkAtImpl(this, index); + return linkAtImpl(this, idx); } - Token *linkAt(int index) + Token *linkAt(int idx) { - return linkAtImpl(this, index); + return linkAtImpl(this, idx); } /** * @return String of the token in given index, related to this token. * If that token does not exist, an empty string is being returned. */ - const std::string &strAt(int index) const + const std::string &strAt(int idx) const { - const Token *tok = this->tokAt(index); + const Token *tok = this->tokAt(idx); return tok ? tok->mStr : mEmptyString; } @@ -604,11 +604,11 @@ class CPPCHECKLIB Token { bool hasAttributeCleanup() const { return !mImpl->mAttributeCleanup.empty(); } - void setCppcheckAttribute(CppcheckAttributesType type, MathLib::bigint value) { - mImpl->setCppcheckAttribute(type, value); + void setCppcheckAttribute(CppcheckAttributesType attrType, MathLib::bigint value) { + mImpl->setCppcheckAttribute(attrType, value); } - bool getCppcheckAttribute(CppcheckAttributesType type, MathLib::bigint &value) const { - return mImpl->getCppcheckAttribute(type, value); + bool getCppcheckAttribute(CppcheckAttributesType attrType, MathLib::bigint &value) const { + return mImpl->getCppcheckAttribute(attrType, value); } // cppcheck-suppress unusedFunction bool hasCppcheckAttributes() const { @@ -899,15 +899,15 @@ class CPPCHECKLIB Token { private: template )> - static T *tokAtImpl(T *tok, int index) + static T *tokAtImpl(T *tok, int idx) { - while (index > 0 && tok) { + while (idx > 0 && tok) { tok = tok->next(); - --index; + --idx; } - while (index < 0 && tok) { + while (idx < 0 && tok) { tok = tok->previous(); - ++index; + ++idx; } return tok; } @@ -916,9 +916,9 @@ class CPPCHECKLIB Token { * @throws InternalError thrown if index is out of range */ template )> - static T *linkAtImpl(T *thisTok, int index) + static T *linkAtImpl(T *thisTok, int idx) { - T *tok = thisTok->tokAt(index); + T *tok = thisTok->tokAt(idx); if (!tok) { throw InternalError(thisTok, "Internal error. Token::linkAt called with index outside the tokens range."); } diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4475bfcb44f..2a1920b42e9 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -568,23 +568,23 @@ namespace { const std::pair rangeBefore(start, Token::findsimplematch(start, "{")); // find typedef name token - Token* nameToken = rangeBefore.second->link()->next(); - while (Token::Match(nameToken, "%name%|* %name%|*")) - nameToken = nameToken->next(); - const std::pair rangeQualifiers(rangeBefore.second->link()->next(), nameToken); + Token* nameTok = rangeBefore.second->link()->next(); + while (Token::Match(nameTok, "%name%|* %name%|*")) + nameTok = nameTok->next(); + const std::pair rangeQualifiers(rangeBefore.second->link()->next(), nameTok); - if (Token::Match(nameToken, "%name% ;")) { + if (Token::Match(nameTok, "%name% ;")) { if (Token::Match(rangeBefore.second->previous(), "enum|struct|union|class {")) - rangeBefore.second->previous()->insertToken(nameToken->str()); + rangeBefore.second->previous()->insertToken(nameTok->str()); mRangeType = rangeBefore; mRangeTypeQualifiers = rangeQualifiers; Token* typeName = rangeBefore.second->previous(); if (typeName->isKeyword()) { // TODO typeName->insertToken("T:" + std::to_string(num++)); - typeName->insertToken(nameToken->str()); + typeName->insertToken(nameTok->str()); } - mNameToken = nameToken; - mEndToken = nameToken->next(); + mNameToken = nameTok; + mEndToken = nameTok->next(); return; } } diff --git a/test/testother.cpp b/test/testother.cpp index 02418df5627..ca42ef23deb 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -13207,6 +13207,9 @@ class TestOther : public TestFixture { check("struct S { static int i(); static void f(int i) {} };\n"); ASSERT_EQUALS("[test.cpp:1:23] -> [test.cpp:1:46]: (style) Argument 'i' shadows outer function [shadowFunction]\n", errout_str()); + + check("struct S { void g(float f) {} void f() {} };\n"); + ASSERT_EQUALS("[test.cpp:1:36] -> [test.cpp:1:25]: (style) Argument 'f' shadows outer function [shadowFunction]\n", errout_str()); } void knownArgument() { diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 5da298a2714..55fcafd4f4f 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -146,8 +146,8 @@ class TestPreprocessor : public TestFixture { } for (const std::string & config : cfgs) { try { - const bool writeLocations = (strstr(code, "#include") != nullptr); - cfgcode[config] = preprocessor.getcode(config, files, writeLocations); + const bool writeLocs = (strstr(code, "#include") != nullptr); + cfgcode[config] = preprocessor.getcode(config, files, writeLocs); } catch (const simplecpp::Output &) { cfgcode[config] = ""; } From 80ab5388763157ec42bd00449c95221b7d17af68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 13 Jul 2026 08:11:37 +0200 Subject: [PATCH 141/171] Fix #14803: `ValueType::BOOL` set for `&&` in rvalue reference declaration (#8606) --- lib/symboldatabase.cpp | 2 +- test/testsymboldatabase.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 6e6a98ee81e..b82a3f790b0 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7823,7 +7823,7 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to setValueType(tok, ValueType(sign, type, 0U)); } - } else if (tok->isComparisonOp() || tok->tokType() == Token::eLogicalOp) { + } else if ((tok->isComparisonOp() || tok->tokType() == Token::eLogicalOp) && tok->astOperand1()) { if (tok->isCpp() && tok->isComparisonOp() && (getClassScope(tok->astOperand1()) || getClassScope(tok->astOperand2()))) { const Function *function = getOperatorFunction(tok); if (function) { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 84681b00c85..345bfdb7990 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -10192,6 +10192,15 @@ class TestSymbolDatabase : public TestFixture { ASSERT(tok); TODO_ASSERT(tok->valueType() && "container(std :: string|wstring|u16string|u32string)" == tok->valueType()->str()); } + { + GET_SYMBOL_DB("void f() {\n" + " int &&x = 0;\n" + "}\n"); + + const Token* tok = Token::findsimplematch(tokenizer.tokens(), "&&"); + ASSERT(tok); + ASSERT_EQUALS(static_cast(nullptr), tok->valueType()); + } } void valueTypeThis() { From ad04c7aff4217928764073e7fe7f53e6dc8e58b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 13 Jul 2026 08:12:40 +0200 Subject: [PATCH 142/171] Fix #14836: FP syntaxError for anonymous struct in for loop (#8710) --- lib/tokenize.cpp | 13 ++++++++++++- test/testtokenize.cpp | 5 +++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 2a1920b42e9..4e00e0d184e 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -8973,7 +8973,7 @@ void Tokenizer::findGarbageCode() const if (tok->strAt(-1) == ",") syntaxError(tok); colons++; - } else if (tok->str() == "(") { // skip pairs of ( ) + } else if (tok->str() == "(" || tok->str() == "{") { // skip pairs of ( ) tok = tok->link(); } } @@ -9417,6 +9417,7 @@ void Tokenizer::simplifyStructDecl() if (Token::Match(after->next(), "const|static|volatile| *|&| const| (| %type% )| ,|;|[|=|(|{")) { after->insertToken(";"); after = after->next(); + Token *declEnd = after; while (!Token::Match(start, "struct|class|union|enum")) { after->insertToken(start->str()); after = after->next(); @@ -9459,6 +9460,16 @@ void Tokenizer::simplifyStructDecl() } } } + + // pull declaration out of for loop + if (Token::simpleMatch(start->tokAt(-2), "for ( struct")) { + Token *link = start->linkAt(-1); + start->deletePrevious(2); + declEnd->insertToken("("); + declEnd->next()->link(link); + link->link(declEnd->next()); + declEnd->insertToken("for"); + } } } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index e33c98861c7..c4de2be00e7 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -2274,6 +2274,11 @@ class TestTokenizer : public TestFixture { const char code4[] = "union U { struct { int a; int b; }; int ab[2]; };"; const char expected4[] = "union U { struct { int a ; int b ; } ; int ab [ 2 ] ; } ;"; ASSERT_EQUALS(expected4, tokenizeAndStringify(code4)); + + // #14836: FP syntaxError for anonymous struct in for loop + const char code5[] = "void f(void) { for (struct { int a; } it = {0}; it.a < 10; it.a++) {} }"; + const char expected5[] = "void f ( ) { struct Anonymous0 { int a ; } ; for ( struct Anonymous0 it = { 0 } ; it . a < 10 ; it . a ++ ) { } }"; + ASSERT_EQUALS(expected5, tokenizeAndStringify(code5)); } void vardecl1() { From f49f1aa318d46f92109da3c59e4f1b011889339a Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Mon, 13 Jul 2026 01:19:10 -0500 Subject: [PATCH 143/171] Fix 14900: FP knownConditionTrueFalse on variable after if/else-if chain (#8715) Co-authored-by: Your Name --- lib/forwardanalyzer.cpp | 7 ++++++- test/testcondition.cpp | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 368ac761a53..c38d93155ea 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -834,8 +834,13 @@ namespace { ++ft.forkDepth; ft.updateRange(thenBranch.endBlock, end, depth - 1); } - if (pElse == Progress::Break) + if (pElse == Progress::Break) { + // Only the else branch escaped; the then branch falls through, so + // the scope as a whole does not always escape. + if (terminate == Analyzer::Terminate::Escape && !thenBranch.isEscape()) + terminate = Analyzer::Terminate::None; return Break(); + } } } } else if (Token::simpleMatch(tok, "try {")) { diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 837cd4e78ba..da4ecae43b3 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4935,6 +4935,20 @@ class TestCondition : public TestFixture { " if (v > 0) {}\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("bool f(int x) {\n" // only the innermost else escapes - x is 0 or >1 afterwards, not known + " if (!x) {}\n" + " else if (x > 1) {}\n" + " else return false;\n" + " return x ? false : true;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("bool f(int x) {\n" // the branch's fall-through path must clear the escape + " if (x) { if (x > 1) {} else return false; }\n" + " return x ? false : true;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void alwaysTrueSymbolic() From 3d88880e833ed9f60e1ba48f256498440368d86c Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Mon, 13 Jul 2026 01:59:30 -0500 Subject: [PATCH 144/171] Fix issue 13254: FN: containerOutOfBounds (std::equal) (#8695) This adds a new check `algorithmOutOfBounds` that checks when one of the algorithms will access elements out of bounds based on the sizes of other containers passed in. Right now, it directly checks for the stl algorithms, but we could add attributes to the Library to better describe these algorithms so it can be used for other algorithm libraries. --------- Co-authored-by: Your Name --- lib/checkers.cpp | 1 + lib/checkstl.cpp | 407 ++++++++++++++++++++++++++- lib/checkstl.h | 16 ++ lib/valueflow.cpp | 12 + man/checkers/algorithmOutOfBounds.md | 69 +++++ releasenotes.txt | 1 + test/cli/other_test.py | 9 +- test/teststl.cpp | 372 +++++++++++++++++++++++- test/testvalueflow.cpp | 42 +++ 9 files changed, 908 insertions(+), 21 deletions(-) create mode 100644 man/checkers/algorithmOutOfBounds.md diff --git a/lib/checkers.cpp b/lib/checkers.cpp index cc8c4054ea2..56d91cc4f05 100644 --- a/lib/checkers.cpp +++ b/lib/checkers.cpp @@ -167,6 +167,7 @@ namespace checkers { {"CheckSizeof::sizeofVoid","portability"}, {"CheckSizeof::sizeofsizeof","warning"}, {"CheckSizeof::suspiciousSizeofCalculation","warning,inconclusive"}, + {"CheckStl::algorithmOutOfBounds",""}, {"CheckStl::checkDereferenceInvalidIterator","warning"}, {"CheckStl::checkDereferenceInvalidIterator2",""}, {"CheckStl::checkFindInsert","performance"}, diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 743ac8a3cb4..500adc08b01 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -35,6 +35,7 @@ #include "checknullpointer.h" #include +#include #include #include #include @@ -127,6 +128,16 @@ static const Token* getContainerFromSize(const Library::Container* container, co return nullptr; } +// A value that out of bounds analysis can use: not impossible, and inconclusive only when enabled +static bool isUsableValue(const ValueFlow::Value& value, const Settings& settings) +{ + if (value.isImpossible()) + return false; + if (value.isInconclusive() && !settings.certainty.isEnabled(Certainty::inconclusive)) + return false; + return true; +} + void CheckStlImpl::outOfBounds() { logChecker("CheckStl::outOfBounds"); @@ -148,9 +159,7 @@ void CheckStlImpl::outOfBounds() for (const ValueFlow::Value &value : tok->values()) { if (!value.isContainerSizeValue()) continue; - if (value.isImpossible()) - continue; - if (value.isInconclusive() && !mSettings.certainty.isEnabled(Certainty::inconclusive)) + if (!isUsableValue(value, mSettings)) continue; if (!value.errorSeverity() && !mSettings.severity.isEnabled(Severity::warning)) continue; @@ -2482,8 +2491,6 @@ void CheckStlImpl::checkDereferenceInvalidIterator() void CheckStlImpl::checkDereferenceInvalidIterator2() { - const bool printInconclusive = (mSettings.certainty.isEnabled(Certainty::inconclusive)); - logChecker("CheckStl::checkDereferenceInvalidIterator2"); for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { @@ -2496,20 +2503,16 @@ void CheckStlImpl::checkDereferenceInvalidIterator2() continue; std::vector contValues; - std::copy_if(tok->values().cbegin(), tok->values().cend(), std::back_inserter(contValues), [&](const ValueFlow::Value& value) { - if (value.isImpossible()) - return false; - if (!printInconclusive && value.isInconclusive()) - return false; - return value.isContainerSizeValue(); + std::copy_if(tok->values().cbegin(), + tok->values().cend(), + std::back_inserter(contValues), + [&](const ValueFlow::Value& value) { + return isUsableValue(value, mSettings) && value.isContainerSizeValue(); }); - // Can iterator point to END or before START? for (const ValueFlow::Value& value:tok->values()) { - if (value.isImpossible()) - continue; - if (!printInconclusive && value.isInconclusive()) + if (!isUsableValue(value, mSettings)) continue; if (!value.isIteratorValue()) continue; @@ -3379,6 +3382,378 @@ void CheckStlImpl::eraseIteratorOutOfBounds() } } +namespace { +// An iterator position described by the ValueFlow values attached to the iterator expression + struct IteratorPosition { + const ValueFlow::Value* value = nullptr; // ITERATOR_START or ITERATOR_END value + const ValueFlow::Value* sizeValue = nullptr; // container size value with the same path, if available + bool fromEnd() const { + return value->isIteratorEndValue(); + } + explicit operator bool() const { + return value != nullptr; + } + }; + +// A number of elements together with the ValueFlow values it was derived from + struct ElementCount { + MathLib::bigint count = 0; + std::vector values; + explicit operator bool() const { + return !values.empty(); + } + }; + +// The best candidate proving an out of bounds access, preferring proofs without possible values + struct BestCandidate { + ElementCount best; + bool certain = false; + void consider(const ElementCount& candidate) + { + const bool candidateCertain = + std::none_of(candidate.values.cbegin(), candidate.values.cend(), std::mem_fn(&ValueFlow::Value::isPossible)); + if (best && (certain || !candidateCertain)) + return; + best = candidate; + certain = candidateCertain; + } + }; +} // namespace + +// Get the first ValueFlow value of a token matching the predicate, preferring known values +template +static const ValueFlow::Value* selectPreferredValue(const Token* tok, const Predicate& pred) +{ + const ValueFlow::Value* result = nullptr; + for (const ValueFlow::Value& value : tok->values()) { + if (!pred(value)) + continue; + if (result && !(value.isKnown() && !result->isKnown())) + continue; + result = &value; + } + return result; +} + +// Get the iterator value of an iterator expression together with the container size value that +// ValueFlow has added to the iterator +static IteratorPosition getIteratorPosition(const Token* tok, const Settings& settings) +{ + IteratorPosition position; + if (!tok) + return position; + position.value = selectPreferredValue(tok, [&](const ValueFlow::Value& value) { + return isUsableValue(value, settings) && value.isIteratorValue(); + }); + if (!position.value) + return position; + position.sizeValue = selectPreferredValue(tok, [&](const ValueFlow::Value& value) { + return isUsableValue(value, settings) && value.isContainerSizeValue() && value.path == position.value->path; + }); + return position; +} + +// Compute the distance last-first between two iterators into the same container +static ElementCount getIteratorDistance(const IteratorPosition& first, const IteratorPosition& last) +{ + ElementCount distance; + if (first.value->path != last.value->path) + return distance; + // bounded values could make the distance an overestimate + if (first.value->bound != ValueFlow::Value::Bound::Point || last.value->bound != ValueFlow::Value::Bound::Point) + return distance; + if (first.fromEnd() == last.fromEnd()) { // the container size cancels out + distance.count = last.value->intvalue - first.value->intvalue; + distance.values = {first.value, last.value}; + return distance; + } + const IteratorPosition& endPosition = first.fromEnd() ? first : last; + if (!endPosition.sizeValue || endPosition.sizeValue->bound != ValueFlow::Value::Bound::Point) + return distance; + const MathLib::bigint endIndex = endPosition.sizeValue->intvalue + endPosition.value->intvalue; + distance.count = last.fromEnd() ? endIndex - first.value->intvalue : last.value->intvalue - endIndex; + distance.values = {first.value, last.value, endPosition.sizeValue}; + return distance; +} + +// Compute the number of elements available in the container behind the iterator position +static ElementCount getAvailableSpace(const IteratorPosition& position) +{ + ElementCount available; + // the position could be smaller, which would make more elements available + if (position.value->bound == ValueFlow::Value::Bound::Upper) + return available; + if (position.fromEnd()) { // the container size cancels out + available.count = -position.value->intvalue; + available.values = {position.value}; + return available; + } + // the container size could be larger, which would make more elements available + if (!position.sizeValue || position.sizeValue->bound == ValueFlow::Value::Bound::Lower) + return available; + available.count = position.sizeValue->intvalue - position.value->intvalue; + available.values = {position.value, position.sizeValue}; + return available; +} + +// Find iterator values and paired container sizes of the iterator that prove accessing +// elements to be out of bounds, preferring a proof that does not rely on possible values +static ElementCount findInsufficientSpace(const Token* tok, + MathLib::bigint accessed, + MathLib::bigint sourcePath, + const Settings& settings) +{ + BestCandidate insufficient; + if (!tok) + return insufficient.best; + const auto consider = [&](const ElementCount& candidate) { + if (!candidate) + return; + if (candidate.count < 0 || accessed <= candidate.count) + return; // the space is sufficient + insufficient.consider(candidate); + }; + for (const ValueFlow::Value& value : tok->values()) { + if (!isUsableValue(value, settings) || !value.isIteratorValue()) + continue; + if (value.path != 0 && sourcePath != 0 && value.path != sourcePath) + continue; + IteratorPosition position; + position.value = &value; + if (position.fromEnd()) { // the available space does not depend on the container size + consider(getAvailableSpace(position)); + continue; + } + for (const ValueFlow::Value& sizeValue : tok->values()) { + if (!isUsableValue(sizeValue, settings) || !sizeValue.isContainerSizeValue() || sizeValue.path != value.path) + continue; + position.sizeValue = &sizeValue; + consider(getAvailableSpace(position)); + } + } + return insufficient.best; +} + +// Find iterator values and paired container sizes of the source range that prove more than +// elements to be accessed, preferring a proof that does not rely on possible values +static ElementCount findExcessiveDistance(const Token* firstTok, + const Token* lastTok, + MathLib::bigint available, + MathLib::bigint destPath, + const Settings& settings) +{ + BestCandidate excessive; + const auto consider = [&](const ElementCount& candidate) { + if (!candidate) + return; + if (candidate.count <= available) + return; // the access is within bounds + excessive.consider(candidate); + }; + for (const ValueFlow::Value& firstValue : firstTok->values()) { + if (!isUsableValue(firstValue, settings) || !firstValue.isIteratorValue()) + continue; + if (firstValue.path != 0 && destPath != 0 && firstValue.path != destPath) + continue; + for (const ValueFlow::Value& lastValue : lastTok->values()) { + if (!isUsableValue(lastValue, settings) || !lastValue.isIteratorValue()) + continue; + IteratorPosition first, last; + first.value = &firstValue; + last.value = &lastValue; + if (first.fromEnd() == last.fromEnd()) { // the distance does not depend on the container size + consider(getIteratorDistance(first, last)); + continue; + } + IteratorPosition& endPosition = first.fromEnd() ? first : last; + const Token* const endTok = first.fromEnd() ? firstTok : lastTok; + for (const ValueFlow::Value& sizeValue : endTok->values()) { + if (!isUsableValue(sizeValue, settings) || !sizeValue.isContainerSizeValue() || + sizeValue.path != endPosition.value->path) + continue; + endPosition.sizeValue = &sizeValue; + consider(getIteratorDistance(first, last)); + } + } + } + return excessive.best; +} + +// Find count values of a count-based algorithm that prove more than elements to be accessed +static ElementCount findExcessiveCount(const Token* tok, + MathLib::bigint available, + MathLib::bigint destPath, + const Settings& settings) +{ + BestCandidate excessive; + if (!tok) + return excessive.best; + for (const ValueFlow::Value& value : tok->values()) { + if (!isUsableValue(value, settings) || !value.isIntValue()) + continue; + // a count with an upper bound could be smaller, which would make fewer elements accessed + if (value.bound == ValueFlow::Value::Bound::Upper) + continue; + if (value.path != 0 && destPath != 0 && value.path != destPath) + continue; + if (value.intvalue <= available) + continue; // the access is within bounds + ElementCount candidate; + candidate.count = value.intvalue; + candidate.values.push_back(&value); + excessive.consider(candidate); + } + return excessive.best; +} + +// Do not warn when the proof relies on possible values on both sides +static bool bothSidesPossible(const ElementCount& accessed, const ElementCount& available) +{ + const auto isPossible = std::mem_fn(&ValueFlow::Value::isPossible); + return std::any_of(accessed.values.cbegin(), accessed.values.cend(), isPossible) && + std::any_of(available.values.cbegin(), available.values.cend(), isPossible); +} + +// Get the number of accessed elements of a count-based algorithm such as std::fill_n +static const ValueFlow::Value* getCountValue(const Token* tok, const Settings& settings) +{ + if (!tok) + return nullptr; + return selectPreferredValue(tok, [&](const ValueFlow::Value& value) { + // a count with an upper bound could be smaller, which would make fewer elements accessed + return isUsableValue(value, settings) && value.isIntValue() && value.bound != ValueFlow::Value::Bound::Upper; + }); +} + +void CheckStlImpl::algorithmOutOfBounds() +{ + logChecker("CheckStl::algorithmOutOfBounds"); + for (const Scope* function : mTokenizer->getSymbolDatabase()->functionScopes) { + for (const Token* tok = function->bodyStart; tok != function->bodyEnd; tok = tok->next()) { + if (!Token::Match(tok, "std :: %name% (")) + continue; + const Token* const nameTok = tok->tokAt(2); + // algorithms accessing the range denoted by the third argument exactly last1-first1 times.. + const bool exact = Token::Match( + nameTok, + "copy|move|swap_ranges|transform|replace_copy|replace_copy_if|reverse_copy|equal|mismatch|is_permutation|partial_sum|adjacent_difference|inner_product ("); + // ..or at most last1-first1 times, depending on the values in the input range.. + const bool atMost = !exact && Token::Match(nameTok, "copy_if|remove_copy|remove_copy_if|unique_copy ("); + // ..or accessing their iterator arguments as many times as the count argument says + const bool countBased = !exact && !atMost && Token::Match(nameTok, "copy_n|fill_n|generate_n ("); + if (!exact && !atMost && !countBased) + continue; + if (atMost && !mSettings.certainty.isEnabled(Certainty::inconclusive)) + continue; + const std::vector args = getArguments(nameTok); + if (args.size() < 3) + continue; + ElementCount accessed; // source access count using the preferred values + std::vector iterArgs; + if (countBased) { + if (const ValueFlow::Value* countValue = getCountValue(args[1], mSettings)) { + accessed.count = countValue->intvalue; + accessed.values.push_back(countValue); + } + iterArgs.push_back(args[0]); + if (Token::simpleMatch(nameTok, "copy_n")) + iterArgs.push_back(args[2]); // copy_n also writes through the third argument + } else { + // two-range overloads taking a last2 iterator do not access the second range out of bounds + if (Token::Match(nameTok, "equal|mismatch|is_permutation") && args.size() >= 4 && astIsIterator(args[3])) + continue; + // both iterators must refer to the same container + const ValueFlow::Value firstLifetime = getLifetimeIteratorValue(args[0]); + const ValueFlow::Value lastLifetime = getLifetimeIteratorValue(args[1]); + if (!firstLifetime.tokvalue || !lastLifetime.tokvalue) + continue; + if (!isSameIteratorContainerExpression(firstLifetime.tokvalue, + lastLifetime.tokvalue, + mSettings, + firstLifetime.lifetimeKind)) + continue; + const IteratorPosition first = getIteratorPosition(args[0], mSettings); + const IteratorPosition last = getIteratorPosition(args[1], mSettings); + if (first && last) + accessed = getIteratorDistance(first, last); + iterArgs.push_back(args[2]); + if (Token::simpleMatch(nameTok, "transform") && args.size() == 5) + iterArgs.push_back(args[3]); // binary transform also writes through the fourth argument + } + if (accessed.count <= 0) + accessed = ElementCount(); // there is no preferred source access count + for (const Token* const iterArg : iterArgs) { + // check the preferred source access count against all destination values.. + ElementCount sourceCount = accessed; + ElementCount available; + if (sourceCount) + available = + findInsufficientSpace(iterArg, sourceCount.count, sourceCount.values.front()->path, mSettings); + if (!available || bothSidesPossible(sourceCount, available)) { + // ..or all source access counts against the preferred destination values + const IteratorPosition dest = getIteratorPosition(iterArg, mSettings); + if (!dest) + continue; + available = getAvailableSpace(dest); + if (!available || available.count < 0) + continue; + sourceCount = + countBased + ? findExcessiveCount(args[1], available.count, dest.value->path, mSettings) + : findExcessiveDistance(args[0], args[1], available.count, dest.value->path, mSettings); + if (!sourceCount || bothSidesPossible(sourceCount, available)) + continue; + } + const ValueFlow::Value* conditionValue = nullptr; + bool inconclusiveValues = false; + std::vector usedValues = sourceCount.values; + usedValues.insert(usedValues.end(), available.values.cbegin(), available.values.cend()); + for (const ValueFlow::Value* value : usedValues) { + if (!conditionValue && value->condition) + conditionValue = value; + inconclusiveValues |= value->isInconclusive(); + } + if (conditionValue && !mSettings.severity.isEnabled(Severity::warning)) + continue; + const ValueFlow::Value* pathValue = conditionValue ? conditionValue : available.values.back(); + algorithmOutOfBoundsError(iterArg, + "std::" + nameTok->str(), + sourceCount.count, + available.count, + pathValue, + atMost, + atMost || inconclusiveValues); + } + } + } +} + +void CheckStlImpl::algorithmOutOfBoundsError(const Token* tok, + const std::string& algoName, + MathLib::bigint accessed, + MathLib::bigint available, + const ValueFlow::Value* value, + bool mayAccessFewer, + bool inconclusive) +{ + const Token* const condition = value ? value->condition : nullptr; + const std::string iterExpr = tok ? tok->expressionString() : "it"; + const std::string accessedStr = MathLib::toString(accessed) + (accessed == 1 ? " element" : " elements"); + const std::string availableStr = MathLib::toString(available) + (available == 1 ? " element is" : " elements are"); + const std::string body = "algorithm '" + algoName + "' " + (mayAccessFewer ? "may access up to " : "accesses ") + + accessedStr + " through the iterator '" + iterExpr + "' but only " + availableStr + + " available."; + const std::string msg = + condition ? (ValueFlow::eitherTheConditionIsRedundant(condition) + " or the " + body) : ("The " + body); + ErrorPath errorPath = getErrorPath(tok, value, "Access out of bounds"); + reportError(std::move(errorPath), + (condition || mayAccessFewer) ? Severity::warning : Severity::error, + "algorithmOutOfBounds", + msg, + CWE788, + inconclusive ? Certainty::inconclusive : Certainty::normal); +} + static bool isMutex(const Variable* var) { const Token* tok = Token::typeDecl(var->nameToken()).first; @@ -3478,6 +3853,7 @@ void CheckStl::runChecks(const Tokenizer &tokenizer, ErrorLogger& errorLogger) checkStl.mismatchingContainerIterator(); checkStl.knownEmptyContainer(); checkStl.eraseIteratorOutOfBounds(); + checkStl.algorithmOutOfBounds(); checkStl.stlBoundaries(); checkStl.checkDereferenceInvalidIterator(); @@ -3529,6 +3905,7 @@ void CheckStl::getErrorMessages(ErrorLogger& errorLogger, const Settings& settin c.dereferenceInvalidIteratorError(nullptr, "i"); // TODO: derefInvalidIteratorRedundantCheck c.eraseIteratorOutOfBoundsError(nullptr, nullptr); + c.algorithmOutOfBoundsError(nullptr, "std::copy", 10, 6, nullptr, false, false); c.useStlAlgorithmError(nullptr, ""); c.knownEmptyContainerError(nullptr, ""); c.globalLockGuardError(nullptr); diff --git a/lib/checkstl.h b/lib/checkstl.h index 4218090e707..0f9a70a7a15 100644 --- a/lib/checkstl.h +++ b/lib/checkstl.h @@ -26,6 +26,7 @@ #include "checkimpl.h" #include "config.h" #include "errortypes.h" +#include "mathlib.h" #include #include @@ -73,6 +74,7 @@ class CPPCHECKLIB CheckStl : public Check { "- useless calls of string and STL functions\n" "- dereferencing an invalid iterator\n" "- erasing an iterator that is out of bounds\n" + "- out of bounds access of an iterator passed to an STL algorithm\n" "- reading from empty STL container\n" "- iterating over an empty STL container\n" "- consider using an STL algorithm instead of raw loop\n" @@ -183,6 +185,12 @@ class CPPCHECKLIB CheckStlImpl : public CheckImpl { void eraseIteratorOutOfBounds(); + /** + * Check that the iterator given to an STL algorithm is not accessed + * out of bounds: std::equal(in.begin(), in.end(), out.begin()) + */ + void algorithmOutOfBounds(); + void checkMutexes(); bool isContainerSize(const Token *containerToken, const Token *expr) const; @@ -235,6 +243,14 @@ class CPPCHECKLIB CheckStlImpl : public CheckImpl { void eraseIteratorOutOfBoundsError(const Token* ftok, const Token* itertok, const ValueFlow::Value* val = nullptr); + void algorithmOutOfBoundsError(const Token* tok, + const std::string& algoName, + MathLib::bigint accessed, + MathLib::bigint available, + const ValueFlow::Value* value, + bool mayAccessFewer, + bool inconclusive); + void globalLockGuardError(const Token *tok); void localMutexError(const Token *tok); }; diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 8c77b17cf94..096e3d56f56 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3844,12 +3844,24 @@ static void valueFlowForwardConst(Token* start, { if (!precedes(start, end)) throw InternalError(var->nameToken(), "valueFlowForwardConst: start token does not precede the end token."); + const bool hasContainerSizeValue = std::any_of(values.begin(), values.end(), [](const ValueFlow::Value& value) { + return value.isContainerSizeValue(); + }); for (Token* tok = start; tok != end; tok = tok->next()) { if (tok->varId() == var->declarationId()) { for (const ValueFlow::Value& value : values) setTokenValue(tok, value, settings); } else { [&] { + // Add the container size to iterators of the container (mirrors ContainerExpressionAnalyzer::match) + if (hasContainerSizeValue && astIsIterator(tok) && isAliasOf(tok, var->declarationId())) { + for (const ValueFlow::Value& value : values) { + if (!value.isContainerSizeValue()) + continue; + setTokenValue(tok, value, settings); + } + return; + } // Follow references const auto& refs = tok->refs(); auto it = std::find_if(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) { diff --git a/man/checkers/algorithmOutOfBounds.md b/man/checkers/algorithmOutOfBounds.md new file mode 100644 index 00000000000..8e446f82895 --- /dev/null +++ b/man/checkers/algorithmOutOfBounds.md @@ -0,0 +1,69 @@ +# algorithmOutOfBounds + +**Message**: The algorithm 'std::copy' accesses 5 elements through the iterator 'v1.begin()' but only 3 elements are available.
+**Category**: Correctness
+**Severity**: Error
+**Language**: C++ + +## Description + +Many STL algorithms take an iterator that denotes the beginning of a second range (typically an output range) and +assume that this range is large enough. If it is not, the algorithm writes or reads past the end of the container, +which is undefined behavior. + +This checker uses the ValueFlow analysis to compare the number of elements an algorithm accesses with the number of +elements that are actually available through the iterator, and warns when the access is out of bounds. Three groups +of algorithms are checked: + +- Algorithms that access exactly `last1 - first1` elements through the other iterator: `std::copy`, `std::move`, + `std::swap_ranges`, `std::transform`, `std::replace_copy`, `std::replace_copy_if`, `std::reverse_copy`, + `std::equal`, `std::mismatch`, `std::is_permutation`, `std::partial_sum`, `std::adjacent_difference` and + `std::inner_product`. +- Algorithms that access at most `last1 - first1` elements, depending on the values in the input range: + `std::copy_if`, `std::remove_copy`, `std::remove_copy_if` and `std::unique_copy`. Since the actual number of + accessed elements is not known, these are only reported as inconclusive warnings (with `--inconclusive`). +- Count-based algorithms that access as many elements as the count argument says: `std::copy_n`, `std::fill_n` and + `std::generate_n`. + +The severity is `error` when the out of bounds access always happens. When the analysis depends on an earlier +condition in the code, the severity is `warning` and the message has the form "Either the condition 'v.size()==3' +is redundant or the algorithm ... ". + +The checker does not warn when: + +- The second range is given with both a begin and an end iterator (for example the two-range overloads of + `std::equal`, `std::mismatch` and `std::is_permutation`), since such overloads do not access the second range out + of bounds. +- An iterator adaptor such as `std::back_inserter` or `std::inserter` is used, since those grow the container as + needed. +- The proof would rely on "possible" (non-known) values on both the accessed and the available side. + +## How to fix + +Make sure the destination range is large enough before calling the algorithm, or use an iterator adaptor such as +`std::back_inserter` that grows the container as needed. + +Before: +```cpp +void f(const std::vector& v0) { + std::vector v1(3); + // If v0 has more than 3 elements, this writes past the end of v1 + std::copy(v0.begin(), v0.end(), v1.begin()); +} +``` + +After: +```cpp +void f(const std::vector& v0) { + std::vector v1(v0.size()); + std::copy(v0.begin(), v0.end(), v1.begin()); +} +``` + +Or let the container grow: +```cpp +void f(const std::vector& v0) { + std::vector v1; + std::copy(v0.begin(), v0.end(), std::back_inserter(v1)); +} +``` diff --git a/releasenotes.txt b/releasenotes.txt index 0ca26f2374a..1c0739dec0d 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -7,6 +7,7 @@ Major bug fixes & crashes: New checks: - Warn when feof() is used as a while loop condition (wrongfeofUsage). - ftell() result is unspecified when file is opened in mode "t". +- Detect when an STL algorithm such as std::copy, std::equal, std::transform, etc. accesses more elements through an iterator than are available in the container (algorithmOutOfBounds). C/C++ support: - diff --git a/test/cli/other_test.py b/test/cli/other_test.py index c79fd0c8e50..c48a0b50354 100644 --- a/test/cli/other_test.py +++ b/test/cli/other_test.py @@ -1,4 +1,3 @@ - # python -m pytest test-other.py import os @@ -4429,25 +4428,25 @@ def __test_active_checkers(tmp_path, active_cnt, total_cnt, use_misra=False, use def test_active_unusedfunction_only(tmp_path): - __test_active_checkers(tmp_path, 1, 187, use_unusedfunction_only=True) + __test_active_checkers(tmp_path, 1, 188, use_unusedfunction_only=True) def test_active_unusedfunction_only_builddir(tmp_path): checkers_exp = [ 'CheckUnusedFunctions::check' ] - __test_active_checkers(tmp_path, 1, 187, use_unusedfunction_only=True, checkers_exp=checkers_exp) + __test_active_checkers(tmp_path, 1, 188, use_unusedfunction_only=True, checkers_exp=checkers_exp) def test_active_unusedfunction_only_misra(tmp_path): - __test_active_checkers(tmp_path, 1, 387, use_unusedfunction_only=True, use_misra=True) + __test_active_checkers(tmp_path, 1, 388, use_unusedfunction_only=True, use_misra=True) def test_active_unusedfunction_only_misra_builddir(tmp_path): checkers_exp = [ 'CheckUnusedFunctions::check' ] - __test_active_checkers(tmp_path, 1, 387, use_unusedfunction_only=True, use_misra=True, checkers_exp=checkers_exp) + __test_active_checkers(tmp_path, 1, 388, use_unusedfunction_only=True, use_misra=True, checkers_exp=checkers_exp) def test_analyzerinfo(tmp_path): diff --git a/test/teststl.cpp b/test/teststl.cpp index 93b53b43671..ed9c5503d45 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -78,6 +78,7 @@ class TestStl : public TestFixture { TEST_CASE(iteratorSameExpression); TEST_CASE(mismatchingContainerIterator); TEST_CASE(eraseIteratorOutOfBounds); + TEST_CASE(algorithmOutOfBounds); TEST_CASE(dereference); TEST_CASE(dereference_break); // #3644 - handle "break" @@ -2421,6 +2422,372 @@ class TestStl : public TestFixture { errout_str()); } + void algorithmOutOfBounds() + { + check("void f() {\n" + " const std::deque d0{1,2,3,4,5,6,7,8,9,10};\n" + " const std::deque d1{1,2,3,4,5,6};\n" + " if(std::equal(d0.cbegin(), d0.cend(), d1.cbegin())) {}\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:52]: (error) The algorithm 'std::equal' accesses 10 elements through the iterator 'd1.cbegin()' but only 6 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f() {\n" + " const std::deque d0{1,2,3,4,5,6};\n" + " const std::deque d1{1,2,3,4,5,6};\n" + " if(std::equal(d0.cbegin(), d0.cend(), d1.cbegin())) {}\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // two-range overload does not access the second range out of bounds + check("void f() {\n" + " const std::deque d0{1,2,3,4,5,6,7,8,9,10};\n" + " const std::deque d1{1,2,3,4,5,6};\n" + " if(std::equal(d0.cbegin(), d0.cend(), d1.cbegin(), d1.cend())) {}\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(3);\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:45]: (error) The algorithm 'std::copy' accesses 5 elements through the iterator 'v1.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(5);\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // iterator arithmetic + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(6);\n" + " std::copy(v0.begin(), v0.end(), v1.begin() + 3);\n" + " std::copy(v0.begin() + 3, v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:48]: (error) The algorithm 'std::copy' accesses 5 elements through the iterator 'v1.begin()+3' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // don't warn when using iterator adaptors + check("void f() {\n" + " const std::deque d0{1,2,3,4,5,6,7,8,9,10};\n" + " std::deque d1;\n" + " std::copy(d0.cbegin(), d0.cend(), std::back_inserter(d1));\n" + " std::copy(d0.cbegin(), d0.cend(), std::inserter(d1, d1.begin()));\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // algorithms that access at most last-first elements are inconclusive + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(3);\n" + " std::copy_if(v0.begin(), v0.end(), v1.begin(), [](int i) { return i != 3; });\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(3);\n" + " std::copy_if(v0.begin(), v0.end(), v1.begin(), [](int i) { return i != 3; });\n" + "}\n", + dinit(CheckOptions, $.inconclusive = true)); + ASSERT_EQUALS( + "[test.cpp:4:48]: (warning, inconclusive) The algorithm 'std::copy_if' may access up to 5 elements through the iterator 'v1.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(3);\n" + " std::transform(v0.begin(), v0.end(), v1.begin(), [](int i) { return i * 2; });\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:50]: (error) The algorithm 'std::transform' accesses 5 elements through the iterator 'v1.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // binary transform reads the third argument and writes the fourth argument + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " const std::vector v1{1,2,3};\n" + " std::vector v2(5);\n" + " std::transform(v0.begin(), v0.end(), v1.begin(), v2.begin(), [](int a, int b) { return a + b; });\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:5:50]: (error) The algorithm 'std::transform' accesses 5 elements through the iterator 'v1.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " const std::vector v1{1,2,3,4,5};\n" + " std::vector v2(3);\n" + " std::transform(v0.begin(), v0.end(), v1.begin(), v2.begin(), [](int a, int b) { return a + b; });\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:5:62]: (error) The algorithm 'std::transform' accesses 5 elements through the iterator 'v2.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // copying a range within the same container + check("void f() {\n" + " std::vector v{1,2,3,4,5,6,7,8,9,10};\n" + " std::copy(v.begin(), v.begin() + 3, v.begin() + 7);\n" + " std::copy(v.begin(), v.begin() + 4, v.begin() + 7);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:51]: (error) The algorithm 'std::copy' accesses 4 elements through the iterator 'v.begin()+7' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // unknown container sizes + check("void f(const std::vector& v0, std::vector& v1) {\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // don't warn for iterator variables when the container size changes before the algorithm is called + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::list l1(3);\n" + " auto it = l1.begin();\n" + " l1.resize(10);\n" + " std::copy(v0.begin(), v0.end(), it);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // iterator variables carry the container size + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(3);\n" + " auto it = v1.begin();\n" + " std::copy(v0.begin(), v0.end(), it);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:5:37]: (error) The algorithm 'std::copy' accesses 5 elements through the iterator 'it' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // ..and the size is the size at the call, not at the creation of the iterator + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::list l1(10);\n" + " auto it = l1.begin();\n" + " l1.resize(3);\n" + " std::copy(v0.begin(), v0.end(), it);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:6:37]: (error) The algorithm 'std::copy' accesses 5 elements through the iterator 'it' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // conditional container size + check("void f(std::vector& v) {\n" + " const std::vector v0{1,2,3,4,5};\n" + " if (v.size() == 3)\n" + " std::copy(v0.begin(), v0.end(), v.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:3:18] -> [test.cpp:4:48]: (warning) Either the condition 'v.size()==3' is redundant or the algorithm 'std::copy' accesses 5 elements through the iterator 'v.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f(std::vector& v) {\n" + " const std::vector v0{1,2,3,4,5};\n" + " if (v.size() < 5)\n" + " std::copy(v0.begin(), v0.end(), v.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:3:18] -> [test.cpp:4:48]: (warning) Either the condition 'v.size()<5' is redundant or the algorithm 'std::copy' accesses 5 elements through the iterator 'v.begin()' but only 4 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f(std::vector& v) {\n" + " const std::vector v0{1,2,3,4,5};\n" + " if (v.size() >= 5)\n" + " std::copy(v0.begin(), v0.end(), v.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // writing through the end iterator + check("void f() {\n" + " const std::vector v0{1,2,3};\n" + " std::vector v1(10);\n" + " std::copy(v0.begin(), v0.end(), v1.end());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:43]: (error) The algorithm 'std::copy' accesses 3 elements through the iterator 'v1.end()' but only 0 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // the source range is known even when the container size is not + check("void f(const std::vector& v) {\n" + " std::vector v1(3);\n" + " std::copy(v.begin(), v.begin() + 5, v1.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:3:49]: (error) The algorithm 'std::copy' accesses 5 elements through the iterator 'v1.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // count-based algorithms access both iterator arguments times + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(3);\n" + " std::copy_n(v0.begin(), 5, v1.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:40]: (error) The algorithm 'std::copy_n' accesses 5 elements through the iterator 'v1.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(10);\n" + " std::copy_n(v0.begin(), 10, v1.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:25]: (error) The algorithm 'std::copy_n' accesses 10 elements through the iterator 'v0.begin()' but only 5 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f() {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1(5);\n" + " std::copy_n(v0.begin(), 5, v1.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("void f() {\n" + " std::vector v(5);\n" + " std::fill_n(v.begin(), 10, 0);\n" + " std::fill_n(v.begin() + 3, 3, 0);\n" + " std::fill_n(v.begin(), 5, 0);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:3:24]: (error) The algorithm 'std::fill_n' accesses 10 elements through the iterator 'v.begin()' but only 5 elements are available. [algorithmOutOfBounds]\n" + "[test.cpp:4:27]: (error) The algorithm 'std::fill_n' accesses 3 elements through the iterator 'v.begin()+3' but only 2 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f() {\n" + " std::vector v;\n" + " std::fill_n(std::back_inserter(v), 10, 0);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + check("void f() {\n" + " std::vector v(5);\n" + " std::generate_n(v.begin(), 6, [] { return 1; });\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:3:28]: (error) The algorithm 'std::generate_n' accesses 6 elements through the iterator 'v.begin()' but only 5 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // conditional count + check("void f(std::vector& v, int n) {\n" + " if (v.size() == 5 && n > 5)\n" + " std::fill_n(v.begin(), n, 0);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:2:28] -> [test.cpp:3:28]: (warning) Either the condition 'n>5' is redundant or the algorithm 'std::fill_n' accesses 6 elements through the iterator 'v.begin()' but only 5 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // an upper bound of the count cannot tell whether the access is out of bounds + check("void f(int n) {\n" + " std::vector v(3);\n" + " if (n < 5)\n" + " std::fill_n(v.begin(), n, 0);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // a lower bound of the container size cannot tell whether the access is out of bounds + check("void f(std::vector& v) {\n" + " const std::vector v0{1,2,3,4,5};\n" + " if (v.size() >= 4)\n" + " std::copy(v0.begin(), v0.end(), v.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // unknown count + check("void f(std::vector& v, int n) {\n" + " std::fill_n(v.begin(), n, 0);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // all container size values are checked, not only the first one + check("void f(bool b) {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1;\n" + " if (b)\n" + " v1.resize(3);\n" + " else\n" + " v1.resize(10);\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:8:45]: (error) The algorithm 'std::copy' accesses 5 elements through the iterator 'v1.begin()' but only 3 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f(bool b) {\n" + " const std::vector v0{1,2,3,4,5};\n" + " std::vector v1;\n" + " if (b)\n" + " v1.resize(5);\n" + " else\n" + " v1.resize(10);\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // all iterator position values are checked as well + check("void f(bool b) {\n" + " const std::vector v0{1,2,3,4};\n" + " std::vector v1(5);\n" + " auto it = b ? v1.begin() : v1.begin() + 3;\n" + " std::copy(v0.begin(), v0.end(), it);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:5:37]: (error) The algorithm 'std::copy' accesses 4 elements through the iterator 'it' but only 2 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + // do not combine possible values on both sides + check("void f(bool b, std::vector& v0, std::vector& v1) {\n" + " if (b) v0.resize(5); else v0.resize(2);\n" + " if (b) v1.resize(3); else v1.resize(10);\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // all source range values are checked against the preferred destination values + check("void f(bool b) {\n" + " std::vector v0;\n" + " if (b)\n" + " v0.resize(3);\n" + " else\n" + " v0.resize(10);\n" + " std::vector v1(5);\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:8:45]: (error) The algorithm 'std::copy' accesses 10 elements through the iterator 'v1.begin()' but only 5 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + + check("void f(bool b) {\n" + " std::vector v0;\n" + " if (b)\n" + " v0.resize(3);\n" + " else\n" + " v0.resize(5);\n" + " std::vector v1(5);\n" + " std::copy(v0.begin(), v0.end(), v1.begin());\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + // all count values are checked as well + check("void f(bool b) {\n" + " std::vector v(5);\n" + " const int n = b ? 3 : 10;\n" + " std::fill_n(v.begin(), n, 0);\n" + "}\n"); + ASSERT_EQUALS( + "[test.cpp:4:24]: (error) The algorithm 'std::fill_n' accesses 10 elements through the iterator 'v.begin()' but only 5 elements are available. [algorithmOutOfBounds]\n", + errout_str()); + } + // Dereferencing invalid pointer void dereference() { check("void f()\n" @@ -7047,7 +7414,10 @@ class TestStl : public TestFixture { " std::copy(v1.begin(), v1.end(), v2.begin());\n" "}\n", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:4:45]: (style) Using copy with iterator 'v2.begin()' that is always empty. [knownEmptyContainer]\n", errout_str()); + ASSERT_EQUALS( + "[test.cpp:4:45]: (style) Using copy with iterator 'v2.begin()' that is always empty. [knownEmptyContainer]\n" + "[test.cpp:4:45]: (error) The algorithm 'std::copy' accesses 2 elements through the iterator 'v2.begin()' but only 0 elements are available. [algorithmOutOfBounds]\n", + errout_str()); check("void f() {\n" " std::vector v;\n" diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 1f144900c4d..abeb603b660 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -137,6 +137,7 @@ class TestValueFlow : public TestFixture { TEST_CASE(valueFlowConditionExpressions); TEST_CASE(valueFlowContainerSize); + TEST_CASE(valueFlowContainerSizeIterator); TEST_CASE(valueFlowContainerElement); TEST_CASE(valueFlowDynamicBufferSize); @@ -7662,6 +7663,47 @@ class TestValueFlow : public TestFixture { ASSERT(!isKnownContainerSizeValue(tokenValues(code, "m ."), 0).empty()); } + void valueFlowContainerSizeIterator() { + const char* code; + + // valueFlowForwardConst: the container size is added to iterators of a const container + code = "void f() {\n" + " const std::vector v{1, 2, 3};\n" + " auto it = v.begin();\n" + " if (it != v.end()) {}\n" + "}"; + ASSERT_EQUALS( + "", + isKnownContainerSizeValue(tokenValues(code, "it !=", ValueFlow::Value::ValueType::CONTAINER_SIZE), 3)); + + // ..also to iterators created in place + code = "void f() {\n" + " const std::deque d{1, 2, 3, 4, 5, 6};\n" + " if (std::equal(d.cbegin(), d.cend(), d.cbegin())) {}\n" + "}"; + ASSERT_EQUALS( + "", + isKnownContainerSizeValue(tokenValues(code, "( ) ,", ValueFlow::Value::ValueType::CONTAINER_SIZE), 6)); + + // ..and to iterators of containers with a static size + code = "void f() {\n" + " std::array a;\n" + " auto it = a.begin();\n" + " if (it != a.end()) {}\n" + "}"; + ASSERT_EQUALS( + "", + isKnownContainerSizeValue(tokenValues(code, "it !=", ValueFlow::Value::ValueType::CONTAINER_SIZE), 5)); + + // the size of another container is not added to the iterator + code = "void f(std::vector& w) {\n" + " const std::vector v{1, 2, 3};\n" + " auto it = w.begin();\n" + " if (it != w.end()) {}\n" + "}"; + ASSERT(tokenValues(code, "it !=", ValueFlow::Value::ValueType::CONTAINER_SIZE).empty()); + } + void valueFlowContainerElement() { const char* code; From 174a5692e78af69120710d2d127d67afabee4f61 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:01:07 +0200 Subject: [PATCH 145/171] Fix #13148 FN: constStatement (static_cast(integer|nullptr|NULL)) (#8694) Co-authored-by: chrchr-github --- lib/checkother.cpp | 38 ++++++++++----------------- test/cli/proj-inline-suppress/cfg.c | 4 +-- test/testincompletestatement.cpp | 40 ++++++++++++++++++++--------- test/testother.cpp | 7 +++-- 4 files changed, 48 insertions(+), 41 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index f0d7fbd91f1..d8f2f6ff6f4 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -2323,18 +2323,12 @@ static bool isConstStatement(const Token *tok, const Library& library, bool plat static bool isVoidStmt(const Token *tok) { - if (Token::simpleMatch(tok, "( void")) + if (Token::simpleMatch(tok, "( void") && !(tok->astOperand1() && (tok->astOperand1()->isLiteral() || isNullOperand(tok->astOperand1())))) return true; - if (isCPPCast(tok) && tok->astOperand1() && Token::Match(tok->astOperand1()->next(), "< void *| >")) + if (isCPPCast(tok) && tok->astOperand1() && Token::Match(tok->astOperand1()->next(), "< void *| >") && + !(tok->astOperand2() && (tok->astOperand2()->isLiteral() || isNullOperand(tok->astOperand2())))) return true; - const Token *tok2 = tok; - while (tok2->astOperand1()) - tok2 = tok2->astOperand1(); - if (Token::simpleMatch(tok2->previous(), ")") && Token::simpleMatch(tok2->linkAt(-1), "( void")) - return true; - if (Token::simpleMatch(tok2, "( void")) - return true; - return Token::Match(tok2->previous(), "delete|throw|return"); + return false; } static bool isConstTop(const Token *tok) @@ -2425,10 +2419,6 @@ void CheckOtherImpl::checkIncompleteStatement() void CheckOtherImpl::constStatementError(const Token *tok, const std::string &type, bool inconclusive) { - const Token *valueTok = tok; - while (valueTok && valueTok->isCast()) - valueTok = valueTok->astOperand2() ? valueTok->astOperand2() : valueTok->astOperand1(); - std::string msg; if (Token::simpleMatch(tok, "==")) msg = "Found suspicious equality comparison. Did you intend to assign a value instead?"; @@ -2436,26 +2426,24 @@ void CheckOtherImpl::constStatementError(const Token *tok, const std::string &ty msg = "Found suspicious operator '" + tok->str() + "', result is not used."; else if (Token::Match(tok, "%var%")) msg = "Unused variable value '" + tok->str() + "'"; - else if (isConstant(valueTok)) { + else if (isConstant(tok)) { std::string typeStr("string"); - if (valueTok->isNumber()) + if (tok->isNumber()) typeStr = "numeric"; - else if (valueTok->isBoolean()) + else if (tok->isBoolean()) typeStr = "bool"; - else if (valueTok->tokType() == Token::eChar) + else if (tok->tokType() == Token::eChar) typeStr = "character"; - else if (isNullOperand(valueTok)) - typeStr = "NULL"; - else if (valueTok->isEnumerator()) + else if (isNullOperand(tok)) + typeStr = "null"; + else if (tok->isEnumerator()) typeStr = "enumerator"; msg = "Redundant code: Found a statement that begins with " + typeStr + " constant."; } else if (!tok) msg = "Redundant code: Found a statement that begins with " + type + " constant."; - else if (tok->isCast() && tok->tokType() == Token::Type::eExtendedOp) { - msg = "Redundant code: Found unused cast "; - msg += valueTok ? "of expression '" + valueTok->expressionString() + "'." : "expression."; - } + else if (tok->isCast() && tok->tokType() == Token::Type::eExtendedOp) + msg = "Redundant code: Found unused cast in expression '" + tok->expressionString() + "'."; else if (tok->str() == "?" && tok->tokType() == Token::Type::eExtendedOp) msg = "Redundant code: Found unused result of ternary operator."; else if (tok->str() == "." && tok->tokType() == Token::Type::eOther) diff --git a/test/cli/proj-inline-suppress/cfg.c b/test/cli/proj-inline-suppress/cfg.c index b597217fa32..42709095dcf 100644 --- a/test/cli/proj-inline-suppress/cfg.c +++ b/test/cli/proj-inline-suppress/cfg.c @@ -2,9 +2,9 @@ void f() { #if DEF_1 // cppcheck-suppress id - (void)0; + ; #endif // cppcheck-suppress id - (void)0; + ; } diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index 806f734274e..da238d304b2 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -180,9 +180,25 @@ class TestIncompleteStatement : public TestFixture { } void void0() { // #6327 - check("void f() { (void*)0; }"); + check("#define assert(x) ((void)0)\n" + "void f(int* p) {\n" + " assert(p);\n" + "}\n"); ASSERT_EQUALS("", errout_str()); + check("void f() { (void*)0; }"); + ASSERT_EQUALS("[test.cpp:1:12]: (warning) Redundant code: Found unused cast in expression '(void*)0'. [constStatement]\n", errout_str()); + + check("void f() {\n" // #13148 + " static_cast(1);\n" + " static_cast(nullptr);\n" + " (void)NULL;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:22]: (warning) Redundant code: Found unused cast in expression 'static_cast(1)'. [constStatement]\n" + "[test.cpp:3:22]: (warning) Redundant code: Found unused cast in expression 'static_cast(nullptr)'. [constStatement]\n" + "[test.cpp:4:5]: (warning) Redundant code: Found unused cast in expression '(void)NULL'. [constStatement]\n", + errout_str()); + check("#define X 0\n" "void f() { X; }"); ASSERT_EQUALS("", errout_str()); @@ -432,11 +448,11 @@ class TestIncompleteStatement : public TestFixture { "}\n", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:2:5]: (warning) Redundant code: Found a statement that begins with numeric constant. [constStatement]\n" "[test.cpp:3:6]: (warning) Redundant code: Found a statement that begins with numeric constant. [constStatement]\n" - "[test.cpp:4:5]: (warning) Redundant code: Found a statement that begins with numeric constant. [constStatement]\n" - "[test.cpp:5:6]: (warning) Redundant code: Found a statement that begins with numeric constant. [constStatement]\n" + "[test.cpp:4:5]: (warning) Redundant code: Found unused cast in expression '(char)1'. [constStatement]\n" + "[test.cpp:5:6]: (warning) Redundant code: Found unused cast in expression '(char)1'. [constStatement]\n" "[test.cpp:6:5]: (warning, inconclusive) Found suspicious operator '!', result is not used. [constStatement]\n" "[test.cpp:7:6]: (warning, inconclusive) Found suspicious operator '!', result is not used. [constStatement]\n" - "[test.cpp:8:5]: (warning) Redundant code: Found unused cast of expression '!x'. [constStatement]\n" + "[test.cpp:8:5]: (warning) Redundant code: Found unused cast in expression '(unsigned int)!x'. [constStatement]\n" "[test.cpp:9:5]: (warning, inconclusive) Found suspicious operator '~', result is not used. [constStatement]\n", errout_str()); @@ -447,7 +463,7 @@ class TestIncompleteStatement : public TestFixture { ASSERT_EQUALS("", errout_str()); check("void f(int x) { static_cast(x); }"); - ASSERT_EQUALS("[test.cpp:1:38]: (warning) Redundant code: Found unused cast of expression 'x'. [constStatement]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:1:38]: (warning) Redundant code: Found unused cast in expression 'static_cast(x)'. [constStatement]\n", errout_str()); check("void f(int x, int* p) {\n" " static_cast(x);\n" @@ -465,9 +481,9 @@ class TestIncompleteStatement : public TestFixture { " static_cast((char)i);\n" " (char)static_cast(i);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2:5]: (warning) Redundant code: Found unused cast of expression 'i'. [constStatement]\n" - "[test.cpp:3:23]: (warning) Redundant code: Found unused cast of expression 'i'. [constStatement]\n" - "[test.cpp:4:5]: (warning) Redundant code: Found unused cast of expression 'i'. [constStatement]\n", + ASSERT_EQUALS("[test.cpp:2:5]: (warning) Redundant code: Found unused cast in expression '(float)(char)i'. [constStatement]\n" + "[test.cpp:3:23]: (warning) Redundant code: Found unused cast in expression 'static_cast((char)i)'. [constStatement]\n" + "[test.cpp:4:5]: (warning) Redundant code: Found unused cast in expression '(char)static_cast(i)'. [constStatement]\n", errout_str()); check("namespace M {\n" @@ -476,7 +492,7 @@ class TestIncompleteStatement : public TestFixture { "void f(int i) {\n" " (M::N::T)i;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5:5]: (warning) Redundant code: Found unused cast of expression 'i'. [constStatement]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:5:5]: (warning) Redundant code: Found unused cast in expression '(char)i'. [constStatement]\n", errout_str()); check("void f(int (g)(int a, int b)) {\n" // #10873 " int p = 0, q = 1;\n" @@ -528,7 +544,7 @@ class TestIncompleteStatement : public TestFixture { " for (L\"y\"; ;) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:2:10]: (warning) Unused variable value 'i' [constStatement]\n" - "[test.cpp:3:10]: (warning) Redundant code: Found unused cast of expression 'i'. [constStatement]\n" + "[test.cpp:3:10]: (warning) Redundant code: Found unused cast in expression '(long)i'. [constStatement]\n" "[test.cpp:4:10]: (warning) Redundant code: Found a statement that begins with numeric constant. [constStatement]\n" "[test.cpp:5:10]: (warning) Redundant code: Found a statement that begins with bool constant. [constStatement]\n" "[test.cpp:6:10]: (warning) Redundant code: Found a statement that begins with character constant. [constStatement]\n" @@ -696,8 +712,8 @@ class TestIncompleteStatement : public TestFixture { " NULL;\n" " nullptr;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2:5]: (warning) Redundant code: Found a statement that begins with NULL constant. [constStatement]\n" - "[test.cpp:3:5]: (warning) Redundant code: Found a statement that begins with NULL constant. [constStatement]\n", + ASSERT_EQUALS("[test.cpp:2:5]: (warning) Redundant code: Found a statement that begins with null constant. [constStatement]\n" + "[test.cpp:3:5]: (warning) Redundant code: Found a statement that begins with null constant. [constStatement]\n", errout_str()); check("struct S { int i; };\n" // #6504 diff --git a/test/testother.cpp b/test/testother.cpp index ca42ef23deb..0b87a07f160 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -3914,7 +3914,9 @@ class TestOther : public TestFixture { " (void)(true);\n" " if (r) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:1:13]: (style) Parameter 'r' can be declared as reference to const [constParameterReference]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:2:5]: (warning) Redundant code: Found unused cast in expression '(void)(true)'. [constStatement]\n" + "[test.cpp:1:13]: (style) Parameter 'r' can be declared as reference to const [constParameterReference]\n", + errout_str()); check("struct S { void f(int&); };\n" // #12216 "void g(S& s, int& r, void (S::* p2m)(int&)) {\n" @@ -7012,7 +7014,8 @@ class TestOther : public TestFixture { " std::pair(1, 2);\n" " (void)0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2:10]: (style) Instance of 'std::string' object is destroyed immediately. [unusedScopedObject]\n" + ASSERT_EQUALS("[test.cpp:5:5]: (warning) Redundant code: Found unused cast in expression '(void)0'. [constStatement]\n" + "[test.cpp:2:10]: (style) Instance of 'std::string' object is destroyed immediately. [unusedScopedObject]\n" "[test.cpp:3:10]: (style) Instance of 'std::string' object is destroyed immediately. [unusedScopedObject]\n" "[test.cpp:4:10]: (style) Instance of 'std::pair' object is destroyed immediately. [unusedScopedObject]\n", errout_str()); From df67f2b84f2295c65ac1b6bd386a80979cac1254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 13 Jul 2026 17:13:13 +0200 Subject: [PATCH 146/171] CI: suppress with symbolname (#8714) --- .github/workflows/selfcheck.yml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/.github/workflows/selfcheck.yml b/.github/workflows/selfcheck.yml index 1a213039f93..3517486df31 100644 --- a/.github/workflows/selfcheck.yml +++ b/.github/workflows/selfcheck.yml @@ -121,8 +121,25 @@ jobs: - name: Self check (unusedFunction / no test / no gui) run: | - supprs="--suppress=unusedFunction:lib/errorlogger.h:198 --suppress=unusedFunction:lib/importproject.cpp:1671 --suppress=unusedFunction:lib/importproject.cpp:1695" - ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib -D__CPPCHECK__ -D__GNUC__ --enable=unusedFunction,information --exception-handling -rp=. --project=cmake.output.notest_nogui/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr $supprs + echo ' + + + unusedFunction + lib/errorlogger.h + verboseMessage + + + unusedFunction + lib/importproject.cpp + selectVsConfigurations + + + unusedFunction + lib/importproject.cpp + getVSConfigs + + ' > supprs.xml + ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib -D__CPPCHECK__ -D__GNUC__ --enable=unusedFunction,information --exception-handling -rp=. --project=cmake.output.notest_nogui/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr --suppress-xml=supprs.xml env: DISABLE_VALUEFLOW: 1 UNUSEDFUNCTION_ONLY: 1 From b6e1f451ca73418fe6433da095c07d69c8addfbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 14 Jul 2026 08:21:25 +0200 Subject: [PATCH 147/171] Fix #14910: Wrong tokenization of qualified function-pointer member definition (#8718) --- lib/tokenize.cpp | 9 +++++++-- test/testsimplifyusing.cpp | 8 ++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4e00e0d184e..f273cd623ec 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3389,12 +3389,17 @@ bool Tokenizer::simplifyUsing() } else if (fpArgList && fpQual && Token::Match(tok1->next(), "%name%")) { // function pointer const bool isFuncDecl = Token::simpleMatch(tok1->tokAt(2), "("); - TokenList::copyTokens(tok1->next(), fpArgList, usingEnd->previous()); + Token *dest = tok1->next(); + while (Token::Match(dest, "%name% :: %name%")) + dest = dest->tokAt(2); + TokenList::copyTokens(dest, fpArgList, usingEnd->previous()); Token* const copyEnd = TokenList::copyTokens(tok1, start, fpQual->link()->previous()); Token* leftPar = copyEnd->previous(); while (leftPar->str() != "(") leftPar = leftPar->previous(); - Token* const insertTok = isFuncDecl ? copyEnd->linkAt(2) : copyEnd->next(); + Token *insertTok = isFuncDecl ? copyEnd->linkAt(2) : copyEnd->next(); + while (Token::Match(insertTok, "%name% :: %name%")) + insertTok = insertTok->tokAt(2); Token* const rightPar = insertTok->insertToken(")"); Token::createMutualLinks(leftPar, rightPar); tok1->deleteThis(); diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 160f80762a8..5210d484d40 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -78,6 +78,7 @@ class TestSimplifyUsing : public TestFixture { TEST_CASE(simplifyUsing38); TEST_CASE(simplifyUsing39); TEST_CASE(simplifyUsing40); + TEST_CASE(simplifyUsing41); TEST_CASE(simplifyUsing8970); TEST_CASE(simplifyUsing8971); @@ -948,6 +949,13 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS(expected, tok(code)); } + void simplifyUsing41() { + const char code[] = "using FpHandler = void(*)(const SourceLocation&);\n" + "inline FpHandler AssertImpl::m_fpHandler = nullptr;\n"; + const char expected[] = "void ( * AssertImpl :: m_fpHandler ) ( const SourceLocation & ) ; m_fpHandler = nullptr ;"; + ASSERT_EQUALS(expected, tok(code)); + } + void simplifyUsing8970() { const char code[] = "using V = std::vector;\n" "struct A {\n" From 1444cd8b8a1d8a918647cc422c89219254947ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 14 Jul 2026 11:29:22 +0200 Subject: [PATCH 148/171] Fix #14782: Partially or fully missing valuetype info for auto declarations (#8599) --- lib/symboldatabase.cpp | 62 +++++++++++++++++++++++++++++----- test/testsymboldatabase.cpp | 67 +++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 9 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index b82a3f790b0..0f612d5f45a 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7021,6 +7021,10 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, const setAutoTokenProperties(autoTok); if (vt2->pointer > vt.pointer) vt.pointer++; + if (Token::simpleMatch(autoTok->next(), "&")) + vt.reference = Reference::LValue; + if (Token::simpleMatch(autoTok->next(), "&&")) + vt.reference = Reference::RValue; setValueType(var1Tok, vt); if (var1Tok != parent->previous()) setValueType(parent->previous(), vt); @@ -7295,15 +7299,55 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, const } // c++17 auto type deduction of braced init list - if (parent->isCpp() && mSettings.standards.cpp >= Standards::CPP17 && vt2 && Token::Match(parent->tokAt(-2), "auto %var% {")) { - Token *autoTok = parent->tokAt(-2); - setValueType(autoTok, *vt2); - setAutoTokenProperties(autoTok); - if (parent->previous()->variable()) - const_cast(parent->previous()->variable())->setValueType(*vt2); - else - debugMessage(parent->previous(), "debug", "Missing variable class for variable with varid"); - return; + if (parent->isCpp() && mSettings.standards.cpp >= Standards::CPP17 + && Token::Match(parent->astOperand1(), "%var% {") && vt2) { + + auto reference = Reference::None; + nonneg int pointer = 0; + nonneg int constness = 0; + nonneg int volatileness = 0; + + Token *varTok = parent->astOperand1(); + Token *typeTok = varTok->previous(); + + while (Token::Match(typeTok, "&|&&|*|const|volatile")) { + if (typeTok->str() == "&") + reference = Reference::LValue; + else if (typeTok->str() == "&&") + reference = Reference::RValue; + else if (typeTok->str() == "*") + pointer++; + else if (typeTok->str() == "const") + constness |= 1 << pointer; + else if (typeTok->str() == "volatile") + volatileness |= 1 << pointer; + typeTok = typeTok->previous(); + } + + if (typeTok->str() == "auto") { + setValueType(typeTok, *vt2); + setAutoTokenProperties(typeTok); + + auto *varVt = new ValueType(*vt2); + + varVt->reference = reference; + varVt->constness |= constness; + varVt->volatileness |= volatileness; + + if (Token::simpleMatch(typeTok->previous(), "const auto")) + varVt->constness |= 1 << pointer; + + if (Token::simpleMatch(typeTok->previous(), "volatile auto")) + varVt->volatileness |= 1 << pointer; + + varTok->setValueType(varVt); + + if (varTok->variable()) + const_cast(varTok->variable())->setValueType(*varVt); + else + debugMessage(varTok, "debug", "Missing variable class for variable with varid"); + return; + } } if (!vt1) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 345bfdb7990..69d345a1cc5 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -220,6 +220,8 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(VariableValueType4); // smart pointer type TEST_CASE(VariableValueType5); // smart pointer type TEST_CASE(VariableValueType6); // smart pointer type + TEST_CASE(VariableValueType7); + TEST_CASE(VariableValueType8); TEST_CASE(VariableValueTypeReferences); TEST_CASE(VariableValueTypeTemplate); @@ -1316,6 +1318,71 @@ class TestSymbolDatabase : public TestFixture { ASSERT(check->valueType()->smartPointerTypeToken); } + void VariableValueType7() { + GET_SYMBOL_DB("void f() {\n" + " auto x0 = 0;\n" + " auto &x1 = x0;\n" + " auto &x2 {x0};\n" + " auto &&x3 = 0;\n" + " auto &&x4 {0};\n" + "}\n"); + + const Token* x1 = Token::findsimplematch(tokenizer.tokens(), "x1"); + const Token* x2 = Token::findsimplematch(tokenizer.tokens(), "x2"); + const Token* x3 = Token::findsimplematch(tokenizer.tokens(), "x3"); + const Token* x4 = Token::findsimplematch(tokenizer.tokens(), "x4"); + + ASSERT(x1); + ASSERT(x2); + ASSERT(x3); + ASSERT(x4); + + ASSERT_EQUALS_ENUM(ValueType::INT, x1->valueType()->type); + ASSERT_EQUALS_ENUM(ValueType::INT, x2->valueType()->type); + ASSERT_EQUALS_ENUM(ValueType::INT, x3->valueType()->type); + ASSERT_EQUALS_ENUM(ValueType::INT, x4->valueType()->type); + + ASSERT_EQUALS_ENUM(Reference::LValue, x1->valueType()->reference); + ASSERT_EQUALS_ENUM(Reference::LValue, x2->valueType()->reference); + ASSERT_EQUALS_ENUM(Reference::RValue, x3->valueType()->reference); + ASSERT_EQUALS_ENUM(Reference::RValue, x4->valueType()->reference); + } + + void VariableValueType8() { + GET_SYMBOL_DB("void f() {\n" + " char buf[128];\n" + " const auto *const x0 {buf};\n" + " auto *const x1 {buf};\n" + " const auto *x2 {buf};\n" + " auto x3 {buf};\n" + "}\n"); + + const Token* x0 = Token::findsimplematch(tokenizer.tokens(), "x0"); + const Token* x1 = Token::findsimplematch(tokenizer.tokens(), "x1"); + const Token* x2 = Token::findsimplematch(tokenizer.tokens(), "x2"); + const Token* x3 = Token::findsimplematch(tokenizer.tokens(), "x3"); + + ASSERT(x0); + ASSERT(x1); + ASSERT(x2); + ASSERT(x3); + + ASSERT_EQUALS_ENUM(ValueType::CHAR, x0->valueType()->type); + ASSERT_EQUALS_ENUM(ValueType::CHAR, x1->valueType()->type); + ASSERT_EQUALS_ENUM(ValueType::CHAR, x2->valueType()->type); + ASSERT_EQUALS_ENUM(ValueType::CHAR, x3->valueType()->type); + + ASSERT_EQUALS(3, x0->valueType()->constness); + ASSERT_EQUALS(1, x1->valueType()->constness); + ASSERT_EQUALS(2, x2->valueType()->constness); + ASSERT_EQUALS(0, x3->valueType()->constness); + + ASSERT_EQUALS(1, x0->valueType()->pointer); + ASSERT_EQUALS(1, x1->valueType()->pointer); + ASSERT_EQUALS(1, x2->valueType()->pointer); + ASSERT_EQUALS(1, x3->valueType()->pointer); + } + void VariableValueTypeReferences() { { GET_SYMBOL_DB("void foo(int x) {}\n"); From a1beb847d99392a77382b8a32171d3e140bd568b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 14 Jul 2026 13:12:01 +0200 Subject: [PATCH 149/171] Add test for #14797: internalAstError with if in do while loop (#8725) Fixed in 42a08059f71f3952f7f992dfe82828e2af495c6e. --- test/testtokenize.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index c4de2be00e7..f1a2a85e212 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -92,6 +92,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(tokenize40); // #13181 TEST_CASE(tokenize41); // #13847 TEST_CASE(tokenize42); // #13861 + TEST_CASE(tokenize43); // #13861 TEST_CASE(validate); @@ -941,6 +942,12 @@ class TestTokenizer : public TestFixture { (void)errout_str(); } + void tokenize43() { + const char code[] = "void f(int i) { do if (i &= 1) {} while (0); }"; + ASSERT_NO_THROW(tokenizeAndStringify(code)); + (void)errout_str(); + } + void validate() { // C++ code in C file ASSERT_THROW_INTERNAL(tokenizeAndStringify(";using namespace std;",dinit(TokenizeOptions, $.expand = false, $.cpp = false)), SYNTAX); From 3deb36d1f386553bbcee076082e33e7b58d68537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 14 Jul 2026 13:13:58 +0200 Subject: [PATCH 150/171] Fix #14901: fuzzing timeout (hang) in Tokenizer::simplifyTypedef() (#8717) --- lib/tokenize.cpp | 18 ++++++++++++++++++ ...ut-242e02017d15d072fd7a230de22faeef0816693d | 1 + test/testsimplifytypedef.cpp | 10 ++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 test/cli/fuzz-timeout/timeout-242e02017d15d072fd7a230de22faeef0816693d diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index f273cd623ec..3dc83082e4e 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -589,12 +589,27 @@ namespace { } } + const auto checkForRecursion = [this]() { + if (Token::Match(mTypedefToken, "typedef %name% %name% ;")) + return; + for (const Token *tok = mTypedefToken; tok != mEndToken; tok = tok->next()) { + if (tok == mNameToken) + continue; + if (tok->str() != mNameToken->str()) + continue; + if (Token::Match(tok->previous(), "struct|class|enum|union")) + continue; + throw InternalError(tok, "recursive typedef encountered"); + } + }; + for (Token* type = start; Token::Match(type, "%name%|*|&|&&"); type = type->next()) { if (type != start && Token::Match(type, "%name% ;") && !type->isStandardType()) { mRangeType.first = start; mRangeType.second = type; mNameToken = type; mEndToken = mNameToken->next(); + checkForRecursion(); return; } if (type != start && Token::Match(type, "%name% [")) { @@ -609,6 +624,7 @@ namespace { mEndToken = end->next(); mRangeAfterVar.first = mNameToken->next(); mRangeAfterVar.second = mEndToken; + checkForRecursion(); return; } if (Token::Match(type->next(), "( * const| %name% ) (") && Token::simpleMatch(type->linkAt(1)->linkAt(1), ") ;")) { @@ -618,6 +634,7 @@ namespace { mRangeType.second = mNameToken; mRangeAfterVar.first = mNameToken->next(); mRangeAfterVar.second = mEndToken; + checkForRecursion(); return; } if (type != start && Token::Match(type, "%name% ( !!(") && Token::simpleMatch(type->linkAt(1), ") ;") && !type->isStandardType()) { @@ -627,6 +644,7 @@ namespace { mRangeType.second = type; mRangeAfterVar.first = mNameToken->next(); mRangeAfterVar.second = mEndToken; + checkForRecursion(); return; } } diff --git a/test/cli/fuzz-timeout/timeout-242e02017d15d072fd7a230de22faeef0816693d b/test/cli/fuzz-timeout/timeout-242e02017d15d072fd7a230de22faeef0816693d new file mode 100644 index 00000000000..c269baf1efe --- /dev/null +++ b/test/cli/fuzz-timeout/timeout-242e02017d15d072fd7a230de22faeef0816693d @@ -0,0 +1 @@ +typedef const v*v,*; \ No newline at end of file diff --git a/test/testsimplifytypedef.cpp b/test/testsimplifytypedef.cpp index 84a95a81cfc..5a14399e406 100644 --- a/test/testsimplifytypedef.cpp +++ b/test/testsimplifytypedef.cpp @@ -233,6 +233,7 @@ class TestSimplifyTypedef : public TestFixture { TEST_CASE(simplifyTypedef160); TEST_CASE(simplifyTypedef161); TEST_CASE(simplifyTypedef162); + TEST_CASE(simplifyTypedef163); TEST_CASE(simplifyTypedefFunction1); TEST_CASE(simplifyTypedefFunction2); // ticket #1685 @@ -3836,11 +3837,11 @@ class TestSimplifyTypedef : public TestFixture { "}"; ASSERT_EQUALS(exp, tok(code)); - const char code2[] = "typedef stuct T* T;\n" // #14669 + const char code2[] = "typedef struct T* T;\n" // #14669 "struct T {\n" " T p;\n" "};\n"; - const char exp2[] = "struct T { stuct T * p ; } ;"; + const char exp2[] = "struct T { struct T * p ; } ;"; ASSERT_EQUALS(exp2, simplifyTypedefC(code2)); } @@ -3868,6 +3869,11 @@ class TestSimplifyTypedef : public TestFixture { ASSERT_EQUALS(exp, tok(code)); } + void simplifyTypedef163() { + const char code[] = "typedef v *v;"; + ASSERT_THROW_INTERNAL(tok(code), INTERNAL); + } + void simplifyTypedefFunction1() { { const char code[] = "typedef void (*my_func)();\n" From 5aa31d0da84926c8abf213942498c53cba2445c1 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 15 Jul 2026 08:33:20 +0200 Subject: [PATCH 151/171] Fix #14452 fuzzing crash (null-pointer-use) in ReverseTraversal::traverse() (#8723) --- lib/tokenlist.cpp | 3 +++ .../crash-85cab41781812453dfc8e74e1f0b915225f7a0a1 | 1 + 2 files changed, 4 insertions(+) create mode 100644 test/cli/fuzz-crash_c/crash-85cab41781812453dfc8e74e1f0b915225f7a0a1 diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 594de5c0295..53d1c4f94dd 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -1947,6 +1947,9 @@ void TokenList::validateAst(bool print) const if ((tok->isAssignmentOp() || tok->isComparisonOp() || Token::Match(tok,"[|^/%]")) && tok->astOperand1() && !tok->astOperand2()) throw InternalError(tok, "Syntax Error: AST broken, binary operator has only one operand.", InternalError::AST); + if (!(tok->astOperand1() && tok->astOperand2()) && ((isC() && tok->str() == "&&") || Token::Match(tok, "%or%|%oror%"))) + throw InternalError(tok, "Syntax Error: AST broken, binary operator is missing operand(s).", InternalError::AST); + // Syntax error if we encounter "?" with operand2 that is not ":" if (tok->str() == "?") { if (!tok->astOperand1() || !tok->astOperand2()) diff --git a/test/cli/fuzz-crash_c/crash-85cab41781812453dfc8e74e1f0b915225f7a0a1 b/test/cli/fuzz-crash_c/crash-85cab41781812453dfc8e74e1f0b915225f7a0a1 new file mode 100644 index 00000000000..a2e58c69ea7 --- /dev/null +++ b/test/cli/fuzz-crash_c/crash-85cab41781812453dfc8e74e1f0b915225f7a0a1 @@ -0,0 +1 @@ +n(f=n){n&&,n} From a0a31d927acd129c125d4f85008380eee334d710 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 15 Jul 2026 08:35:20 +0200 Subject: [PATCH 152/171] Fix #14741 fuzzing crash (null-pointer-use) in SymbolicConditionHandler::parse() (#8722) --- lib/tokenlist.cpp | 4 ++-- .../crash-401f925d3c6fd78f864ffd7bf0531bd6a76bb832 | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 test/cli/fuzz-crash_c/crash-401f925d3c6fd78f864ffd7bf0531bd6a76bb832 diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 53d1c4f94dd..ca509904db3 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -2032,9 +2032,9 @@ void TokenList::validateAst(bool print) const "' doesn't have two operands.", InternalError::AST); } - if (tok->str() == "case" && !tok->astOperand1()) { + if (!tok->astOperand1() && Token::Match(tok, "case|!")) { throw InternalError(tok, - "Syntax Error: AST broken, 'case' doesn't have an operand.", + "Syntax Error: AST broken, '" + tok->str() + "' doesn't have an operand.", InternalError::AST); } diff --git a/test/cli/fuzz-crash_c/crash-401f925d3c6fd78f864ffd7bf0531bd6a76bb832 b/test/cli/fuzz-crash_c/crash-401f925d3c6fd78f864ffd7bf0531bd6a76bb832 new file mode 100644 index 00000000000..a778e6e2823 --- /dev/null +++ b/test/cli/fuzz-crash_c/crash-401f925d3c6fd78f864ffd7bf0531bd6a76bb832 @@ -0,0 +1 @@ +i(){!!:!=!&&d} From ae6a77d2e284a5d56b957f117af021a2414405f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 15 Jul 2026 09:54:56 +0200 Subject: [PATCH 153/171] Fix #14798: internalError on sscanf format string (#8724) --- lib/checkio.cpp | 2 ++ test/testio.cpp | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 3d82bdb796a..468e2867619 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -841,6 +841,8 @@ void CheckIOImpl::checkFormatString(const Token * const tok, } ++i; } + while (!width.empty() && width[0] == '0') + width = width.substr(1); auto bracketBeg = formatString.cend(); if (i != formatString.cend() && *i == '[') { bracketBeg = i; diff --git a/test/testio.cpp b/test/testio.cpp index f90773d4cf4..843c5a62ccc 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -53,6 +53,7 @@ class TestIO : public TestFixture { TEST_CASE(testScanf3); // #3494 TEST_CASE(testScanf4); // #ticket 2553 TEST_CASE(testScanf5); // #10632 + TEST_CASE(testScanf6); mNewTemplate = false; TEST_CASE(testScanfArgument); @@ -892,6 +893,14 @@ class TestIO : public TestFixture { "[test.cpp:3:5]: (error) Width 42 given in format string (no. 2) is larger than destination buffer 's2[42]', use %41[a-z] to prevent overflowing it. [invalidScanfFormatWidth]\n", errout_str()); } + void testScanf6() { + ASSERT_NO_THROW(check("int f(const char *p) {\n" + " char a[3];\n" + " return sscanf(p, \"%02s\", a);\n" + "}\n")); + ASSERT_EQUALS("", errout_str()); + } + #define TEST_SCANF_CODE(format, type) \ "void f(){" type " x; scanf(\"" format "\", &x);}" From 0873197005c7a44abce603dbb48188b03d3629e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 15 Jul 2026 09:55:15 +0200 Subject: [PATCH 154/171] Fix #14704: False positive: IOWithoutPositioning reported for user functions fread and fwrite (#8726) --- lib/checkio.cpp | 2 ++ test/testio.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 468e2867619..0a0ca70a833 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -155,6 +155,8 @@ void CheckIOImpl::checkFileUsage() tok = tok->linkAt(1); continue; } + if (tok->function() && tok->function()->nestedIn) + continue; if (tok->str() == "{") indent++; else if (tok->str() == "}") { diff --git a/test/testio.cpp b/test/testio.cpp index 843c5a62ccc..2d191555ba6 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -694,6 +694,23 @@ class TestIO : public TestFixture { " fwrite(X::data(), sizeof(char), buffer.size(), d->file);\n" "}"); ASSERT_EQUALS("[test.cpp:9:5]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour. [IOWithoutPositioning]\n", errout_str()); + + check("struct MemStream {\n" + " char buf[1024];\n" + " int pos = 0;\n" + " void fwrite(const void *ptr, size_t n) { memcpy(buf + pos, ptr, n); pos += (int)n; }\n" + "};\n" + "struct FileStream {\n" + " FILE *fp;\n" + " size_t _fread(void *ptr, size_t n) { return ::fread(ptr, 1, n, fp); }\n" + " size_t fread(void *ptr, size_t n) { return _fread(ptr, n); }\n" + " void copy_to(MemStream *dst, size_t n) {\n" + " char tmp[256];\n" + " fread(tmp, n);\n" + " dst->fwrite(tmp, n);\n" + " }\n" + "};\n"); + ASSERT_EQUALS("", errout_str()); } void seekOnAppendedFile() { From fdd606703d11911910d49a62692770b4c928e837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 15 Jul 2026 13:26:00 +0200 Subject: [PATCH 155/171] Add test for #14684 (#8728) Fixed by 1444cd8b8a1d8a918647cc422c89219254947ef5. --- test/testunusedvar.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 03ef0a14a83..849d34b49b0 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -156,6 +156,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(localvar70); TEST_CASE(localvar71); TEST_CASE(localvar72); + TEST_CASE(localvar73); TEST_CASE(localvarloops); // loops TEST_CASE(localvaralias1); TEST_CASE(localvaralias2); // ticket #1637 @@ -4074,6 +4075,16 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("[test.cpp:4:12]: (style) Unused variable: mp [unusedVariable]\n", errout_str()); } + void localvar73() { + functionVariableUsage("struct S { S(); ~S(); };\n" + "void f() {\n" + " auto a{ S() };\n" + " auto const &b{ S() };\n" + " const auto &&c{ S() };\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void localvarloops() { // loops functionVariableUsage("void fun(int c) {\n" From 8e5682d993323cc605de65896ac090fe9db93876 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 15 Jul 2026 15:55:24 +0200 Subject: [PATCH 156/171] Fix #14437 fuzzing crash (null-pointer-use) in ValueFlowAnalyzer::assume() (#8730) --- lib/tokenize.cpp | 2 +- .../fuzz-crash/crash-b4bd9ce1af8a423d15d034f42c7b99dc0f8a0a7d | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 test/cli/fuzz-crash/crash-b4bd9ce1af8a423d15d034f42c7b99dc0f8a0a7d diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 3dc83082e4e..031ab624bfb 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -6920,7 +6920,7 @@ Token *Tokenizer::simplifyAddBracesToCommand(Token *tok) // before the "while" if (tokEnd) { tokEnd=tokEnd->next(); - if (!tokEnd || tokEnd->str()!="while") // no while + if (!Token::simpleMatch(tokEnd, "while (") || !Token::simpleMatch(tokEnd->linkAt(1), ") ;")) // no while syntaxError(tok); } } diff --git a/test/cli/fuzz-crash/crash-b4bd9ce1af8a423d15d034f42c7b99dc0f8a0a7d b/test/cli/fuzz-crash/crash-b4bd9ce1af8a423d15d034f42c7b99dc0f8a0a7d new file mode 100644 index 00000000000..e7b11b223da --- /dev/null +++ b/test/cli/fuzz-crash/crash-b4bd9ce1af8a423d15d034f42c7b99dc0f8a0a7d @@ -0,0 +1 @@ +d o(n c){do if(c){}while(0)n} From bc9349a87163483fd1d70cbce66455c690eff38d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Thu, 16 Jul 2026 10:58:58 +0200 Subject: [PATCH 157/171] Fix #14919: FP constVariableReference (initialization with parentheses) (#8731) --- lib/astutils.cpp | 2 +- test/testother.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 27a01ab0382..3c5c51498ba 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3001,7 +3001,7 @@ bool isVariableChanged(const Variable * var, const Settings &settings, int depth const Token * start = var->declEndToken(); if (!start) return false; - if (Token::Match(start, "; %varid% =", var->declarationId())) + if (Token::Match(start, "; %varid% =", var->declarationId()) && !Token::simpleMatch(start->previous(), ")")) start = start->tokAt(2); if (Token::simpleMatch(start, "=")) { const Token* next = nextAfterAstRightmostLeafGeneric(start); diff --git a/test/testother.cpp b/test/testother.cpp index 0b87a07f160..92fefb72fd3 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -4146,6 +4146,14 @@ class TestOther : public TestFixture { " *o = 1;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("int f() {\n" + " int x = 0;\n" + " int& r(x);\n" + " r = x;\n" + " return r;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void constParameterCallback() { From d32c01d1b9fd2612417dedff95bf96be71915805 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Thu, 16 Jul 2026 05:01:21 -0400 Subject: [PATCH 158/171] Fix #14880 add support for Folders in slnx project file and skip non C++ projects (#8681) --- lib/importproject.cpp | 46 ++++++--- test/cli/project_test.py | 46 +++++++++ test/cli/slnx-folders/app/app.cpp | 7 ++ test/cli/slnx-folders/app/app.vcxproj | 102 ++++++++++++++++++++ test/cli/slnx-folders/lib/lib.cpp | 9 ++ test/cli/slnx-folders/lib/lib.h | 1 + test/cli/slnx-folders/lib/lib.vcxproj | 97 +++++++++++++++++++ test/cli/slnx-folders/slnx-folders.cppcheck | 17 ++++ test/cli/slnx-folders/slnx-folders.slnx | 12 +++ test/cli/slnx-folders_test.py | 73 ++++++++++++++ 10 files changed, 399 insertions(+), 11 deletions(-) create mode 100644 test/cli/slnx-folders/app/app.cpp create mode 100644 test/cli/slnx-folders/app/app.vcxproj create mode 100644 test/cli/slnx-folders/lib/lib.cpp create mode 100644 test/cli/slnx-folders/lib/lib.h create mode 100644 test/cli/slnx-folders/lib/lib.vcxproj create mode 100644 test/cli/slnx-folders/slnx-folders.cppcheck create mode 100644 test/cli/slnx-folders/slnx-folders.slnx create mode 100644 test/cli/slnx-folders_test.py diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 2d63fa8bbb7..0e6ca353480 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -529,27 +529,51 @@ bool ImportProject::importSlnx(const std::string& filename, const std::vectorName(), "Solution") != 0) { + errors.emplace_back("Invalid Visual Studio solution file format"); + return false; + } + std::map variables; variables["SolutionDir"] = Path::simplifyPath(Path::getPathFromFilename(filename)); bool found = false; std::vector sharedItemsProjects; + auto processProject = [&](const tinyxml2::XMLElement* projectNode) { + const char* pathAttribute = projectNode->Attribute("Path"); + if (pathAttribute == nullptr) + return true; + + std::string vcxproj(pathAttribute); + vcxproj = Path::toNativeSeparators(std::move(vcxproj)); + + if (Path::getFilenameExtensionInLowerCase(vcxproj) != ".vcxproj") + return true; // skip other project types + + if (!Path::isAbsolute(vcxproj)) + vcxproj = variables["SolutionDir"] + vcxproj; + + vcxproj = Path::fromNativeSeparators(std::move(vcxproj)); + if (!importVcxproj(vcxproj, variables, "", fileFilters, sharedItemsProjects)) { + errors.emplace_back("failed to load '" + vcxproj + "' from Visual Studio solution"); + return false; + } + found = true; + return true; + }; + for (const tinyxml2::XMLElement* node = rootnode->FirstChildElement(); node; node = node->NextSiblingElement()) { const char* name = node->Name(); if (std::strcmp(name, "Project") == 0) { - const char* labelAttribute = node->Attribute("Path"); - if (labelAttribute) { - std::string vcxproj(labelAttribute); - vcxproj = Path::toNativeSeparators(std::move(vcxproj)); - if (!Path::isAbsolute(vcxproj)) - vcxproj = variables["SolutionDir"] + vcxproj; - vcxproj = Path::fromNativeSeparators(std::move(vcxproj)); - if (!importVcxproj(vcxproj, variables, "", fileFilters, sharedItemsProjects)) { - errors.emplace_back("failed to load '" + vcxproj + "' from Visual Studio solution"); - return false; + if (!processProject(node)) + return false; + } else if (std::strcmp(name, "Folder") == 0) { + for (const tinyxml2::XMLElement* childNode = node->FirstChildElement(); childNode; childNode = childNode->NextSiblingElement()) { + if (std::strcmp(childNode->Name(), "Project") == 0) { + if (!processProject(childNode)) + return false; } - found = true; } } } diff --git a/test/cli/project_test.py b/test/cli/project_test.py index 7421ca406a6..64bb406a709 100644 --- a/test/cli/project_test.py +++ b/test/cli/project_test.py @@ -147,6 +147,16 @@ def test_slnx_no_xml_root(tmpdir): __test_project_error(tmpdir, "slnx", content, expected) +def test_slnx_invalid_xml_root(tmpdir): + content = '\r\n' \ + "\r\n" \ + "\r\n" + + expected = "Invalid Visual Studio solution file format" + + __test_project_error(tmpdir, "slnx", content, expected) + + def test_slnx_no_projects(tmpdir): content = '\r\n' \ "\r\n" \ @@ -161,6 +171,22 @@ def test_slnx_no_projects(tmpdir): __test_project_error(tmpdir, "slnx", content, expected) +def test_slnx_no_projects_in_folder(tmpdir): + content = '\r\n' \ + "\r\n" \ + " \r\n" \ + ' \r\n' \ + ' \r\n' \ + " \r\n" \ + ' \r\n' \ + ' \r\n' \ + "\r\n" + + expected = "no projects found in Visual Studio solution file" + + __test_project_error(tmpdir, "slnx", content, expected) + + def test_slnx_project_file_not_found(tmpdir): content = '\r\n' \ "\r\n" \ @@ -179,6 +205,26 @@ def test_slnx_project_file_not_found(tmpdir): __test_project_error(tmpdir, "slnx", content, expected) +def test_slnx_project_file_in_folder_not_found(tmpdir): + content = '\r\n' \ + "\r\n" \ + " \r\n" \ + ' \r\n' \ + ' \r\n' \ + " \r\n" \ + ' \r\n' \ + ' \r\n' \ + ' \r\n' \ + "\r\n" + + expected = "Visual Studio project file is not a valid XML - XML_ERROR_FILE_NOT_FOUND\n" \ + "cppcheck: error: failed to load '{}' from Visual Studio solution".format(os.path.join(tmpdir, "common/test.vcxproj")) + if sys.platform == "win32": + expected = expected.replace('\\', '/') + + __test_project_error(tmpdir, "slnx", content, expected) + + def test_vcxproj_no_xml_root(tmpdir): content = '' diff --git a/test/cli/slnx-folders/app/app.cpp b/test/cli/slnx-folders/app/app.cpp new file mode 100644 index 00000000000..3454c2de254 --- /dev/null +++ b/test/cli/slnx-folders/app/app.cpp @@ -0,0 +1,7 @@ +#include "../lib/lib.h" + +int main(int argc, char *argv[]) +{ + int x = 3 / 0; (void)x; // ERROR + return foo(); +} diff --git a/test/cli/slnx-folders/app/app.vcxproj b/test/cli/slnx-folders/app/app.vcxproj new file mode 100644 index 00000000000..b72ae55c565 --- /dev/null +++ b/test/cli/slnx-folders/app/app.vcxproj @@ -0,0 +1,102 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 18.0 + Win32Proj + {0de77c38-881a-4f9f-bdfa-2c429968985e} + unused + 10.0 + + + + Application + true + v145 + Unicode + + + Application + false + v145 + true + Unicode + + + + + + + + + + + + + + + ..\x64\Debug\ + x64\Debug\ + + + ..\x64\Release\ + x64\Release\ + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp20 + + + + + Console + true + ../lib + + + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp20 + + + Console + true + + + true + + + + + + + + {93BE1430-BE74-35DF-1882-AF70E49C9898} + + + + + + diff --git a/test/cli/slnx-folders/lib/lib.cpp b/test/cli/slnx-folders/lib/lib.cpp new file mode 100644 index 00000000000..b4a89cee1c7 --- /dev/null +++ b/test/cli/slnx-folders/lib/lib.cpp @@ -0,0 +1,9 @@ +#include +#include "lib.h" + +int foo() +{ + std::cout << "hello world\n"; + int x = 3 / 0; (void)x; // ERROR + return 0; +} diff --git a/test/cli/slnx-folders/lib/lib.h b/test/cli/slnx-folders/lib/lib.h new file mode 100644 index 00000000000..cf790ac3eab --- /dev/null +++ b/test/cli/slnx-folders/lib/lib.h @@ -0,0 +1 @@ +extern int foo(); diff --git a/test/cli/slnx-folders/lib/lib.vcxproj b/test/cli/slnx-folders/lib/lib.vcxproj new file mode 100644 index 00000000000..232c2478e2f --- /dev/null +++ b/test/cli/slnx-folders/lib/lib.vcxproj @@ -0,0 +1,97 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 18.0 + Win32Proj + {93BE1430-BE74-35DF-1882-AF70E49C9898} + unused + 10.0 + + + + StaticLibrary + true + v145 + Unicode + + + StaticLibrary + false + v145 + true + Unicode + + + + + + + + + + + + + + + ..\x64\Debug\ + x64\Debug\ + + + ..\x64\Release\ + x64\Release\ + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp20 + + + + + Console + true + ../lib + + + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp20 + + + Console + true + + + true + + + + + + + + + diff --git a/test/cli/slnx-folders/slnx-folders.cppcheck b/test/cli/slnx-folders/slnx-folders.cppcheck new file mode 100644 index 00000000000..4fa0c4e7623 --- /dev/null +++ b/test/cli/slnx-folders/slnx-folders.cppcheck @@ -0,0 +1,17 @@ + + + slnx-folders-cppcheck-build-dir + slnx-folders.slnx + false + true + true + true + 2 + 100 + + Debug + Release + + + slnx-folders + diff --git a/test/cli/slnx-folders/slnx-folders.slnx b/test/cli/slnx-folders/slnx-folders.slnx new file mode 100644 index 00000000000..ce6b9014431 --- /dev/null +++ b/test/cli/slnx-folders/slnx-folders.slnx @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/test/cli/slnx-folders_test.py b/test/cli/slnx-folders_test.py new file mode 100644 index 00000000000..b9dd5f09c92 --- /dev/null +++ b/test/cli/slnx-folders_test.py @@ -0,0 +1,73 @@ + +# python -m pytest slnx-folders_test.py + +import os +import re + +from testutils import cppcheck + +__script_dir = os.path.dirname(os.path.abspath(__file__)) +__proj_dir = os.path.join(__script_dir, 'slnx-folders') + +def get_lines(s): + return sorted(s.split('\n')) + +# Get Visual Studio configurations checking a file +# Checking {file} {config}... +def __getVsConfigs(stdout, filename): + ret = [] + for line in stdout.split('\n'): + if not line.startswith('Checking %s ' % filename): + continue + if not line.endswith('...'): + continue + res = re.match(r'.* ([A-Za-z0-9|]+)...', line) + if res: + ret.append(res.group(1)) + ret.sort() + return ' '.join(ret) + +def test_relative_path(): + args = [ + '--template=cppcheck1', + 'slnx-folders' + ] + ret, stdout, stderr = cppcheck(args, cwd=__script_dir) + filename1 = os.path.join('slnx-folders', 'app', 'app.cpp') + filename2 = os.path.join('slnx-folders', 'lib', 'lib.cpp') + assert ret == 0, stdout + expected = ( + '[%s:5]: (error) Division by zero.\n' + '[%s:7]: (error) Division by zero.\n' % (filename1, filename2) + ) + assert get_lines(stderr) == get_lines(expected) + +def test_local_path(): + args = [ + '--template=cppcheck1', + '.' + ] + ret, stdout, stderr = cppcheck(args, cwd=__proj_dir) + filename1 = os.path.join('app', 'app.cpp') + filename2 = os.path.join('lib', 'lib.cpp') + assert ret == 0, stdout + expected = ( + '[%s:5]: (error) Division by zero.\n' + '[%s:7]: (error) Division by zero.\n' % (filename1, filename2) + ) + assert get_lines(stderr) == get_lines(expected) + +def test_absolute_path(): + args = [ + '--template=cppcheck1', + __proj_dir + ] + ret, stdout, stderr = cppcheck(args) + filename1 = os.path.join(__proj_dir, 'app', 'app.cpp') + filename2 = os.path.join(__proj_dir, 'lib', 'lib.cpp') + assert ret == 0, stdout + expected = ( + '[%s:5]: (error) Division by zero.\n' + '[%s:7]: (error) Division by zero.\n' % (filename1, filename2) + ) + assert get_lines(stderr) == get_lines(expected) From 6edf26edb3e136945886bee40d1fceee567d3aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 17 Jul 2026 16:15:28 +0200 Subject: [PATCH 159/171] fixed #14922 - do not use absolute paths in CMake `INSTALL()` / added TODOs (#8734) --- .github/workflows/CI-unixish.yml | 1 + .github/workflows/CI-windows.yml | 4 ++++ cli/CMakeLists.txt | 17 +++++++++++------ cmake/options.cmake | 8 ++++++-- cmake/printInfo.cmake | 2 ++ gui/CMakeLists.txt | 4 ++-- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/.github/workflows/CI-unixish.yml b/.github/workflows/CI-unixish.yml index 4a7d94c4057..8fb5c8d76d6 100644 --- a/.github/workflows/CI-unixish.yml +++ b/.github/workflows/CI-unixish.yml @@ -150,6 +150,7 @@ jobs: - name: Run CMake install run: | cmake --build cmake.output --target install + # TODO: validate the installed files - name: Run CMake on ubuntu (no CLI) if: matrix.os == 'ubuntu-22.04' diff --git a/.github/workflows/CI-windows.yml b/.github/workflows/CI-windows.yml index f9d108eefc9..ce73819bc70 100644 --- a/.github/workflows/CI-windows.yml +++ b/.github/workflows/CI-windows.yml @@ -21,6 +21,7 @@ defaults: jobs: + # TODO: use Debug build to speed it up? build_qt: strategy: matrix: @@ -68,7 +69,10 @@ jobs: - name: Run CMake install run: | + rem TODO: this performs a Debug build + rem TODO: the Qt DLLS are not being installed (because of the missing windeployqt?) cmake --build build --target install + rem TODO: validate the installed files build_cmake_cxxstd: strategy: diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index f63f3291849..52103bdb8ec 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -40,27 +40,32 @@ if (BUILD_CLI) endif() install(TARGETS cppcheck - RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT applications) install(PROGRAMS ${CMAKE_SOURCE_DIR}/htmlreport/cppcheck-htmlreport - DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} + DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT applications) + # TODO: leverage CMAKE_INSTALL_DATAROOTDIR (share)? + install(FILES ${addons_py} - DESTINATION ${FILESDIR_DEF}/addons + DESTINATION ${FILESDIR_INSTALL}/addons COMPONENT headers) install(FILES ${addons_json} - DESTINATION ${FILESDIR_DEF}/addons + DESTINATION ${FILESDIR_INSTALL}/addons COMPONENT headers) install(FILES ${cfgs} - DESTINATION ${FILESDIR_DEF}/cfg + DESTINATION ${FILESDIR_INSTALL}/cfg COMPONENT headers) install(FILES ${platforms} - DESTINATION ${FILESDIR_DEF}/platforms + DESTINATION ${FILESDIR_INSTALL}/platforms COMPONENT headers) + # TODO: install manpage into CMAKE_INSTALL_MANDIR + # TODO: install documentation into CMAKE_INSTALL_DOCDIR? + endif() diff --git a/cmake/options.cmake b/cmake/options.cmake index 0fa27e4734b..bda080fe77b 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -134,18 +134,22 @@ set(CMAKE_DISABLE_PRECOMPILE_HEADERS Off CACHE BOOL "Disable precompiled headers # see https://gitlab.kitware.com/cmake/cmake/-/issues/21219 set(CMAKE_PCH_PROLOGUE "") +# TODO: do we need to set these? set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE ${CMAKE_INSTALL_PREFIX}/include CACHE PATH "Output directory for headers") set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_INSTALL_PREFIX}/lib CACHE PATH "Output directory for libraries") +# TODO: do we need to set these? set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) string(LENGTH "${FILESDIR}" _filesdir_len) # override FILESDIR if it is set or empty +# needs to be an absolute path in Cppcheck but a relative one for CMake install if(FILESDIR OR ${_filesdir_len} EQUAL 0) -# TODO: verify that it is an absolute path? + set(FILESDIR_INSTALL "${FILESDIR}") # TODO: make relative - leverage CMAKE_INSTALL_DATAROOTDIR? set(FILESDIR_DEF "${FILESDIR}") else() - set(FILESDIR_DEF ${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME} CACHE STRING "Cppcheck files directory") + set(FILESDIR_INSTALL "share/${PROJECT_NAME}") + set(FILESDIR_DEF "${CMAKE_INSTALL_PREFIX}/${FILESDIR_INSTALL}") endif() diff --git a/cmake/printInfo.cmake b/cmake/printInfo.cmake index 87c7e41f284..7869169708d 100644 --- a/cmake/printInfo.cmake +++ b/cmake/printInfo.cmake @@ -8,6 +8,7 @@ message(STATUS "Compiler Version = ${CMAKE_CXX_COMPILER_VERSION}") message(STATUS "Build type = ${CMAKE_BUILD_TYPE}") message(STATUS "CMake C++ Standard = ${CMAKE_CXX_STANDARD}") message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}") +message(STATUS "CMAKE_INSTALL_BINDIR = ${CMAKE_INSTALL_BINDIR}") message(STATUS "CMAKE_DISABLE_PRECOMPILE_HEADERS = ${CMAKE_DISABLE_PRECOMPILE_HEADERS}") message(STATUS "C++ flags (General) = ${CMAKE_CXX_FLAGS}") message(STATUS "C++ flags (Release) = ${CMAKE_CXX_FLAGS_RELEASE}") @@ -109,6 +110,7 @@ message(STATUS) message(STATUS "USE_LIBCXX = ${USE_LIBCXX}") message(STATUS) message(STATUS "FILESDIR = ${FILESDIR}") +message(STATUS "FILESDIR_INSTALL = ${FILESDIR_INSTALL}") message(STATUS "FILESDIR_DEF = ${FILESDIR_DEF}") message(STATUS) diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index d640c341458..50980bfb262 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -71,8 +71,8 @@ CheckOptions: add_dependencies(cppcheck-gui online-help.qhc) endif() - install(TARGETS cppcheck-gui RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} COMPONENT applications) - install(FILES ${qms} DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} COMPONENT applications) + install(TARGETS cppcheck-gui RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT applications) + install(FILES ${qms} DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT applications) install(FILES cppcheck-gui.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) From 95a327779a199d973763a8e05e1308f638027c6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Sat, 18 Jul 2026 20:43:27 +0200 Subject: [PATCH 160/171] CI-windows.yml: cleaned up and sped up `build_qt` job (#8735) --- .github/workflows/CI-windows.yml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/CI-windows.yml b/.github/workflows/CI-windows.yml index ce73819bc70..a63be4e0ad9 100644 --- a/.github/workflows/CI-windows.yml +++ b/.github/workflows/CI-windows.yml @@ -21,7 +21,6 @@ defaults: jobs: - # TODO: use Debug build to speed it up? build_qt: strategy: matrix: @@ -52,27 +51,26 @@ jobs: - name: Run CMake run: | rem TODO: enable rules? - rem specify Release build so matchcompiler is used - cmake -S . -B build -Werror=dev --warn-uninitialized -DCMAKE_BUILD_TYPE=Release -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DBUILD_TESTING=Off -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DBUILD_ONLINE_HELP=On -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! + cmake -S . -B build -Werror=dev --warn-uninitialized -DCMAKE_BUILD_TYPE=Debug -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DBUILD_TESTING=Off -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DBUILD_ONLINE_HELP=On -DISABLE_DMAKE=On -DCMAKE_INSTALL_PREFIX=cppcheck-cmake-install -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel! - - name: Build GUI release + - name: Build GUI run: | - cmake --build build --target cppcheck-gui --config Release || exit /b !errorlevel! + cmake --build build --config Debug --target cppcheck-gui || exit /b !errorlevel! + # TODO: can this be done in CMake? - name: Deploy GUI run: | - windeployqt build\bin\Release || exit /b !errorlevel! - del build\bin\Release\cppcheck-gui.ilk || exit /b !errorlevel! - del build\bin\Release\cppcheck-gui.pdb || exit /b !errorlevel! + windeployqt --no-translations build\bin\Debug || exit /b !errorlevel! + del build\bin\Debug\cppcheck-gui.pdb || exit /b !errorlevel! # TODO: run GUI tests - name: Run CMake install run: | - rem TODO: this performs a Debug build - rem TODO: the Qt DLLS are not being installed (because of the missing windeployqt?) - cmake --build build --target install + rem TODO: the Qt DLLs are not being installed + cmake --build build --config Debug --target install rem TODO: validate the installed files + rem TODO: the structure does not match an actual Windows installation build_cmake_cxxstd: strategy: From d01dca600b0ddea551011bae55e1468ce91c0af1 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 18 Jul 2026 22:24:17 +0200 Subject: [PATCH 161/171] Fix #14909 internalAstError with x.size() passed to template parameter (#8716) --- lib/templatesimplifier.cpp | 2 +- test/testtokenize.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 6fdd423628b..24cc0bcbe1d 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -496,7 +496,7 @@ unsigned int TemplateSimplifier::templateParameters(const Token *tok) return 0; // num/type .. - if (!tok->isNumber() && tok->tokType() != Token::eChar && tok->tokType() != Token::eString && !tok->isName() && !tok->isOp()) + if (!tok->isNumber() && tok->tokType() != Token::eChar && tok->tokType() != Token::eString && !tok->isName() && !tok->isOp() && tok->str() != ".") return 0; tok = tok->next(); if (!tok) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index f1a2a85e212..79da0177e19 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -241,6 +241,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(vardecl_stl_3); TEST_CASE(vardecl_template_1); TEST_CASE(vardecl_template_2); + TEST_CASE(vardecl_template_3); TEST_CASE(vardecl_union); TEST_CASE(vardecl_par); // #2743 - set links if variable type contains parentheses TEST_CASE(vardecl_par2); // #3912 - set correct links @@ -2394,6 +2395,19 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(expected, tokenizeAndStringify(code)); } + void vardecl_template_3() { + const char code[] = "template \n" // #14909 + "void f(T x) {\n" + " const auto y = h;\n" + "}"; + const char expected[] = "template < class T >\n" + "void f ( T x ) {\n" + "const auto y = h < T , x . size ( ) > ;\n" + "}"; + ASSERT_EQUALS(expected, tokenizeAndStringify(code)); + ASSERT_EQUALS("[test.cpp:3:11]: (debug) auto token with no type. [autoNoType]\n", errout_str()); + } + void vardecl_union() { // ticket #1976 const char code1[] = "class Fred { public: union { int a ; int b ; } ; } ;"; From 1fb66305f057029071f6b7175bc557eefaebfb87 Mon Sep 17 00:00:00 2001 From: Felix Patschkowski <49550034+Patschkowski@users.noreply.github.com> Date: Sun, 19 Jul 2026 15:41:59 +0700 Subject: [PATCH 162/171] Added configuration file for Microsoft.GSL library (#8738) Added configuration file to support: https://github.com/microsoft/gsl --- AUTHORS | 1 + cfg/microsoft_gsl.cfg | 17 ++++++++ man/manual.md | 1 + releasenotes.txt | 2 +- test/cfg/microsoft_gsl.cpp | 72 +++++++++++++++++++++++++++++++ test/cfg/runtests.sh | 5 ++- test/tools/donate_cpu_lib_test.py | 1 + tools/donate_cpu_lib.py | 1 + win_installer/cppcheck.wxs | 1 + 9 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 cfg/microsoft_gsl.cfg create mode 100644 test/cfg/microsoft_gsl.cpp diff --git a/AUTHORS b/AUTHORS index 1a7543b0d93..b4917d7d157 100644 --- a/AUTHORS +++ b/AUTHORS @@ -133,6 +133,7 @@ Felipe Pena Felix Faber Felix Geyer Felix Passenberg +Felix Patschkowski Felix Wolff Florian Mueller Florin Iucha diff --git a/cfg/microsoft_gsl.cfg b/cfg/microsoft_gsl.cfg new file mode 100644 index 00000000000..07fbfcb74a6 --- /dev/null +++ b/cfg/microsoft_gsl.cfg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/man/manual.md b/man/manual.md index 47a3a43fd36..7db916d4777 100644 --- a/man/manual.md +++ b/man/manual.md @@ -1161,6 +1161,7 @@ To use a `.cfg` file shipped with Cppcheck, pass the `--library=` option. T | `lua.cfg` | | | | `mfc.cfg` | [MFC](https://learn.microsoft.com/en-us/cpp/mfc/mfc-desktop-applications) | | | `microsoft_atl.cfg` | [ATL](https://learn.microsoft.com/en-us/cpp/atl/active-template-library-atl-concepts) | | +| `microsoft_gsl.cfg` | [Microsoft.GSL](https://github.com/microsoft/gsl) | | | `microsoft_sal.cfg` | [SAL annotations](https://learn.microsoft.com/en-us/cpp/c-runtime-library/sal-annotations) | | | `microsoft_unittest.cfg` | [CppUnitTest](https://learn.microsoft.com/en-us/visualstudio/test/microsoft-visualstudio-testtools-cppunittestframework-api-reference) | | | `motif.cfg` | | | diff --git a/releasenotes.txt b/releasenotes.txt index 1c0739dec0d..4b3ef047c5c 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -22,4 +22,4 @@ Infrastructure & dependencies: - Other: -- +- Added configuration file for Microsoft.GSL (Guideline Support Library). diff --git a/test/cfg/microsoft_gsl.cpp b/test/cfg/microsoft_gsl.cpp new file mode 100644 index 00000000000..4241cce045d --- /dev/null +++ b/test/cfg/microsoft_gsl.cpp @@ -0,0 +1,72 @@ +// Test library configuration for microsoft_gsl.cfg +// +// Usage: +// $ cppcheck --check-library --library=microsoft_gsl --enable=style,information --inconclusive --error-exitcode=1 --inline-suppr --suppress=autoNoType test/cfg/microsoft_gsl.cpp +// => +// No warnings about bad library configuration, unmatched suppressions, etc. exitcode=0 +// + +// C++ Standard Library +#include + +// Guideline Support Library +#include + +struct owner_type +{ + owner_type() = default; + owner_type(const owner_type &) = delete; + owner_type(owner_type &&) = default; + + ~owner_type() { delete ptr_; } + + auto operator=(const owner_type &) -> owner_type & = delete; + auto operator=(owner_type &&) -> owner_type & = default; + +private: + gsl::owner ptr_{new int(42)}; +}; + +auto pre_and_post_condition_test(int i) -> int +{ + Expects(i > 0); + + const auto result{i * 2}; + + Ensures(result > 0); + return result; +} + +auto suppress_macro_test(std::span s) -> int +{ + GSL_SUPPRESS("bounds.1") + return s[0]; +} + +auto iterate_over_container_test(const std::vector &v) -> int +{ + int sum{0}; + + for (gsl::index i{0}; i < v.size(); ++i) + { + sum += v[i]; + } + return sum; +} + +void not_null_test(gsl::not_null p) +{ + Expects(p != nullptr); + *p = 42; +} + +void strict_not_null_test(gsl::strict_not_null p) +{ + Expects(p != nullptr); + *p = 42; +} + +auto byte_test(gsl::byte b) -> gsl::byte +{ + return b | 0x81; +} diff --git a/test/cfg/runtests.sh b/test/cfg/runtests.sh index c8c1515e66c..4cf17b3a9df 100755 --- a/test/cfg/runtests.sh +++ b/test/cfg/runtests.sh @@ -549,7 +549,7 @@ function check_file { kde.cpp) # TODO: "kde-4config" is no longer commonly available in recent distros #kde_fn - cppcheck_run --library="$lib" --library=qt "${DIR}""$f" + cppcheck_run --library="$lib" --library=qt "${DIR}""$f" ;; libcurl.c) libcurl_fn @@ -563,6 +563,9 @@ function check_file { lua_fn cppcheck_run --library="$lib" "${DIR}""$f" ;; + microsoft_gsl.cpp) + cppcheck_run --suppress=autoNoType --library="$lib" "${DIR}""$f" + ;; mfc.cpp) mfc_fn cppcheck_run --platform=win64 --library="$lib" "${DIR}""$f" diff --git a/test/tools/donate_cpu_lib_test.py b/test/tools/donate_cpu_lib_test.py index e00a3d296a0..141781192aa 100644 --- a/test/tools/donate_cpu_lib_test.py +++ b/test/tools/donate_cpu_lib_test.py @@ -58,6 +58,7 @@ def test_library_includes(tmpdir): _test_library_includes(tmpdir, ['posix', 'gnu', 'bsd', 'opengl'], '#include\t ') _test_library_includes(tmpdir, ['posix', 'gnu', 'bsd', 'nspr'], '#include\t"prtypes.h"') _test_library_includes(tmpdir, ['posix', 'gnu', 'bsd', 'lua'], '#include \t') + _test_library_includes(tmpdir, ['posix', 'gnu', 'bsd', 'microsoft_gsl'], '#include ') def test_match_multiple_time(tmpdir): libinc = LibraryIncludes() diff --git a/tools/donate_cpu_lib.py b/tools/donate_cpu_lib.py index c292d2b9a13..ed345cb10c9 100644 --- a/tools/donate_cpu_lib.py +++ b/tools/donate_cpu_lib.py @@ -723,6 +723,7 @@ def __init__(self): 'wxwidgets': [''], + 'microsoft_gsl': [''], } self.__library_includes_re = {} diff --git a/win_installer/cppcheck.wxs b/win_installer/cppcheck.wxs index e7b597e2046..91d08c1c946 100644 --- a/win_installer/cppcheck.wxs +++ b/win_installer/cppcheck.wxs @@ -107,6 +107,7 @@ + From 2807561de51f59afd4993dd4b1e96d786fb546bf Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 20 Jul 2026 11:34:29 +0200 Subject: [PATCH 163/171] Followup to #8731: use isSplittedVarDeclEq() (#8739) --- lib/astutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 3c5c51498ba..74d2274ae6c 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3001,7 +3001,7 @@ bool isVariableChanged(const Variable * var, const Settings &settings, int depth const Token * start = var->declEndToken(); if (!start) return false; - if (Token::Match(start, "; %varid% =", var->declarationId()) && !Token::simpleMatch(start->previous(), ")")) + if (start->isSplittedVarDeclEq() && Token::Match(start, "; %varid% =", var->declarationId())) start = start->tokAt(2); if (Token::simpleMatch(start, "=")) { const Token* next = nextAfterAstRightmostLeafGeneric(start); From 678290cf0670ba88a4e1fcecc9d9d22b37cdb003 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 21 Jul 2026 08:23:08 +0200 Subject: [PATCH 164/171] Add test for #14422 (#8742) Co-authored-by: chrchr-github --- test/testnullpointer.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 02810906fb2..86b0f4aeeb9 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -145,6 +145,7 @@ class TestNullPointer : public TestFixture { TEST_CASE(nullpointer105); // #13861 TEST_CASE(nullpointer106); // #13682 TEST_CASE(nullpointer107); // #13682 (FP/FN cases around guards that depend on the pointer indirectly) + TEST_CASE(nullpointer108); TEST_CASE(nullpointer_addressOf); // address of TEST_CASE(nullpointerSwitch); // #2626 TEST_CASE(nullpointer_cast); // #4692 @@ -3105,6 +3106,15 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void nullpointer108() { // #14422 + check("void f() {\n" + " int *p{};\n" + " int *&r{p};\n" + " if (*r) {}\n" + "}"); + ASSERT_EQUALS("[test.cpp:4:10]: (error) Null pointer dereference: r [nullPointer]\n", errout_str()); + } + void nullpointer_addressOf() { // address of check("void f() {\n" " struct X *x = 0;\n" From 4ba79f2c5885f6916851ce0ea5642beac9b70a8a Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 23 Jul 2026 09:24:31 +0200 Subject: [PATCH 165/171] Fix #14929 Crash in CheckBufferOverrunImpl::getBufferSize() (#8743) Co-authored-by: chrchr-github --- lib/checkbufferoverrun.cpp | 2 +- test/testbufferoverrun.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index d28ac7c64f7..246d428802e 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -575,7 +575,7 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok, cons if (const ValueFlow::Value *value = getBufferSizeValue(bufTok)) { if (value->isBufferSizeValue()) return *value; - if (value->isContainerSizeValue() && bufTok->valueType() && bufTok->valueType()->container) { + if (value->isContainerSizeValue() && bufTok->valueType() && bufTok->valueType()->containerTypeToken) { const ValueType vtElement = ValueType::parseDecl(bufTok->valueType()->containerTypeToken, settings); const size_t elementSize = vtElement.getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer); if (elementSize > 0) { diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index f9e55910c01..b44fd742ab1 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -3551,6 +3551,12 @@ class TestBufferOverrun : public TestFixture { " std::memset(&buf[0], 0, 26);\n" "}\n"); ASSERT_EQUALS("[test.cpp:3:17]: (error) Buffer is accessed out of bounds: &buf[0] [bufferAccessOutOfBounds]\n", errout_str()); + + check("void f(FILE *fp) {\n" // #14929 + " std::string s;\n" + " fwrite(&s, 1, 1, fp);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); // don't crash } void buffer_overrun_errorpath() { From e0e5a04717d7d30b5ac068c44a591ec4f9c6c041 Mon Sep 17 00:00:00 2001 From: glankk Date: Thu, 23 Jul 2026 10:07:27 +0200 Subject: [PATCH 166/171] Fix #14931: dump file: Add classDef to scope (#8747) --- lib/symboldatabase.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 0f612d5f45a..4dbd09e98c4 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4457,6 +4457,11 @@ void SymbolDatabase::printXml(std::ostream &out) const outs += ErrorLogger::toxml(scope->className); outs += "\""; } + if (scope->classDef) { + outs += " classDef=\""; + outs += id_string(scope->classDef); + outs += "\""; + } if (scope->bodyStart) { outs += " bodyStart=\""; outs += id_string(scope->bodyStart); From f87363d10451c97a6987d5e729369cd5084d69b7 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Thu, 23 Jul 2026 04:26:30 -0500 Subject: [PATCH 167/171] Fix 14924: FP containerOutOfBounds (copy accessed in loop) (#8740) Co-authored-by: Your Name --- lib/programmemory.cpp | 29 +++++++++++++++++++++++++++-- test/teststl.cpp | 12 ++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 013906d00ae..9571e04ea00 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -1512,6 +1512,31 @@ namespace { return unknown(); } + // Get the size of the container. If the container itself is not tracked in the program + // memory then check if it is symbolically equal to a container whose size is tracked. + ValueFlow::Value executeContainerSize(const Token* containerTok) + { + ValueFlow::Value v = execute(containerTok); + if (v.isContainerSizeValue()) + return v; + for (const ValueFlow::Value& value : containerTok->values()) { + if (!value.isSymbolicValue()) + continue; + if (value.isImpossible()) + continue; + if (value.intvalue != 0) + continue; + if (!value.tokvalue) + continue; + if (value.tokvalue->exprId() == 0) + continue; + const ValueFlow::Value* sizeValue = pm->getValue(value.tokvalue->exprId()); + if (sizeValue && sizeValue->isContainerSizeValue()) + return *sizeValue; + } + return unknown(); + } + ValueFlow::Value executeImpl(const Token* expr) { const ValueFlow::Value* value = nullptr; @@ -1540,14 +1565,14 @@ namespace { const Token* containerTok = expr->tokAt(-2)->astOperand1(); const Library::Container::Yield yield = containerTok->valueType()->container->getYield(expr->strAt(-1)); if (yield == Library::Container::Yield::SIZE) { - ValueFlow::Value v = execute(containerTok); + ValueFlow::Value v = executeContainerSize(containerTok); if (!v.isContainerSizeValue()) return unknown(); v.valueType = ValueFlow::Value::ValueType::INT; return v; } if (yield == Library::Container::Yield::EMPTY) { - ValueFlow::Value v = execute(containerTok); + ValueFlow::Value v = executeContainerSize(containerTok); if (!v.isContainerSizeValue()) return unknown(); if (v.isImpossible() && v.intvalue == 0) diff --git a/test/teststl.cpp b/test/teststl.cpp index ed9c5503d45..c030fb4c6f6 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -1003,6 +1003,18 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2:13]: error: Out of bounds access in 'v[2]', if 'v' size is 1 and '2' is 2 [containerOutOfBounds]\n", errout_str()); + + checkNormal("std::string f(const std::string& str) {\n" // do not warn, the copy has the same size as 'str' + " std::string outStr = str;\n" + " if (!outStr.empty())\n" + " outStr[0] = 'a';\n" + " for (int i = 0; i < str.size(); ++i) {\n" + " if (outStr[i] == '_')\n" + " outStr[i] = ' ';\n" + " }\n" + " return outStr;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void outOfBoundsSymbolic() From 7aa7114cce28124d409ebf76e0e2a022f21e1553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Thu, 23 Jul 2026 11:44:22 +0200 Subject: [PATCH 168/171] Fix #14796: FP assertWithSideEffect for member functions without definition (#8607) --- lib/checkassert.cpp | 6 +++--- lib/checkassert.h | 2 +- test/testassert.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 1d0ecde7959..4578f7395ba 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -83,7 +83,7 @@ void CheckAssertImpl::assertWithSideEffects() if (!scope) { // guess that const method doesn't have side effects if (f->nestedIn->isClassOrStruct() && !f->isConst() && !f->isStatic()) - sideEffectInAssertError(tmp, f->name()); // Non-const member function called, assume it has side effects + sideEffectInAssertError(tmp, f->name(), " If there are no side effects, consider declaring the method const."); // Non-const member function called, assume it has side effects continue; } @@ -117,12 +117,12 @@ void CheckAssertImpl::assertWithSideEffects() //--------------------------------------------------------------------------- -void CheckAssertImpl::sideEffectInAssertError(const Token *tok, const std::string& functionName) +void CheckAssertImpl::sideEffectInAssertError(const Token *tok, const std::string& functionName, const std::string &extra) { reportError(tok, Severity::warning, "assertWithSideEffect", "$symbol:" + functionName + "\n" - "Assert statement calls a function which may have desired side effects: '$symbol'.\n" + "Assert statement calls a function which may have desired side effects: '$symbol'." + extra + "\n" "Non-pure function: '$symbol' is called inside assert statement. " "Assert statements are removed from release builds so the code inside " "assert statement is not executed. If the code is needed also in release " diff --git a/lib/checkassert.h b/lib/checkassert.h index 2db9d804fcb..15f97fb1746 100644 --- a/lib/checkassert.h +++ b/lib/checkassert.h @@ -65,7 +65,7 @@ class CPPCHECKLIB CheckAssertImpl : public CheckImpl { void checkVariableAssignment(const Token* assignTok, const Scope *assertionScope); static bool inSameScope(const Token* returnTok, const Token* assignTok); - void sideEffectInAssertError(const Token *tok, const std::string& functionName); + void sideEffectInAssertError(const Token *tok, const std::string& functionName, const std::string &extra = ""); void assignmentInAssertError(const Token *tok, const std::string &varname); }; /// @} diff --git a/test/testassert.cpp b/test/testassert.cpp index 80bb5d3b827..ea170c43f2d 100644 --- a/test/testassert.cpp +++ b/test/testassert.cpp @@ -156,7 +156,7 @@ class TestAssert : public TestFixture { "void foo(SquarePack s) {\n" " assert( s.Foo() );\n" "}"); - ASSERT_EQUALS("[test.cpp:5:14]: (warning) Assert statement calls a function which may have desired side effects: 'Foo'. [assertWithSideEffect]\n", errout_str()); + ASSERT_EQUALS("[test.cpp:5:14]: (warning) Assert statement calls a function which may have desired side effects: 'Foo'. If there are no side effects, consider declaring the method const. [assertWithSideEffect]\n", errout_str()); check("struct SquarePack {\n" " int Foo() const;\n" From d272996589c5d7c75fd6f2e4e4f52d00e5224a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Thu, 23 Jul 2026 11:46:18 +0200 Subject: [PATCH 169/171] Fix #14894: false positive: co_return not recognized as return in combination with {} (#8741) --- lib/astutils.cpp | 20 ++++++++++++++++++++ lib/astutils.h | 2 ++ lib/forwardanalyzer.cpp | 2 +- test/testnullpointer.cpp | 13 +++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 74d2274ae6c..ea54232b551 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3918,3 +3918,23 @@ const Token *skipUnreachableBranch(const Token *tok) return tok; } + +bool isEscapeKeyword(const Token *tok, const Settings &settings) +{ + if (!tok) + return false; + + if (tok->str() == "return") + return true; + + if (!tok->isCpp()) + return false; + + if (tok->str() == "throw") + return true; + + if (settings.standards.cpp < Standards::CPP20) + return false; + + return tok->str() == "co_return"; +} diff --git a/lib/astutils.h b/lib/astutils.h index 2c6650068b5..79a607108fd 100644 --- a/lib/astutils.h +++ b/lib/astutils.h @@ -463,4 +463,6 @@ bool isUnreachableOperand(const Token *tok); const Token *skipUnreachableBranch(const Token *tok); +bool isEscapeKeyword(const Token *tok, const Settings &settings); + #endif // astutilsH diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index c38d93155ea..3e227873b26 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -144,7 +144,7 @@ namespace { // If we are in a loop then jump to the end if (out) *out = loopEnds.back(); - } else if (Token::Match(tok, "return|throw")) { + } else if (isEscapeKeyword(tok, settings)) { traverseRecursive(tok->astOperand2(), f, traverseUnknown); traverseRecursive(tok->astOperand1(), f, traverseUnknown); return Break(Analyzer::Terminate::Escape); diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 86b0f4aeeb9..698946b8efa 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -146,6 +146,7 @@ class TestNullPointer : public TestFixture { TEST_CASE(nullpointer106); // #13682 TEST_CASE(nullpointer107); // #13682 (FP/FN cases around guards that depend on the pointer indirectly) TEST_CASE(nullpointer108); + TEST_CASE(nullpointer109); TEST_CASE(nullpointer_addressOf); // address of TEST_CASE(nullpointerSwitch); // #2626 TEST_CASE(nullpointer_cast); // #4692 @@ -3115,6 +3116,18 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("[test.cpp:4:10]: (error) Null pointer dereference: r [nullPointer]\n", errout_str()); } + void nullpointer109() + { + check("boost::asio::awaitable test()\n" + "{\n" + " const auto *s = getStr();\n" + " if(!s) co_return int{1};\n" + " std::print(\"{}\",*s);\n" + " co_return int{9};\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void nullpointer_addressOf() { // address of check("void f() {\n" " struct X *x = 0;\n" From 55ae8c452452de1214e9598fcc3ac02e651fff26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Thu, 23 Jul 2026 11:47:05 +0200 Subject: [PATCH 170/171] Fix #14896: false positive: missing co_return in void function (#8719) --- lib/checkfunctions.cpp | 2 ++ lib/symboldatabase.cpp | 14 ++++++++++++++ lib/symboldatabase.h | 1 + test/testfunctions.cpp | 9 +++++++++ 4 files changed, 26 insertions(+) diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index 23db248816d..1edfdfab6ac 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -329,6 +329,8 @@ void CheckFunctionsImpl::checkMissingReturn() continue; if (Function::returnsVoid(function, true)) continue; + if (Function::isCoroutine(function, mSettings.standards, *mTokenizer)) + continue; const Token *errorToken = checkMissingReturnScope(scope->bodyEnd, mSettings.library); if (errorToken) missingReturnError(errorToken); diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 4dbd09e98c4..d98c66770e1 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3407,6 +3407,20 @@ bool Function::returnsVoid(const Function* function, bool unknown) }); } +bool Function::isCoroutine(const Function* function, const Standards &standards, const Tokenizer &tokens) +{ + if (!tokens.isCPP() || standards.cpp < Standards::CPP20) + return false; + if (!function->functionScope) + return false; + const Scope *scope = function->functionScope; + for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) { + if (Token::Match(tok, "co_return|co_await|co_yield")) + return true; + } + return false; +} + std::vector Function::findReturns(const Function* f) { std::vector result; diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index 166f228ad99..7d52d0bfb32 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -945,6 +945,7 @@ class CPPCHECKLIB Function { static bool returnsStandardType(const Function* function, bool unknown = false); static bool returnsVoid(const Function* function, bool unknown = false); + static bool isCoroutine(const Function* function, const Standards &standards, const Tokenizer &tokens); static std::vector findReturns(const Function* f); diff --git a/test/testfunctions.cpp b/test/testfunctions.cpp index 788ff7a0d14..f5067bc31dc 100644 --- a/test/testfunctions.cpp +++ b/test/testfunctions.cpp @@ -86,6 +86,7 @@ class TestFunctions : public TestFixture { TEST_CASE(checkMissingReturn5); TEST_CASE(checkMissingReturn6); // #13180 TEST_CASE(checkMissingReturn7); // #14370 - FN try/catch + TEST_CASE(checkMissingReturn8); TEST_CASE(checkMissingReturnStdInt); // #14482 - FN std::int32_t // std::move for locar variable @@ -1927,6 +1928,14 @@ class TestFunctions : public TestFixture { ASSERT_EQUALS("[test.cpp:3:19]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str()); } + void checkMissingReturn8() { + const Settings s = settingsBuilder(settings).cpp(Standards::CPP20).build(); + check("boost::asio::awaitable test() {\n" + " co_return;\n" + "}\n",s); + ASSERT_EQUALS("", errout_str()); + } + void checkMissingReturnStdInt() {// #14482 - FN check("std::int32_t f() {}\n"); ASSERT_EQUALS("[test.cpp:1:19]: (error) Found an exit path from function with non-void return type that has missing return statement [missingReturn]\n", errout_str()); From 354edf03694e7d2d2f91e5cf496356a4c458a73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 24 Jul 2026 06:01:24 +0200 Subject: [PATCH 171/171] Fixed #14930 (Manual: Document hash value for warnings) (#8745) --- man/manual-premium.md | 28 ++++++++++++++++++++++++++++ man/manual.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/man/manual-premium.md b/man/manual-premium.md index 4c30dc6d4b3..c8e38666530 100644 --- a/man/manual-premium.md +++ b/man/manual-premium.md @@ -572,6 +572,34 @@ The usage of the suppressions file is as follows: cppcheck --suppress-xml=suppressions.xml src/ +### The `` element + +Cppcheck calculates a unique ID for each error, called the hash. The hash depends on the code that +is related to the error, not on where that code is located. This means that the hash for an error +stays the same even when unrelated code elsewhere in the file is added, removed or moved, shifting +the line numbers around. The hash only changes if the related code itself is modified. + +This makes hash-based suppressions more robust than line-based suppressions: once you have +reviewed and suppressed a specific warning, the suppression keeps working even after the file is +edited, as long as the offending code is not changed. + +The hash for an error is included as the `hash` attribute in the [XML output](#the-error-element). +You can copy that value into a `` element in a suppressions XML file: + + + + + uninitvar + src/file1.c + 12345678 + + + +A suppression can use `` on its own, without ``, to suppress a specific error regardless +of its id. It is also possible to combine `` with ``, ``, `` and +``; when several of these are specified, all of them must match for the suppression to +apply. + ## Inline suppressions Suppressions can also be added directly in the code by adding comments that contain special keywords. diff --git a/man/manual.md b/man/manual.md index 7db916d4777..93d67e8f402 100644 --- a/man/manual.md +++ b/man/manual.md @@ -573,6 +573,34 @@ The usage of the suppressions file is as follows: cppcheck --suppress-xml=suppressions.xml src/ +### The `` element + +Cppcheck calculates a unique ID for each error, called the hash. The hash depends on the code that +is related to the error, not on where that code is located. This means that the hash for an error +stays the same even when unrelated code elsewhere in the file is added, removed or moved, shifting +the line numbers around. The hash only changes if the related code itself is modified. + +This makes hash-based suppressions more robust than line-based suppressions: once you have +reviewed and suppressed a specific warning, the suppression keeps working even after the file is +edited, as long as the offending code is not changed. + +The hash for an error is included as the `hash` attribute in the [XML output](#the-error-element). +You can copy that value into a `` element in a suppressions XML file: + + + + + uninitvar + src/file1.c + 12345678 + + + +A suppression can use `` on its own, without ``, to suppress a specific error regardless +of its id. It is also possible to combine `` with ``, ``, `` and +``; when several of these are specified, all of them must match for the suppression to +apply. + ## Inline suppressions Suppressions can also be added directly in the code by adding comments that contain special keywords.