From 96955ccfe98d4edd73bf22cc48654f37b265736c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 1 Jul 2023 13:17:41 +0200 Subject: [PATCH 1/2] Tokenizer: detect unknown macro 'if (x) MACRO }' (#5209) --- lib/tokenize.cpp | 11 +++++++++++ test/testtokenize.cpp | 3 +++ 2 files changed, 14 insertions(+) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4969542f88f..815040df91e 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -8054,6 +8054,17 @@ void Tokenizer::reportUnknownMacros() const } } + // Report unknown macros before } "{ .. if (x) MACRO }" + for (const Token *tok = tokens(); tok; tok = tok->next()) { + if (Token::Match(tok, ")|; %name% }")) { + const Token* prev = tok->linkAt(2); + while (Token::simpleMatch(prev, "{")) + prev = prev->previous(); + if (Token::Match(prev, ";|)")) + unknownMacroError(tok->next()); + } + } + // Report unknown macros that contain several statements "MACRO(a;b;c)" for (const Token *tok = tokens(); tok; tok = tok->next()) { if (!Token::Match(tok, "%name% (")) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 2a5055a7a90..266224c0e29 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -6843,6 +6843,9 @@ class TestTokenizer : public TestFixture { ASSERT_NO_THROW(tokenizeAndStringify(code11)); ASSERT_NO_THROW(tokenizeAndStringify("alignas(8) alignas(16) int x;")); // alignas is not unknown macro + + ASSERT_THROW(tokenizeAndStringify("void foo() { if(x) SYSTEM_ERROR }"), InternalError); + ASSERT_THROW(tokenizeAndStringify("void foo() { dostuff(); SYSTEM_ERROR }"), InternalError); } void findGarbageCode() { // Test Tokenizer::findGarbageCode() From b99931c59cb00f1088a29a6a0d5b2c87b4b7bd70 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 1 Jul 2023 14:11:28 +0200 Subject: [PATCH 2/2] Fix #11808 FP uselessOverride - grandchildren calling grandfather (#5212) --- lib/symboldatabase.cpp | 4 ++-- test/testclass.cpp | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 7f09400345c..6fb5acbec75 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4388,13 +4388,13 @@ const Function * Function::getOverriddenFunctionRecursive(const ::Type* baseType auto range = parent->functionMap.equal_range(tokenDef->str()); for (std::multimap::const_iterator it = range.first; it != range.second; ++it) { const Function * func = it->second; - if (func->hasVirtualSpecifier()) { // Base is virtual and of same name + if (func->isImplicitlyVirtual()) { // Base is virtual and of same name const Token *temp1 = func->tokenDef->previous(); const Token *temp2 = tokenDef->previous(); bool match = true; // check for matching return parameters - while (temp1->str() != "virtual") { + while (!Token::Match(temp1, "virtual|{|}|;")) { if (temp1->str() != temp2->str() && !(temp1->str() == derivedFromType->name() && temp2->str() == baseType->name())) { diff --git a/test/testclass.cpp b/test/testclass.cpp index 85f0c7f0a3e..995e343835d 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -8440,6 +8440,15 @@ class TestClass : public TestFixture { " void g() { f(); }\n" "};"); ASSERT_EQUALS("", errout.str()); + + checkUselessOverride("struct B { virtual void f(); };\n" // #11808 + "struct D : B { void f() override {} };\n" + "struct D2 : D {\n" + " void f() override {\n" + " B::f();\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); } #define checkUnsafeClassRefMember(code) checkUnsafeClassRefMember_(code, __FILE__, __LINE__)