メインコンテンツ

Windows での関数 alloc と関数 dealloc の不一致

不適切な割り当て解除関数がメモリ破損問題を引き起こす

説明

この欠陥は、使用する 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
影響度: Low

バージョン履歴

R2017b で導入