From 442aeb40c4ed4f729e6f2706a5af392c8fb7f6f3 Mon Sep 17 00:00:00 2001 From: chrchr Date: Fri, 16 Feb 2024 11:44:10 +0100 Subject: [PATCH 1/3] Fix #12446 FN cstyleCast with scope operator --- lib/checkother.cpp | 10 +++++++++- test/testother.cpp | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index af2ca4ea432..c38ad1df22c 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -313,8 +313,16 @@ void CheckOther::warningOldStylePointerCast() tok = scope->bodyStart; for (; tok && tok != scope->bodyEnd; tok = tok->next()) { // Old style pointer casting.. - if (!Token::Match(tok, "( const|volatile| const|volatile|class|struct| %type% * *| *| const|&| ) (| %name%|%num%|%bool%|%char%|%str%|&")) + const Token* castTok = tok->next(); + while (Token::Match(castTok, "const|volatile|class|struct|union|%type%|::")) + castTok = castTok->next(); + if (!Token::simpleMatch(castTok, "*")) continue; + while (Token::Match(castTok, "*|const|&")) + castTok = castTok->next(); + if (!Token::Match(castTok, ") (| %name%|%num%|%bool%|%char%|%str%|&")) + continue; + if (Token::Match(tok->previous(), "%type%")) continue; diff --git a/test/testother.cpp b/test/testother.cpp index 2c949a47877..2904c480234 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -1895,6 +1895,20 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (style) C-style pointer casting\n" "[test.cpp:3]: (style) C-style pointer casting\n", errout.str()); + + // #12446 + checkOldStylePointerCast("namespace N { struct S {}; }\n" + "union U {\n" + " int i;\n" + " char c[4];\n" + "};\n" + "void f(void* p) {\n" + " auto ps = (N::S*)p;\n" + " auto pu = (union U*)p;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:7]: (style) C-style pointer casting\n" + "[test.cpp:8]: (style) C-style pointer casting\n", + errout.str()); } #define checkInvalidPointerCast(...) checkInvalidPointerCast_(__FILE__, __LINE__, __VA_ARGS__) From 40336c42249e6c3675123d7d27cb337c9d3c74e9 Mon Sep 17 00:00:00 2001 From: chrchr Date: Fri, 16 Feb 2024 11:50:57 +0100 Subject: [PATCH 2/3] Fix --- lib/checkother.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index c38ad1df22c..e803adb59f8 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -313,10 +313,12 @@ void CheckOther::warningOldStylePointerCast() tok = scope->bodyStart; for (; tok && tok != scope->bodyEnd; tok = tok->next()) { // Old style pointer casting.. + if (tok->str() != "(") + continue; const Token* castTok = tok->next(); while (Token::Match(castTok, "const|volatile|class|struct|union|%type%|::")) castTok = castTok->next(); - if (!Token::simpleMatch(castTok, "*")) + if (castTok == tok->next() || !Token::simpleMatch(castTok, "*")) continue; while (Token::Match(castTok, "*|const|&")) castTok = castTok->next(); @@ -327,7 +329,7 @@ void CheckOther::warningOldStylePointerCast() continue; // skip first "const" in "const Type* const" - while (Token::Match(tok->next(), "const|volatile|class|struct")) + while (Token::Match(tok->next(), "const|volatile|class|struct|union")) tok = tok->next(); const Token* typeTok = tok->next(); // skip second "const" in "const Type* const" From 8a0acf80003c889bbf4ab277e5c472cf7c67611b Mon Sep 17 00:00:00 2001 From: chrchr Date: Fri, 16 Feb 2024 12:03:25 +0100 Subject: [PATCH 3/3] Skip template arguments --- lib/checkother.cpp | 5 ++++- test/testother.cpp | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index e803adb59f8..8eaea623500 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -316,8 +316,11 @@ void CheckOther::warningOldStylePointerCast() if (tok->str() != "(") continue; const Token* castTok = tok->next(); - while (Token::Match(castTok, "const|volatile|class|struct|union|%type%|::")) + while (Token::Match(castTok, "const|volatile|class|struct|union|%type%|::")) { castTok = castTok->next(); + if (Token::simpleMatch(castTok, "<") && castTok->link()) + castTok = castTok->link()->next(); + } if (castTok == tok->next() || !Token::simpleMatch(castTok, "*")) continue; while (Token::Match(castTok, "*|const|&")) diff --git a/test/testother.cpp b/test/testother.cpp index 2904c480234..3f938af2e85 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -1905,9 +1905,11 @@ class TestOther : public TestFixture { "void f(void* p) {\n" " auto ps = (N::S*)p;\n" " auto pu = (union U*)p;\n" + " auto pv = (std::vector*)(p);\n" "}\n"); ASSERT_EQUALS("[test.cpp:7]: (style) C-style pointer casting\n" - "[test.cpp:8]: (style) C-style pointer casting\n", + "[test.cpp:8]: (style) C-style pointer casting\n" + "[test.cpp:9]: (style) C-style pointer casting\n", errout.str()); }