Mismatched alloc/dealloc functions on Windows

Неправильная функция деаллокации вызывает проблемы с повреждением памяти

Описание

Этот дефект возникает, когда вы используете Windows® функция удаления, которая неправильно соединена с соответствующей функцией выделения.

Риск

Отмена выделения памяти функцией, которая не совпадает с функцией выделения, может привести к повреждению памяти или неопределенному поведению. Если вы используете более старую версию Windows, неправильная функция может также вызвать проблемы совместимости с новыми версиями.

Зафиксировать

Правильно соедините функции выделения и отмены назначения в соответствии с функциями, перечисленными в этой таблице.

Функция распределенияФункция деаллокации
malloc()free()
realloc()free()
calloc()free()
_aligned_malloc()_aligned_free()
_aligned_offset_malloc()_aligned_free()
_aligned_realloc()_aligned_free()
_aligned_offset_realloc()_aligned_free()
_aligned_recalloc()_aligned_free()
_aligned_offset_recalloc()_aligned_free()
_malloca()_freea()
LocalAlloc()LocalFree()
LocalReAlloc()LocalFree()
GlobalAlloc()GlobalFree()
GlobalReAlloc()GlobalFree()
VirtualAlloc()VirtualFree()
VirtualAllocEx()VirtualFreeEx()
VirtualAllocExNuma()VirtualFreeEx()
HeapAlloc()HeapFree()
HeapReAlloc()HeapFree()

Примеры

расширить все

#ifdef _WIN32_
#include <windows.h>
#else
#define _WIN32_
typedef void *HANDLE;
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
typedef unsigned int UINT;
extern HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);
extern HLOCAL LocalFree(HLOCAL hMem);
extern HGLOBAL GlobalFree(HGLOBAL hMem);
#endif

#define SIZE9 9


void func(void)
{
	/* Memory allocation */
    HLOCAL p = LocalAlloc(0x0000, SIZE9);
	
    if (p) {
		/* Memory deallocation. */
        GlobalFree(p);
		
    }
}
     
      

В этом примере память выделяется с LocallAlloc(). Затем программа ошибочно использует GlobalFree() для удаления памяти.

Коррекция - правильная пара функций выделения и удаления окон

Когда вы выделяете память с LocalAllocate(), использовать LocalFree() для удаления памяти.

#ifdef _WIN32_
#include <windows.h>
#else
#define _WIN32_
typedef void *HANDLE;
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
typedef unsigned int UINT;
extern HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);
extern HLOCAL LocalFree(HLOCAL hMem);
extern HGLOBAL GlobalFree(HGLOBAL hMem);
#endif

#define SIZE9 9
void func(void)
{
	/* Memory allocation */
    HLOCAL p = LocalAlloc(0x0000, SIZE9);
    if (p) {
		/* Memory deallocation. */
        LocalFree(p);  
    }
} 

Информация о результатах

Группа: Динамическая память
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : WIN_MISMATCH_DEALLOC
Влияние: Низкое
ИДЕНТИФИКАТОР CWE : 404, 762
Введенный в R2017b