exponenta event banner

Несоответствующие функции alloc/dealloc в 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() для освобождения памяти.

Исправление - правильная пара функций распределения и освобождения Windows

При выделении памяти с помощью 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++
По умолчанию: Откл.
Синтаксис командной строки: WIN_MISMATCH_DEALLOC
Воздействие: Низкий
CWE ID: 404, 762
Представлен в R2017b