diff --git a/lib/astutils.cpp b/lib/astutils.cpp index cf6d8a496..a8eb38609 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2356,6 +2356,11 @@ int getArgumentPos(const Variable* var, const Function* f) return std::distance(f->argumentList.begin(), arg_it); } +bool isIteratorPair(std::vector args) +{ + return args.size() == 2 && ((astIsIterator(args[0]) && astIsIterator(args[1])) || (astIsPointer(args[0]) && astIsPointer(args[1]))); +} + const Token *findLambdaStartToken(const Token *last) { if (!last || last->str() != "}") diff --git a/lib/astutils.h b/lib/astutils.h index f3364c6cd..ee1b0d874 100644 --- a/lib/astutils.h +++ b/lib/astutils.h @@ -274,6 +274,11 @@ std::vector getArguments(const Token *ftok); int getArgumentPos(const Variable* var, const Function* f); +/** + * Are the arguments a pair of iterators/pointers? + */ +bool isIteratorPair(std::vector args); + const Token *findLambdaStartToken(const Token *last); /** diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 640598300..d4b0065be 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -6972,7 +6972,7 @@ static std::vector getInitListSize(const Token* tok, } return {}; } else if ((args.size() == 1 && astIsContainer(args[0]) && args[0]->valueType()->container == container) || - (args.size() == 2 && astIsIterator(args[0]) && astIsIterator(args[1]))) { + isIteratorPair(args)) { return getContainerValues(args[0]); } return {makeContainerSizeValue(args.size(), known)}; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 12366df42..3c3b2eb1f 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -5177,6 +5177,13 @@ private: "}"; ASSERT(tokenValues(code, "s . size").empty()); + code = "void f() {\n" + " const uint8_t data[] = { 1, 2, 3 };\n" + " std::vector v{ data, data + sizeof(data) };\n" + " v.size();\n" + "}"; + TODO_ASSERT_EQUALS("", "ContainerSizeValue", isKnownContainerSizeValue(tokenValues(code, "v . size"), 3)); // TODO: extract container size + // valueFlowContainerForward, loop code = "void f() {\n" " std::stack links;\n"