X-Git-Url: https://git.cworth.org/git?p=tar;a=blobdiff_plain;f=gnu%2Fxalloc.h;fp=gnu%2Fxalloc.h;h=400019c63d2ef03b0aca152c23ceeecb9465b9e1;hp=37500ed81d7df0b05afa8b391874f8efa67e08e6;hb=de7372b23c3da92fbfaea2d1ac592f0b2ba87914;hpb=fbbfb9406a82e647ce27b6462b11a802fa48f31a diff --git a/gnu/xalloc.h b/gnu/xalloc.h index 37500ed..400019c 100644 --- a/gnu/xalloc.h +++ b/gnu/xalloc.h @@ -48,6 +48,14 @@ extern "C" { # endif # endif +# ifndef ATTRIBUTE_ALLOC_SIZE +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +# define ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) +# else +# define ATTRIBUTE_ALLOC_SIZE(args) +# endif +# endif + /* This function is always triggered when memory is exhausted. It must be defined by the application, either explicitly or by using gnulib's xalloc-die module. This is the @@ -55,13 +63,19 @@ extern "C" { memory allocation failure. */ extern void xalloc_die (void) ATTRIBUTE_NORETURN; -void *xmalloc (size_t s) ATTRIBUTE_MALLOC; -void *xzalloc (size_t s) ATTRIBUTE_MALLOC; -void *xcalloc (size_t n, size_t s) ATTRIBUTE_MALLOC; -void *xrealloc (void *p, size_t s); +void *xmalloc (size_t s) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((1)); +void *xzalloc (size_t s) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((1)); +void *xcalloc (size_t n, size_t s) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((1, 2)); +void *xrealloc (void *p, size_t s) + ATTRIBUTE_ALLOC_SIZE ((2)); void *x2realloc (void *p, size_t *pn); -void *xmemdup (void const *p, size_t s) ATTRIBUTE_MALLOC; -char *xstrdup (char const *str) ATTRIBUTE_MALLOC; +void *xmemdup (void const *p, size_t s) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((2)); +char *xstrdup (char const *str) + ATTRIBUTE_MALLOC; /* Return 1 if an array of N objects, each of size S, cannot exist due to size arithmetic overflow. S must be positive and N must be @@ -108,10 +122,13 @@ char *xstrdup (char const *str) ATTRIBUTE_MALLOC; # if HAVE_INLINE # define static_inline static inline # else -void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC; -void *xnrealloc (void *p, size_t n, size_t s); +void *xnmalloc (size_t n, size_t s) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((1, 2)); +void *xnrealloc (void *p, size_t n, size_t s) + ATTRIBUTE_ALLOC_SIZE ((2, 3)); void *x2nrealloc (void *p, size_t *pn, size_t s); -char *xcharalloc (size_t n) ATTRIBUTE_MALLOC; +char *xcharalloc (size_t n) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((1)); # endif # ifdef static_inline @@ -119,7 +136,8 @@ char *xcharalloc (size_t n) ATTRIBUTE_MALLOC; /* Allocate an array of N objects, each with S bytes of memory, dynamically, with error checking. S must be nonzero. */ -static_inline void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC; +static_inline void *xnmalloc (size_t n, size_t s) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((1, 2)); static_inline void * xnmalloc (size_t n, size_t s) { @@ -131,6 +149,8 @@ xnmalloc (size_t n, size_t s) /* Change the size of an allocated block of memory P to an array of N objects each of S bytes, with error checking. S must be nonzero. */ +static_inline void *xnrealloc (void *p, size_t n, size_t s) + ATTRIBUTE_ALLOC_SIZE ((2, 3)); static_inline void * xnrealloc (void *p, size_t n, size_t s) { @@ -231,7 +251,8 @@ x2nrealloc (void *p, size_t *pn, size_t s) /* Return a pointer to a new buffer of N bytes. This is like xmalloc, except it returns char *. */ -static_inline char *xcharalloc (size_t n) ATTRIBUTE_MALLOC; +static_inline char *xcharalloc (size_t n) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ((1)); static_inline char * xcharalloc (size_t n) {