Refactorizations in checkmemoryleak.cpp:

- Rely more on <alloc> declarations in Libraries
- Removed unreachable debug message
- Simplified code
This commit is contained in:
PKEuS 2015-11-19 17:33:52 +01:00
parent 0d25a43a5d
commit 2e7c5d37df
3 changed files with 22 additions and 44 deletions

View File

@ -118,21 +118,6 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2,
return No;
if (!Token::Match(tok2, "%name% ::|. %type%")) {
// Does tok2 point on "malloc", "strdup" or "kmalloc"..
static const char * const mallocfunc[] = {
"malloc",
"calloc",
"strdup",
"strndup",
"kmalloc",
"kzalloc",
"kcalloc"
};
for (unsigned int i = 0; i < sizeof(mallocfunc)/sizeof(*mallocfunc); i++) {
if (tok2->str() == mallocfunc[i])
return Malloc;
}
// Using realloc..
if (varid && Token::Match(tok2, "realloc ( %any% ,") && tok2->tokAt(2)->varId() != varid)
return Malloc;
@ -143,9 +128,6 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2,
return New;
}
if (Token::Match(tok2, "fopen|tmpfile|g_fopen ("))
return File;
if (settings1->standards.posix) {
if (Token::Match(tok2, "open|openat|creat|mkstemp|mkostemp|socket (")) {
// simple sanity check of function parameters..
@ -164,7 +146,7 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2,
return Pipe;
}
// Does tok2 point on "g_malloc", "g_strdup", ..
// Does tok2 point on a Library allocation function?
const int alloctype = settings1->library.alloc(tok2);
if (alloctype > 0) {
if (alloctype == settings1->library.dealloc("free"))
@ -243,13 +225,9 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok
vartok = vartok->tokAt(2);
if (Token::Match(vartok, "%varid% )|,|-", varid)) {
if (Token::Match(tok, "free|kfree") ||
(tok->str() == "realloc" && Token::simpleMatch(vartok->next(), ", 0 )")))
if (tok->str() == "realloc" && Token::simpleMatch(vartok->next(), ", 0 )"))
return Malloc;
if (tok->str() == "fclose")
return File;
if (settings1->standards.posix) {
if (tok->str() == "close")
return Fd;
@ -257,10 +235,15 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok
return Pipe;
}
// Does tok2 point on "g_free", etc ..
// Does tok point on a Library deallocation function?
const int dealloctype = settings1->library.dealloc(tok);
if (dealloctype > 0)
if (dealloctype > 0) {
if (dealloctype == settings1->library.dealloc("free"))
return Malloc;
if (dealloctype == settings1->library.dealloc("fclose"))
return File;
return Library::ismemory(dealloctype) ? OtherMem : OtherRes;
}
}
}
@ -2225,23 +2208,13 @@ void CheckMemoryLeakInClass::check()
if (!var->isStatic() && var->isPointer()) {
// allocation but no deallocation of private variables in public function..
const Token *tok = var->typeStartToken();
if (tok->isStandardType()) {
// Either it is of standard type or a non-derived type
if (tok->isStandardType() || (var->type() && var->type()->derivedFrom.empty())) {
if (var->isPrivate())
checkPublicFunctions(scope, var->nameToken());
variable(scope, var->nameToken());
}
// known class?
else if (var->type()) {
// not derived?
if (var->type()->derivedFrom.empty()) {
if (var->isPrivate())
checkPublicFunctions(scope, var->nameToken());
variable(scope, var->nameToken());
}
}
}
}
}
@ -2378,10 +2351,6 @@ void CheckMemoryLeakInClass::checkPublicFunctions(const Scope *scope, const Toke
return;
const unsigned int varid = classtok->varId();
if (varid == 0) {
_tokenizer->getSymbolDatabase()->debugMessage(classtok, "CheckMemoryInClass::checkPublicFunctions found variable \'" + classtok->str() + "\' with varid 0");
return;
}
// Parse public functions..
// If they allocate member variables, they should also deallocate

View File

@ -146,6 +146,7 @@ private:
void run() {
LOAD_LIB_2(settings1.library, "std.cfg");
LOAD_LIB_2(settings1.library, "gtk.cfg");
LOAD_LIB_2(settings1.library, "posix.cfg");
LOAD_LIB_2(settings2.library, "std.cfg");
// Check that getcode works correctly..
@ -4209,7 +4210,7 @@ private:
check("void f() {\n"
" char *p;\n"
" char **pp = &p;\n"
" *pp = calloc(10);\n"
" *pp = calloc(10, 1);\n"
"}");
ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: p\n", errout.str());
}
@ -4295,6 +4296,8 @@ private:
settings.addEnabled("warning");
settings.addEnabled("style");
LOAD_LIB_2(settings.library, "std.cfg");
TEST_CASE(class1);
TEST_CASE(class2);
TEST_CASE(class3);
@ -5550,6 +5553,9 @@ private:
}
void run() {
LOAD_LIB_2(settings.library, "std.cfg");
LOAD_LIB_2(settings.library, "posix.cfg");
// testing that errors are detected
TEST_CASE(err);
@ -5985,6 +5991,7 @@ private:
settings.addEnabled("warning");
LOAD_LIB_2(settings.library, "std.cfg");
LOAD_LIB_2(settings.library, "posix.cfg");
LOAD_LIB_2(settings.library, "gtk.cfg");
// pass allocated memory to function..
@ -6095,7 +6102,7 @@ private:
check("void x()\n"
"{\n"
" calloc(10);\n"
" calloc(10, 1);\n"
"}");
ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'calloc' is not stored.\n", errout.str());

View File

@ -62,6 +62,8 @@ private:
}
void run() {
LOAD_LIB_2(settings.library, "std.cfg");
TEST_CASE(deadlock_with_many_errors);
TEST_CASE(many_threads);
TEST_CASE(no_errors_more_files);