From adad786d75a7588f62dd2c26ccf0513615d17df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 15 Nov 2008 17:21:35 +0000 Subject: [PATCH] SimplifyTokens: Replace 'sizeof(*abc)' with '100'. This prevents false positives in checks --- testmemleak.cpp | 35 +++++++++++++++++++++++++++++++---- testsimplifytokens.cpp | 8 ++++++++ tokenize.cpp | 7 +++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/testmemleak.cpp b/testmemleak.cpp index cadc0af17..8526e4bb9 100644 --- a/testmemleak.cpp +++ b/testmemleak.cpp @@ -113,7 +113,9 @@ private: TEST_CASE( throw1 ); TEST_CASE( linux_list_1 ); - // TODO: TEST_CASE( linux_list_2 ); + // TODO: TEST_CASE( linux_list_2 ); + + TEST_CASE( sizeof1 ); } @@ -839,8 +841,6 @@ private: ASSERT_EQUALS( std::string(""), errout.str() ); } -/* - // TODO: Add this test void linux_list_2() { check( "struct AB\n" @@ -856,8 +856,35 @@ private: ASSERT_EQUALS( std::string("[test.cpp:10]: Memory leak: ab\n"), errout.str() ); } -*/ + + + + void sizeof1() + { + check( "void f()\n" + "{\n" + " struct s_t s1;\n" + " struct s_t cont *p = &s1;\n" + " struct s_t *s2;\n" + "\n" + " memset(p, 0, sizeof(*p));\n" + "\n" + " s2 = (struct s_t *) malloc(sizeof(*s2));\n" + "\n" + " if (s2->value != 0)\n" + " return;\n" + "\n" + " free(s2);\n" + "\n" + " return;\n" + "}\n" ); + + std::string err( errout.str() ); + + ASSERT_EQUALS( std::string("[test.cpp:12]: Memory leak: s2\n"), err ); + } + }; REGISTER_TEST( TestMemleak ) diff --git a/testsimplifytokens.cpp b/testsimplifytokens.cpp index 20e928395..c81040a4f 100644 --- a/testsimplifytokens.cpp +++ b/testsimplifytokens.cpp @@ -34,6 +34,7 @@ private: void run() { TEST_CASE( cast0 ); + TEST_CASE( sizeof1 ); } static std::string tok(const char code[]) @@ -58,6 +59,13 @@ private: const char code2[] = " if ( p == 0 ) "; ASSERT_EQUALS( tok(code1), tok(code2) ); } + + void sizeof1() + { + const char code1[] = " struct ABC *abc = malloc(sizeof(*abc)); "; + const char code2[] = " struct ABC *abc = malloc(100); "; + ASSERT_EQUALS( tok(code1), tok(code2) ); + } }; REGISTER_TEST( TestSimplifyTokens ) diff --git a/tokenize.cpp b/tokenize.cpp index e3ee603ae..2d5cb7921 100644 --- a/tokenize.cpp +++ b/tokenize.cpp @@ -758,6 +758,13 @@ void Tokenizer::SimplifyTokenList() DeleteNextToken(tok); } } + } + + else if (Match(tok, "sizeof ( * %var% )")) + { + tok->setstr("100"); + for ( int i = 0; i < 4; ++i ) + DeleteNextToken(tok); } }