diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 41414cd00..03323abfc 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1183,9 +1183,10 @@ int CheckUninitVar::isFunctionParUsage(const Token *vartok, bool pointer, Alloc const bool isnullbad = mSettings->library.isnullargbad(start->previous(), argumentNumber + 1); if (indirect == 0 && pointer && !address && isnullbad && alloc == NO_ALLOC) return 1; - const bool isuninitbad = mSettings->library.isuninitargbad(start->previous(), argumentNumber + 1, indirect); + bool hasIndirect = false; + const bool isuninitbad = mSettings->library.isuninitargbad(start->previous(), argumentNumber + 1, indirect, &hasIndirect); if (alloc != NO_ALLOC) - return isnullbad && isuninitbad; + return (isnullbad || hasIndirect) && isuninitbad; return isuninitbad && (!address || isnullbad); } } diff --git a/lib/library.cpp b/lib/library.cpp index 283963f0a..18642bab4 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -692,7 +692,7 @@ Library::Error Library::loadFunction(const tinyxml2::XMLElement * const node, co for (const tinyxml2::XMLElement *argnode = functionnode->FirstChildElement(); argnode; argnode = argnode->NextSiblingElement()) { const std::string argnodename = argnode->Name(); int indirect = 0; - const char * const indirectStr = node->Attribute("indirect"); + const char * const indirectStr = argnode->Attribute("indirect"); if (indirectStr) indirect = atoi(indirectStr); if (argnodename == "not-bool") @@ -1035,7 +1035,7 @@ bool Library::isnullargbad(const Token *ftok, int argnr) const return arg && arg->notnull; } -bool Library::isuninitargbad(const Token *ftok, int argnr, int indirect) const +bool Library::isuninitargbad(const Token *ftok, int argnr, int indirect, bool *hasIndirect) const { const ArgumentChecks *arg = getarg(ftok, argnr); if (!arg) { @@ -1045,6 +1045,8 @@ bool Library::isuninitargbad(const Token *ftok, int argnr, int indirect) const if (it != functions.cend() && it->second.formatstr && !it->second.formatstr_scan) return true; } + if (hasIndirect && arg && arg->notuninit >= 1) + *hasIndirect = true; return arg && arg->notuninit >= indirect; } diff --git a/lib/library.h b/lib/library.h index bf5ade214..a383b2317 100644 --- a/lib/library.h +++ b/lib/library.h @@ -324,7 +324,7 @@ public: } bool isnullargbad(const Token *ftok, int argnr) const; - bool isuninitargbad(const Token *ftok, int argnr, int indirect = 0) const; + bool isuninitargbad(const Token *ftok, int argnr, int indirect = 0, bool *hasIndirect=nullptr) const; bool isargformatstr(const Token *ftok, int argnr) const { const ArgumentChecks *arg = getarg(ftok, argnr);