From 2de4c516e9e5e3dd9590379b0e980c9fc484db89 Mon Sep 17 00:00:00 2001 From: Reijo Tomperi Date: Sun, 31 May 2009 22:33:44 +0300 Subject: [PATCH] Fixed ticket #338 (Simplify sizeof for pointer arrays) by patch submitted by php-coderrr http://apps.sourceforge.net/trac/cppcheck/ticket/338 --- src/tokenize.cpp | 15 ++++++++++----- test/testsimplifytokens.cpp | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 5e5f94ee2..9ac1dc0a7 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -1140,6 +1140,8 @@ void Tokenizer::simplifyTokenList() _typeSize["long"] = sizeof(long); _typeSize["float"] = sizeof(float); _typeSize["double"] = sizeof(double); + _typeSize["*"] = sizeof(void *); + for (Token *tok = _tokens; tok; tok = tok->next()) { if (Token::Match(tok, "class|struct %var%")) @@ -1286,19 +1288,22 @@ void Tokenizer::simplifyTokenList() // Replace 'sizeof(var)' 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; - 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) continue; - const unsigned int varid = tok->next()->varId(); + const unsigned int varid = tok->tokAt(varname_tok)->varId(); if (varid == 0) 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 int indentlevel = 0; diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 2809bfa6f..5856d930e 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -79,6 +79,7 @@ private: TEST_CASE(sizeof5); TEST_CASE(sizeof6); TEST_CASE(sizeof7); + TEST_CASE(sizeof8); TEST_CASE(casting); TEST_CASE(template1); @@ -542,6 +543,43 @@ private: 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() { const char code[] = "void f()\n"