From 81174a4817bf057f3a4a7067df8a0a5185940d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 31 Jan 2009 17:54:31 +0000 Subject: [PATCH] mismatching allocation / deallocation: moved to --all --- src/checkmemoryleak.cpp | 2 ++ src/cppcheck.cpp | 2 +- src/errormessage.h | 15 ++++++++++++--- test/testmemleak.cpp | 12 ++++++------ tools/errmsg.cpp | 3 ++- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/checkmemoryleak.cpp b/src/checkmemoryleak.cpp index 434bdfe77..19cbad422 100644 --- a/src/checkmemoryleak.cpp +++ b/src/checkmemoryleak.cpp @@ -293,6 +293,8 @@ const char * CheckMemoryLeakClass::call_func(const Token *tok, std::list &callstack, const char varname[]) { + if (! ErrorMessage::mismatchAllocDealloc(_settings)) + return; std::ostringstream errmsg; for (std::list::const_iterator tok = callstack.begin(); tok != callstack.end(); ++tok) errmsg << _tokenizer->fileLine(*tok) << " -> "; diff --git a/src/cppcheck.cpp b/src/cppcheck.cpp index 4c6452389..6a32afd7c 100644 --- a/src/cppcheck.cpp +++ b/src/cppcheck.cpp @@ -367,7 +367,7 @@ void CppCheck::checkFile(const std::string &code, const char FileName[]) // Memory leak CheckMemoryLeakClass checkMemoryLeak(&_tokenizer, _settings, this); - if (ErrorMessage::memleak() || ErrorMessage::mismatchAllocDealloc()) + if (ErrorMessage::memleak() || ErrorMessage::mismatchAllocDealloc(_settings)) checkMemoryLeak.CheckMemoryLeak(); // Check that all class constructors are ok. diff --git a/src/errormessage.h b/src/errormessage.h index 65b6c20c8..e3866cf92 100644 --- a/src/errormessage.h +++ b/src/errormessage.h @@ -132,11 +132,11 @@ public: static std::string mismatchAllocDealloc(const Tokenizer *tokenizer, const Token *Location, const std::string &varname) { - return msg1(tokenizer, Location) + std::string("(always) ") + "Mismatching allocation and deallocation: " + varname + ""; + return msg1(tokenizer, Location) + std::string("(all) ") + "Mismatching allocation and deallocation: " + varname + ""; } - static bool mismatchAllocDealloc() + static bool mismatchAllocDealloc(const Settings &s) { - return true; + return s._showAll; } static std::string memleak(const Tokenizer *tokenizer, const Token *Location, const std::string &varname) @@ -175,6 +175,15 @@ public: return true; } + static std::string deallocuse(const Tokenizer *tokenizer, const Token *Location, const std::string &varname) + { + return msg1(tokenizer, Location) + std::string("(always) ") + "Using '" + varname + "' after it is deallocated / released"; + } + static bool deallocuse() + { + return true; + } + static std::string cstyleCast(const Tokenizer *tokenizer, const Token *Location) { return msg1(tokenizer, Location) + std::string("(style) ") + "C-style pointer casting"; diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 65ff5c67d..52f52e85b 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -951,8 +951,8 @@ private: "{\n" " int *a = new int[10];\n" " free(a);\n" - "}\n"); - ASSERT_EQUALS(std::string("[test.cpp:4]: (always) Mismatching allocation and deallocation: a\n"), errout.str()); + "}\n", true); + ASSERT_EQUALS(std::string("[test.cpp:4]: (all) Mismatching allocation and deallocation: a\n"), errout.str()); } void mismatch2() @@ -966,7 +966,7 @@ private: "\n" " fp = popen();\n" " pclose(fp);\n" - "}\n"); + "}\n", false); ASSERT_EQUALS(std::string(""), errout.str()); } @@ -1041,9 +1041,9 @@ private: "{\n" " char *p = new char[100];\n" " foo(p);\n" - "}\n"); + "}\n", true); std::string err(errout.str()); - ASSERT_EQUALS(std::string("[test.cpp:9] -> [test.cpp:3]: (always) Mismatching allocation and deallocation: str\n"), err); + ASSERT_EQUALS(std::string("[test.cpp:9] -> [test.cpp:3]: (all) Mismatching allocation and deallocation: str\n"), err); } @@ -1248,7 +1248,7 @@ private: " free(str1);\n" "}\n", true); - ASSERT_EQUALS(std::string("[test.cpp:17]: (always) Mismatching allocation and deallocation: Fred::str1\n"), errout.str()); + ASSERT_EQUALS(std::string("[test.cpp:17]: (all) Mismatching allocation and deallocation: Fred::str1\n"), errout.str()); } void class3() diff --git a/tools/errmsg.cpp b/tools/errmsg.cpp index bba9236d6..cd955d6fb 100644 --- a/tools/errmsg.cpp +++ b/tools/errmsg.cpp @@ -75,11 +75,12 @@ int main() err.push_back(Message("unusedFunction", Message::style_all, "[%1]: The function '%2' is never used", "filename", "funcname")); // checkmemoryleak.cpp.. - err.push_back(Message("mismatchAllocDealloc", Message::always, "Mismatching allocation and deallocation: %1", "varname")); + err.push_back(Message("mismatchAllocDealloc", Message::all, "Mismatching allocation and deallocation: %1", "varname")); err.push_back(Message("memleak", Message::always, "Memory leak: %1", "varname")); err.push_back(Message("memleakall", Message::all, "Memory leak: %1", "varname")); err.push_back(Message("resourceLeak", Message::always, "Resource leak: %1", "varname")); err.push_back(Message("deallocDealloc", Message::always, "Deallocating a deallocated pointer: %1", "varname")); + err.push_back(Message("deallocuse", Message::always, "Using '%1' after it is deallocated / released", "varname")); // checkother.cpp.. err.push_back(Message("cstyleCast", Message::style, "C-style pointer casting"));