From 4bebb80300bc1030454649f605eb8906884e7578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 5 Aug 2015 10:19:17 +0200 Subject: [PATCH] Fixed #6869 (False positive: uninitvar, array passed to function) --- lib/checkuninitvar.cpp | 5 ++--- test/testuninitvar.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index a20a86d4d..d6b8f3d76 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -896,15 +896,14 @@ int CheckUninitVar::isFunctionParUsage(const Token *vartok, bool pointer, Alloc // is this a function call? if (start && Token::Match(start->previous(), "%name% (")) { const bool address(vartok->previous()->str() == "&"); + const bool array(vartok->variable() && vartok->variable()->isArray()); // check how function handle uninitialized data arguments.. const Function *func = start->previous()->function(); if (func) { const Variable *arg = func->getArgumentVar(argumentNumber); if (arg) { const Token *argStart = arg->typeStartToken(); - if (!address && Token::Match(argStart, "struct| %type% [,)]")) - return 1; - if (!address && Token::Match(argStart, "struct| %type% %name% [,)]")) + if (!address && !array && Token::Match(argStart, "struct| %type% %name%| [,)]")) return 1; if (pointer && !address && alloc == NO_ALLOC && Token::Match(argStart, "struct| %type% * %name% [,)]")) return 1; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 602802606..b9bf2bc6d 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -1336,6 +1336,14 @@ private: " int **b = a[0];\n" "}"); ASSERT_EQUALS("", errout.str()); + + // #6869 - FP when passing uninit array to function + checkUninitVar("void bar(PSTR x);\n" + "void foo() {\n" + " char x[10];\n" + " bar(x);\n" + "}"); + ASSERT_EQUALS("", errout.str()); } // alloc..