Fixed ticket #338 (Simplify sizeof for pointer arrays) by patch submitted by php-coderrr
http://apps.sourceforge.net/trac/cppcheck/ticket/338
This commit is contained in:
parent
8822cbb713
commit
2de4c516e9
|
@ -1140,6 +1140,8 @@ void Tokenizer::simplifyTokenList()
|
||||||
_typeSize["long"] = sizeof(long);
|
_typeSize["long"] = sizeof(long);
|
||||||
_typeSize["float"] = sizeof(float);
|
_typeSize["float"] = sizeof(float);
|
||||||
_typeSize["double"] = sizeof(double);
|
_typeSize["double"] = sizeof(double);
|
||||||
|
_typeSize["*"] = sizeof(void *);
|
||||||
|
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
{
|
{
|
||||||
if (Token::Match(tok, "class|struct %var%"))
|
if (Token::Match(tok, "class|struct %var%"))
|
||||||
|
@ -1286,19 +1288,22 @@ void Tokenizer::simplifyTokenList()
|
||||||
// Replace 'sizeof(var)'
|
// Replace 'sizeof(var)'
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
{
|
{
|
||||||
// type array [ num ] ;
|
if (! Token::Match(tok, "%type% *| %var% [ %num% ] ;"))
|
||||||
if (! Token::Match(tok, "%type% %var% [ %num% ] ;"))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int size = SizeOfType(tok->str().c_str());
|
const int type_tok = ((tok->next()->str() == "*") ? 1 : 0);
|
||||||
|
const int varname_tok = type_tok + 1;
|
||||||
|
const int num_tok = varname_tok + 2;
|
||||||
|
|
||||||
|
int size = SizeOfType(tok->tokAt(type_tok)->str().c_str());
|
||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const unsigned int varid = tok->next()->varId();
|
const unsigned int varid = tok->tokAt(varname_tok)->varId();
|
||||||
if (varid == 0)
|
if (varid == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int total_size = size * MathLib::toLongNumber(tok->strAt(3));
|
int total_size = size * MathLib::toLongNumber(tok->strAt(num_tok));
|
||||||
|
|
||||||
// Replace 'sizeof(var)' with number
|
// Replace 'sizeof(var)' with number
|
||||||
int indentlevel = 0;
|
int indentlevel = 0;
|
||||||
|
|
|
@ -79,6 +79,7 @@ private:
|
||||||
TEST_CASE(sizeof5);
|
TEST_CASE(sizeof5);
|
||||||
TEST_CASE(sizeof6);
|
TEST_CASE(sizeof6);
|
||||||
TEST_CASE(sizeof7);
|
TEST_CASE(sizeof7);
|
||||||
|
TEST_CASE(sizeof8);
|
||||||
TEST_CASE(casting);
|
TEST_CASE(casting);
|
||||||
|
|
||||||
TEST_CASE(template1);
|
TEST_CASE(template1);
|
||||||
|
@ -542,6 +543,43 @@ private:
|
||||||
ASSERT_EQUALS(" ; INT32 i [ 10 ] ; sizeof ( i [ 0 ] ) ;", sizeof_(code));
|
ASSERT_EQUALS(" ; INT32 i [ 10 ] ; sizeof ( i [ 0 ] ) ;", sizeof_(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sizeof8()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
const char code[] = "void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char* ptrs[2];\n"
|
||||||
|
" int a = sizeof( ptrs );\n"
|
||||||
|
"}\n";
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << (sizeof(void *) * 2);
|
||||||
|
ASSERT_EQUALS(" void f ( ) { char * ptrs [ 2 ] ; int a ; a = " + oss.str() + " ; }", sizeof_(code));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const char code[] = "void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char* ptrs[55];\n"
|
||||||
|
" int a = sizeof( ptrs );\n"
|
||||||
|
"}\n";
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << (sizeof(void *) * 55);
|
||||||
|
ASSERT_EQUALS(" void f ( ) { char * ptrs [ 55 ] ; int a ; a = " + oss.str() + " ; }", sizeof_(code));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
const char code[] = "void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char* ptrs;\n"
|
||||||
|
" int a = sizeof( ptrs );\n"
|
||||||
|
"}\n";
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << sizeof(void *);
|
||||||
|
TODO_ASSERT_EQUALS(" void f ( ) { char * ptrs ; int a ; a = " + oss.str() + " ; }", sizeof_(code));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void casting()
|
void casting()
|
||||||
{
|
{
|
||||||
const char code[] = "void f()\n"
|
const char code[] = "void f()\n"
|
||||||
|
|
Loading…
Reference in New Issue