Source-Changes archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CVS commit: src/sys/dev/scsipi
khym%azeotrope.org@localhost wrote:
> On Fri, Dec 01, 2006 at 08:36:23PM +0100, Christian Biere wrote:
> > I suggest using STATIC_ASSERT(sizeof(struct whatever) == whatever) wherever
> > size matters.
>
> Interesting... I didn't think that the aligned attribute would change
> the sizeof the struct, but it does :( The gcc documentation (info gcc)
> doesn't seem to make any mention of that (although I suppose if you set
> the attribute on a structure member, it'd obviously have to increase
> the sizeof the struct. I didn't think it'd do it when aligning the
> struct itself.)
>
> So how does one ensure that the start of the struct is aligned to a
> 32-bit boundary, but the sizeof the struct stays unchanged?
>
> In an off-list email, Martin Husemann had suggested using a union to
> force the appropriate alignment, but it looks like that doesn't work:
>
> #include <stdio.h>
>
> struct odd {
> char x[3];
> } __attribute__((__packed__));
>
> struct evenunion {
> union {
> int i_x;
> char x[4];
> } u_x;
> char y[4];
> } __attribute__((__packed__));
I think the __packed__ will just override what you're trying to achieve with
union.
I believe you have no choice to apply it to the variable instead of the type:
struct odd __attribute__(__align__(4));
or
union {
uint32_t align4;
struct evenunion e;
} u;
Maybe GCC is smart enough to prove alignment statically in which case one could
add static assertions to prevent unintended breaches in the future.
--
Christian
Home |
Main Index |
Thread Index |
Old Index