diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 427b73658..34acd00c1 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1382,7 +1382,7 @@ bool CheckUninitVar::isVariableUsage(const Scope* scope, const Token *vartok, bo return true; if (Token::Match(argStart, "const %type% & %var% [,)]")) return true; - if (pointer && Token::Match(argStart, "%type% * %var% [,)]")) + if (pointer && !address && Token::Match(argStart, "%type% * %var% [,)]")) return true; if ((pointer || address) && Token::Match(argStart, "const %type% * %var% [,)]")) return true; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index e5426b29e..d2e737c58 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2452,6 +2452,13 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + checkUninitVar2("void a(char *c);\n" // address of pointer (suspicious cast to pointer) => no error + "void b() {\n" + " char *c;\n" + " a(&c);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + checkUninitVar2("void a(const char **c);\n" // const address of pointer => no error "void b() {\n" " const char *c;\n"