diff --git a/cfg/cppcheck-cfg.rng b/cfg/cppcheck-cfg.rng index 004e931b4..f3a3c1f7b 100644 --- a/cfg/cppcheck-cfg.rng +++ b/cfg/cppcheck-cfg.rng @@ -698,6 +698,7 @@ push pop find + find-const insert erase change-content diff --git a/cfg/std.cfg b/cfg/std.cfg index 23616f160..cc9785244 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -8758,12 +8758,12 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init - - - - - - + + + + + + diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 49fe0fc02..949d79b70 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -1966,7 +1966,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library) return false; if (container->getYield(ftok->str()) != Library::Container::Yield::NO_YIELD) return true; - if (container->getAction(ftok->str()) == Library::Container::Action::FIND) + if (container->getAction(ftok->str()) == Library::Container::Action::FIND_CONST) return true; return false; } else if (const Library::Function* lf = library.getFunction(ftok)) { @@ -1974,7 +1974,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library) return true; if (lf->containerYield != Library::Container::Yield::NO_YIELD) return true; - if (lf->containerAction == Library::Container::Action::FIND) + if (lf->containerAction == Library::Container::Action::FIND_CONST) return true; return false; } else { diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index fcf32f1f1..3d448c85f 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -1518,7 +1518,9 @@ void CheckStl::if_find() } } - if (container && container->getAction(funcTok->str()) == Library::Container::Action::FIND) { + Library::Container::Action action{}; + if (container && + ((action = container->getAction(funcTok->str())) == Library::Container::Action::FIND || action == Library::Container::Action::FIND_CONST)) { if (if_findCompare(funcTok->next(), container->stdStringLike)) continue; diff --git a/lib/library.cpp b/lib/library.cpp index bcf7dab7d..593e76448 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -175,6 +175,8 @@ Library::Container::Action Library::Container::actionFrom(const std::string& act return Container::Action::POP; if (actionName == "find") return Container::Action::FIND; + if (actionName == "find-const") + return Container::Action::FIND_CONST; if (actionName == "insert") return Container::Action::INSERT; if (actionName == "erase") diff --git a/lib/library.h b/lib/library.h index e27ca3842..1f20964b8 100644 --- a/lib/library.h +++ b/lib/library.h @@ -197,6 +197,7 @@ public: PUSH, POP, FIND, + FIND_CONST, INSERT, ERASE, CHANGE_CONTENT, diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 78fde897d..eebe52fd2 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -8300,6 +8300,7 @@ bool ValueFlow::isContainerSizeChanged(const Token* tok, int indirect, const Set } break; case Library::Container::Action::FIND: + case Library::Container::Action::FIND_CONST: case Library::Container::Action::CHANGE_CONTENT: case Library::Container::Action::CHANGE_INTERNAL: break; diff --git a/test/testlibrary.cpp b/test/testlibrary.cpp index 508ee938d..430ac100f 100644 --- a/test/testlibrary.cpp +++ b/test/testlibrary.cpp @@ -811,6 +811,7 @@ private: " \n" " \n" " \n" + " \n" " \n" " \n" " \n" @@ -851,6 +852,7 @@ private: ASSERT_EQ(Library::Container::Action::PUSH, A.getAction("push_back")); ASSERT_EQ(Library::Container::Action::POP, A.getAction("pop_back")); ASSERT_EQ(Library::Container::Action::FIND, A.getAction("find")); + ASSERT_EQ(Library::Container::Action::FIND_CONST, A.getAction("cfind")); ASSERT_EQ(Library::Container::Action::NO_ACTION, A.getAction("foo")); ASSERT_EQUALS(B.type_templateArgNo, 1);