From 7fb5b9b67b01d35d270c6b7f1ec214a47bb4576c Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Wed, 31 Mar 2010 17:09:59 +0200 Subject: [PATCH] Better checking for assignment to self. Ticket: #1550 --- lib/checkclass.cpp | 2 +- test/testclass.cpp | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 38e0f588b..9a5dae51a 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1089,7 +1089,7 @@ static bool hasDeallocation(const Token * first, const Token * last) while (tok1 && (tok1 != last)) { - if (Token::Match(tok1, "%var% = new [")) + if (Token::Match(tok1, "%var% = new %type% [")) { if (tok1->str() == var->str()) return true; diff --git a/test/testclass.cpp b/test/testclass.cpp index f4972e81e..bf8c8fae7 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -83,6 +83,7 @@ private: TEST_CASE(operatorEqToSelf3); // multiple inheritance TEST_CASE(operatorEqToSelf4); // nested class with multiple inheritance TEST_CASE(operatorEqToSelf5); // ticket # 1233 + TEST_CASE(operatorEqToSelf6); // ticket # 1550 TEST_CASE(memsetOnStruct); TEST_CASE(memsetOnClass); @@ -820,6 +821,27 @@ private: ASSERT_EQUALS("", errout.str()); } + void operatorEqToSelf6() + { + // ticket # 1550 + checkOpertorEqToSelf( + "class A\n" + "{\n" + "public:\n" + " char *s;\n" + " A & operator=(const A &a)\n" + " {\n" + " delete [] data;\n" + " data = new char[strlen(a.data) + 1];\n" + " strcpy(data, a.data);\n" + " return *this;\n" + " }\n" + "private:\n" + " char * data;\n" + "};"); + ASSERT_EQUALS("[test.cpp:5]: (possible style) 'operator=' should check for assignment to self\n", errout.str()); + } + // Check that base classes have virtual destructors void checkVirtualDestructor(const char code[]) {