From 0fff5a23bfb151dec848a0c7008418eb94259108 Mon Sep 17 00:00:00 2001 From: Reijo Tomperi Date: Sun, 20 Sep 2009 23:38:32 +0300 Subject: [PATCH] Fix #701 (false positive: Invalid deallocation) http://sourceforge.net/apps/trac/cppcheck/ticket/701 --- src/tokenize.cpp | 14 ++++++-------- test/testsimplifytokens.cpp | 14 +++++++++++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 9557b56a5..fc62f19a6 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -1353,6 +1353,11 @@ void Tokenizer::simplifySizeof() { if (Token::Match(tempToken, "%var%")) { + while (tempToken->next()->str() == "[") + { + tempToken = tempToken->next()->link(); + } + if (tempToken->next()->str() == ".") { // We are checking a class or struct, search next varname @@ -1371,19 +1376,12 @@ void Tokenizer::simplifySizeof() // nothing after this tempToken = tempToken->tokAt(2); } - else if (tempToken->next()->str() == "[") - { - /** @todo We need to find closing ], then check for - * dots and arrows "var[some[0]]->other" */ - - // But for now, just bail out - break; - } // Ok, we should be clean. Add ) after tempToken tok->insertToken("("); tempToken->insertToken(")"); Token::createMutualLinks(tok->next(), tempToken->next()); + setVarId(); break; } } diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 75162c83c..8fbe0e2e9 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -554,9 +554,17 @@ private: void sizeof4() { - const char code[] = "int i[10];\n" - "sizeof(i[0]);\n"; - ASSERT_EQUALS("int i [ 10 ] ; 4 ;", sizeof_(code)); + { + const char code[] = "int i[10];\n" + "sizeof(i[0]);\n"; + ASSERT_EQUALS("int i [ 10 ] ; 4 ;", sizeof_(code)); + } + + { + const char code[] = "int i[10];\n" + "sizeof i[0];\n"; + ASSERT_EQUALS("int i [ 10 ] ; 4 ;", sizeof_(code)); + } } void sizeof5()