ticket 155
This commit is contained in:
parent
53c36f53ef
commit
8d97080ab8
|
@ -83,31 +83,18 @@ void CheckOther::checkSizeofWithSilentArrayPointer()
|
||||||
{
|
{
|
||||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
||||||
{
|
{
|
||||||
if (Token::Match(tok, "sizeof ( %var% )"))
|
if (Token::Match(tok, "sizeof ( %var% )") || Token::Match(tok, "sizeof %var% "))
|
||||||
{
|
{
|
||||||
if (tok->tokAt(2)->varId() > 0)
|
int tokIdx = 1;
|
||||||
|
if (tok->tokAt(tokIdx)->str() == "(") {
|
||||||
|
++tokIdx;
|
||||||
|
}
|
||||||
|
if (tok->tokAt(tokIdx)->varId() > 0)
|
||||||
{
|
{
|
||||||
const Token *declTok = Token::findmatch(_tokenizer->tokens(), "%varid% [", tok->tokAt(2)->varId());
|
const Token *declTok = Token::findmatch(_tokenizer->tokens(), "%varid% [", tok->tokAt(tokIdx)->varId());
|
||||||
if (declTok)
|
if (declTok)
|
||||||
{
|
{
|
||||||
int idx = 2;
|
if (!(Token::simpleMatch(declTok->next()->link(), "] = {")) && !(Token::simpleMatch(declTok->next()->link(), "] ;")))
|
||||||
bool bracket = false;
|
|
||||||
while (!Token::simpleMatch(declTok->tokAt(idx), "]") || bracket)
|
|
||||||
{
|
|
||||||
if (Token::simpleMatch(declTok->tokAt(idx), "["))
|
|
||||||
{
|
|
||||||
bracket = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (Token::simpleMatch(declTok->tokAt(idx), "]"))
|
|
||||||
{
|
|
||||||
bracket = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++idx;
|
|
||||||
}
|
|
||||||
if (!(Token::simpleMatch(declTok->tokAt(idx), "] = {")) && !(Token::simpleMatch(declTok->tokAt(idx), "] ;")))
|
|
||||||
{
|
{
|
||||||
sizeofWithSilentArrayPointerError(tok);
|
sizeofWithSilentArrayPointerError(tok);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1681,6 +1681,16 @@ private:
|
||||||
);
|
);
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" unsigned int a = { 2 };\n"
|
||||||
|
" unsigned int b[] = { 0 };\n"
|
||||||
|
" int c[a[b[0]]];\n"
|
||||||
|
" std::cout << sizeof(c) / sizeof(int) << std::endl;\n"
|
||||||
|
"}\n"
|
||||||
|
);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" unsigned int a[] = { 1 };\n"
|
" unsigned int a[] = { 1 };\n"
|
||||||
" unsigned int b = 2;\n"
|
" unsigned int b = 2;\n"
|
||||||
|
@ -1710,6 +1720,12 @@ private:
|
||||||
);
|
);
|
||||||
ASSERT_EQUALS("[test.cpp:2]: (error) silent pointer of array is passed as parameter to the function sizeof.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:2]: (error) silent pointer of array is passed as parameter to the function sizeof.\n", errout.str());
|
||||||
|
|
||||||
|
check("void f( int a[]) {\n"
|
||||||
|
" std::cout << sizeof a / sizeof(int) << std::endl;\n"
|
||||||
|
"}\n"
|
||||||
|
);
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (error) silent pointer of array is passed as parameter to the function sizeof.\n", errout.str());
|
||||||
|
|
||||||
check("void f( int a[3] ) {\n"
|
check("void f( int a[3] ) {\n"
|
||||||
" std::cout << sizeof(a) / sizeof(int) << std::endl;\n"
|
" std::cout << sizeof(a) / sizeof(int) << std::endl;\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
|
|
Loading…
Reference in New Issue