Mismatched alloc/dealloc functions on Windows

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

Описание

Функции 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 Allocation и функции освобождения

Когда вы выделяете память с 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
Удар: низко
ID CWE: 404, 762

Введенный в R2017b