diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 8463f6a1c8e..5f90ed93d7d 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -906,7 +906,7 @@ bool CheckUninitVar::checkIfForWhileHead(const Token *startparentheses, const Va continue; uninitvarError(errorToken, errorToken->expressionString(), alloc); } - return true; + return !Token::Match(tok->astParent(), "!|%comp%"); } // skip sizeof / offsetof if (isUnevaluated(tok)) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index b3c988e5b00..3b2e82c4b50 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2035,7 +2035,7 @@ class TestUninitVar : public TestFixture { " return;\n" " char c = *s;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Memory is allocated but not initialized: s\n", "", errout_str()); + ASSERT_EQUALS("[test.cpp:6:15]: (error) Memory is allocated but not initialized: s [uninitdata]\n", errout_str()); // #3708 - false positive when using ptr typedef checkUninitVar("void f() {\n" @@ -2139,6 +2139,24 @@ class TestUninitVar : public TestFixture { " *(p + i) = 0;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + checkUninitVar("int* f() {\n" // #14448 + " int* p = (int*)malloc(4);\n" + " if (!p)\n" + " return nullptr;\n" + " if (*p) {}\n" + " return p;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:9]: (error) Memory is allocated but not initialized: *p [uninitdata]\n", errout_str()); + + checkUninitVar("int* f() {\n" + " int* p = (int*)malloc(4);\n" + " if (p == nullptr)\n" + " return nullptr;\n" + " if (*p) {}\n" + " return p;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5:9]: (error) Memory is allocated but not initialized: *p [uninitdata]\n", errout_str()); } // class / struct..