windows.cfg: Add "buffer-size" attributes, fix allocation configuration.

Memory allocated with `_aligned_*malloc*()` must be freed with
`_aligned_free*()`. Using `free()` is illegal.
See
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/aligned-malloc
for details.
Also add tests for some of the changed functions.
This commit is contained in:
versat 2019-03-22 13:11:03 +01:00
parent ddf5ecc6bc
commit 0d14bdac22
2 changed files with 62 additions and 27 deletions

View File

@ -1156,21 +1156,21 @@
<dealloc>FreeLibraryAndExitThread</dealloc>
</resource>
<memory>
<alloc>ExAllocatePool</alloc>
<alloc>ExAllocatePoolWithQuota</alloc>
<alloc>ExAllocatePoolWithQuotaTag</alloc>
<alloc>ExAllocatePoolWithTag</alloc>
<alloc>ExAllocatePoolWithTagPriority</alloc>
<alloc buffer-size="malloc:2">ExAllocatePool</alloc>
<alloc buffer-size="malloc:2">ExAllocatePoolWithQuota</alloc>
<alloc buffer-size="malloc:2">ExAllocatePoolWithQuotaTag</alloc>
<alloc buffer-size="malloc:2">ExAllocatePoolWithTag</alloc>
<alloc buffer-size="malloc:2">ExAllocatePoolWithTagPriority</alloc>
<dealloc>ExFreePool</dealloc>
<dealloc>ExFreePoolWithTag</dealloc>
</memory>
<memory>
<alloc>HeapAlloc</alloc>
<alloc buffer-size="malloc:3">HeapAlloc</alloc>
<alloc>HeapReAlloc</alloc>
<dealloc arg="3">HeapFree</dealloc>
</memory>
<memory>
<alloc>IoAllocateErrorLogEntry</alloc>
<alloc buffer-size="malloc:2">IoAllocateErrorLogEntry</alloc>
<dealloc>IoWriteErrorLogEntry</dealloc>
<dealloc>IoFreeErrorLogEntry</dealloc>
</memory>
@ -1181,16 +1181,16 @@
<dealloc arg="2">IoCallDriver</dealloc>
</memory>
<memory>
<alloc>IoAllocateMdl</alloc>
<alloc buffer-size="malloc:2">IoAllocateMdl</alloc>
<dealloc>IoFreeMdl</dealloc>
</memory>
<memory>
<alloc>MmAllocateContiguousMemory</alloc>
<alloc buffer-size="malloc">MmAllocateContiguousMemory</alloc>
<dealloc>MmFreeContiguousMemory</dealloc>
</memory>
<memory>
<alloc>MmAllocateContiguousMemorySpecifyCache</alloc>
<alloc>MmAllocateContiguousMemorySpecifyCacheNode</alloc>
<alloc buffer-size="malloc">MmAllocateContiguousMemorySpecifyCache</alloc>
<alloc buffer-size="malloc">MmAllocateContiguousMemorySpecifyCacheNode</alloc>
<dealloc>MmFreeContiguousMemorySpecifyCache</dealloc>
</memory>
<memory>
@ -1198,7 +1198,7 @@
<dealloc>IoFreeWorkItem</dealloc>
</memory>
<memory>
<alloc>RtlAllocateHeap</alloc>
<alloc buffer-size="malloc:3">RtlAllocateHeap</alloc>
<dealloc>RtlFreeHeap</dealloc>
</memory>
<memory>
@ -1210,32 +1210,32 @@
<dealloc arg="2">ExFreeToNPagedLookasideList</dealloc>
</memory>
<memory>
<alloc>AllocateHeap</alloc>
<alloc buffer-size="malloc">AllocateHeap</alloc>
<dealloc>FreeHeap</dealloc>
</memory>
<memory>
<alloc>AllocateLsaHeap</alloc>
<alloc buffer-size="malloc">AllocateLsaHeap</alloc>
<dealloc>FreeLsaHeap</dealloc>
</memory>
<memory>
<alloc>AllocatePrivateHeap</alloc>
<alloc buffer-size="malloc">AllocatePrivateHeap</alloc>
<dealloc>FreePrivateHeap</dealloc>
</memory>
<memory>
<alloc>VirtualAlloc</alloc>
<alloc buffer-size="malloc:2">VirtualAlloc</alloc>
<dealloc>VirtualFree</dealloc>
</memory>
<memory>
<alloc>VirtualAllocEx</alloc>
<alloc>VirtualAllocExNuma</alloc>
<alloc buffer-size="malloc:3">VirtualAllocEx</alloc>
<alloc buffer-size="malloc:3">VirtualAllocExNuma</alloc>
<dealloc arg="2">VirtualFreeEx</dealloc>
</memory>
<memory>
<alloc>LocalAlloc</alloc>
<alloc buffer-size="malloc:2">LocalAlloc</alloc>
<dealloc>LocalFree</dealloc>
</memory>
<memory>
<alloc>GlobalAlloc</alloc>
<alloc buffer-size="malloc:2">GlobalAlloc</alloc>
<dealloc>GlobalFree</dealloc>
<dealloc arg="2">SetClipboardData</dealloc>
</memory>
@ -1252,25 +1252,32 @@
</memory>
<memory>
<alloc init="true">wcsdup</alloc>
<alloc init="true">_strdup</alloc>
<alloc init="true" buffer-size="strdup">_strdup</alloc>
<alloc init="true">_wcsdup</alloc>
<alloc init="true">_mbsdup</alloc>
<alloc init="true">_tcsdup</alloc>
<alloc init="true">_malloc_dbg</alloc>
<alloc init="true">_aligned_malloc</alloc>
<alloc init="true">_aligned_malloc_dbg</alloc>
<alloc init="true">_aligned_offset_malloc</alloc>
<alloc init="true" buffer-size="malloc">_malloc_dbg</alloc>
<alloc init="true" buffer-size="calloc">_calloc_dbg</alloc>
<alloc init="true">_strdup_dbg</alloc>
<alloc init="true">_wcsdup_dbg</alloc>
<alloc init="true">_tcsdup_dbg</alloc>
<dealloc>free</dealloc>
<dealloc>_free_dbg</dealloc>
</memory>
<memory>
<alloc>CoTaskMemAlloc</alloc>
<alloc init="true" buffer-size="malloc">_aligned_malloc</alloc>
<alloc init="true" buffer-size="malloc">_aligned_malloc_dbg</alloc>
<alloc init="true" buffer-size="malloc">_aligned_offset_malloc</alloc>
<alloc init="true" buffer-size="malloc">_aligned_offset_malloc_dbg</alloc>
<dealloc>_aligned_free</dealloc>
<dealloc>_aligned_free_dbg</dealloc>
</memory>
<memory>
<alloc buffer-size="malloc">CoTaskMemAlloc</alloc>
<dealloc>CoTaskMemFree</dealloc>
</memory>
<memory>
<alloc>_malloca</alloc>
<alloc buffer-size="malloc">_malloca</alloc>
<!-- Do not add _alloca here. It is automatically freed! -->
<dealloc>_freea</dealloc>
</memory>
@ -3643,6 +3650,14 @@ HFONT CreateFont(
<not-uninit/>
</arg>
</function>
<!-- void _aligned_free (void *memblock); -->
<function name="_aligned_free">
<noreturn>false</noreturn>
<returnValue type="void"/>
<arg nr="1">
<not-bool/>
</arg>
</function>
<!-- size_t _mbslen_l( const unsigned char *str, _locale_t locale); -->
<!-- size_t _mbstrlen_l( const char *str, _locale_t locale ); -->
<function name="_mbslen_l,_mbstrlen_l,_tcsclen_l">

View File

@ -174,6 +174,9 @@ void validCode()
__noop(1, "test", NULL);
__nop();
void * pAlloc1 = _aligned_malloc(100, 2);
_aligned_free(pAlloc1);
// Valid Library usage, no leaks, valid arguments
HINSTANCE hInstLib = LoadLibrary(L"My.dll");
FreeLibrary(hInstLib);
@ -232,6 +235,23 @@ void bufferAccessOutOfBounds()
RtlFillMemory(byteBuf, sizeof(byteBuf)+1, 0x01);
// cppcheck-suppress bufferAccessOutOfBounds
FillMemory(byteBuf, sizeof(byteBuf)+1, 0x01);
char * pAlloc1 = _malloca(32);
memset(pAlloc1, 0, 32);
// cppcheck-suppress bufferAccessOutOfBounds
memset(pAlloc1, 0, 33);
_freea(pAlloc1);
}
void mismatchAllocDealloc()
{
char * pChar = _aligned_malloc(100, 2);
// cppcheck-suppress mismatchAllocDealloc
free(pChar);
pChar = _malloca(32);
// cppcheck-suppress mismatchAllocDealloc
_aligned_free(pChar);
}
void nullPointer()