bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] Add nmalloc, NMALLOC et al.


From: Ondřej Bílka
Subject: Re: [PATCH 1/2] Add nmalloc, NMALLOC et al.
Date: Sun, 3 Nov 2013 21:36:58 +0100
User-agent: Mutt/1.5.20 (2009-06-14)

On Sun, Nov 03, 2013 at 09:13:33PM +0100, Ondřej Bílka wrote:
> On Sun, Nov 03, 2013 at 12:04:36PM -0800, Paul Eggert wrote:
> > Ondřej Bílka wrote:
> > > +XALLOC_INLINE void *
> > > +nmalloc (size_t n, size_t s)
> > > +{
> > > +  if (xalloc_oversized (n, s))
> > > +    xalloc_die ();
> > > +  return xmalloc (n * s);
> > > +}
> > 
> > This is the same as the existing xnmalloc, so why bother with a new name?
> > Similarly for the other changes.
> 
> I accidentally inlined wrong version. As idea is to handle overflow by
> oom logic these should be:
> 
> nmalloc (size_t n, size_t s)
> {
>   if (xalloc_oversized (n, s))
>     NULL;
>   return malloc (n * s);
> }
> 

A new version is here. Macros are added for consistency of api but not
neccessary.

        * lib/xalloc.h (NMALLOC, NREALLOC, nmalloc, nrealloc): Add.
        * lib/xmalloca.h (XNMALLOCA): Likewise.

diff --git a/lib/xalloc.h b/lib/xalloc.h
index 6c9b53b..66799be 100644
--- a/lib/xalloc.h
+++ b/lib/xalloc.h
@@ -93,6 +93,15 @@ char *xstrdup (char const *str)
 #define XCALLOC(n, t) \
    ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
 
+/* Allocate memory for N elements of type T, with overflow checking.  */
+/* extern t *NMALLOC (size_t n, typename t); */
+#define NMALLOC(n, t) \
+   ((t *) (sizeof (t) == 1 ? malloc (n) : nmalloc (n, sizeof (t))))
+
+/* Rellocate memory for N elements of type T, with overflow checking. */
+/* extern t *NREALLOC (void *p, size_t n, typename t); */
+#define NREALLOC(p, n, t) ((t *) (nrealloc (p, n, sizeof (t))))
+
 
 /* Allocate an array of N objects, each with S bytes of memory,
    dynamically, with error checking.  S must be nonzero.  */
@@ -107,6 +116,17 @@ xnmalloc (size_t n, size_t s)
   return xmalloc (n * s);
 }
 
+/* Allocate an array of N objects, each with S bytes of memory,
+   dynamically, with overflow checking.  S must be nonzero.  */
+
+XALLOC_INLINE void *nmalloc (size_t n, size_t s)
+                    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+XALLOC_INLINE void *
+nmalloc (size_t n, size_t s)
+{
+  return malloc (xalloc_oversized (n, s) ? SIZE_MAX : n * 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.  */
 
@@ -120,6 +140,17 @@ xnrealloc (void *p, size_t n, size_t s)
   return xrealloc (p, n * s);
 }
 
+/* Change the size of an allocated block of memory P to an array of N
+   objects each of S bytes, with overflow checking.  S must be nonzero.  */
+
+XALLOC_INLINE void *nrealloc (void *p, size_t n, size_t s)
+                    _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
+XALLOC_INLINE void *
+nrealloc (void *p, size_t n, size_t s)
+{
+  return realloc (p, xalloc_oversized (n, s) ? SIZE_MAX : n * s);
+}
+
 /* If P is null, allocate a block of at least *PN such objects;
    otherwise, reallocate P so that it contains more than *PN objects
    each of S bytes.  *PN must be nonzero unless P is null, and S must
diff --git a/lib/xmalloca.h b/lib/xmalloca.h
index 2f7567d..4ab1a03 100644
--- a/lib/xmalloca.h
+++ b/lib/xmalloca.h
@@ -55,6 +55,7 @@ extern void * xmmalloca (size_t n);
     xnmalloc ((n), (s))
 #endif
 
+#define XNMALLOCA(n, t) ((t *) xnmalloca (x, sizeof (t)))
 
 #ifdef __cplusplus
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]