uninitialized variables: added testcases and made a fix
This commit is contained in:
parent
b9b5e8d92a
commit
574db37a6f
|
@ -168,7 +168,7 @@ const Token * CheckClass::FindClassFunction(const Token *tok, const char classna
|
||||||
// Member function implemented in the class declaration?
|
// Member function implemented in the class declaration?
|
||||||
if (tok->str() != "~" && Token::Match(tok->next(), internalPattern.str().c_str()))
|
if (tok->str() != "~" && Token::Match(tok->next(), internalPattern.str().c_str()))
|
||||||
{
|
{
|
||||||
const Token *tok2 = tok;
|
const Token *tok2 = tok->next();
|
||||||
while (tok2 && tok2->str() != "{" && tok2->str() != ";")
|
while (tok2 && tok2->str() != "{" && tok2->str() != ";")
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
if (tok2 && tok2->str() == "{")
|
if (tok2 && tok2->str() == "{")
|
||||||
|
|
|
@ -43,9 +43,13 @@ private:
|
||||||
TEST_CASE(virtualDestructor5); // Derived class has empty destructor => no error
|
TEST_CASE(virtualDestructor5); // Derived class has empty destructor => no error
|
||||||
|
|
||||||
TEST_CASE(uninitVar1);
|
TEST_CASE(uninitVar1);
|
||||||
|
TEST_CASE(uninitVarEnum);
|
||||||
TEST_CASE(uninitVarStream);
|
TEST_CASE(uninitVarStream);
|
||||||
TEST_CASE(privateCtor); // If constructor is private..
|
TEST_CASE(privateCtor1); // If constructor is private..
|
||||||
|
// TODO TEST_CASE(privateCtor2); // If constructor is private..
|
||||||
TEST_CASE(function); // Function is not variable
|
TEST_CASE(function); // Function is not variable
|
||||||
|
TEST_CASE(uninitVarHeader1); // Class is defined in header
|
||||||
|
TEST_CASE(uninitVarHeader2); // Class is defined in header
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that base classes have virtual destructors
|
// Check that base classes have virtual destructors
|
||||||
|
@ -168,20 +172,40 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:10]: (error) Uninitialized member variable 'Fred::_code'\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:10]: (error) Uninitialized member variable 'Fred::_code'\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uninitVarEnum()
|
||||||
|
{
|
||||||
|
checkUninitVar("class Fred\n"
|
||||||
|
"{\n"
|
||||||
|
"public:\n"
|
||||||
|
" enum abc {a,b,c};\n"
|
||||||
|
" Fred() {}\n"
|
||||||
|
"private:\n"
|
||||||
|
" unsigned int i;\n"
|
||||||
|
"};\n");
|
||||||
|
|
||||||
|
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized member variable 'Fred::i'\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void uninitVarStream()
|
void uninitVarStream()
|
||||||
{
|
{
|
||||||
checkUninitVar("#include <fstream>\n"
|
checkUninitVar("#include <fstream>\n"
|
||||||
"class Foo {\n"
|
"class Foo\n"
|
||||||
|
"{\n"
|
||||||
|
"private:\n"
|
||||||
" int foo;\n"
|
" int foo;\n"
|
||||||
"public:\n"
|
"public:\n"
|
||||||
"Foo(std::istream &in) { if(!(in >> foo)) throw 0; }\n"
|
" Foo(std::istream &in)\n"
|
||||||
|
" {\n"
|
||||||
|
" if(!(in >> foo))\n"
|
||||||
|
" throw 0;\n"
|
||||||
|
" }\n"
|
||||||
"};\n");
|
"};\n");
|
||||||
|
|
||||||
ASSERT_EQUALS(std::string(""), errout.str());
|
ASSERT_EQUALS(std::string(""), errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void privateCtor()
|
void privateCtor1()
|
||||||
{
|
{
|
||||||
checkUninitVar("class Foo {\n"
|
checkUninitVar("class Foo {\n"
|
||||||
" int foo;\n"
|
" int foo;\n"
|
||||||
|
@ -191,6 +215,20 @@ private:
|
||||||
ASSERT_EQUALS(std::string(""), errout.str());
|
ASSERT_EQUALS(std::string(""), errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void privateCtor2()
|
||||||
|
{
|
||||||
|
checkUninitVar("class Foo\n"
|
||||||
|
"{\n"
|
||||||
|
"private:\n"
|
||||||
|
" int foo;\n"
|
||||||
|
" Foo() { }\n"
|
||||||
|
"public:\n"
|
||||||
|
" Foo(int _i) { }\n"
|
||||||
|
"};\n");
|
||||||
|
|
||||||
|
ASSERT_EQUALS(std::string("[test.cpp:7] uninitialized member variable Foo::foo"), errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void function()
|
void function()
|
||||||
{
|
{
|
||||||
|
@ -213,6 +251,36 @@ private:
|
||||||
ASSERT_EQUALS(std::string(""), errout.str());
|
ASSERT_EQUALS(std::string(""), errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void uninitVarHeader1()
|
||||||
|
{
|
||||||
|
checkUninitVar("#file \"fred.h\"\n"
|
||||||
|
"class Fred\n"
|
||||||
|
"{\n"
|
||||||
|
"private:\n"
|
||||||
|
" unsigned int i;\n"
|
||||||
|
"public:\n"
|
||||||
|
" Fred();\n"
|
||||||
|
"};\n"
|
||||||
|
"#endfile\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void uninitVarHeader2()
|
||||||
|
{
|
||||||
|
checkUninitVar("#file \"fred.h\"\n"
|
||||||
|
"class Fred\n"
|
||||||
|
"{\n"
|
||||||
|
"private:\n"
|
||||||
|
" unsigned int i;\n"
|
||||||
|
"public:\n"
|
||||||
|
" Fred() { }\n"
|
||||||
|
"};\n"
|
||||||
|
"#endfile\n");
|
||||||
|
ASSERT_EQUALS("[fred.h:6]: (error) Uninitialized member variable 'Fred::i'\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestClass)
|
REGISTER_TEST(TestClass)
|
||||||
|
|
Loading…
Reference in New Issue