diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index bdd18ee21d2..c6bfbf844ca 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -607,7 +607,7 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok, cons } } - if (!var || var->isPointer() || (astIsContainer(bufTok) && var->getTypeName() != "std::array")) + if (!var || var->isPointer() || (astIsContainer(bufTok) && !var->isStlType("array"))) return ValueFlow::Value(-1); const MathLib::bigint dim = std::accumulate(var->dimensions().cbegin(), var->dimensions().cend(), MathLib::bigint(1), [](MathLib::bigint i1, const Dimension &dim) { diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 314af14e158..293850b9ee3 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -136,7 +136,7 @@ bool CheckClassImpl::isInitialized(const Usage& usage, FunctionType funcType) co { // needs initialization } - else if (var.getTypeName() == "std::array") { + else if (var.isStlType("array")) { const Token* ctt = var.valueType()->containerTypeToken; if (!ctt->isStandardType() && (!ctt->type() || ctt->type()->needInitialization != Type::NeedInitialization::True) && @@ -1577,18 +1577,9 @@ void CheckClassImpl::checkMemsetType(const Scope *start, const Token *tok, const } // don't warn if variable static or const, pointer or array of pointers if (!var.isStatic() && !var.isConst() && !var.isPointer() && (!var.isArray() || var.typeEndToken()->str() != "*")) { - const Token *tok1 = var.typeStartToken(); const Scope *typeScope = var.typeScope(); - std::string typeName; - if (Token::Match(tok1, "%type% ::")) { - const Token *typeTok = tok1; - while (Token::Match(typeTok, "%type% ::")) { - typeName += typeTok->str() + "::"; - typeTok = typeTok->tokAt(2); - } - typeName += typeTok->str(); - } + const std::string typeName = var.getTypeName(); // check for std:: type if (var.isStlType() && typeName != "std::array" && !mSettings.library.podtype(typeName)) { diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index 2d9012078a6..735eefd5688 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -87,7 +87,7 @@ void CheckSizeofImpl::checkSizeofForArrayParameter() } const Variable *var = varTok->variable(); - if (var && var->isArray() && var->isArgument() && !var->isReference() && !(var->isStlType() && var->getTypeName() == "std::array")) + if (var && var->isArray() && var->isArgument() && !var->isReference() && !var->isStlType("array")) sizeofForArrayParameterError(tok); } } diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index baa279803cf..5d7333fa70e 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -727,7 +727,7 @@ static void valueFlowArrayBool(TokenList& tokenlist, const Settings& settings) } if (!var) continue; - if (!var->isArray() || var->isArgument() || var->getTypeName() == "std::array") + if (!var->isArray() || var->isArgument() || var->isStlType("array")) continue; if (isNonZero(getOtherOperand(tok)) && Token::Match(tok->astParent(), "%comp%")) continue; @@ -1169,7 +1169,7 @@ static void valueFlowImpossibleValues(TokenList& tokenList, const Settings& sett value.setImpossible(); setTokenValue(tok, std::move(value), settings); } else if (tok->variable() && tok->variable()->isArray() && !tok->variable()->isArgument() && - tok->variable()->getTypeName() != "std::array") { + !tok->variable()->isStlType("array")) { ValueFlow::Value value{0}; value.setImpossible(); setTokenValue(tok, std::move(value), settings); @@ -5995,7 +5995,7 @@ static bool needsInitialization(const Variable* var) return true; if (var->valueType()->type == ValueType::Type::ITERATOR) return true; - if (var->isStlType() && var->isArray()) { + if (var->isArray() && var->isStlType("array")) { if (const Token* ctt = var->valueType()->containerTypeToken) { if (ctt->isStandardType()) return true; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 1874e020fa8..b2ebeada5a5 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6788,6 +6788,12 @@ class TestUninitVar : public TestFixture { " return a[0];\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + valueFlowUninit("std::vector f() {\n" // #15077 + " const std::vector a[1];\n" + " return a[0];\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value