Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Wed, 24 May 2023 18:12:05 -0400
From: Rich Felker <dalias@...c.org>
To: Jens Gustedt <Jens.Gustedt@...ia.fr>
Cc: musl@...ts.openwall.com
Subject: Re: [C23 new stdlib 2/4] C23: add the memalignment function

On Wed, May 24, 2023 at 05:28:35PM -0400, Rich Felker wrote:
> On Wed, May 24, 2023 at 09:38:52PM +0200, Jens Gustedt wrote:
> > The name is reserved, so we don't need to protect it via a feature
> > macro or a weak symbol.
> > ---
> >  include/stdlib.h          | 3 +++
> >  src/stdlib/memalignment.c | 6 ++++++
> >  2 files changed, 9 insertions(+)
> >  create mode 100644 src/stdlib/memalignment.c
> > 
> > diff --git a/include/stdlib.h b/include/stdlib.h
> > index 7800074d..68993c04 100644
> > --- a/include/stdlib.h
> > +++ b/include/stdlib.h
> > @@ -178,6 +178,9 @@ long double strtold_l(const char *__restrict, char **__restrict, struct __locale
> >  typedef int once_flag;
> >  void call_once(once_flag *, void (*)(void));
> >  
> > +size_t (memalignment)(const void *);
> > +#define memalignment(P) (((size_t)1)<<__builtin_ctzll((unsigned long long)P))
> > +
> >  #ifdef __cplusplus
> >  }
> >  #endif
> > diff --git a/src/stdlib/memalignment.c b/src/stdlib/memalignment.c
> > new file mode 100644
> > index 00000000..58b68954
> > --- /dev/null
> > +++ b/src/stdlib/memalignment.c
> > @@ -0,0 +1,6 @@
> > +#include <stdlib.h>
> > +
> > +size_t (memalignment)(const void *p)
> > +{
> > +	return memalignment(p);
> > +}
> > -- 
> > 2.34.1
> 
> There's a more efficient implementation of this function which does
> not depend on __builtin_ctzll (which we don't): p^(p-1)&p
> 
> I'm not clear that there's a really good motivation for having it
> implemented in the header. It kinda falls under the "maybe do it
> because it's easy" case, but once you switch to the non-GNUC-specific
> version, it needs a static inline function to avoid multiple
> evaluation, and then it gets to the point of "this is really too much
> code to have in a header" (which is more an issue of avoiding
> "creative" content in headers than anything else).

I was reading the spec and came across:

    "If p is a null pointer, an alignment of zero is returned."

and:

    "NOTE An alignment of zero indicates that the tested pointer
    cannot be used to access an object of any type."

I think this precludes your version with ctzll, but works fine with
the replacement I proposed.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.