Skip to content

Commit d833b6b

Browse files
Fix #12520 FN mismatchingContainers/iterators3 with temporary containers and erase (#8665)
1 parent d7bcdb5 commit d833b6b

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

lib/checkstl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -637,12 +637,14 @@ void CheckStlImpl::iterators()
637637
void CheckStlImpl::mismatchingContainerIteratorError(const Token* containerTok, const Token* iterTok, const Token* containerTok2)
638638
{
639639
const std::string container(containerTok ? containerTok->expressionString() : std::string("v1"));
640+
const std::string containerTemp(isTemporary(containerTok, &mSettings.library) ? " temporary " : " ");
640641
const std::string container2(containerTok2 ? containerTok2->expressionString() : std::string("v2"));
642+
const std::string containerTemp2(isTemporary(containerTok2, &mSettings.library) ? " temporary " : " ");
641643
const std::string iter(iterTok ? iterTok->expressionString() : std::string("it"));
642644
reportError(containerTok,
643645
Severity::error,
644646
"mismatchingContainerIterator",
645-
"Iterator '" + iter + "' referring to container '" + container2 + "' is used with container '" + container + "'.",
647+
"Iterator '" + iter + "' referring to" + containerTemp2 + "container '" + container2 + "' is used with" + containerTemp + "container '" + container + "'.",
646648
CWE664,
647649
Certainty::normal);
648650
}
@@ -884,7 +886,7 @@ void CheckStlImpl::mismatchingContainerIterator()
884886
const std::vector<const Token *> args = getArguments(ftok);
885887

886888
const Library::Container * c = tok->valueType()->container;
887-
const Library::Container::Action action = c->getAction(tok->strAt(2));
889+
const Library::Container::Action action = c->getAction(ftok->str());
888890
const Token* iterTok = nullptr;
889891
if (action == Library::Container::Action::INSERT && args.size() == 2) {
890892
// Skip if iterator pair

test/teststl.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2345,6 +2345,15 @@ class TestStl : public TestFixture {
23452345
" } \n"
23462346
"}\n");
23472347
ASSERT_EQUALS("", errout_str());
2348+
2349+
check("std::string g1();\n" // #12520
2350+
"const std::string& g2();\n"
2351+
"void f() {\n"
2352+
" g1().erase(g1().begin());\n"
2353+
" g2().erase(g2().begin());\n"
2354+
"}\n");
2355+
ASSERT_EQUALS("[test.cpp:4:7]: (error) Iterator 'g1().begin()' referring to temporary container 'g1()' is used with temporary container 'g1()'. [mismatchingContainerIterator]\n",
2356+
errout_str());
23482357
}
23492358

23502359
void eraseIteratorOutOfBounds() {

0 commit comments

Comments
 (0)