Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions lib/checkstl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -884,7 +886,7 @@ void CheckStlImpl::mismatchingContainerIterator()
const std::vector<const Token *> 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
Expand Down
9 changes: 9 additions & 0 deletions test/teststl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Loading