X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fxalloc.h;h=4b6585811bbc392fd2369b49da76d887631b691f;hb=9bb48fb977629b0184a12b081ba716b8185136d2;hp=b07e10c79a0a7be265038c6d1faaeddf913b150b;hpb=57bc22e6bc9141897ea2ebefa5e39598cb53a02d;p=gnulib.git diff --git a/lib/xalloc.h b/lib/xalloc.h index b07e10c79..4b6585811 100644 --- a/lib/xalloc.h +++ b/lib/xalloc.h @@ -59,6 +59,21 @@ void *x2nrealloc (void *p, size_t *pn, size_t s); void *xclone (void const *p, size_t s); char *xstrdup (const char *str); +/* 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 + nonnegative. This is a macro, not an inline function, so that it + works correctly even when SIZE_MAX < N. + + By gnulib convention, SIZE_MAX represents overflow in size + calculations, so the conservative dividend to use here is + SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value. + However, malloc (SIZE_MAX) fails on all known hosts where + sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for + exactly-SIZE_MAX allocations on such hosts; this avoids a test and + branch when S is known to be 1. */ +# define xalloc_oversized(n, s) \ + ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) + /* These macros are deprecated; they will go away soon, and are retained temporarily only to ease conversion to the functions described above. */ # define CCLONE(p, n) xclone (p, (n) * sizeof *(p))