Use library to get deallocation function (#5061)
* Use library to get deallocation function * Add suppressions * Amend * Remove suppression * More getDeallocFuncInfo() * Fix suppressions * Fix suppression
This commit is contained in:
parent
d30f8e18f7
commit
e621f721fc
|
@ -1738,7 +1738,7 @@ bool CheckClass::hasAllocation(const Function *func, const Scope* scope, const T
|
||||||
|
|
||||||
// check for deallocating memory
|
// check for deallocating memory
|
||||||
const Token *var;
|
const Token *var;
|
||||||
if (Token::Match(tok, "free ( %var%"))
|
if (Token::Match(tok, "%name% ( %var%") && mSettings->library.getDeallocFuncInfo(tok))
|
||||||
var = tok->tokAt(2);
|
var = tok->tokAt(2);
|
||||||
else if (Token::Match(tok, "delete [ ] %var%"))
|
else if (Token::Match(tok, "delete [ ] %var%"))
|
||||||
var = tok->tokAt(3);
|
var = tok->tokAt(3);
|
||||||
|
|
|
@ -876,7 +876,7 @@ void CheckMemoryLeakStructMember::checkStructVariable(const Variable * const var
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deallocating the struct..
|
// Deallocating the struct..
|
||||||
else if (Token::Match(tok3, "free|kfree ( %varid% )", structid)) {
|
else if (Token::Match(tok3, "%name% ( %varid% )", structid) && mSettings->library.getDeallocFuncInfo(tok3)) {
|
||||||
if (indentlevel2 == 0)
|
if (indentlevel2 == 0)
|
||||||
memoryLeak(tok3, variable->name() + "." + tok2->strAt(2), Malloc);
|
memoryLeak(tok3, variable->name() + "." + tok2->strAt(2), Malloc);
|
||||||
break;
|
break;
|
||||||
|
@ -910,7 +910,7 @@ void CheckMemoryLeakStructMember::checkStructVariable(const Variable * const var
|
||||||
--indentlevel4;
|
--indentlevel4;
|
||||||
if (indentlevel4 == 0)
|
if (indentlevel4 == 0)
|
||||||
break;
|
break;
|
||||||
} else if (Token::Match(tok4, "free|kfree ( %var% . %varid% )", structmemberid)) {
|
} else if (Token::Match(tok4, "%name% ( %var% . %varid% )", structmemberid) && mSettings->library.getDeallocFuncInfo(tok4)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2323,7 +2323,7 @@ void CheckOther::checkInvalidFree()
|
||||||
|
|
||||||
// If a variable that was previously assigned a newly-allocated memory location is
|
// If a variable that was previously assigned a newly-allocated memory location is
|
||||||
// added or subtracted from when used to free the memory, report an error.
|
// added or subtracted from when used to free the memory, report an error.
|
||||||
else if (Token::Match(tok, "free|g_free|delete ( %any% +|-") ||
|
else if ((Token::Match(tok, "%name% ( %any% +|-") && mSettings->library.getDeallocFuncInfo(tok)) ||
|
||||||
Token::Match(tok, "delete [ ] ( %any% +|-") ||
|
Token::Match(tok, "delete [ ] ( %any% +|-") ||
|
||||||
Token::Match(tok, "delete %any% +|- %any%")) {
|
Token::Match(tok, "delete %any% +|- %any%")) {
|
||||||
|
|
||||||
|
|
|
@ -837,7 +837,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Freeing memory (not considered "using" the pointer if it was also allocated in this function)
|
// Freeing memory (not considered "using" the pointer if it was also allocated in this function)
|
||||||
if (Token::Match(tok, "free|g_free|kfree|vfree ( %var% )") ||
|
if ((Token::Match(tok, "%name% ( %var% )") && mSettings->library.getDeallocFuncInfo(tok)) ||
|
||||||
(mTokenizer->isCPP() && (Token::Match(tok, "delete %var% ;") || Token::Match(tok, "delete [ ] %var% ;")))) {
|
(mTokenizer->isCPP() && (Token::Match(tok, "delete %var% ;") || Token::Match(tok, "delete [ ] %var% ;")))) {
|
||||||
nonneg int varid = 0;
|
nonneg int varid = 0;
|
||||||
if (tok->str() != "delete") {
|
if (tok->str() != "delete") {
|
||||||
|
|
|
@ -51,6 +51,7 @@ void validCode(int argInt, GHashTableIter * hash_table_iter, GHashTable * hash_t
|
||||||
printf("%s", pGchar1);
|
printf("%s", pGchar1);
|
||||||
g_free(pGchar1);
|
g_free(pGchar1);
|
||||||
|
|
||||||
|
// cppcheck-suppress unusedAllocatedMemory
|
||||||
GError * pGerror = g_error_new(1, -2, "a %d", 1);
|
GError * pGerror = g_error_new(1, -2, "a %d", 1);
|
||||||
g_error_free(pGerror);
|
g_error_free(pGerror);
|
||||||
|
|
||||||
|
|
|
@ -1287,6 +1287,7 @@ void dl(const char* libname, const char* func)
|
||||||
void* sym = dlsym(lib, funcname);
|
void* sym = dlsym(lib, funcname);
|
||||||
// cppcheck-suppress ignoredReturnValue
|
// cppcheck-suppress ignoredReturnValue
|
||||||
dlsym(lib, "foo");
|
dlsym(lib, "foo");
|
||||||
|
// cppcheck-suppress unassignedVariable
|
||||||
void* uninit;
|
void* uninit;
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
dlclose(uninit);
|
dlclose(uninit);
|
||||||
|
|
|
@ -25,8 +25,10 @@ void validCode(PyObject * pPyObjArg)
|
||||||
Py_CLEAR(pPyObjNULL);
|
Py_CLEAR(pPyObjNULL);
|
||||||
(void)PyErr_NewException("text", NULL, NULL);
|
(void)PyErr_NewException("text", NULL, NULL);
|
||||||
|
|
||||||
|
// cppcheck-suppress unusedAllocatedMemory
|
||||||
char * pBuf1 = PyMem_Malloc(5);
|
char * pBuf1 = PyMem_Malloc(5);
|
||||||
PyMem_Free(pBuf1);
|
PyMem_Free(pBuf1);
|
||||||
|
// cppcheck-suppress unusedAllocatedMemory
|
||||||
int * pIntBuf1 = PyMem_New(int, 10);
|
int * pIntBuf1 = PyMem_New(int, 10);
|
||||||
PyMem_Free(pIntBuf1);
|
PyMem_Free(pIntBuf1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -648,6 +648,7 @@ void uninitvar_clearerr(void)
|
||||||
|
|
||||||
void uninitvar_fclose(void)
|
void uninitvar_fclose(void)
|
||||||
{
|
{
|
||||||
|
// cppcheck-suppress unassignedVariable
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
|
@ -1795,7 +1795,6 @@ void uninitvar_fread(void)
|
||||||
|
|
||||||
void uninitvar_free(void)
|
void uninitvar_free(void)
|
||||||
{
|
{
|
||||||
// cppcheck-suppress unassignedVariable
|
|
||||||
void *block;
|
void *block;
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
std::free(block);
|
std::free(block);
|
||||||
|
|
|
@ -258,6 +258,7 @@ void validCode()
|
||||||
CloseHandle(event);
|
CloseHandle(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cppcheck-suppress unusedAllocatedMemory
|
||||||
void *pMem1 = _malloca(1);
|
void *pMem1 = _malloca(1);
|
||||||
_freea(pMem1);
|
_freea(pMem1);
|
||||||
// Memory from _alloca must not be freed
|
// Memory from _alloca must not be freed
|
||||||
|
@ -343,7 +344,7 @@ void validCode()
|
||||||
SecureZeroMemory(byteBuf, sizeof(byteBuf));
|
SecureZeroMemory(byteBuf, sizeof(byteBuf));
|
||||||
RtlFillMemory(byteBuf, sizeof(byteBuf), 0xff);
|
RtlFillMemory(byteBuf, sizeof(byteBuf), 0xff);
|
||||||
|
|
||||||
// cppcheck-suppress LocalAllocCalled
|
// cppcheck-suppress [LocalAllocCalled, unusedAllocatedMemory]
|
||||||
HLOCAL pLocalAlloc = LocalAlloc(1, 2);
|
HLOCAL pLocalAlloc = LocalAlloc(1, 2);
|
||||||
LocalFree(pLocalAlloc);
|
LocalFree(pLocalAlloc);
|
||||||
|
|
||||||
|
@ -357,6 +358,7 @@ void validCode()
|
||||||
__noop(1, "test", NULL);
|
__noop(1, "test", NULL);
|
||||||
__nop();
|
__nop();
|
||||||
|
|
||||||
|
// cppcheck-suppress unusedAllocatedMemory
|
||||||
void * pAlloc1 = _aligned_malloc(100, 2);
|
void * pAlloc1 = _aligned_malloc(100, 2);
|
||||||
_aligned_free(pAlloc1);
|
_aligned_free(pAlloc1);
|
||||||
|
|
||||||
|
@ -437,6 +439,7 @@ void mismatchAllocDealloc()
|
||||||
// cppcheck-suppress mismatchAllocDealloc
|
// cppcheck-suppress mismatchAllocDealloc
|
||||||
free(pChar);
|
free(pChar);
|
||||||
|
|
||||||
|
// cppcheck-suppress unusedAllocatedMemory
|
||||||
pChar = _malloca(32);
|
pChar = _malloca(32);
|
||||||
// cppcheck-suppress mismatchAllocDealloc
|
// cppcheck-suppress mismatchAllocDealloc
|
||||||
_aligned_free(pChar);
|
_aligned_free(pChar);
|
||||||
|
@ -751,6 +754,7 @@ void invalidFunctionArg()
|
||||||
|
|
||||||
void uninitvar()
|
void uninitvar()
|
||||||
{
|
{
|
||||||
|
// cppcheck-suppress unassignedVariable
|
||||||
HANDLE hSemaphore;
|
HANDLE hSemaphore;
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
CloseHandle(hSemaphore);
|
CloseHandle(hSemaphore);
|
||||||
|
@ -765,12 +769,14 @@ void uninitvar()
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
lstrcat(buf, buf2);
|
lstrcat(buf, buf2);
|
||||||
|
|
||||||
|
// cppcheck-suppress unassignedVariable
|
||||||
HANDLE hMutex1, hMutex2;
|
HANDLE hMutex1, hMutex2;
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
ReleaseMutex(hMutex1);
|
ReleaseMutex(hMutex1);
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
CloseHandle(hMutex2);
|
CloseHandle(hMutex2);
|
||||||
|
|
||||||
|
// cppcheck-suppress unassignedVariable
|
||||||
HANDLE hEvent1, hEvent2, hEvent3, hEvent4;
|
HANDLE hEvent1, hEvent2, hEvent3, hEvent4;
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
PulseEvent(hEvent1);
|
PulseEvent(hEvent1);
|
||||||
|
|
Loading…
Reference in New Issue