From ac6d67dc4d9d959a4df012ec00c3bcf51f3e5a46 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Thu, 4 Aug 2011 20:37:27 -0400 Subject: [PATCH] add support for using global qualified :: memset on class and class member initialization --- lib/checkclass.cpp | 11 ++++++----- test/testclass.cpp | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 72b5f1de0..027616597 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -331,7 +331,7 @@ void CheckClass::initializeVarList(const Function &func, std::list ftok = ftok->tokAt(2); } - if (!Token::Match(ftok->next(), "%var%") && + if (!Token::Match(ftok->next(), "::| %var%") && !Token::Match(ftok->next(), "this . %var%") && !Token::Match(ftok->next(), "* %var% =") && !Token::Match(ftok->next(), "( * this ) . %var%")) @@ -355,17 +355,18 @@ void CheckClass::initializeVarList(const Function &func, std::list ftok = ftok->tokAt(2); // Clearing all variables.. - if (Token::simpleMatch(ftok, "memset ( this ,")) + if (Token::Match(ftok, "::| memset ( this ,")) { assignAllVar(usage); return; } // Clearing array.. - else if (Token::Match(ftok, "memset ( %var% ,")) + else if (Token::Match(ftok, "::| memset ( %var% ,")) { - assignVar(ftok->strAt(2), scope, usage); - ftok = ftok->next()->link(); + const int offset = ftok->str() == "::" ? 1 : 0; + assignVar(ftok->strAt(2 + offset), scope, usage); + ftok = ftok->tokAt(1 + offset)->link(); continue; } diff --git a/test/testclass.cpp b/test/testclass.cpp index e66c8a210..fd093c4c9 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -76,6 +76,7 @@ private: TEST_CASE(uninitVarArray4); TEST_CASE(uninitVarArray5); TEST_CASE(uninitVarArray6); + TEST_CASE(uninitVarArray7); TEST_CASE(uninitVarArray2D); TEST_CASE(uninitVarStruct1); // ticket #2172 TEST_CASE(uninitVarStruct2); // ticket #838 @@ -2395,6 +2396,33 @@ private: ASSERT_EQUALS("", errout.str()); } + void uninitVarArray7() + { + checkUninitVar("class Foo\n" + "{\n" + " int array[10];\n" + "public:\n" + " Foo() { }\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::array' is not initialized in the constructor.\n", errout.str()); + + checkUninitVar("class Foo\n" + "{\n" + " int array[10];\n" + "public:\n" + " Foo() { memset(array, 0, sizeof(array)); }\n" + "};\n"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar("class Foo\n" + "{\n" + " int array[10];\n" + "public:\n" + " Foo() { ::memset(array, 0, sizeof(array)); }\n" + "};\n"); + ASSERT_EQUALS("", errout.str()); + } + void uninitVarArray2D() { checkUninitVar("class John\n" @@ -2616,6 +2644,15 @@ private: "};\n"); ASSERT_EQUALS("", errout.str()); + + checkUninitVar("class Foo\n" + "{\n" + "public:\n" + " int * pointer;\n" + " Foo() { ::memset(this, 0, sizeof(*this)); }\n" + "};\n"); + + ASSERT_EQUALS("", errout.str()); } void privateCtor1()