From 2f9a9a7ca2ec2a60447ef3e11baeb9187541018f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Sat, 7 Dec 2024 14:36:03 +0100 Subject: [PATCH 1/2] add test --- test/testfunctions.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/testfunctions.cpp b/test/testfunctions.cpp index a2f2ad5a069..ea586270cd7 100644 --- a/test/testfunctions.cpp +++ b/test/testfunctions.cpp @@ -55,6 +55,9 @@ class TestFunctions : public TestFixture { TEST_CASE(invalidFunctionUsage1); TEST_CASE(invalidFunctionUsageStrings); + // Invalid function argument + TEST_CASE(invalidFunctionArg1); + // Math function usage TEST_CASE(mathfunctionCall_fmod); TEST_CASE(mathfunctionCall_sqrt); @@ -755,6 +758,21 @@ class TestFunctions : public TestFixture { ASSERT_EQUALS("[test.c:1]: (error) Invalid puts() argument nr 1. A nul-terminated string is required.\n", errout_str()); } + void invalidFunctionArg1() { + const Settings settingsUnix32 = settingsBuilder(settings).platform(Platform::Unix32).build(); + check("int main() {\n" + " char tgt[7];\n" + " char src[7+1] = \"7777777\";\n" + " if (sizeof tgt <= sizeof src) {\n" + " memmove(&tgt, &src, sizeof tgt);\n" + " } else {\n" + " memmove(&tgt, &src, sizeof src);\n" + " memset(&tgt + sizeof src, ' ', sizeof tgt - sizeof src);\n" + " }\n" + "}\n", false, &settingsUnix32); + ASSERT_EQUALS("", errout_str()); + } + void mathfunctionCall_sqrt() { // sqrt, sqrtf, sqrtl check("void foo()\n" From 116c5ec05600a5fbb62f68ecf2e1a4a7e2231490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Sat, 7 Dec 2024 14:22:58 +0100 Subject: [PATCH 2/2] fix #10157 --- lib/checkfunctions.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index 639b54a252b..bb6bda379ee 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -107,6 +107,7 @@ void CheckFunctions::invalidFunctionUsage() const SymbolDatabase* symbolDatabase = mTokenizer->getSymbolDatabase(); for (const Scope *scope : symbolDatabase->functionScopes) { for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { + tok = skipUnreachableBranch(tok); if (!Token::Match(tok, "%name% ( !!)")) continue; const Token * const functionToken = tok;