diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 3b2e32ada..f717b04a2 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1072,6 +1072,10 @@ void CheckUninitVar::checkScope(const Scope* scope) checkRhs(i->nameToken(), *i, NO_ALLOC, ""); continue; } + if (Token::Match(i->nameToken(), "%var% ) (") && Token::simpleMatch(i->nameToken()->linkAt(2), ") =")) { // Function pointer is initialized, but Rhs might be not + checkRhs(i->nameToken()->linkAt(2)->next(), *i, NO_ALLOC, ""); + continue; + } bool stdtype = _tokenizer->isC(); const Token* tok = i->typeStartToken(); diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index b617565c6..eee29398f 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -71,6 +71,7 @@ private: TEST_CASE(uninitvar8); // ticket #6230 TEST_CASE(uninitvar9); // ticket #6424 TEST_CASE(uninitvar_unconditionalTry); + TEST_CASE(uninitvar_funcptr); // #6404 TEST_CASE(syntax_error); // Ticket #5073 @@ -2825,6 +2826,28 @@ private: ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: i\n", errout.str()); } + void uninitvar_funcptr() { + checkUninitVar2("void getLibraryContainer() {\n" + " Reference< XStorageBasedLibraryContainer >(*Factory)(const Reference< XComponentContext >&, const Reference< XStorageBasedDocument >&)\n" + " = &DocumentDialogLibraryContainer::create;\n" + " rxContainer.set((*Factory)(m_aContext, xDocument));\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar2("void getLibraryContainer() {\n" + " void* x;\n" + " Reference< XStorageBasedLibraryContainer >(*Factory)(const Reference< XComponentContext >&, const Reference< XStorageBasedDocument >&)\n" + " = x;\n" + " rxContainer.set((*Factory)(m_aContext, xDocument));\n" + "}", "test.cpp", false); + ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: x\n", errout.str()); + + checkUninitVar2("void getLibraryContainer() {\n" + " Reference< XStorageBasedLibraryContainer >(*Factory)(const Reference< XComponentContext >&, const Reference< XStorageBasedDocument >&);\n" + " rxContainer.set((*Factory)(m_aContext, xDocument));\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: Factory\n", errout.str()); + } // Handling of function calls void uninitvar2_func() { // non-pointer variable