[PATCH 0/1] MR69: include: Add __WINE_MALLOC attribute and use it for allocation functions.

Chip Davis (@cdavis5e) wine at gitlab.winehq.org
Sat May 14 14:23:18 CDT 2022


On Sat May 14 12:30:10 2022 +0000, **** wrote:
> Eric Pouech replied on the mailing list:
> ```
> Le 14/05/2022 à 10:50, Rémi Bernon (@rbernon) a écrit :
> > Shouldn't this specify the deallocator too while we're at it changing
> global headers? It could perhaps find mismatches, or perhaps optimize
> even more combined malloc / free?
> >
> yes it could (even if the gcc version supporting it is newer)
> could also be done for msvcrt fopen/fclose
> from the initial patch, I wonder if adding the attribute to inline 
> functions in heap.h is needed (as called function are already marked)
> I've been using this patch (generates one potential mismatch to be fixed)
> A+
> diff --git a/include/winbase.h b/include/winbase.h
> index 0a0bfde9d10..879f412186a 100644
> --- a/include/winbase.h
> +++ b/include/winbase.h
> @@ -2349,7 +2349,8 @@ WINBASEAPI BOOL        WINAPI GetXStateFeaturesMask(CONTEXT*,DWORD64*);
>  WINBASEAPI ATOM        WINAPI GlobalAddAtomA(LPCSTR);
>  WINBASEAPI ATOM        WINAPI GlobalAddAtomW(LPCWSTR);
>  #define                       GlobalAddAtom WINELIB_NAME_AW(GlobalAddAtom)
> -WINBASEAPI HGLOBAL     WINAPI GlobalAlloc(UINT,SIZE_T) __WINE_ALLOC_SIZE(2);
> +WINBASEAPI HGLOBAL     WINAPI GlobalFree(HGLOBAL);
> +WINBASEAPI HGLOBAL     WINAPI GlobalAlloc(UINT,SIZE_T)
> __WINE_ALLOC_SIZE(2) __WINE_MALLOC(GlobalFree, 1);
>  WINBASEAPI SIZE_T      WINAPI GlobalCompact(DWORD);
>  WINBASEAPI ATOM        WINAPI GlobalDeleteAtom(ATOM);
>  WINBASEAPI ATOM        WINAPI GlobalFindAtomA(LPCSTR);
> @@ -2357,7 +2358,6 @@ WINBASEAPI ATOM        WINAPI GlobalFindAtomW(LPCWSTR);
>  #define                       GlobalFindAtom WINELIB_NAME_AW(GlobalFindAtom)
>  WINBASEAPI VOID        WINAPI GlobalFix(HGLOBAL);
>  WINBASEAPI UINT        WINAPI GlobalFlags(HGLOBAL);
> -WINBASEAPI HGLOBAL     WINAPI GlobalFree(HGLOBAL);
>  WINBASEAPI UINT        WINAPI GlobalGetAtomNameA(ATOM,LPSTR,INT);
>  WINBASEAPI UINT        WINAPI GlobalGetAtomNameW(ATOM,LPWSTR,INT);
>  #define                       GlobalGetAtomName WINELIB_NAME_AW(GlobalGetAtomName)
> @@ -2365,20 +2365,20 @@ WINBASEAPI HGLOBAL     WINAPI GlobalHandle(LPCVOID);
>  WINBASEAPI LPVOID      WINAPI GlobalLock(HGLOBAL);
>  WINBASEAPI VOID        WINAPI GlobalMemoryStatus(LPMEMORYSTATUS);
>  WINBASEAPI BOOL        WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX);
> -WINBASEAPI HGLOBAL     WINAPI GlobalReAlloc(HGLOBAL,SIZE_T,UINT) __WINE_ALLOC_SIZE(2);
> +WINBASEAPI HGLOBAL     WINAPI GlobalReAlloc(HGLOBAL,SIZE_T,UINT)
> __WINE_ALLOC_SIZE(2) __WINE_REALLOC(GlobalFree, 1);
>  WINBASEAPI SIZE_T      WINAPI GlobalSize(HGLOBAL);
>  WINBASEAPI VOID        WINAPI GlobalUnfix(HGLOBAL);
>  WINBASEAPI BOOL        WINAPI GlobalUnlock(HGLOBAL);
>  WINBASEAPI BOOL        WINAPI GlobalUnWire(HGLOBAL);
>  WINBASEAPI LPVOID      WINAPI GlobalWire(HGLOBAL);
>  #define                       HasOverlappedIoCompleted(lpOverlapped)
> ((lpOverlapped)->Internal != STATUS_PENDING)
> -WINBASEAPI LPVOID      WINAPI HeapAlloc(HANDLE,DWORD,SIZE_T) __WINE_ALLOC_SIZE(3);
> +WINBASEAPI BOOL        WINAPI HeapFree(HANDLE,DWORD,LPVOID);
> +WINBASEAPI LPVOID      WINAPI HeapAlloc(HANDLE,DWORD,SIZE_T)
> __WINE_ALLOC_SIZE(3) __WINE_MALLOC(HeapFree, 3);
>  WINBASEAPI SIZE_T      WINAPI HeapCompact(HANDLE,DWORD);
>  WINBASEAPI HANDLE      WINAPI HeapCreate(DWORD,SIZE_T,SIZE_T);
>  WINBASEAPI BOOL        WINAPI HeapDestroy(HANDLE);
> -WINBASEAPI BOOL        WINAPI HeapFree(HANDLE,DWORD,LPVOID);
>  WINBASEAPI BOOL        WINAPI HeapLock(HANDLE);
> -WINBASEAPI LPVOID      WINAPI HeapReAlloc(HANDLE,DWORD,LPVOID,SIZE_T) __WINE_ALLOC_SIZE(4);
> +WINBASEAPI LPVOID      WINAPI HeapReAlloc(HANDLE,DWORD,LPVOID,SIZE_T)
> __WINE_ALLOC_SIZE(4) __WINE_REALLOC(HeapFree, 3);
>  WINBASEAPI BOOL        WINAPI HeapQueryInformation(HANDLE,HEAP_INFORMATION_CLASS,PVOID,SIZE_T,PSIZE_T);
>  WINBASEAPI BOOL        WINAPI HeapSetInformation(HANDLE,HEAP_INFORMATION_CLASS,PVOID,SIZE_T);
>  WINBASEAPI SIZE_T      WINAPI HeapSize(HANDLE,DWORD,LPCVOID);
> @@ -2438,13 +2438,13 @@ WINBASEAPI HMODULE     WINAPI LoadLibraryExW(LPCWSTR,HANDLE,DWORD);
>  WINBASEAPI DWORD       WINAPI LoadModule(LPCSTR,LPVOID);
>  WINBASEAPI HMODULE     WINAPI LoadPackagedLibrary(LPCWSTR,DWORD);
>  WINBASEAPI HGLOBAL     WINAPI LoadResource(HMODULE,HRSRC);
> -WINBASEAPI HLOCAL      WINAPI LocalAlloc(UINT,SIZE_T) __WINE_ALLOC_SIZE(2);
> +WINBASEAPI HLOCAL      WINAPI LocalFree(HLOCAL);
> +WINBASEAPI HLOCAL      WINAPI LocalAlloc(UINT,SIZE_T)
> __WINE_ALLOC_SIZE(2) __WINE_MALLOC(LocalFree, 1);
>  WINBASEAPI SIZE_T      WINAPI LocalCompact(UINT);
>  WINBASEAPI UINT        WINAPI LocalFlags(HLOCAL);
> -WINBASEAPI HLOCAL      WINAPI LocalFree(HLOCAL);
>  WINBASEAPI HLOCAL      WINAPI LocalHandle(LPCVOID);
>  WINBASEAPI LPVOID      WINAPI LocalLock(HLOCAL);
> -WINBASEAPI HLOCAL      WINAPI LocalReAlloc(HLOCAL,SIZE_T,UINT) __WINE_ALLOC_SIZE(2);
> +WINBASEAPI HLOCAL      WINAPI LocalReAlloc(HLOCAL,SIZE_T,UINT)
> __WINE_ALLOC_SIZE(2) __WINE_REALLOC(LocalFree, 1);
>  WINBASEAPI SIZE_T      WINAPI LocalShrink(HGLOBAL,UINT);
>  WINBASEAPI SIZE_T      WINAPI LocalSize(HLOCAL);
>  WINBASEAPI BOOL        WINAPI LocalUnlock(HLOCAL);
> diff --git a/include/winnt.h b/include/winnt.h
> index c80efee077d..ff9b55b7ea2 100644
> --- a/include/winnt.h
> +++ b/include/winnt.h
> @@ -203,6 +203,13 @@ extern "C" {
>  #else
>  #define __WINE_ALLOC_SIZE(x)
>  #endif
> +#if defined(__GNUC__) && ((__GNUC__ > 11) || ((__GNUC__ == 11) &&
> (__GNUC_MINOR__ >= 2)))
> +#define __WINE_MALLOC(x, y) __attribute__((malloc, malloc(x, y)))
> +#define __WINE_REALLOC(x, y) __attribute__((malloc(x, y)))
> +#else
> +#define __WINE_MALLOC(x, y)
> +#define __WINE_REALLOC(x, y)
> +#endif
>  
>  /* Anonymous union/struct handling */
> ```
I guess I'll also point out FWIW that the MSVC equivalent to `__attribute__((malloc))` (no arguments) is `__declspec(restrict)`. It's available since MSVC 2005 (MSC 14.0). (Not to be confused with `__declspec(noalias)`, which is actually a weaker form of GCC's `__attribute__((pure))`.)

Also, am I the only one disturbed by the fact that the GCC developers chose to reuse an attribute name and give it **totally different semantics** when it has arguments vs. when it doesn't?

-- 
https://gitlab.winehq.org/wine/wine/-/merge_requests/69#note_870



More information about the wine-devel mailing list