Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20140608155441.GG179@brightrain.aerifal.cx>
Date: Sun, 8 Jun 2014 11:54:41 -0400
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: Revisiting max_align_t and stdalign.h

On Sun, Jun 08, 2014 at 10:59:24AM -0400, Rich Felker wrote:
> I was looking back at the max_align_t issue and there seems to be a
> lot more to resolve: gcc is badly broken in regards to everything
> related to stdalign.h. This test program on i386:
> 
> #include <stdalign.h>
> #include <stdio.h>
> 
> int main()
> {
> 	long long x;
> 	printf("%d %d\n", (int)_Alignof(x), (int)_Alignof(long long));
> }
> 
> prints 8 8 on most gcc versions, and what's worse, its behavior
> depends on -std; adding -std=c11 and using gcc 4.9.0 changes it to
> printing 8 4. The correct result of course would be 4 4.

My tests must have been messed up here; apparently gcc 4.9.0 works
even without -std=c11. So a workaround that applies only to versions
earlier than 4.9 should be possible.

Moreover it appears that _Alignof is not required to accept
expressions as its argument, only types. If this is correct then 4.9.0
is working, albeit doing something ugly in the case of invalid code.

> I had in mind the following patch for stdalign.h:
> 
> diff --git a/include/stdalign.h b/include/stdalign.h
> index b6e50ae..3f00466 100644
> --- a/include/stdalign.h
> +++ b/include/stdalign.h
> @@ -4,7 +4,7 @@
>  /* this whole header only works in C11 or with compiler extensions */
>  #if __STDC_VERSION__ < 201112L && defined( __GNUC__)
>  #define _Alignas(t) __attribute__((__aligned__(t)))
> -#define _Alignof(t) __alignof__(t)
> +#define _Alignof(t) (sizeof(struct {char __x; __typeof__(t) __y;}) - sizeof(t))
>  #endif
>  
>  #define alignas _Alignas
> 
> but it doesn't really help since _Alignof is broken even with
> -std=c11.
> 
> I suspect _Alignas is similarly broken.

And _Alignas might be broken even on current gcc -- it accepts not
just types but also expressions. However it's not clear to me whether
it can even be used in contexts where it would be observably wrong, so
I don;t know how to write a test for it. IIRC there's an open issue
about whether it can be used in structs, or only on objects.

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.