diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index c8fcca48f1a..72664c6a954 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -637,12 +637,14 @@ void CheckStlImpl::iterators() void CheckStlImpl::mismatchingContainerIteratorError(const Token* containerTok, const Token* iterTok, const Token* containerTok2) { const std::string container(containerTok ? containerTok->expressionString() : std::string("v1")); + const std::string containerTemp(isTemporary(containerTok, &mSettings.library) ? " temporary " : " "); const std::string container2(containerTok2 ? containerTok2->expressionString() : std::string("v2")); + const std::string containerTemp2(isTemporary(containerTok2, &mSettings.library) ? " temporary " : " "); const std::string iter(iterTok ? iterTok->expressionString() : std::string("it")); reportError(containerTok, Severity::error, "mismatchingContainerIterator", - "Iterator '" + iter + "' referring to container '" + container2 + "' is used with container '" + container + "'.", + "Iterator '" + iter + "' referring to" + containerTemp2 + "container '" + container2 + "' is used with" + containerTemp + "container '" + container + "'.", CWE664, Certainty::normal); } @@ -884,7 +886,7 @@ void CheckStlImpl::mismatchingContainerIterator() const std::vector args = getArguments(ftok); const Library::Container * c = tok->valueType()->container; - const Library::Container::Action action = c->getAction(tok->strAt(2)); + const Library::Container::Action action = c->getAction(ftok->str()); const Token* iterTok = nullptr; if (action == Library::Container::Action::INSERT && args.size() == 2) { // Skip if iterator pair diff --git a/test/teststl.cpp b/test/teststl.cpp index 2060a5cfd2b..50ad9297e87 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -2345,6 +2345,15 @@ class TestStl : public TestFixture { " } \n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("std::string g1();\n" // #12520 + "const std::string& g2();\n" + "void f() {\n" + " g1().erase(g1().begin());\n" + " g2().erase(g2().begin());\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4:7]: (error) Iterator 'g1().begin()' referring to temporary container 'g1()' is used with temporary container 'g1()'. [mismatchingContainerIterator]\n", + errout_str()); } void eraseIteratorOutOfBounds() {