-- v4: include/msvcrt: Add __WINE_(ALLOC_SIZE|DEALLOC|MALLOC) attributes to _aligned_malloc functions. include/msvcrt: Add __WINE_(DEALLOC|MALLOC) attributes to _strdup and _wcsdup.
From: Brendan Shanks bshanks@codeweavers.com
--- include/msvcrt/corecrt.h | 12 ++++++++++++ include/msvcrt/corecrt_wstring.h | 2 +- include/msvcrt/string.h | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/include/msvcrt/corecrt.h b/include/msvcrt/corecrt.h index aba9bc9422e..9f403c7d10e 100644 --- a/include/msvcrt/corecrt.h +++ b/include/msvcrt/corecrt.h @@ -342,4 +342,16 @@ typedef struct threadlocaleinfostruct { #define __WINE_CRT_SCANF_ATTR(fmt,args) #endif
+#if defined(__GNUC__) && (__GNUC__ > 10) +#define __WINE_DEALLOC(...) __attribute__((malloc (__VA_ARGS__))) +#else +#define __WINE_DEALLOC(...) +#endif + +#if defined(__GNUC__) && (__GNUC__ > 2) +#define __WINE_MALLOC __attribute__((malloc)) +#else +#define __WINE_MALLOC +#endif + #endif /* __WINE_CORECRT_H */ diff --git a/include/msvcrt/corecrt_wstring.h b/include/msvcrt/corecrt_wstring.h index bcf9f947625..09b5b0d9ec4 100644 --- a/include/msvcrt/corecrt_wstring.h +++ b/include/msvcrt/corecrt_wstring.h @@ -29,7 +29,7 @@ static inline void* memccpy(void *s1, const void *s2, int c, size_t n) { return
_ACRTIMP void* __cdecl memmove(void*,const void*,size_t);
-_ACRTIMP wchar_t* __cdecl _wcsdup(const wchar_t*); +_ACRTIMP wchar_t* __cdecl _wcsdup(const wchar_t*) __WINE_DEALLOC(__builtin_free) __WINE_MALLOC; _ACRTIMP int __cdecl _wcsicmp(const wchar_t*,const wchar_t*); _ACRTIMP int __cdecl _wcsicoll(const wchar_t*,const wchar_t*); _ACRTIMP int __cdecl _wcsicoll_l(const wchar_t*, const wchar_t*, _locale_t); diff --git a/include/msvcrt/string.h b/include/msvcrt/string.h index 5e3d51076c6..707a1b1cd00 100644 --- a/include/msvcrt/string.h +++ b/include/msvcrt/string.h @@ -22,7 +22,7 @@ extern "C" { _ACRTIMP size_t __cdecl __strncnt(const char*,size_t); _ACRTIMP int __cdecl _strcmpi(const char*,const char*); _ACRTIMP int __cdecl _strcoll_l(const char*, const char*, _locale_t); -_ACRTIMP char* __cdecl _strdup(const char*); +_ACRTIMP char* __cdecl _strdup(const char*) __WINE_DEALLOC(__builtin_free) __WINE_MALLOC; _ACRTIMP char* __cdecl _strerror(const char*); _ACRTIMP errno_t __cdecl strerror_s(char*,size_t,int); _ACRTIMP int __cdecl _stricmp(const char*,const char*);
From: Brendan Shanks bshanks@codeweavers.com
--- include/msvcrt/corecrt.h | 6 ++++++ include/msvcrt/malloc.h | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/include/msvcrt/corecrt.h b/include/msvcrt/corecrt.h index 9f403c7d10e..4dc2ca53208 100644 --- a/include/msvcrt/corecrt.h +++ b/include/msvcrt/corecrt.h @@ -342,6 +342,12 @@ typedef struct threadlocaleinfostruct { #define __WINE_CRT_SCANF_ATTR(fmt,args) #endif
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +#define __WINE_ALLOC_SIZE(...) __attribute__((__alloc_size__(__VA_ARGS__))) +#else +#define __WINE_ALLOC_SIZE(...) +#endif + #if defined(__GNUC__) && (__GNUC__ > 10) #define __WINE_DEALLOC(...) __attribute__((malloc (__VA_ARGS__))) #else diff --git a/include/msvcrt/malloc.h b/include/msvcrt/malloc.h index fcbadbeb4e0..c6a26491249 100644 --- a/include/msvcrt/malloc.h +++ b/include/msvcrt/malloc.h @@ -69,10 +69,10 @@ _ACRTIMP void* __cdecl malloc(size_t); _ACRTIMP void* __cdecl realloc(void*,size_t);
_ACRTIMP void __cdecl _aligned_free(void*); -_ACRTIMP void* __cdecl _aligned_malloc(size_t,size_t); -_ACRTIMP void* __cdecl _aligned_offset_malloc(size_t,size_t,size_t); -_ACRTIMP void* __cdecl _aligned_realloc(void*,size_t,size_t); -_ACRTIMP void* __cdecl _aligned_offset_realloc(void*,size_t,size_t,size_t); +_ACRTIMP void* __cdecl _aligned_malloc(size_t,size_t) __WINE_ALLOC_SIZE(1) __WINE_DEALLOC(_aligned_free) __WINE_MALLOC; +_ACRTIMP void* __cdecl _aligned_offset_malloc(size_t,size_t,size_t) __WINE_ALLOC_SIZE(1) __WINE_DEALLOC(_aligned_free) __WINE_MALLOC; +_ACRTIMP void* __cdecl _aligned_realloc(void*,size_t,size_t) __WINE_ALLOC_SIZE(2) __WINE_DEALLOC(_aligned_free); +_ACRTIMP void* __cdecl _aligned_offset_realloc(void*,size_t,size_t,size_t) __WINE_ALLOC_SIZE(2) __WINE_DEALLOC(_aligned_free);
_ACRTIMP size_t __cdecl _get_sbh_threshold(void); _ACRTIMP int __cdecl _set_sbh_threshold(size_t size);
On Wed Dec 7 21:03:53 2022 +0000, Alexandre Julliard wrote:
Ah thanks for figuring that out, I'll push a new version. Maybe we
should look into whether plain `environ` should be defined by default, MS doesn't document it (just `_environ`) and I see it gated behind an ifdef in the Windows SDK. Maybe not, but in any case I don't think string.h should be bringing in stdlib.h.
Makes sense. I've pushed a new version using `__builtin_free` instead, this is what the glibc headers use and doesn't require additional includes
Maybe not, but in any case I don't think string.h should be bringing in stdlib.h.
Would it be acceptable to move malloc and free to corecrt_malloc.h and then include only that file in string.h? Those functions really ought to be moved anyway to avoid declaring them in both malloc.h and stdlib.h.