From 347802f81983bf94494c50bd71522f5c5d8f1e15 Mon Sep 17 00:00:00 2001 From: Slava Semushin Date: Fri, 31 Jul 2009 00:49:38 +0700 Subject: [PATCH] Fixed ticket #503 (Dereferencing after erase() not work if we try to get access to member) http://sourceforge.net/apps/trac/cppcheck/ticket/503 --- src/checkstl.cpp | 5 +++++ test/teststl.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/checkstl.cpp b/src/checkstl.cpp index 4c3e73654..c2b48fef5 100644 --- a/src/checkstl.cpp +++ b/src/checkstl.cpp @@ -80,6 +80,11 @@ void CheckStl::iterators() dereferenceErasedError(tok2, tok2->strAt(1)); tok2 = tok2->tokAt(2); } + else if (!validIterator && Token::Match(tok2, "%varid% . %var%", iteratorId)) + { + dereferenceErasedError(tok2, tok2->strAt(0)); + tok2 = tok2->tokAt(3); + } } } } diff --git a/test/teststl.cpp b/test/teststl.cpp index 694e5562e..66e212f6b 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -39,6 +39,7 @@ private: TEST_CASE(iterator3); TEST_CASE(dereference); + TEST_CASE(dereference_member); TEST_CASE(STLSize); TEST_CASE(STLSizeNoErr); @@ -133,6 +134,18 @@ private: ASSERT_EQUALS("[test.cpp:6]: (error) Dereferenced iterator 'iter' has been erased\n", errout.str()); } + void dereference_member() + { + check("void f()\n" + "{\n" + " std::map ints;" + " std::map::iterator iter;\n" + " iter = ints.begin();\n" + " ints.erase(iter);\n" + " std::cout << iter->first << std::endl;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6]: (error) Dereferenced iterator 'iter' has been erased\n", errout.str()); + } void STLSize()