diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 5be309bb9e4..96ba644f3d5 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -245,6 +245,12 @@ bool astIsContainer(const Token* tok) { return getLibraryContainer(tok) != nullptr && !astIsIterator(tok); } +bool astIsNonStringContainer(const Token* tok) +{ + const Library::Container* container = getLibraryContainer(tok); + return container && !container->stdStringLike && !astIsIterator(tok); +} + bool astIsContainerView(const Token* tok) { const Library::Container* container = getLibraryContainer(tok); diff --git a/lib/astutils.h b/lib/astutils.h index 10699f8de61..1526d00a7d7 100644 --- a/lib/astutils.h +++ b/lib/astutils.h @@ -164,6 +164,7 @@ bool astIsUniqueSmartPointer(const Token* tok); bool astIsIterator(const Token *tok); bool astIsContainer(const Token *tok); +bool astIsNonStringContainer(const Token *tok); bool astIsContainerView(const Token* tok); bool astIsContainerOwned(const Token* tok); diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index ee8ad0d0d14..61cfc06acaa 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -4489,7 +4489,7 @@ static void valueFlowLifetimeFunction(Token *tok, TokenList &tokenlist, ErrorLog tok->next(), tokenlist, errorLogger, settings); } } else if (memtok && Token::Match(tok->astParent(), ". push_back|push_front|insert|push|assign") && - astIsContainer(memtok)) { + astIsNonStringContainer(memtok)) { std::vector args = getArguments(tok); const std::size_t n = args.size(); if (n > 1 && Token::typeStr(args[n - 2]) == Token::typeStr(args[n - 1]) && diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 666023b5f3c..ef8cd776a2b 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -2815,6 +2815,16 @@ class TestAutoVariables : public TestFixture { " return ss;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("void f() {\n" // #12568 + " std::string str;\n" + " {\n" + " std::unique_ptr b(new char[1]{});\n" + " str.assign(b.get());\n" + " }\n" + " std::cerr << str;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeContainerView()