diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index ec90fb3e302..5b792b08e28 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -6491,7 +6491,7 @@ static std::vector getContainerSizeFromConstructorArgs(const s if (args.size() == 1 && args[0]->tokType() == Token::Type::eString) return {makeContainerSizeValue(Token::getStrLength(args[0]), known)}; if (args.size() == 1 && args[0]->variable() && args[0]->variable()->isArray() && - args[0]->variable()->isConst() && args[0]->variable()->dimensions().size() == 1) + args[0]->variable()->isConst() && args[0]->variable()->dimensions().size() == 1 && args[0]->variable()->dimensions()[0].known) return {makeContainerSizeValue(args[0]->variable()->dimensions()[0].num, known)}; if (args.size() == 2 && astIsIntegral(args[1], false)) // { char*, count } return {makeContainerSizeValue(args[1], known)}; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 79ad6e45b30..6eb807bdd11 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -7406,6 +7406,12 @@ class TestValueFlow : public TestFixture { " return a[0];\n" "}"; ASSERT(!isKnownContainerSizeValue(tokenValues(code, "a ["), 6).empty()); + + code = "void f(const char a[]) {\n" // #14518 + " std::string s(a);\n" + " if (s.empty()) {}\n" + "}"; + ASSERT(!isKnownContainerSizeValue(tokenValues(code, "s ."), 0).empty()); } void valueFlowContainerElement()