diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 0f562d65b95..84bb8046cbd 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -968,10 +968,17 @@ void CheckLeakAutoVar::functionCall(const Token *tokName, const Token *tokOpenin if (!isnull && (!af || af->arg == argNr)) { const Library::AllocFunc* deallocFunc = mSettings->library.getDeallocFuncInfo(tokName); VarInfo::AllocInfo dealloc(deallocFunc ? deallocFunc->groupId : 0, VarInfo::DEALLOC, tokName); - if (dealloc.type == 0) - changeAllocStatus(varInfo, allocation, tokName, arg); + if (const Library::AllocFunc* allocFunc = mSettings->library.getAllocFuncInfo(tokName)) { + if (allocFunc->arg == argNr) { + leakIfAllocated(arg, varInfo); + VarInfo::AllocInfo& varAlloc = varInfo.alloctype[arg->varId()]; + varAlloc.type = allocFunc->groupId; + varAlloc.status = VarInfo::ALLOC; + varAlloc.allocTok = arg; + } + } else - changeAllocStatus(varInfo, dealloc, tokName, arg); + changeAllocStatus(varInfo, dealloc.type == 0 ? allocation : dealloc, tokName, arg); } } // Check smart pointer diff --git a/test/cfg/gnu.c b/test/cfg/gnu.c index 89c060258dd..d2ded37e540 100644 --- a/test/cfg/gnu.c +++ b/test/cfg/gnu.c @@ -354,9 +354,22 @@ void memleak_asprintf(char **ptr, const char *fmt, const int arg) if (-1 != asprintf(ptr,fmt,arg)) { free(ptr); } - if (-1 != asprintf(ptr,fmt,arg)) { - // TODO: Related to #8980 cppcheck-suppress memleak - } + if (-1 != asprintf(ptr,fmt,arg)) {} + // cppcheck-suppress memleak +} + +void memleak_asprintf2() { // #12186 + char* p = malloc(5); + // cppcheck-suppress memleak + (void)asprintf(&p, "%s", "test"); + // cppcheck-suppress memleak +} + +void memleak_asprintf3() { + char* p = malloc(5); + // cppcheck-suppress memleak + asprintf(&p, "%s", "test"); + free(p); } void memleak_xmalloc() diff --git a/test/cfg/sqlite3.c b/test/cfg/sqlite3.c index b294d82ab7f..b493011fc7c 100644 --- a/test/cfg/sqlite3.c +++ b/test/cfg/sqlite3.c @@ -43,7 +43,7 @@ void resourceLeak_sqlite3_open() sqlite3 * db; sqlite3_open("/db", &db); - // TODO: cppcheck-suppress resourceLeak + // cppcheck-suppress resourceLeak } void ignoredReturnValue(const char * buf) diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index a08bc2d649a..2ac0a356e60 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -3004,8 +3004,7 @@ class TestLeakAutoVarWindows : public TestFixture { " HeapFree(MyHeap, 0, a);" " HeapFree(MyHeap, 0, b);" "}"); - TODO_ASSERT_EQUALS("[test.c:1] (error) Resource leak: MyHeap", - "", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) Resource leak: MyHeap\n", errout.str()); check("void f() {" " HANDLE MyHeap = HeapCreate(0, 0, 0);" @@ -3013,9 +3012,9 @@ class TestLeakAutoVarWindows : public TestFixture { " int *b = HeapAlloc(MyHeap, 0, sizeof(int));" " HeapFree(MyHeap, 0, a);" "}"); - TODO_ASSERT_EQUALS("[test.c:1] (error) Memory leak: MyHeap\n" - "[test.c:1] (error) Memory leak: b", - "[test.c:1]: (error) Memory leak: b\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) Resource leak: MyHeap\n" + "[test.c:1]: (error) Memory leak: b\n", + errout.str()); } };