From 3a1196e5f93410a1992f138065114794be55e182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 13 Dec 2008 16:42:39 +0000 Subject: [PATCH] Tokenizer : Added function for simplifying casts --- testmemleak.cpp | 8 ++++---- tokenize.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- tokenize.h | 4 +++- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/testmemleak.cpp b/testmemleak.cpp index 12c102f86..ddfbf0d0f 100644 --- a/testmemleak.cpp +++ b/testmemleak.cpp @@ -135,9 +135,9 @@ private: // TODO TEST_CASE( varid ); - // TODO TEST_CASE( cast1 ); - // TODO TEST_CASE( cast2 ); // Doesn't fail but for bad reasons - // TODO TEST_CASE( cast3 ); + TEST_CASE( cast1 ); + TEST_CASE( cast2 ); + TEST_CASE( cast3 ); } @@ -1119,7 +1119,7 @@ private: check( "void foo()\n" "{\n" " char *a = malloc(10);\n" - " free(reinterpret_cast(c));\n" + " free(reinterpret_cast(a));\n" "}\n" ); ASSERT_EQUALS( std::string(""), errout.str() ); diff --git a/tokenize.cpp b/tokenize.cpp index 8d9588ee1..a7d808b73 100644 --- a/tokenize.cpp +++ b/tokenize.cpp @@ -1014,7 +1014,8 @@ void Tokenizer::simplifyTokenList() for ( bool done = false; !done; done = true) { - done &= simplifyConditions(); + done &= simplifyConditions(); + done &= simplifyCasts(); }; } //--------------------------------------------------------------------------- @@ -1090,6 +1091,45 @@ bool Tokenizer::simplifyConditions() return ret; } + +bool Tokenizer::simplifyCasts() +{ + bool ret = true; + for ( TOKEN *tok = _tokens; tok; tok = tok->next() ) + { + if ( TOKEN::Match(tok->next(), "( %type% * )") ) + { + tok->deleteNext(); + tok->deleteNext(); + tok->deleteNext(); + tok->deleteNext(); + ret = false; + } + + else if ( TOKEN::Match(tok->next(), "dynamic_cast|reinterpret_cast|const_cast <" ) ) + { + while ( tok->next() && tok->next()->str() != ">" ) + tok->deleteNext(); + tok->deleteNext(); + tok->deleteNext(); + TOKEN *tok2 = tok; + int parlevel = 0; + while ( tok2->next() && parlevel >= 0 ) + { + tok2 = tok2->next(); + if ( TOKEN::Match(tok2->next(), "(") ) + ++parlevel; + else if ( TOKEN::Match(tok2->next(), ")") ) + --parlevel; + } + if (tok2->next()) + tok2->deleteNext(); + } + } + + return ret; +} + //--------------------------------------------------------------------------- // Helper functions for handling the tokens list diff --git a/tokenize.h b/tokenize.h index 7deddaa8e..a2f611bd1 100644 --- a/tokenize.h +++ b/tokenize.h @@ -95,7 +95,9 @@ private: void addtoken(const char str[], const unsigned int lineno, const unsigned int fileno); - bool simplifyConditions(); + bool simplifyConditions(); + + bool simplifyCasts(); TOKEN *_gettok(TOKEN *tok, int index);