From 50210857a6c46e0a29b046223d6e2e752e2a55ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 27 Feb 2010 19:41:14 +0100 Subject: [PATCH] Fixed #1439 (false positive: memory leak when using realloc) --- lib/tokenize.cpp | 30 ++++++++++++++++++++++++++++++ test/testsimplifytokens.cpp | 9 +++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index cddd9b24f..255b63472 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2945,6 +2945,36 @@ bool Tokenizer::simplifyTokenList() simplifyLogicalOperators(); simplifyCasts(); + // simplify "x=realloc(y,0);" => "free(y); x=0;".. + for (Token *tok = _tokens; tok; tok = tok->next()) + { + if (Token::Match(tok, "; %var% = realloc ( %var% , 0 ) ;")) + { + const std::string varname(tok->next()->str()); + const unsigned int varid(tok->next()->varId()); + + // Delete the "%var% =" + tok->deleteNext(); + tok->deleteNext(); + + // Change function name "realloc" to "free" + tok->next()->str("free"); + + // delete the ", 0" + Token::eraseTokens(tok->tokAt(3), tok->tokAt(6)); + + // goto the ";" + tok = tok->tokAt(5); + + // insert "var=0;" + tok->insertToken(";"); + tok->insertToken("0"); + tok->insertToken("="); + tok->insertToken(varname); + tok->next()->varId(varid); + } + } + // Simplify simple calculations.. while (simplifyCalculations()) ; diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 3117b5cc5..c89a8410b 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -211,6 +211,9 @@ private: // Tokenizer::simplifyReference TEST_CASE(simplifyReference); + + // x = realloc(y,0); => free(y);x=0; + TEST_CASE(simplifyRealloc); } std::string tok(const char code[], bool simplify = true) @@ -3993,6 +3996,12 @@ private: ASSERT_EQUALS("void f ( ) { int a ; a ++ ; }", tok("void f() { int a; int &b = a; b++; }")); } + + void simplifyRealloc() + { + ASSERT_EQUALS("; free ( p ) ; p = 0 ;", + tok("; p = realloc(p,0);")); + } }; REGISTER_TEST(TestSimplifyTokens)