From cb0b057595e96b5031a2082934d398c6f7364e59 Mon Sep 17 00:00:00 2001 From: Ken-Patrick Date: Wed, 7 Aug 2019 08:04:10 +0200 Subject: [PATCH] 8706 (#2066) * 8706 * Add test case for #8706 --- lib/checkleakautovar.cpp | 2 +- test/testleakautovar.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 1614651fb..a4608bde4 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -316,7 +316,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken, // look for end of statement - if (!Token::Match(tok, "[;{}]") || Token::Match(tok->next(), "[;{}]")) + if (!Token::Match(tok, "[;{},]") || Token::Match(tok->next(), "[;{},]")) continue; tok = tok->next(); diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 64c3f323a..b66751785 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -94,6 +94,7 @@ private: TEST_CASE(doublefree7); TEST_CASE(doublefree8); TEST_CASE(doublefree9); + TEST_CASE(doublefree10); // #8706 // exit TEST_CASE(exit1); @@ -1136,6 +1137,32 @@ private: ASSERT_EQUALS("", errout.str()); } + void doublefree10() { + check("void f(char* s) {\n" + " char *p = malloc(strlen(s));\n" + " if (p != NULL) {\n" + " strcat(p, s);\n" + " if (strlen(s) != 10)\n" + " free(p); p = NULL;\n" + " }\n" + " if (p != NULL)\n" + " free(p);\n" + "}\n", true); + ASSERT_EQUALS("", errout.str()); + + check("void f(char* s) {\n" + " char *p = malloc(strlen(s));\n" + " if (p != NULL) {\n" + " strcat(p, s);\n" + " if (strlen(s) != 10)\n" + " free(p), p = NULL;\n" + " }\n" + " if (p != NULL)\n" + " free(p);\n" + "}\n", true); + ASSERT_EQUALS("", errout.str()); + } + void exit1() { check("void f() {\n" " char *p = malloc(10);\n"