Fixed #1948 (C++ class scoping not followed)
This commit is contained in:
parent
ca407110dc
commit
e7f7c77eab
|
@ -1221,10 +1221,16 @@ void CheckBufferOverrun::checkGlobalAndLocalVariable()
|
||||||
|
|
||||||
void CheckBufferOverrun::checkStructVariable()
|
void CheckBufferOverrun::checkStructVariable()
|
||||||
{
|
{
|
||||||
const char declstruct[] = "struct|class %var% {|:";
|
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
||||||
for (const Token *tok = Token::findmatch(_tokenizer->tokens(), declstruct);
|
|
||||||
tok; tok = Token::findmatch(tok->next(), declstruct))
|
|
||||||
{
|
{
|
||||||
|
if (tok->str() == "{")
|
||||||
|
{
|
||||||
|
tok = tok->link();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Token::Match(tok, "struct|class %var% {|:"))
|
||||||
|
continue;
|
||||||
|
|
||||||
const std::string &structname = tok->next()->str();
|
const std::string &structname = tok->next()->str();
|
||||||
const Token *tok2 = tok;
|
const Token *tok2 = tok;
|
||||||
|
|
||||||
|
@ -1295,7 +1301,6 @@ void CheckBufferOverrun::checkStructVariable()
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
// Goto end of statement.
|
// Goto end of statement.
|
||||||
const Token *CheckTok = NULL;
|
const Token *CheckTok = NULL;
|
||||||
while (tok3)
|
while (tok3)
|
||||||
|
|
|
@ -175,6 +175,8 @@ private:
|
||||||
TEST_CASE(executionPaths2);
|
TEST_CASE(executionPaths2);
|
||||||
|
|
||||||
TEST_CASE(cmdLineArgs1);
|
TEST_CASE(cmdLineArgs1);
|
||||||
|
|
||||||
|
TEST_CASE(scope); // handling different scopes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2485,6 +2487,21 @@ private:
|
||||||
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scope()
|
||||||
|
{
|
||||||
|
check("class A {\n"
|
||||||
|
"private:\n"
|
||||||
|
" struct X { char buf[10]; };\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" X x;\n"
|
||||||
|
" x.buf[10] = 0;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestBufferOverrun)
|
REGISTER_TEST(TestBufferOverrun)
|
||||||
|
|
Loading…
Reference in New Issue