Fixed false negative pointerSize with member variables.
Fixed wrong comment in testcppcheck.cpp
This commit is contained in:
parent
2d0ecc08c1
commit
61b16909bd
|
@ -120,14 +120,14 @@ void CheckSizeof::checkSizeofForPointerSize()
|
||||||
// Once leaving those tests, it is mandatory to have:
|
// Once leaving those tests, it is mandatory to have:
|
||||||
// - variable matching the used pointer
|
// - variable matching the used pointer
|
||||||
// - tokVar pointing on the argument where sizeof may be used
|
// - tokVar pointing on the argument where sizeof may be used
|
||||||
if (Token::Match(tok, "[*;{}] %var% = malloc|alloca (")) {
|
if (Token::Match(tok, "%var% = malloc|alloca (")) {
|
||||||
variable = tok->next();
|
variable = tok;
|
||||||
tokSize = tok->tokAt(5);
|
tokSize = tok->tokAt(4);
|
||||||
tokFunc = tok->tokAt(3);
|
tokFunc = tok->tokAt(2);
|
||||||
} else if (Token::Match(tok, "[*;{}] %var% = calloc (")) {
|
} else if (Token::Match(tok, "%var% = calloc (")) {
|
||||||
variable = tok->next();
|
variable = tok;
|
||||||
tokSize = tok->tokAt(5)->nextArgument();
|
tokSize = tok->tokAt(4)->nextArgument();
|
||||||
tokFunc = tok->tokAt(3);
|
tokFunc = tok->tokAt(2);
|
||||||
} else if (Token::Match(tok, "return malloc|alloca (")) {
|
} else if (Token::Match(tok, "return malloc|alloca (")) {
|
||||||
tokSize = tok->tokAt(3);
|
tokSize = tok->tokAt(3);
|
||||||
tokFunc = tok->next();
|
tokFunc = tok->next();
|
||||||
|
@ -161,6 +161,9 @@ void CheckSizeof::checkSizeofForPointerSize()
|
||||||
if (!variable)
|
if (!variable)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
while (Token::Match(variable, "%var% ::|."))
|
||||||
|
variable = variable->tokAt(2);
|
||||||
|
|
||||||
// Ensure the variables are in the symbol database
|
// Ensure the variables are in the symbol database
|
||||||
// Also ensure the variables are pointers
|
// Also ensure the variables are pointers
|
||||||
// Only keep variables which are pointers
|
// Only keep variables which are pointers
|
||||||
|
@ -186,16 +189,23 @@ void CheckSizeof::checkSizeofForPointerSize()
|
||||||
// This is to allow generic operations with sizeof
|
// This is to allow generic operations with sizeof
|
||||||
for (; tokSize && tokSize->str() != ")" && tokSize->str() != "," && tokSize->str() != "sizeof"; tokSize = tokSize->next()) {}
|
for (; tokSize && tokSize->str() != ")" && tokSize->str() != "," && tokSize->str() != "sizeof"; tokSize = tokSize->next()) {}
|
||||||
|
|
||||||
|
if (Token::Match(tokSize, "sizeof ( &"))
|
||||||
|
tokSize = tokSize->tokAt(3);
|
||||||
|
else if (Token::Match(tokSize, "sizeof (|&"))
|
||||||
|
tokSize = tokSize->tokAt(2);
|
||||||
|
else
|
||||||
|
tokSize = tokSize->next();
|
||||||
|
|
||||||
|
while (Token::Match(tokSize, "%var% ::|."))
|
||||||
|
tokSize = tokSize->tokAt(2);
|
||||||
|
|
||||||
// Now check for the sizeof usage. Once here, everything using sizeof(varid) or sizeof(&varid)
|
// Now check for the sizeof usage. Once here, everything using sizeof(varid) or sizeof(&varid)
|
||||||
// looks suspicious
|
// looks suspicious
|
||||||
// Do it for first variable
|
// Do it for first variable
|
||||||
if (variable && (Token::Match(tokSize, "sizeof ( &| %varid% )", variable->varId()) ||
|
if (variable && tokSize->varId() == variable->varId())
|
||||||
Token::Match(tokSize, "sizeof &| %varid% !!.", variable->varId()))) {
|
|
||||||
sizeofForPointerError(variable, variable->str());
|
sizeofForPointerError(variable, variable->str());
|
||||||
} else if (variable2 && (Token::Match(tokSize, "sizeof ( &| %varid% )", variable2->varId()) ||
|
if (variable2 && tokSize->varId() == variable2->varId())
|
||||||
Token::Match(tokSize, "sizeof &| %varid% !!.", variable2->varId()))) {
|
|
||||||
sizeofForPointerError(variable2, variable2->str());
|
sizeofForPointerError(variable2, variable2->str());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -536,7 +536,7 @@ private:
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" struct foo {\n"
|
" struct foo {\n"
|
||||||
" char bar[10];\n"
|
" char bar[10];\n"
|
||||||
" };\n"
|
" }* ptr;\n"
|
||||||
" memset( ptr->bar, 0, sizeof ptr->bar );\n"
|
" memset( ptr->bar, 0, sizeof ptr->bar );\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
@ -544,10 +544,10 @@ private:
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" struct foo {\n"
|
" struct foo {\n"
|
||||||
" char *bar;\n"
|
" char *bar;\n"
|
||||||
" };\n"
|
" }* ptr;\n"
|
||||||
" memset( ptr->bar, 0, sizeof ptr->bar );\n"
|
" memset( ptr->bar, 0, sizeof ptr->bar );\n"
|
||||||
"}");
|
"}");
|
||||||
TODO_ASSERT_EQUALS("[test.cpp:5]: (warning) Size of pointer 'bar' used instead of size of its data.\n", "", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (warning) Size of pointer 'bar' used instead of size of its data.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void sizeofDivisionMemset() {
|
void sizeofDivisionMemset() {
|
||||||
|
|
Loading…
Reference in New Issue