diff --git a/src/checkmemoryleak.cpp b/src/checkmemoryleak.cpp index ce62c8c59..40e70ce51 100644 --- a/src/checkmemoryleak.cpp +++ b/src/checkmemoryleak.cpp @@ -595,25 +595,25 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list addtoken(tok->str().c_str()); } - if ((tok->str() == "case")) + else if ((tok->str() == "case")) { addtoken("case"); addtoken(";"); } - if ((tok->str() == "default")) + else if ((tok->str() == "default")) { addtoken("default"); addtoken(";"); } // Loops.. - if ((tok->str() == "for") || (tok->str() == "while")) + else if ((tok->str() == "for") || (tok->str() == "while")) { addtoken("loop"); isloop = true; } - if ((tok->str() == "do")) + else if ((tok->str() == "do")) { addtoken("do"); } @@ -633,7 +633,7 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list } // Return.. - if (tok->str() == "return") + else if (tok->str() == "return") { addtoken("return"); @@ -684,7 +684,7 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list } // throw.. - if (Token::Match(tok, "try|throw|catch")) + else if (Token::Match(tok, "try|throw|catch")) addtoken(tok->strAt(0)); // exit.. @@ -694,7 +694,8 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list // Assignment.. if (Token::Match(tok, std::string("[)=] " + varnameStr + " [+;)]").c_str()) || Token::Match(tok, std::string(varnameStr + " +=|-=").c_str()) || - Token::Match(tok, std::string("+=|<< " + varnameStr + " ;").c_str())) + Token::Match(tok, std::string("+=|<< " + varnameStr + " ;").c_str()) || + Token::Match(tok, std::string("= strcpy|strcat|memmove|memcpy ( " + varnameStr + " ,").c_str())) { addtoken("use"); } diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 1f6f71fc5..cb14b8ad3 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -190,6 +190,7 @@ private: // free a free'd pointer TEST_CASE(freefree1); TEST_CASE(freefree2); + TEST_CASE(strcpy_result_assignment); TEST_CASE(strcat_result_assignment); TEST_CASE(all1); // Extra checking when --all is given @@ -1974,6 +1975,16 @@ private: ASSERT_EQUALS("", errout.str()); } + void strcpy_result_assignment() + { + check("void foo()\n" + "{\n" + " char *p1 = malloc(10);\n" + " char *p2 = strcpy(p1, \"a\");\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } + void strcat_result_assignment() { check("void foo()\n"